mirror of
https://github.com/umami-software/umami.git
synced 2025-12-06 01:18:00 +01:00
Merge branch 'dev' into jajaja
# Conflicts: # db/postgresql/schema.prisma # src/queries/sql/reports/getRevenue.ts
This commit is contained in:
commit
b2aa37a3df
9 changed files with 279 additions and 200 deletions
31
db/postgresql/migrations/13_add_revenue/migration.sql
Normal file
31
db/postgresql/migrations/13_add_revenue/migration.sql
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
-- AlterTable
|
||||
ALTER TABLE "segment" ADD COLUMN "type" VARCHAR(200) NOT NULL;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "revenue" (
|
||||
"revenue_id" UUID NOT NULL,
|
||||
"website_id" UUID NOT NULL,
|
||||
"session_id" UUID NOT NULL,
|
||||
"event_id" UUID NOT NULL,
|
||||
"event_name" VARCHAR(50) NOT NULL,
|
||||
"currency" VARCHAR(100) NOT NULL,
|
||||
"revenue" DECIMAL(19,4),
|
||||
"created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "revenue_pkey" PRIMARY KEY ("revenue_id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "revenue_revenue_id_key" ON "revenue"("revenue_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "revenue_website_id_idx" ON "revenue"("website_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "revenue_session_id_idx" ON "revenue"("session_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "revenue_website_id_created_at_idx" ON "revenue"("website_id", "created_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "revenue_website_id_session_id_created_at_idx" ON "revenue"("website_id", "session_id", "created_at");
|
||||
|
|
@ -46,6 +46,7 @@ model Session {
|
|||
|
||||
websiteEvent WebsiteEvent[]
|
||||
sessionData SessionData[]
|
||||
revenue Revenue[]
|
||||
|
||||
@@index([createdAt])
|
||||
@@index([websiteId])
|
||||
|
|
@ -79,6 +80,7 @@ model Website {
|
|||
team Team? @relation(fields: [teamId], references: [id])
|
||||
eventData EventData[]
|
||||
report Report[]
|
||||
revenue Revenue[]
|
||||
sessionData SessionData[]
|
||||
segment Segment[]
|
||||
|
||||
|
|
@ -237,15 +239,36 @@ model Report {
|
|||
}
|
||||
|
||||
model Segment {
|
||||
id String @id() @unique() @map("segment_id") @db.Uuid
|
||||
websiteId String @map("website_id") @db.Uuid
|
||||
name String @db.VarChar(200)
|
||||
filters Json
|
||||
createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
|
||||
updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6)
|
||||
id String @id() @unique() @map("segment_id") @db.Uuid
|
||||
websiteId String @map("website_id") @db.Uuid
|
||||
type String @db.VarChar(200)
|
||||
name String @db.VarChar(200)
|
||||
filters Json
|
||||
createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
|
||||
updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6)
|
||||
|
||||
website Website @relation(fields: [websiteId], references: [id])
|
||||
|
||||
@@index([websiteId])
|
||||
@@map("segment")
|
||||
}
|
||||
|
||||
model Revenue {
|
||||
id String @id() @unique() @map("revenue_id") @db.Uuid
|
||||
websiteId String @map("website_id") @db.Uuid
|
||||
sessionId String @map("session_id") @db.Uuid
|
||||
eventId String @map("event_id") @db.Uuid
|
||||
eventName String @map("event_name") @db.VarChar(50)
|
||||
currency String @db.VarChar(100)
|
||||
revenue Decimal? @db.Decimal(19, 4)
|
||||
createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
|
||||
|
||||
website Website @relation(fields: [websiteId], references: [id])
|
||||
session Session @relation(fields: [sessionId], references: [id])
|
||||
|
||||
@@index([websiteId])
|
||||
@@index([sessionId])
|
||||
@@index([websiteId, createdAt])
|
||||
@@index([websiteId, sessionId, createdAt])
|
||||
@@map("revenue")
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 2.3 KiB |
|
|
@ -38,7 +38,7 @@
|
|||
"label.add-step": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Add step"
|
||||
"value": "إضافة خطوة"
|
||||
}
|
||||
],
|
||||
"label.add-website": [
|
||||
|
|
@ -77,6 +77,18 @@
|
|||
"value": "تحليلات"
|
||||
}
|
||||
],
|
||||
"label.attribution": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "الإسناد"
|
||||
}
|
||||
],
|
||||
"label.attribution-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "شاهد كيف يتفاعل المستخدمون مع حملاتك التسويقية وما الذي يحفز التحويلات."
|
||||
}
|
||||
],
|
||||
"label.average": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -122,7 +134,7 @@
|
|||
"label.cancel": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "ألغِ"
|
||||
"value": "إلغاء"
|
||||
}
|
||||
],
|
||||
"label.change-password": [
|
||||
|
|
@ -152,7 +164,7 @@
|
|||
"label.compare": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Compare"
|
||||
"value": "المقارنة"
|
||||
}
|
||||
],
|
||||
"label.confirm": [
|
||||
|
|
@ -170,7 +182,7 @@
|
|||
"label.contains": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "يحتوي"
|
||||
"value": "يحتوي على"
|
||||
}
|
||||
],
|
||||
"label.continue": [
|
||||
|
|
@ -182,7 +194,7 @@
|
|||
"label.count": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Count"
|
||||
"value": "العدد"
|
||||
}
|
||||
],
|
||||
"label.countries": [
|
||||
|
|
@ -236,7 +248,7 @@
|
|||
"label.current": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Current"
|
||||
"value": "الحالي"
|
||||
}
|
||||
],
|
||||
"label.current-password": [
|
||||
|
|
@ -254,7 +266,7 @@
|
|||
"label.dashboard": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "الشاشة الرئيسية"
|
||||
"value": "لوحة التحكم"
|
||||
}
|
||||
],
|
||||
"label.data": [
|
||||
|
|
@ -356,7 +368,7 @@
|
|||
"label.does-not-contain": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "لا يحتوي"
|
||||
"value": "لا يحتوي على"
|
||||
}
|
||||
],
|
||||
"label.domain": [
|
||||
|
|
@ -374,7 +386,7 @@
|
|||
"label.edit": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "عدّل"
|
||||
"value": "تعديل"
|
||||
}
|
||||
],
|
||||
"label.edit-dashboard": [
|
||||
|
|
@ -398,13 +410,13 @@
|
|||
"label.end-step": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "End Step"
|
||||
"value": "الخطوة الأخيرة"
|
||||
}
|
||||
],
|
||||
"label.entry": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Entry URL"
|
||||
"value": "رابط الدخول"
|
||||
}
|
||||
],
|
||||
"label.event": [
|
||||
|
|
@ -428,7 +440,7 @@
|
|||
"label.exit": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Exit URL"
|
||||
"value": "رابط المغادرة"
|
||||
}
|
||||
],
|
||||
"label.false": [
|
||||
|
|
@ -476,7 +488,7 @@
|
|||
"label.first-seen": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "First seen"
|
||||
"value": "أول ظهور"
|
||||
}
|
||||
],
|
||||
"label.funnel": [
|
||||
|
|
@ -494,19 +506,19 @@
|
|||
"label.goal": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Goal"
|
||||
"value": "الهدف"
|
||||
}
|
||||
],
|
||||
"label.goals": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Goals"
|
||||
"value": "الأهداف"
|
||||
}
|
||||
],
|
||||
"label.goals-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Track your goals for pageviews and events."
|
||||
"value": "تابع تحقق أهدافك المرتبطة بمشاهدات الصفحات والأحداث."
|
||||
}
|
||||
],
|
||||
"label.greater-than": [
|
||||
|
|
@ -548,13 +560,13 @@
|
|||
"label.is": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "هو"
|
||||
"value": "يساوي"
|
||||
}
|
||||
],
|
||||
"label.is-not": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "لم"
|
||||
"value": "لا يساوي"
|
||||
}
|
||||
],
|
||||
"label.is-not-set": [
|
||||
|
|
@ -584,13 +596,13 @@
|
|||
"label.journey": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Journey"
|
||||
"value": "رحلة المستخدم"
|
||||
}
|
||||
],
|
||||
"label.journey-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Understand how users navigate through your website."
|
||||
"value": "تعرّف على كيفية تنقّل المستخدمين داخل موقعك."
|
||||
}
|
||||
],
|
||||
"label.language": [
|
||||
|
|
@ -642,7 +654,7 @@
|
|||
"label.last-months": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Last "
|
||||
"value": "آخر "
|
||||
},
|
||||
{
|
||||
"type": 1,
|
||||
|
|
@ -650,13 +662,13 @@
|
|||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": " months"
|
||||
"value": " شهر/أشهر"
|
||||
}
|
||||
],
|
||||
"label.last-seen": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Last seen"
|
||||
"value": "آخر ظهور"
|
||||
}
|
||||
],
|
||||
"label.leave": [
|
||||
|
|
@ -704,7 +716,7 @@
|
|||
"label.manager": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Manager"
|
||||
"value": "مدير"
|
||||
}
|
||||
],
|
||||
"label.max": [
|
||||
|
|
@ -876,13 +888,13 @@
|
|||
"label.path": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Path"
|
||||
"value": "المسار"
|
||||
}
|
||||
],
|
||||
"label.paths": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Paths"
|
||||
"value": "المسارات"
|
||||
}
|
||||
],
|
||||
"label.powered-by": [
|
||||
|
|
@ -898,19 +910,19 @@
|
|||
"label.previous": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Previous"
|
||||
"value": "السابق"
|
||||
}
|
||||
],
|
||||
"label.previous-period": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Previous period"
|
||||
"value": "الفترة السابقة"
|
||||
}
|
||||
],
|
||||
"label.previous-year": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Previous year"
|
||||
"value": "العام السابق"
|
||||
}
|
||||
],
|
||||
"label.profile": [
|
||||
|
|
@ -922,13 +934,13 @@
|
|||
"label.properties": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Properties"
|
||||
"value": "الخصائص"
|
||||
}
|
||||
],
|
||||
"label.property": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Property"
|
||||
"value": "الخاصية"
|
||||
}
|
||||
],
|
||||
"label.queries": [
|
||||
|
|
@ -1042,19 +1054,19 @@
|
|||
"label.revenue": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Revenue"
|
||||
"value": "الإيرادات"
|
||||
}
|
||||
],
|
||||
"label.revenue-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Look into your revenue across time."
|
||||
"value": "قم بإلقاء نظرة على بيانات إيراداتك وكيفية إنفاق المستخدمين."
|
||||
}
|
||||
],
|
||||
"label.revenue-property": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Revenue Property"
|
||||
"value": "خاصية الإيرادات"
|
||||
}
|
||||
],
|
||||
"label.role": [
|
||||
|
|
@ -1114,7 +1126,7 @@
|
|||
"label.session": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Session"
|
||||
"value": "الزيارة"
|
||||
}
|
||||
],
|
||||
"label.sessions": [
|
||||
|
|
@ -1144,13 +1156,13 @@
|
|||
"label.start-step": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Start Step"
|
||||
"value": "الخطوة الأولى"
|
||||
}
|
||||
],
|
||||
"label.steps": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Steps"
|
||||
"value": "الخطوات"
|
||||
}
|
||||
],
|
||||
"label.sum": [
|
||||
|
|
@ -1165,6 +1177,18 @@
|
|||
"value": "تابلت"
|
||||
}
|
||||
],
|
||||
"label.tag": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "الوسم"
|
||||
}
|
||||
],
|
||||
"label.tags": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "الوسوم"
|
||||
}
|
||||
],
|
||||
"label.team": [
|
||||
{
|
||||
"type": 0,
|
||||
|
|
@ -1180,7 +1204,7 @@
|
|||
"label.team-manager": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Team manager"
|
||||
"value": "مدير الفريق"
|
||||
}
|
||||
],
|
||||
"label.team-member": [
|
||||
|
|
@ -1204,7 +1228,7 @@
|
|||
"label.team-view-only": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Team view only"
|
||||
"value": "عرض الفريق فقط"
|
||||
}
|
||||
],
|
||||
"label.team-websites": [
|
||||
|
|
@ -1288,13 +1312,13 @@
|
|||
"label.transactions": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Transactions"
|
||||
"value": "المعاملات"
|
||||
}
|
||||
],
|
||||
"label.transfer": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Transfer"
|
||||
"value": "نقل"
|
||||
}
|
||||
],
|
||||
"label.transfer-website": [
|
||||
|
|
@ -1330,7 +1354,7 @@
|
|||
"label.uniqueCustomers": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Unique Customers"
|
||||
"value": "العملاء الفريدون"
|
||||
}
|
||||
],
|
||||
"label.unknown": [
|
||||
|
|
@ -1348,19 +1372,19 @@
|
|||
"label.update": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Update"
|
||||
"value": "تحديث"
|
||||
}
|
||||
],
|
||||
"label.url": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "URL"
|
||||
"value": "الرابط"
|
||||
}
|
||||
],
|
||||
"label.urls": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "URLs"
|
||||
"value": "الروابط"
|
||||
}
|
||||
],
|
||||
"label.user": [
|
||||
|
|
@ -1372,7 +1396,7 @@
|
|||
"label.user-property": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "User Property"
|
||||
"value": "سمات المستخدم"
|
||||
}
|
||||
],
|
||||
"label.username": [
|
||||
|
|
@ -1396,7 +1420,7 @@
|
|||
"label.utm-description": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Track your campaigns through UTM parameters."
|
||||
"value": "تابع حملاتك التسويقية باستخدام معلمات UTM."
|
||||
}
|
||||
],
|
||||
"label.value": [
|
||||
|
|
@ -1432,7 +1456,7 @@
|
|||
"label.views-per-visit": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Views per visit"
|
||||
"value": "مشاهدات لكل زيارة"
|
||||
}
|
||||
],
|
||||
"label.visit-duration": [
|
||||
|
|
@ -1450,7 +1474,7 @@
|
|||
"label.visits": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Visits"
|
||||
"value": "الزيارات"
|
||||
}
|
||||
],
|
||||
"label.website": [
|
||||
|
|
@ -1534,7 +1558,7 @@
|
|||
"message.collected-data": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "Collected data"
|
||||
"value": "البيانات المجمعة"
|
||||
}
|
||||
],
|
||||
"message.confirm-delete": [
|
||||
|
|
@ -1754,15 +1778,7 @@
|
|||
"message.share-url": [
|
||||
{
|
||||
"type": 0,
|
||||
"value": "هذا الرابط الذي تم مشاركته بشكل عام لـ "
|
||||
},
|
||||
{
|
||||
"type": 1,
|
||||
"value": "target"
|
||||
},
|
||||
{
|
||||
"type": 0,
|
||||
"value": "."
|
||||
"value": "إحصائيات موقعك متاحة للجميع على الرابط التالي:"
|
||||
}
|
||||
],
|
||||
"message.team-already-member": [
|
||||
|
|
|
|||
|
|
@ -5,13 +5,15 @@
|
|||
"label.add": "أضِف",
|
||||
"label.add-description": "أضِف وصف",
|
||||
"label.add-member": "أضِف عضو",
|
||||
"label.add-step": "Add step",
|
||||
"label.add-step": "إضافة خطوة",
|
||||
"label.add-website": "إضافة موقع",
|
||||
"label.admin": "مدير",
|
||||
"label.after": "يعد",
|
||||
"label.all": "الكل",
|
||||
"label.all-time": "كل الوقت",
|
||||
"label.analytics": "تحليلات",
|
||||
"label.attribution": "الإسناد",
|
||||
"label.attribution-description": "شاهد كيف يتفاعل المستخدمون مع حملاتك التسويقية وما الذي يحفز التحويلات.",
|
||||
"label.average": "المتوسط",
|
||||
"label.back": "للخلف",
|
||||
"label.before": "قبل",
|
||||
|
|
@ -19,17 +21,17 @@
|
|||
"label.breakdown": "التصنيف",
|
||||
"label.browser": "المتصفح",
|
||||
"label.browsers": "المتصفحات",
|
||||
"label.cancel": "ألغِ",
|
||||
"label.cancel": "إلغاء",
|
||||
"label.change-password": "تغيير كلمة المرور",
|
||||
"label.cities": "المدن",
|
||||
"label.city": "المدينة",
|
||||
"label.clear-all": "مسح الكل",
|
||||
"label.compare": "Compare",
|
||||
"label.compare": "المقارنة",
|
||||
"label.confirm": "تأكيد",
|
||||
"label.confirm-password": "تأكيد كلمة المرور",
|
||||
"label.contains": "يحتوي",
|
||||
"label.contains": "يحتوي على",
|
||||
"label.continue": "تابع",
|
||||
"label.count": "Count",
|
||||
"label.count": "العدد",
|
||||
"label.countries": "الدول",
|
||||
"label.country": "الدولة",
|
||||
"label.create": "أنشِئ",
|
||||
|
|
@ -38,10 +40,10 @@
|
|||
"label.create-user": "أنشِئ مستخدم",
|
||||
"label.created": "أُنشئت",
|
||||
"label.created-by": "أُنشئ من قبل",
|
||||
"label.current": "Current",
|
||||
"label.current": "الحالي",
|
||||
"label.current-password": "كلمة المرور الحالية",
|
||||
"label.custom-range": "فترة مخصّصة",
|
||||
"label.dashboard": "الشاشة الرئيسية",
|
||||
"label.dashboard": "لوحة التحكم",
|
||||
"label.data": "البيانات",
|
||||
"label.date": "التاريخ",
|
||||
"label.date-range": "فترة مخصّصة",
|
||||
|
|
@ -58,19 +60,19 @@
|
|||
"label.device": "الجهاز",
|
||||
"label.devices": "الأجهزة",
|
||||
"label.dismiss": "تجاهل",
|
||||
"label.does-not-contain": "لا يحتوي",
|
||||
"label.does-not-contain": "لا يحتوي على",
|
||||
"label.domain": "النطاق",
|
||||
"label.dropoff": "إنزال",
|
||||
"label.edit": "عدّل",
|
||||
"label.edit": "تعديل",
|
||||
"label.edit-dashboard": "عدّل لوحة التحكم",
|
||||
"label.edit-member": "عدّل العضو",
|
||||
"label.enable-share-url": "فعّل مشاركة الرابط",
|
||||
"label.end-step": "End Step",
|
||||
"label.entry": "Entry URL",
|
||||
"label.end-step": "الخطوة الأخيرة",
|
||||
"label.entry": "رابط الدخول",
|
||||
"label.event": "الحدث",
|
||||
"label.event-data": "تاريخ الحدث",
|
||||
"label.events": "الأحداث",
|
||||
"label.exit": "Exit URL",
|
||||
"label.exit": "رابط المغادرة",
|
||||
"label.false": "خطأ",
|
||||
"label.field": "الحقل",
|
||||
"label.fields": "الحقول",
|
||||
|
|
@ -78,33 +80,33 @@
|
|||
"label.filter-combined": "مُجمّعة",
|
||||
"label.filter-raw": "خام",
|
||||
"label.filters": "التصفيات",
|
||||
"label.first-seen": "First seen",
|
||||
"label.first-seen": "أول ظهور",
|
||||
"label.funnel": "قمع",
|
||||
"label.funnel-description": "فهم معدل التحويل والانقطاع عن المستخدمين.",
|
||||
"label.goal": "Goal",
|
||||
"label.goals": "Goals",
|
||||
"label.goals-description": "Track your goals for pageviews and events.",
|
||||
"label.goal": "الهدف",
|
||||
"label.goals": "الأهداف",
|
||||
"label.goals-description": "تابع تحقق أهدافك المرتبطة بمشاهدات الصفحات والأحداث.",
|
||||
"label.greater-than": "أكبَر مِن",
|
||||
"label.greater-than-equals": "أكبَر مِن أو يساوي",
|
||||
"label.host": "Host",
|
||||
"label.hosts": "Hosts",
|
||||
"label.insights": "نتائج التحليلات",
|
||||
"label.insights-description": "تعمق في بياناتك باستخدام الشرائح والتصفيات.",
|
||||
"label.is": "هو",
|
||||
"label.is-not": "لم",
|
||||
"label.is": "يساوي",
|
||||
"label.is-not": "لا يساوي",
|
||||
"label.is-not-set": "لم ضُبط",
|
||||
"label.is-set": "ضُبط",
|
||||
"label.join": "انضم",
|
||||
"label.join-team": "انضم للفريق",
|
||||
"label.journey": "Journey",
|
||||
"label.journey-description": "Understand how users navigate through your website.",
|
||||
"label.journey": "رحلة المستخدم",
|
||||
"label.journey-description": "تعرّف على كيفية تنقّل المستخدمين داخل موقعك.",
|
||||
"label.language": "اللغة",
|
||||
"label.languages": "اللغات",
|
||||
"label.laptop": "لابتوب",
|
||||
"label.last-days": "آخر {x} يوم/ايام",
|
||||
"label.last-hours": "آخر {x} ساعة",
|
||||
"label.last-months": "Last {x} months",
|
||||
"label.last-seen": "Last seen",
|
||||
"label.last-months": "آخر {x} شهر/أشهر",
|
||||
"label.last-seen": "آخر ظهور",
|
||||
"label.leave": "غادر",
|
||||
"label.leave-team": "مغادرة المجموعة",
|
||||
"label.less-than": "أقل مِن",
|
||||
|
|
@ -112,7 +114,7 @@
|
|||
"label.login": "تسجيل الدخول",
|
||||
"label.logout": "تسجيل الخروج",
|
||||
"label.manage": "التحكم",
|
||||
"label.manager": "Manager",
|
||||
"label.manager": "مدير",
|
||||
"label.max": "الحد الأقصى",
|
||||
"label.member": "عضو",
|
||||
"label.members": "الأعضاء",
|
||||
|
|
@ -134,15 +136,15 @@
|
|||
"label.pageTitle": "عنوان الصفحة",
|
||||
"label.pages": "الصفحات",
|
||||
"label.password": "كلمة المرور",
|
||||
"label.path": "Path",
|
||||
"label.paths": "Paths",
|
||||
"label.path": "المسار",
|
||||
"label.paths": "المسارات",
|
||||
"label.powered-by": "مشغل بواسطة {name}",
|
||||
"label.previous": "Previous",
|
||||
"label.previous-period": "Previous period",
|
||||
"label.previous-year": "Previous year",
|
||||
"label.previous": "السابق",
|
||||
"label.previous-period": "الفترة السابقة",
|
||||
"label.previous-year": "العام السابق",
|
||||
"label.profile": "الملف الشخصي",
|
||||
"label.properties": "Properties",
|
||||
"label.property": "Property",
|
||||
"label.properties": "الخصائص",
|
||||
"label.property": "الخاصية",
|
||||
"label.queries": "استعلامات",
|
||||
"label.query": "استعلام",
|
||||
"label.query-parameters": "متغيرات الرابط",
|
||||
|
|
@ -161,9 +163,9 @@
|
|||
"label.reset-website": "اعادة تعيين الإحصائيات",
|
||||
"label.retention": "الاحتفاظ",
|
||||
"label.retention-description": "قس مدى ثبات موقعك على الويب من خلال تتبع عدد مرات عودة المستخدمين.",
|
||||
"label.revenue": "Revenue",
|
||||
"label.revenue-description": "Look into your revenue across time.",
|
||||
"label.revenue-property": "Revenue Property",
|
||||
"label.revenue": "الإيرادات",
|
||||
"label.revenue-description": "قم بإلقاء نظرة على بيانات إيراداتك وكيفية إنفاق المستخدمين.",
|
||||
"label.revenue-property": "خاصية الإيرادات",
|
||||
"label.role": "الصلاحية",
|
||||
"label.run-query": "شغّل الاستعلام",
|
||||
"label.save": "حفظ",
|
||||
|
|
@ -173,22 +175,24 @@
|
|||
"label.select-date": "حدد التاريخ",
|
||||
"label.select-role": "حدد الدور",
|
||||
"label.select-website": "حدد موقع",
|
||||
"label.session": "Session",
|
||||
"label.session": "الزيارة",
|
||||
"label.sessions": "الزيارات",
|
||||
"label.settings": "الإعدادات",
|
||||
"label.share-url": "مشاركة الرابط",
|
||||
"label.single-day": "يوم واحد",
|
||||
"label.start-step": "Start Step",
|
||||
"label.steps": "Steps",
|
||||
"label.start-step": "الخطوة الأولى",
|
||||
"label.steps": "الخطوات",
|
||||
"label.sum": "المجموع",
|
||||
"label.tablet": "تابلت",
|
||||
"label.tag": "الوسم",
|
||||
"label.tags": "الوسوم",
|
||||
"label.team": "الفريق",
|
||||
"label.team-id": "معرّف الفريق",
|
||||
"label.team-manager": "Team manager",
|
||||
"label.team-manager": "مدير الفريق",
|
||||
"label.team-member": "عضو الفريق",
|
||||
"label.team-name": "اسم الفريق",
|
||||
"label.team-owner": "مدير الفريق",
|
||||
"label.team-view-only": "Team view only",
|
||||
"label.team-view-only": "عرض الفريق فقط",
|
||||
"label.team-websites": "مواقع الفريق",
|
||||
"label.teams": "الفرق",
|
||||
"label.theme": "السمة",
|
||||
|
|
@ -202,34 +206,34 @@
|
|||
"label.total": "الإجمالي",
|
||||
"label.total-records": "إجمالي السجلات",
|
||||
"label.tracking-code": "كود التتبع",
|
||||
"label.transactions": "Transactions",
|
||||
"label.transfer": "Transfer",
|
||||
"label.transactions": "المعاملات",
|
||||
"label.transfer": "نقل",
|
||||
"label.transfer-website": "انقل الموقع",
|
||||
"label.true": "حقيقي",
|
||||
"label.type": "النوع",
|
||||
"label.unique": "فريد",
|
||||
"label.unique-visitors": "زائرون فريدون",
|
||||
"label.uniqueCustomers": "Unique Customers",
|
||||
"label.uniqueCustomers": "العملاء الفريدون",
|
||||
"label.unknown": "غير معروف",
|
||||
"label.untitled": "بدون عنوان",
|
||||
"label.update": "Update",
|
||||
"label.url": "URL",
|
||||
"label.urls": "URLs",
|
||||
"label.update": "تحديث",
|
||||
"label.url": "الرابط",
|
||||
"label.urls": "الروابط",
|
||||
"label.user": "المستخدم",
|
||||
"label.user-property": "User Property",
|
||||
"label.user-property": "سمات المستخدم",
|
||||
"label.username": "اسم المستخدم",
|
||||
"label.users": "المستخدمين",
|
||||
"label.utm": "UTM",
|
||||
"label.utm-description": "Track your campaigns through UTM parameters.",
|
||||
"label.utm-description": "تابع حملاتك التسويقية باستخدام معلمات UTM.",
|
||||
"label.value": "القيمة",
|
||||
"label.view": "عرض",
|
||||
"label.view-details": "عرض التفاصيل",
|
||||
"label.view-only": "عرض فقط",
|
||||
"label.views": "المشاهدات",
|
||||
"label.views-per-visit": "Views per visit",
|
||||
"label.views-per-visit": "مشاهدات لكل زيارة",
|
||||
"label.visit-duration": "متوسط وقت الزيارة",
|
||||
"label.visitors": "الزوار",
|
||||
"label.visits": "Visits",
|
||||
"label.visits": "الزيارات",
|
||||
"label.website": "الموقع",
|
||||
"label.website-id": "معرّف الموقع",
|
||||
"label.websites": "المواقع",
|
||||
|
|
@ -237,7 +241,7 @@
|
|||
"label.yesterday": "الأمس",
|
||||
"message.action-confirmation": "اكتب {confirmation} في المربع أدناه للتأكيد.",
|
||||
"message.active-users": "{x} حاليا {x, plural, one {زائر واحد} other {زوار}}",
|
||||
"message.collected-data": "Collected data",
|
||||
"message.collected-data": "البيانات المجمعة",
|
||||
"message.confirm-delete": "هل أنت متأكد من حذف {target}?",
|
||||
"message.confirm-leave": "هل أنت متأكد من مغادرة {target}?",
|
||||
"message.confirm-remove": "هل انت متأكد من حذف {target}?",
|
||||
|
|
@ -261,9 +265,9 @@
|
|||
"message.no-websites-configured": "لم تقم بإعداد اي موقع.",
|
||||
"message.page-not-found": "الصفحة غير موجودة.",
|
||||
"message.reset-website": "لإعادة ضبط موقع الويب هذا، اكتب {confirmation} في المربع أدناه للتأكيد.",
|
||||
"message.reset-website-warning": "سيتم اعادة تعيين كافة الإحصائيات لهذا الموقع، لكن لن يتم تعيير كود التتبع",
|
||||
"message.reset-website-warning": "سيتم اعادة تعيين كافة الإحصائيات لهذا الموقع، لكن لن يتم تغيير كود التتبع",
|
||||
"message.saved": "تم الحفظ بنجاح.",
|
||||
"message.share-url": "هذا الرابط الذي تم مشاركته بشكل عام لـ {target}.",
|
||||
"message.share-url": "إحصائيات موقعك متاحة للجميع على الرابط التالي:",
|
||||
"message.team-already-member": "أنت عضو في الفريق",
|
||||
"message.team-not-found": "لم يتم العثور على الفريق",
|
||||
"message.team-websites-info": "يمكن مشاهدة الموقع من اي عضو في الفريق.",
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import kafka from '@/lib/kafka';
|
|||
import prisma from '@/lib/prisma';
|
||||
import { uuid } from '@/lib/crypto';
|
||||
import { saveEventData } from './saveEventData';
|
||||
import { saveRevenue } from './saveRevenue';
|
||||
|
||||
export interface SaveEventArgs {
|
||||
websiteId: string;
|
||||
|
|
@ -130,6 +131,20 @@ async function relationalQuery({
|
|||
eventData,
|
||||
createdAt,
|
||||
});
|
||||
|
||||
const { revenue, currency } = eventData;
|
||||
|
||||
if (revenue > 0 && currency) {
|
||||
await saveRevenue({
|
||||
websiteId,
|
||||
sessionId,
|
||||
eventId: websiteEventId,
|
||||
eventName: eventName?.substring(0, EVENT_NAME_LENGTH),
|
||||
currency,
|
||||
revenue,
|
||||
createdAt,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
36
src/queries/sql/events/saveRevenue.ts
Normal file
36
src/queries/sql/events/saveRevenue.ts
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
import { uuid } from '@/lib/crypto';
|
||||
import { PRISMA, runQuery } from '@/lib/db';
|
||||
import prisma from '@/lib/prisma';
|
||||
|
||||
export interface SaveRevenueArgs {
|
||||
websiteId: string;
|
||||
sessionId: string;
|
||||
eventId: string;
|
||||
eventName: string;
|
||||
currency: string;
|
||||
revenue: number;
|
||||
createdAt: Date;
|
||||
}
|
||||
|
||||
export async function saveRevenue(data: SaveRevenueArgs) {
|
||||
return runQuery({
|
||||
[PRISMA]: () => relationalQuery(data),
|
||||
});
|
||||
}
|
||||
|
||||
async function relationalQuery(data: SaveRevenueArgs) {
|
||||
const { websiteId, sessionId, eventId, eventName, currency, revenue, createdAt } = data;
|
||||
|
||||
await prisma.client.revenue.create({
|
||||
data: {
|
||||
id: uuid(),
|
||||
websiteId,
|
||||
sessionId,
|
||||
eventId,
|
||||
eventName,
|
||||
currency,
|
||||
revenue,
|
||||
createdAt,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
|
@ -69,26 +69,16 @@ async function relationalQuery(
|
|||
group by 1),`;
|
||||
|
||||
const revenueEventQuery = `WITH events AS (
|
||||
select
|
||||
we.session_id,
|
||||
max(ed.created_at) max_dt,
|
||||
sum(coalesce(cast(number_value as decimal(10,2)), cast(string_value as decimal(10,2)))) value
|
||||
from event_data ed
|
||||
join website_event we
|
||||
on we.event_id = ed.website_event_id
|
||||
and we.website_id = ed.website_id
|
||||
join (select website_event_id
|
||||
from event_data
|
||||
where website_id = {{websiteId::uuid}}
|
||||
and created_at between {{startDate}} and {{endDate}}
|
||||
and data_key ${like} '%currency%'
|
||||
and string_value = {{currency}}) currency
|
||||
on currency.website_event_id = ed.website_event_id
|
||||
where ed.website_id = {{websiteId::uuid}}
|
||||
and ed.created_at between {{startDate}} and {{endDate}}
|
||||
and ${column} = {{conversionStep}}
|
||||
and ed.data_key ${like} '%revenue%'
|
||||
group by 1),`;
|
||||
select
|
||||
session_id,
|
||||
max(created_at) max_dt,
|
||||
sum(revenue) value
|
||||
from revenue
|
||||
where website_id = {{websiteId::uuid}}
|
||||
and created_at between {{startDate}} and {{endDate}}
|
||||
and ${column} = {{conversionStep}}
|
||||
and currency ${like} {{currency}}
|
||||
group by 1),`;
|
||||
|
||||
function getModelQuery(model: string) {
|
||||
return model === 'firstClick'
|
||||
|
|
|
|||
|
|
@ -38,22 +38,13 @@ async function relationalQuery(
|
|||
const chartRes = await rawQuery(
|
||||
`
|
||||
select
|
||||
we.event_name x,
|
||||
${getDateSQL('ed.created_at', unit)} t,
|
||||
sum(coalesce(cast(number_value as decimal(10,2)), cast(string_value as decimal(10,2)))) y
|
||||
from event_data ed
|
||||
join website_event we
|
||||
on we.event_id = ed.website_event_id
|
||||
join (select website_event_id
|
||||
from event_data
|
||||
where website_id = {{websiteId::uuid}}
|
||||
and created_at between {{startDate}} and {{endDate}}
|
||||
and data_key ${like} '%currency%'
|
||||
and string_value = {{currency}}) currency
|
||||
on currency.website_event_id = ed.website_event_id
|
||||
where ed.website_id = {{websiteId::uuid}}
|
||||
and ed.created_at between {{startDate}} and {{endDate}}
|
||||
and ed.data_key ${like} '%revenue%'
|
||||
event_name x,
|
||||
${getDateSQL('created_at', unit)} t,
|
||||
sum(revenue) y
|
||||
from revenue
|
||||
where website_id = {{websiteId::uuid}}
|
||||
and created_at between {{startDate}} and {{endDate}}
|
||||
and currency ${like} {{currency}}
|
||||
group by x, t
|
||||
order by t
|
||||
`,
|
||||
|
|
@ -64,22 +55,13 @@ async function relationalQuery(
|
|||
`
|
||||
select
|
||||
s.country as name,
|
||||
sum(coalesce(cast(number_value as decimal(10,2)), cast(string_value as decimal(10,2)))) value
|
||||
from event_data ed
|
||||
join website_event we
|
||||
on we.event_id = ed.website_event_id
|
||||
sum(r.revenue) value
|
||||
from revenue r
|
||||
join session s
|
||||
on s.session_id = we.session_id
|
||||
join (select website_event_id
|
||||
from event_data
|
||||
where website_id = {{websiteId::uuid}}
|
||||
and created_at between {{startDate}} and {{endDate}}
|
||||
and data_key ${like} '%currency%'
|
||||
and string_value = {{currency}}) currency
|
||||
on currency.website_event_id = ed.website_event_id
|
||||
where ed.website_id = {{websiteId::uuid}}
|
||||
and ed.created_at between {{startDate}} and {{endDate}}
|
||||
and ed.data_key ${like} '%revenue%'
|
||||
on s.session_id = r.session_id
|
||||
where r.website_id = {{websiteId::uuid}}
|
||||
and r.created_at between {{startDate}} and {{endDate}}
|
||||
and r.currency ${like} {{currency}}
|
||||
group by s.country
|
||||
`,
|
||||
{ websiteId, startDate, endDate, currency },
|
||||
|
|
@ -88,22 +70,13 @@ async function relationalQuery(
|
|||
const totalRes = await rawQuery(
|
||||
`
|
||||
select
|
||||
sum(coalesce(cast(number_value as decimal(10,2)), cast(string_value as decimal(10,2)))) as sum,
|
||||
sum(revenue) as sum,
|
||||
count(distinct event_id) as count,
|
||||
count(distinct session_id) as unique_count
|
||||
from event_data ed
|
||||
join website_event we
|
||||
on we.event_id = ed.website_event_id
|
||||
join (select website_event_id
|
||||
from event_data
|
||||
where website_id = {{websiteId::uuid}}
|
||||
and created_at between {{startDate}} and {{endDate}}
|
||||
and data_key ${like} '%currency%'
|
||||
and string_value = {{currency}}) currency
|
||||
on currency.website_event_id = ed.website_event_id
|
||||
where ed.website_id = {{websiteId::uuid}}
|
||||
and ed.created_at between {{startDate}} and {{endDate}}
|
||||
and ed.data_key ${like} '%revenue%'
|
||||
from revenue r
|
||||
where website_id = {{websiteId::uuid}}
|
||||
and created_at between {{startDate}} and {{endDate}}
|
||||
and currency ${like} {{currency}}
|
||||
`,
|
||||
{ websiteId, startDate, endDate, currency },
|
||||
).then(result => result?.[0]);
|
||||
|
|
@ -111,24 +84,15 @@ async function relationalQuery(
|
|||
const tableRes = await rawQuery(
|
||||
`
|
||||
select
|
||||
c.currency,
|
||||
sum(coalesce(cast(number_value as decimal(10,2)), cast(string_value as decimal(10,2)))) as sum,
|
||||
count(distinct ed.website_event_id) as count,
|
||||
count(distinct we.session_id) as unique_count
|
||||
from event_data ed
|
||||
join website_event we
|
||||
on we.event_id = ed.website_event_id
|
||||
join (select website_event_id, string_value as currency
|
||||
from event_data
|
||||
where website_id = {{websiteId::uuid}}
|
||||
and created_at between {{startDate}} and {{endDate}}
|
||||
and data_key ${like} '%currency%') c
|
||||
on c.website_event_id = ed.website_event_id
|
||||
where ed.website_id = {{websiteId::uuid}}
|
||||
and ed.created_at between {{startDate}} and {{endDate}}
|
||||
and ed.data_key ${like} '%revenue%'
|
||||
group by c.currency
|
||||
order by sum desc;
|
||||
currency,
|
||||
sum(revenue) as sum,
|
||||
count(distinct event_id) as count,
|
||||
count(distinct session_id) as unique_count
|
||||
from revenue r
|
||||
where website_id = {{websiteId::uuid}}
|
||||
and created_at between {{startDate}} and {{endDate}}
|
||||
group by currency
|
||||
order by sum desc
|
||||
`,
|
||||
{ websiteId, startDate, endDate, unit, currency },
|
||||
);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue