mirror of
https://github.com/vas3k/TaxHacker.git
synced 2025-12-21 13:00:24 -06:00
ci: use local prisma client
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -47,6 +47,7 @@ yarn-error.log*
|
||||
next-env.d.ts
|
||||
|
||||
# databases
|
||||
prisma/client
|
||||
pgdata
|
||||
*.db
|
||||
*.sqlite
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { fileExists, fullPathForFile } from "@/lib/files"
|
||||
import { generateFilePreviews } from "@/lib/previews/generate"
|
||||
import { File, User } from "@prisma/client"
|
||||
import { File, User } from "@/prisma/client"
|
||||
import fs from "fs/promises"
|
||||
|
||||
const MAX_PAGES_TO_ANALYZE = 4
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Category, Field, Project } from "@prisma/client"
|
||||
import { Category, Field, Project } from "@/prisma/client"
|
||||
|
||||
export function buildLLMPrompt(
|
||||
promptTemplate: string,
|
||||
|
||||
13
ai/schema.ts
13
ai/schema.ts
@@ -1,13 +1,16 @@
|
||||
import { Field } from "@prisma/client"
|
||||
import { Field } from "@/prisma/client"
|
||||
|
||||
export const fieldsToJsonSchema = (fields: Field[]) => {
|
||||
const fieldsWithPrompt = fields.filter((field) => field.llm_prompt)
|
||||
const schema = {
|
||||
type: "object",
|
||||
properties: fieldsWithPrompt.reduce((acc, field) => {
|
||||
acc[field.code] = { type: field.type, description: field.llm_prompt || "" }
|
||||
return acc
|
||||
}, {} as Record<string, { type: string; description: string }>),
|
||||
properties: fieldsWithPrompt.reduce(
|
||||
(acc, field) => {
|
||||
acc[field.code] = { type: field.type, description: field.llm_prompt || "" }
|
||||
return acc
|
||||
},
|
||||
{} as Record<string, { type: string; description: string }>
|
||||
),
|
||||
required: fieldsWithPrompt.map((field) => field.code),
|
||||
additionalProperties: false,
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@ import { ActionState } from "@/lib/actions"
|
||||
import { getCurrentUser } from "@/lib/auth"
|
||||
import { EXPORT_AND_IMPORT_FIELD_MAP } from "@/models/export_and_import"
|
||||
import { createTransaction } from "@/models/transactions"
|
||||
import { Transaction } from "@/prisma/client"
|
||||
import { parse } from "@fast-csv/parse"
|
||||
import { Transaction } from "@prisma/client"
|
||||
import { revalidatePath } from "next/cache"
|
||||
|
||||
export async function parseCSVAction(
|
||||
|
||||
@@ -17,7 +17,7 @@ import { createField, deleteField, updateField } from "@/models/fields"
|
||||
import { createProject, deleteProject, updateProject } from "@/models/projects"
|
||||
import { SettingsMap, updateSettings } from "@/models/settings"
|
||||
import { updateUser } from "@/models/users"
|
||||
import { Prisma, User } from "@prisma/client"
|
||||
import { Prisma, User } from "@/prisma/client"
|
||||
import { revalidatePath } from "next/cache"
|
||||
import { redirect } from "next/navigation"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ import { CrudTable } from "@/components/settings/crud"
|
||||
import { getCurrentUser } from "@/lib/auth"
|
||||
import { randomHexColor } from "@/lib/utils"
|
||||
import { getCategories } from "@/models/categories"
|
||||
import { Prisma } from "@prisma/client"
|
||||
import { Prisma } from "@/prisma/client"
|
||||
|
||||
export default async function CategoriesSettingsPage() {
|
||||
const user = await getCurrentUser()
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
import { prisma } from "@/lib/db"
|
||||
import { DEFAULT_CATEGORIES, DEFAULT_CURRENCIES, DEFAULT_FIELDS, DEFAULT_SETTINGS } from "@/models/defaults"
|
||||
import { User } from "@prisma/client"
|
||||
import { User } from "@/prisma/client"
|
||||
import { redirect } from "next/navigation"
|
||||
|
||||
export async function resetLLMSettings(user: User) {
|
||||
|
||||
@@ -2,7 +2,7 @@ import { addFieldAction, deleteFieldAction, editFieldAction } from "@/app/(app)/
|
||||
import { CrudTable } from "@/components/settings/crud"
|
||||
import { getCurrentUser } from "@/lib/auth"
|
||||
import { getFields } from "@/models/fields"
|
||||
import { Prisma } from "@prisma/client"
|
||||
import { Prisma } from "@/prisma/client"
|
||||
|
||||
export default async function FieldsSettingsPage() {
|
||||
const user = await getCurrentUser()
|
||||
|
||||
@@ -3,7 +3,7 @@ import { CrudTable } from "@/components/settings/crud"
|
||||
import { getCurrentUser } from "@/lib/auth"
|
||||
import { randomHexColor } from "@/lib/utils"
|
||||
import { getProjects } from "@/models/projects"
|
||||
import { Prisma } from "@prisma/client"
|
||||
import { Prisma } from "@/prisma/client"
|
||||
|
||||
export default async function ProjectsSettingsPage() {
|
||||
const user = await getCurrentUser()
|
||||
|
||||
@@ -20,7 +20,7 @@ import {
|
||||
updateTransactionFiles,
|
||||
} from "@/models/transactions"
|
||||
import { updateUser } from "@/models/users"
|
||||
import { Transaction } from "@prisma/client"
|
||||
import { Transaction } from "@/prisma/client"
|
||||
import { randomUUID } from "crypto"
|
||||
import { mkdir, writeFile } from "fs/promises"
|
||||
import { revalidatePath } from "next/cache"
|
||||
|
||||
@@ -13,7 +13,7 @@ import { DEFAULT_PROMPT_ANALYSE_NEW_FILE } from "@/models/defaults"
|
||||
import { deleteFile, getFileById, updateFile } from "@/models/files"
|
||||
import { createTransaction, updateTransactionFiles } from "@/models/transactions"
|
||||
import { updateUser } from "@/models/users"
|
||||
import { Category, Field, File, Project, Transaction } from "@prisma/client"
|
||||
import { Category, Field, File, Project, Transaction } from "@/prisma/client"
|
||||
import { mkdir, rename } from "fs/promises"
|
||||
import { revalidatePath } from "next/cache"
|
||||
import path from "path"
|
||||
|
||||
@@ -77,5 +77,3 @@ export default async function SelfHostedWelcomePage() {
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export const dynamic = "force-dynamic"
|
||||
|
||||
@@ -2,7 +2,7 @@ import { Badge } from "@/components/ui/badge"
|
||||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
|
||||
import { formatCurrency } from "@/lib/utils"
|
||||
import { ProjectStats } from "@/models/stats"
|
||||
import { Project } from "@prisma/client"
|
||||
import { Project } from "@/prisma/client"
|
||||
import { Plus } from "lucide-react"
|
||||
import Link from "next/link"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
"use client"
|
||||
|
||||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
|
||||
import { File } from "@prisma/client"
|
||||
import { File } from "@/prisma/client"
|
||||
import { Cake, FilePlus } from "lucide-react"
|
||||
import Link from "next/link"
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ import {
|
||||
} from "@/components/ui/dialog"
|
||||
import { Separator } from "@/components/ui/separator"
|
||||
import { useTransactionFilters } from "@/hooks/use-transaction-filters"
|
||||
import { Category, Field, Project } from "@prisma/client"
|
||||
import { Category, Field, Project } from "@/prisma/client"
|
||||
import { formatDate } from "date-fns"
|
||||
import { useRouter } from "next/navigation"
|
||||
import { useState } from "react"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
"use client"
|
||||
|
||||
import { formatBytes } from "@/lib/utils"
|
||||
import { File } from "@prisma/client"
|
||||
import { File } from "@/prisma/client"
|
||||
import Image from "next/image"
|
||||
import Link from "next/link"
|
||||
import { useState } from "react"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"use client"
|
||||
|
||||
import { Category } from "@prisma/client"
|
||||
import { Category } from "@/prisma/client"
|
||||
import { SelectProps } from "@radix-ui/react-select"
|
||||
import { useMemo } from "react"
|
||||
import { FormSelect } from "./simple"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Project } from "@prisma/client"
|
||||
import { Project } from "@/prisma/client"
|
||||
import { SelectProps } from "@radix-ui/react-select"
|
||||
import { FormSelect } from "./simple"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import { parseCSVAction, saveTransactionsAction } from "@/app/(app)/import/csv/actions"
|
||||
import { FormError } from "@/components/forms/error"
|
||||
import { Button } from "@/components/ui/button"
|
||||
import { Field } from "@prisma/client"
|
||||
import { Field } from "@/prisma/client"
|
||||
import { Loader2, Play, Upload } from "lucide-react"
|
||||
import { useRouter } from "next/navigation"
|
||||
import { startTransition, useActionState, useEffect, useState } from "react"
|
||||
|
||||
@@ -6,7 +6,7 @@ import { FormSelectCategory } from "@/components/forms/select-category"
|
||||
import { FormSelectCurrency } from "@/components/forms/select-currency"
|
||||
import { FormSelectType } from "@/components/forms/select-type"
|
||||
import { Button } from "@/components/ui/button"
|
||||
import { Category, Currency } from "@prisma/client"
|
||||
import { Category, Currency } from "@/prisma/client"
|
||||
import { CircleCheckBig } from "lucide-react"
|
||||
import { useActionState } from "react"
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import { FormError } from "@/components/forms/error"
|
||||
import { FormInput, FormTextarea } from "@/components/forms/simple"
|
||||
import { Button } from "@/components/ui/button"
|
||||
import { Card, CardTitle } from "@/components/ui/card"
|
||||
import { Field } from "@prisma/client"
|
||||
import { Field } from "@/prisma/client"
|
||||
import { CircleCheckBig, Edit } from "lucide-react"
|
||||
import Link from "next/link"
|
||||
import { useActionState } from "react"
|
||||
|
||||
@@ -4,7 +4,7 @@ import { saveProfileAction } from "@/app/(app)/settings/actions"
|
||||
import { FormError } from "@/components/forms/error"
|
||||
import { FormInput } from "@/components/forms/simple"
|
||||
import { Button } from "@/components/ui/button"
|
||||
import { User } from "@prisma/client"
|
||||
import { User } from "@/prisma/client"
|
||||
import { CircleCheckBig } from "lucide-react"
|
||||
import { useActionState } from "react"
|
||||
import { SubscriptionPlan } from "./subscription-plan"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { User } from "@prisma/client"
|
||||
import { User } from "@/prisma/client"
|
||||
|
||||
import { PricingCard } from "@/components/auth/pricing-card"
|
||||
import { Button } from "@/components/ui/button"
|
||||
|
||||
@@ -8,7 +8,7 @@ import { FormSelectProject } from "@/components/forms/select-project"
|
||||
import { FormSelectType } from "@/components/forms/select-type"
|
||||
import { FormInput, FormTextarea } from "@/components/forms/simple"
|
||||
import { Button } from "@/components/ui/button"
|
||||
import { Category, Currency, Project } from "@prisma/client"
|
||||
import { Category, Currency, Project } from "@/prisma/client"
|
||||
import { format } from "date-fns"
|
||||
import { Import, Loader2 } from "lucide-react"
|
||||
import Link from "next/link"
|
||||
|
||||
@@ -8,7 +8,7 @@ import { FormSelectProject } from "@/components/forms/select-project"
|
||||
import { FormSelectType } from "@/components/forms/select-type"
|
||||
import { FormInput, FormTextarea } from "@/components/forms/simple"
|
||||
import { Button } from "@/components/ui/button"
|
||||
import { Category, Currency, Field, Project, Transaction } from "@prisma/client"
|
||||
import { Category, Currency, Field, Project, Transaction } from "@/prisma/client"
|
||||
import { format } from "date-fns"
|
||||
import { Loader2 } from "lucide-react"
|
||||
import { useRouter } from "next/navigation"
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
DropdownMenuSeparator,
|
||||
DropdownMenuTrigger,
|
||||
} from "@/components/ui/dropdown-menu"
|
||||
import { Field } from "@prisma/client"
|
||||
import { Field } from "@/prisma/client"
|
||||
import { ColumnsIcon } from "lucide-react"
|
||||
import { useRouter } from "next/navigation"
|
||||
import { useState } from "react"
|
||||
|
||||
@@ -7,7 +7,7 @@ import { Input } from "@/components/ui/input"
|
||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
|
||||
import { isFiltered, useTransactionFilters } from "@/hooks/use-transaction-filters"
|
||||
import { TransactionFilters } from "@/models/transactions"
|
||||
import { Category, Field, Project } from "@prisma/client"
|
||||
import { Category, Field, Project } from "@/prisma/client"
|
||||
import { X } from "lucide-react"
|
||||
|
||||
export function TransactionSearchAndFilters({
|
||||
|
||||
@@ -6,7 +6,7 @@ import { Checkbox } from "@/components/ui/checkbox"
|
||||
import { Table, TableBody, TableCell, TableFooter, TableHead, TableHeader, TableRow } from "@/components/ui/table"
|
||||
import { calcTotalPerCurrency } from "@/lib/stats"
|
||||
import { cn, formatCurrency } from "@/lib/utils"
|
||||
import { Category, Field, Project, Transaction } from "@prisma/client"
|
||||
import { Category, Field, Project, Transaction } from "@/prisma/client"
|
||||
import { formatDate } from "date-fns"
|
||||
import { ArrowDownIcon, ArrowUpIcon, File } from "lucide-react"
|
||||
import { useRouter, useSearchParams } from "next/navigation"
|
||||
|
||||
@@ -5,7 +5,7 @@ import { FilePreview } from "@/components/files/preview"
|
||||
import { Button } from "@/components/ui/button"
|
||||
import { Card } from "@/components/ui/card"
|
||||
import config from "@/lib/config"
|
||||
import { File, Transaction } from "@prisma/client"
|
||||
import { File, Transaction } from "@/prisma/client"
|
||||
import { Loader2, Upload, X } from "lucide-react"
|
||||
import { useState } from "react"
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import { FormSelectProject } from "@/components/forms/select-project"
|
||||
import { FormSelectType } from "@/components/forms/select-type"
|
||||
import { FormInput, FormTextarea } from "@/components/forms/simple"
|
||||
import { Button } from "@/components/ui/button"
|
||||
import { Category, Currency, Field, File, Project } from "@prisma/client"
|
||||
import { Category, Currency, Field, File, Project } from "@/prisma/client"
|
||||
import { format } from "date-fns"
|
||||
import { Brain, Loader2 } from "lucide-react"
|
||||
import { startTransition, useActionState, useMemo, useState } from "react"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import config from "@/lib/config"
|
||||
import { getSelfHostedUser, getUserByEmail, getUserById, SELF_HOSTED_USER } from "@/models/users"
|
||||
import { User } from "@prisma/client"
|
||||
import { User } from "@/prisma/client"
|
||||
import { betterAuth } from "better-auth"
|
||||
import { prismaAdapter } from "better-auth/adapters/prisma"
|
||||
import { APIError } from "better-auth/api"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { PrismaClient } from "@prisma/client"
|
||||
import { PrismaClient } from "@/prisma/client"
|
||||
|
||||
const globalForPrisma = globalThis as unknown as {
|
||||
prisma: PrismaClient | undefined
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { File, Transaction, User } from "@prisma/client"
|
||||
import { File, Transaction, User } from "@/prisma/client"
|
||||
import { access, constants, readdir, stat } from "fs/promises"
|
||||
import path from "path"
|
||||
import config from "./config"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { resizeImage } from "@/lib/previews/images"
|
||||
import { pdfToImages } from "@/lib/previews/pdf"
|
||||
import { User } from "@prisma/client"
|
||||
import { User } from "@/prisma/client"
|
||||
|
||||
export async function generateFilePreviews(
|
||||
user: User,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
"use server"
|
||||
|
||||
import { fileExists, getUserPreviewsDirectory } from "@/lib/files"
|
||||
import { User } from "@prisma/client"
|
||||
import { User } from "@/prisma/client"
|
||||
import fs from "fs/promises"
|
||||
import path from "path"
|
||||
import sharp from "sharp"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
"use server"
|
||||
|
||||
import { fileExists, getUserPreviewsDirectory } from "@/lib/files"
|
||||
import { User } from "@prisma/client"
|
||||
import { User } from "@/prisma/client"
|
||||
import fs from "fs/promises"
|
||||
import path from "path"
|
||||
import { fromPath } from "pdf2pic"
|
||||
|
||||
25
lib/stats.ts
25
lib/stats.ts
@@ -1,14 +1,17 @@
|
||||
import { Transaction } from "@prisma/client"
|
||||
import { Transaction } from "@/prisma/client"
|
||||
|
||||
export function calcTotalPerCurrency(transactions: Transaction[]): Record<string, number> {
|
||||
return transactions.reduce((acc, transaction) => {
|
||||
if (transaction.convertedCurrencyCode) {
|
||||
acc[transaction.convertedCurrencyCode.toUpperCase()] =
|
||||
(acc[transaction.convertedCurrencyCode.toUpperCase()] || 0) + (transaction.convertedTotal || 0)
|
||||
} else if (transaction.currencyCode) {
|
||||
acc[transaction.currencyCode.toUpperCase()] =
|
||||
(acc[transaction.currencyCode.toUpperCase()] || 0) + (transaction.total || 0)
|
||||
}
|
||||
return acc
|
||||
}, {} as Record<string, number>)
|
||||
return transactions.reduce(
|
||||
(acc, transaction) => {
|
||||
if (transaction.convertedCurrencyCode) {
|
||||
acc[transaction.convertedCurrencyCode.toUpperCase()] =
|
||||
(acc[transaction.convertedCurrencyCode.toUpperCase()] || 0) + (transaction.convertedTotal || 0)
|
||||
} else if (transaction.currencyCode) {
|
||||
acc[transaction.currencyCode.toUpperCase()] =
|
||||
(acc[transaction.currencyCode.toUpperCase()] || 0) + (transaction.total || 0)
|
||||
}
|
||||
return acc
|
||||
},
|
||||
{} as Record<string, number>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { prisma } from "@/lib/db"
|
||||
import { codeFromName } from "@/lib/utils"
|
||||
import { Prisma } from "@prisma/client"
|
||||
import { Prisma } from "@/prisma/client"
|
||||
import { cache } from "react"
|
||||
|
||||
export type CategoryData = {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { prisma } from "@/lib/db"
|
||||
import { Prisma } from "@prisma/client"
|
||||
import { Prisma } from "@/prisma/client"
|
||||
import { cache } from "react"
|
||||
|
||||
export const getCurrencies = cache(async (userId: string) => {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { prisma } from "@/lib/db"
|
||||
import { codeFromName } from "@/lib/utils"
|
||||
import { Prisma } from "@prisma/client"
|
||||
import { Prisma } from "@/prisma/client"
|
||||
import { cache } from "react"
|
||||
|
||||
export type FieldData = {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { prisma } from "@/lib/db"
|
||||
import { codeFromName } from "@/lib/utils"
|
||||
import { Prisma } from "@prisma/client"
|
||||
import { Prisma } from "@/prisma/client"
|
||||
import { cache } from "react"
|
||||
|
||||
export type ProjectData = {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { prisma } from "@/lib/db"
|
||||
import { calcTotalPerCurrency } from "@/lib/stats"
|
||||
import { Prisma } from "@prisma/client"
|
||||
import { Prisma } from "@/prisma/client"
|
||||
import { cache } from "react"
|
||||
import { TransactionFilters } from "./transactions"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { prisma } from "@/lib/db"
|
||||
import { Field, Prisma, Transaction } from "@prisma/client"
|
||||
import { Field, Prisma, Transaction } from "@/prisma/client"
|
||||
import { cache } from "react"
|
||||
import { getFields } from "./fields"
|
||||
import { deleteFile } from "./files"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { prisma } from "@/lib/db"
|
||||
import { Prisma } from "@prisma/client"
|
||||
import { Prisma } from "@/prisma/client"
|
||||
import { cache } from "react"
|
||||
|
||||
export const SELF_HOSTED_USER = {
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"scripts": {
|
||||
"dev": "next dev -p 7331 --turbopack",
|
||||
"build": "next build",
|
||||
"start": "prisma migrate deploy && next start",
|
||||
"start": "prisma generate && prisma migrate deploy && next start",
|
||||
"lint": "next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
output = "client"
|
||||
}
|
||||
|
||||
datasource db {
|
||||
|
||||
Reference in New Issue
Block a user