mirror of
https://github.com/marcogll/TaxHacker_s23.git
synced 2026-01-13 13:25:18 +00:00
fix: rename data -> models
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
PORT=7331
|
PORT=7331
|
||||||
UPLOAD_PATH="./uploads"
|
UPLOAD_PATH="./data/uploads"
|
||||||
DATABASE_URL="file:./db.sqlite"
|
DATABASE_URL="file:../data/db.sqlite"
|
||||||
PROMPT_ANALYSE_NEW_FILE="You are an accountant and invoice analysis assistant.
|
PROMPT_ANALYSE_NEW_FILE="You are an accountant and invoice analysis assistant.
|
||||||
Extract the following information from the given invoice:
|
Extract the following information from the given invoice:
|
||||||
|
|
||||||
|
|||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1,7 +1,7 @@
|
|||||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||||
|
|
||||||
# uploads
|
# data directory
|
||||||
/uploads/*
|
/data/*
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
/node_modules
|
/node_modules
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { ExportFields, ExportFilters, exportImportFieldsMapping } from "@/data/export_and_import"
|
import { ExportFields, ExportFilters, exportImportFieldsMapping } from "@/models/export_and_import"
|
||||||
import { getFields } from "@/data/fields"
|
import { getFields } from "@/models/fields"
|
||||||
import { getFilesByTransactionId } from "@/data/files"
|
import { getFilesByTransactionId } from "@/models/files"
|
||||||
import { getTransactions } from "@/data/transactions"
|
import { getTransactions } from "@/models/transactions"
|
||||||
import { format } from "@fast-csv/format"
|
import { format } from "@fast-csv/format"
|
||||||
import { formatDate } from "date-fns"
|
import { formatDate } from "date-fns"
|
||||||
import fs from "fs"
|
import fs from "fs"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
"use server"
|
"use server"
|
||||||
|
|
||||||
import { createFile } from "@/data/files"
|
|
||||||
import { FILE_UNSORTED_UPLOAD_PATH, getUnsortedFileUploadPath } from "@/lib/files"
|
import { FILE_UNSORTED_UPLOAD_PATH, getUnsortedFileUploadPath } from "@/lib/files"
|
||||||
|
import { createFile } from "@/models/files"
|
||||||
import { existsSync } from "fs"
|
import { existsSync } from "fs"
|
||||||
import { mkdir, writeFile } from "fs/promises"
|
import { mkdir, writeFile } from "fs/promises"
|
||||||
import { revalidatePath } from "next/cache"
|
import { revalidatePath } from "next/cache"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { getFileById } from "@/data/files"
|
import { getFileById } from "@/models/files"
|
||||||
import fs from "fs/promises"
|
import fs from "fs/promises"
|
||||||
import { NextResponse } from "next/server"
|
import { NextResponse } from "next/server"
|
||||||
|
|
||||||
@@ -16,12 +16,11 @@ export async function GET(request: Request, { params }: { params: Promise<{ file
|
|||||||
if (!file) {
|
if (!file) {
|
||||||
return new NextResponse("File not found", { status: 404 })
|
return new NextResponse("File not found", { status: 404 })
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if file exists
|
// Check if file exists
|
||||||
try {
|
try {
|
||||||
await fs.access(file.path)
|
await fs.access(file.path)
|
||||||
} catch {
|
} catch {
|
||||||
return new NextResponse("File not found on disk", { status: 404 })
|
return new NextResponse(`File not found on disk: ${file.path}`, { status: 404 })
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read file
|
// Read file
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { getFileById } from "@/data/files"
|
|
||||||
import { resizeImage } from "@/lib/images"
|
import { resizeImage } from "@/lib/images"
|
||||||
import { pdfToImages } from "@/lib/pdf"
|
import { pdfToImages } from "@/lib/pdf"
|
||||||
|
import { getFileById } from "@/models/files"
|
||||||
import fs from "fs/promises"
|
import fs from "fs/promises"
|
||||||
import { NextResponse } from "next/server"
|
import { NextResponse } from "next/server"
|
||||||
import path from "path"
|
import path from "path"
|
||||||
@@ -27,7 +27,7 @@ export async function GET(request: Request, { params }: { params: Promise<{ file
|
|||||||
try {
|
try {
|
||||||
await fs.access(file.path)
|
await fs.access(file.path)
|
||||||
} catch {
|
} catch {
|
||||||
return new NextResponse("File not found on disk", { status: 404 })
|
return new NextResponse(`File not found on disk: ${file.path}`, { status: 404 })
|
||||||
}
|
}
|
||||||
|
|
||||||
let previewPath = file.path
|
let previewPath = file.path
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
"use server"
|
"use server"
|
||||||
|
|
||||||
import { exportImportFieldsMapping } from "@/data/export_and_import"
|
import { exportImportFieldsMapping } from "@/models/export_and_import"
|
||||||
import { createTransaction } from "@/data/transactions"
|
import { createTransaction } from "@/models/transactions"
|
||||||
import { parse } from "@fast-csv/parse"
|
import { parse } from "@fast-csv/parse"
|
||||||
import { revalidatePath } from "next/cache"
|
import { revalidatePath } from "next/cache"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { ImportCSVTable } from "@/components/import/csv"
|
import { ImportCSVTable } from "@/components/import/csv"
|
||||||
import { getFields } from "@/data/fields"
|
import { getFields } from "@/models/fields"
|
||||||
|
|
||||||
export default async function CSVImportPage() {
|
export default async function CSVImportPage() {
|
||||||
const fields = await getFields()
|
const fields = await getFields()
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ import MobileMenu from "@/components/sidebar/mobile-menu"
|
|||||||
import { AppSidebar } from "@/components/sidebar/sidebar"
|
import { AppSidebar } from "@/components/sidebar/sidebar"
|
||||||
import { SidebarInset, SidebarProvider } from "@/components/ui/sidebar"
|
import { SidebarInset, SidebarProvider } from "@/components/ui/sidebar"
|
||||||
import { Toaster } from "@/components/ui/sonner"
|
import { Toaster } from "@/components/ui/sonner"
|
||||||
import { getUnsortedFilesCount } from "@/data/files"
|
import { getUnsortedFilesCount } from "@/models/files"
|
||||||
import { getSettings } from "@/data/settings"
|
import { getSettings } from "@/models/settings"
|
||||||
import type { Metadata, Viewport } from "next"
|
import type { Metadata, Viewport } from "next"
|
||||||
import { NotificationProvider } from "./context"
|
import { NotificationProvider } from "./context"
|
||||||
import "./globals.css"
|
import "./globals.css"
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ import { StatsWidget } from "@/components/dashboard/stats-widget"
|
|||||||
import DashboardUnsortedWidget from "@/components/dashboard/unsorted-widget"
|
import DashboardUnsortedWidget from "@/components/dashboard/unsorted-widget"
|
||||||
import { WelcomeWidget } from "@/components/dashboard/welcome-widget"
|
import { WelcomeWidget } from "@/components/dashboard/welcome-widget"
|
||||||
import { Separator } from "@/components/ui/separator"
|
import { Separator } from "@/components/ui/separator"
|
||||||
import { getUnsortedFiles } from "@/data/files"
|
import { getUnsortedFiles } from "@/models/files"
|
||||||
import { getSettings } from "@/data/settings"
|
import { getSettings } from "@/models/settings"
|
||||||
import { TransactionFilters } from "@/data/transactions"
|
import { TransactionFilters } from "@/models/transactions"
|
||||||
|
|
||||||
export default async function Home({ searchParams }: { searchParams: Promise<TransactionFilters> }) {
|
export default async function Home({ searchParams }: { searchParams: Promise<TransactionFilters> }) {
|
||||||
const filters = await searchParams
|
const filters = await searchParams
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
"use server"
|
"use server"
|
||||||
|
|
||||||
import { createCategory, deleteCategory, updateCategory } from "@/data/categories"
|
|
||||||
import { createCurrency, deleteCurrency, updateCurrency } from "@/data/currencies"
|
|
||||||
import { createField, deleteField, updateField } from "@/data/fields"
|
|
||||||
import { createProject, deleteProject, updateProject } from "@/data/projects"
|
|
||||||
import { updateSettings } from "@/data/settings"
|
|
||||||
import { settingsFormSchema } from "@/forms/settings"
|
import { settingsFormSchema } from "@/forms/settings"
|
||||||
import { codeFromName } from "@/lib/utils"
|
import { codeFromName } from "@/lib/utils"
|
||||||
|
import { createCategory, deleteCategory, updateCategory } from "@/models/categories"
|
||||||
|
import { createCurrency, deleteCurrency, updateCurrency } from "@/models/currencies"
|
||||||
|
import { createField, deleteField, updateField } from "@/models/fields"
|
||||||
|
import { createProject, deleteProject, updateProject } from "@/models/projects"
|
||||||
|
import { updateSettings } from "@/models/settings"
|
||||||
import { revalidatePath } from "next/cache"
|
import { revalidatePath } from "next/cache"
|
||||||
import { redirect } from "next/navigation"
|
import { redirect } from "next/navigation"
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { addCategoryAction, deleteCategoryAction, editCategoryAction } from "@/app/settings/actions"
|
import { addCategoryAction, deleteCategoryAction, editCategoryAction } from "@/app/settings/actions"
|
||||||
import { CrudTable } from "@/components/settings/crud"
|
import { CrudTable } from "@/components/settings/crud"
|
||||||
import { getCategories } from "@/data/categories"
|
|
||||||
import { randomHexColor } from "@/lib/utils"
|
import { randomHexColor } from "@/lib/utils"
|
||||||
|
import { getCategories } from "@/models/categories"
|
||||||
|
|
||||||
export default async function CategoriesSettingsPage() {
|
export default async function CategoriesSettingsPage() {
|
||||||
const categories = await getCategories()
|
const categories = await getCategories()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { addCurrencyAction, deleteCurrencyAction, editCurrencyAction } from "@/app/settings/actions"
|
import { addCurrencyAction, deleteCurrencyAction, editCurrencyAction } from "@/app/settings/actions"
|
||||||
import { CrudTable } from "@/components/settings/crud"
|
import { CrudTable } from "@/components/settings/crud"
|
||||||
import { getCurrencies } from "@/data/currencies"
|
import { getCurrencies } from "@/models/currencies"
|
||||||
|
|
||||||
export default async function CurrenciesSettingsPage() {
|
export default async function CurrenciesSettingsPage() {
|
||||||
const currencies = await getCurrencies()
|
const currencies = await getCurrencies()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { addFieldAction, deleteFieldAction, editFieldAction } from "@/app/settings/actions"
|
import { addFieldAction, deleteFieldAction, editFieldAction } from "@/app/settings/actions"
|
||||||
import { CrudTable } from "@/components/settings/crud"
|
import { CrudTable } from "@/components/settings/crud"
|
||||||
import { getFields } from "@/data/fields"
|
import { getFields } from "@/models/fields"
|
||||||
|
|
||||||
export default async function FieldsSettingsPage() {
|
export default async function FieldsSettingsPage() {
|
||||||
const fields = await getFields()
|
const fields = await getFields()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import LLMSettingsForm from "@/components/settings/llm-settings-form"
|
import LLMSettingsForm from "@/components/settings/llm-settings-form"
|
||||||
import { getFields } from "@/data/fields"
|
import { getFields } from "@/models/fields"
|
||||||
import { getSettings } from "@/data/settings"
|
import { getSettings } from "@/models/settings"
|
||||||
|
|
||||||
export default async function LlmSettingsPage() {
|
export default async function LlmSettingsPage() {
|
||||||
const settings = await getSettings()
|
const settings = await getSettings()
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import GlobalSettingsForm from "@/components/settings/global-settings-form"
|
import GlobalSettingsForm from "@/components/settings/global-settings-form"
|
||||||
import { getCategories } from "@/data/categories"
|
import { getCategories } from "@/models/categories"
|
||||||
import { getCurrencies } from "@/data/currencies"
|
import { getCurrencies } from "@/models/currencies"
|
||||||
import { getSettings } from "@/data/settings"
|
import { getSettings } from "@/models/settings"
|
||||||
|
|
||||||
export default async function SettingsPage() {
|
export default async function SettingsPage() {
|
||||||
const settings = await getSettings()
|
const settings = await getSettings()
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { addProjectAction, deleteProjectAction, editProjectAction } from "@/app/settings/actions"
|
import { addProjectAction, deleteProjectAction, editProjectAction } from "@/app/settings/actions"
|
||||||
import { CrudTable } from "@/components/settings/crud"
|
import { CrudTable } from "@/components/settings/crud"
|
||||||
import { getProjects } from "@/data/projects"
|
|
||||||
import { randomHexColor } from "@/lib/utils"
|
import { randomHexColor } from "@/lib/utils"
|
||||||
|
import { getProjects } from "@/models/projects"
|
||||||
|
|
||||||
export default async function ProjectsSettingsPage() {
|
export default async function ProjectsSettingsPage() {
|
||||||
const projects = await getProjects()
|
const projects = await getProjects()
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { getTransactionById } from "@/data/transactions"
|
import { getTransactionById } from "@/models/transactions"
|
||||||
import { notFound } from "next/navigation"
|
import { notFound } from "next/navigation"
|
||||||
|
|
||||||
export default async function TransactionLayout({
|
export default async function TransactionLayout({
|
||||||
|
|||||||
@@ -2,13 +2,13 @@ import { FormTextarea } from "@/components/forms/simple"
|
|||||||
import TransactionEditForm from "@/components/transactions/edit"
|
import TransactionEditForm from "@/components/transactions/edit"
|
||||||
import TransactionFiles from "@/components/transactions/transaction-files"
|
import TransactionFiles from "@/components/transactions/transaction-files"
|
||||||
import { Card } from "@/components/ui/card"
|
import { Card } from "@/components/ui/card"
|
||||||
import { getCategories } from "@/data/categories"
|
import { getCategories } from "@/models/categories"
|
||||||
import { getCurrencies } from "@/data/currencies"
|
import { getCurrencies } from "@/models/currencies"
|
||||||
import { getFields } from "@/data/fields"
|
import { getFields } from "@/models/fields"
|
||||||
import { getFilesByTransactionId } from "@/data/files"
|
import { getFilesByTransactionId } from "@/models/files"
|
||||||
import { getProjects } from "@/data/projects"
|
import { getProjects } from "@/models/projects"
|
||||||
import { getSettings } from "@/data/settings"
|
import { getSettings } from "@/models/settings"
|
||||||
import { getTransactionById } from "@/data/transactions"
|
import { getTransactionById } from "@/models/transactions"
|
||||||
import { notFound } from "next/navigation"
|
import { notFound } from "next/navigation"
|
||||||
|
|
||||||
export default async function TransactionPage({ params }: { params: Promise<{ transactionId: string }> }) {
|
export default async function TransactionPage({ params }: { params: Promise<{ transactionId: string }> }) {
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
"use server"
|
"use server"
|
||||||
|
|
||||||
import { createFile, deleteFile } from "@/data/files"
|
import { transactionFormSchema } from "@/forms/transactions"
|
||||||
|
import { FILE_UPLOAD_PATH, getTransactionFileUploadPath } from "@/lib/files"
|
||||||
|
import { createFile, deleteFile } from "@/models/files"
|
||||||
import {
|
import {
|
||||||
bulkDeleteTransactions,
|
bulkDeleteTransactions,
|
||||||
createTransaction,
|
createTransaction,
|
||||||
@@ -8,9 +10,7 @@ import {
|
|||||||
getTransactionById,
|
getTransactionById,
|
||||||
updateTransaction,
|
updateTransaction,
|
||||||
updateTransactionFiles,
|
updateTransactionFiles,
|
||||||
} from "@/data/transactions"
|
} from "@/models/transactions"
|
||||||
import { transactionFormSchema } from "@/forms/transactions"
|
|
||||||
import { FILE_UPLOAD_PATH, getTransactionFileUploadPath } from "@/lib/files"
|
|
||||||
import { existsSync } from "fs"
|
import { existsSync } from "fs"
|
||||||
import { mkdir, writeFile } from "fs/promises"
|
import { mkdir, writeFile } from "fs/promises"
|
||||||
import { revalidatePath } from "next/cache"
|
import { revalidatePath } from "next/cache"
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ import { TransactionSearchAndFilters } from "@/components/transactions/filters"
|
|||||||
import { TransactionList } from "@/components/transactions/list"
|
import { TransactionList } from "@/components/transactions/list"
|
||||||
import { NewTransactionDialog } from "@/components/transactions/new"
|
import { NewTransactionDialog } from "@/components/transactions/new"
|
||||||
import { Button } from "@/components/ui/button"
|
import { Button } from "@/components/ui/button"
|
||||||
import { getCategories } from "@/data/categories"
|
import { getCategories } from "@/models/categories"
|
||||||
import { getFields } from "@/data/fields"
|
import { getFields } from "@/models/fields"
|
||||||
import { getProjects } from "@/data/projects"
|
import { getProjects } from "@/models/projects"
|
||||||
import { getTransactions, TransactionFilters } from "@/data/transactions"
|
import { getTransactions, TransactionFilters } from "@/models/transactions"
|
||||||
import { Download, Plus, Upload } from "lucide-react"
|
import { Download, Plus, Upload } from "lucide-react"
|
||||||
import { Metadata } from "next"
|
import { Metadata } from "next"
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
"use server"
|
"use server"
|
||||||
|
|
||||||
import { deleteFile, getFileById, updateFile } from "@/data/files"
|
|
||||||
import { createTransaction, updateTransactionFiles } from "@/data/transactions"
|
|
||||||
import { transactionFormSchema } from "@/forms/transactions"
|
import { transactionFormSchema } from "@/forms/transactions"
|
||||||
import { getTransactionFileUploadPath } from "@/lib/files"
|
import { getTransactionFileUploadPath } from "@/lib/files"
|
||||||
|
import { deleteFile, getFileById, updateFile } from "@/models/files"
|
||||||
|
import { createTransaction, updateTransactionFiles } from "@/models/transactions"
|
||||||
import { mkdir, rename } from "fs/promises"
|
import { mkdir, rename } from "fs/promises"
|
||||||
import { revalidatePath } from "next/cache"
|
import { revalidatePath } from "next/cache"
|
||||||
import path from "path"
|
import path from "path"
|
||||||
|
|||||||
@@ -4,12 +4,12 @@ import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"
|
|||||||
import { Button } from "@/components/ui/button"
|
import { Button } from "@/components/ui/button"
|
||||||
import { Card } from "@/components/ui/card"
|
import { Card } from "@/components/ui/card"
|
||||||
import AnalyzeForm from "@/components/unsorted/analyze-form"
|
import AnalyzeForm from "@/components/unsorted/analyze-form"
|
||||||
import { getCategories } from "@/data/categories"
|
import { getCategories } from "@/models/categories"
|
||||||
import { getCurrencies } from "@/data/currencies"
|
import { getCurrencies } from "@/models/currencies"
|
||||||
import { getFields } from "@/data/fields"
|
import { getFields } from "@/models/fields"
|
||||||
import { getUnsortedFiles } from "@/data/files"
|
import { getUnsortedFiles } from "@/models/files"
|
||||||
import { getProjects } from "@/data/projects"
|
import { getProjects } from "@/models/projects"
|
||||||
import { getSettings } from "@/data/settings"
|
import { getSettings } from "@/models/settings"
|
||||||
import { FileText, PartyPopper, Settings, Upload } from "lucide-react"
|
import { FileText, PartyPopper, Settings, Upload } from "lucide-react"
|
||||||
import { Metadata } from "next"
|
import { Metadata } from "next"
|
||||||
import Link from "next/link"
|
import Link from "next/link"
|
||||||
|
|||||||
@@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
import { useNotification } from "@/app/context"
|
import { useNotification } from "@/app/context"
|
||||||
import { uploadFilesAction } from "@/app/files/actions"
|
import { uploadFilesAction } from "@/app/files/actions"
|
||||||
|
import { FormError } from "@/components/forms/error"
|
||||||
import { FILE_ACCEPTED_MIMETYPES } from "@/lib/files"
|
import { FILE_ACCEPTED_MIMETYPES } from "@/lib/files"
|
||||||
import { Camera, Loader2 } from "lucide-react"
|
import { Camera, Loader2 } from "lucide-react"
|
||||||
import { useRouter } from "next/navigation"
|
import { useRouter } from "next/navigation"
|
||||||
import { startTransition, useState } from "react"
|
import { startTransition, useState } from "react"
|
||||||
import { FormError } from "../forms/error"
|
|
||||||
|
|
||||||
export default function DashboardDropZoneWidget() {
|
export default function DashboardDropZoneWidget() {
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import { TransactionFilters } from "@/data/transactions"
|
import { DateRangePicker } from "@/components/forms/date-range-picker"
|
||||||
import { useTransactionFilters } from "@/hooks/use-transaction-filters"
|
import { useTransactionFilters } from "@/hooks/use-transaction-filters"
|
||||||
|
import { TransactionFilters } from "@/models/transactions"
|
||||||
import { format } from "date-fns"
|
import { format } from "date-fns"
|
||||||
import { DateRangePicker } from "../forms/date-range-picker"
|
|
||||||
|
|
||||||
export function FiltersWidget({
|
export function FiltersWidget({
|
||||||
defaultFilters,
|
defaultFilters,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Badge } from "@/components/ui/badge"
|
import { Badge } from "@/components/ui/badge"
|
||||||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
|
||||||
import { ProjectStats } from "@/data/stats"
|
|
||||||
import { formatCurrency } from "@/lib/utils"
|
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 { Plus } from "lucide-react"
|
||||||
import Link from "next/link"
|
import Link from "next/link"
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { getProjects } from "@/data/projects"
|
import { FiltersWidget } from "@/components/dashboard/filters-widget"
|
||||||
import { getDashboardStats, getProjectStats } from "@/data/stats"
|
import { ProjectsWidget } from "@/components/dashboard/projects-widget"
|
||||||
import { TransactionFilters } from "@/data/transactions"
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
|
||||||
import { formatCurrency } from "@/lib/utils"
|
import { formatCurrency } from "@/lib/utils"
|
||||||
|
import { getProjects } from "@/models/projects"
|
||||||
|
import { getDashboardStats, getProjectStats } from "@/models/stats"
|
||||||
|
import { TransactionFilters } from "@/models/transactions"
|
||||||
import { ArrowDown, ArrowUp, BicepsFlexed } from "lucide-react"
|
import { ArrowDown, ArrowUp, BicepsFlexed } from "lucide-react"
|
||||||
import { Card, CardContent, CardHeader, CardTitle } from "../ui/card"
|
|
||||||
import { FiltersWidget } from "./filters-widget"
|
|
||||||
import { ProjectsWidget } from "./projects-widget"
|
|
||||||
|
|
||||||
export async function StatsWidget({ filters }: { filters: TransactionFilters }) {
|
export async function StatsWidget({ filters }: { filters: TransactionFilters }) {
|
||||||
const projects = await getProjects()
|
const projects = await getProjects()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Button } from "@/components/ui/button"
|
import { Button } from "@/components/ui/button"
|
||||||
import { Card, CardDescription, CardTitle } from "@/components/ui/card"
|
import { Card, CardDescription, CardTitle } from "@/components/ui/card"
|
||||||
import { getSettings, updateSettings } from "@/data/settings"
|
import { getSettings, updateSettings } from "@/models/settings"
|
||||||
import { Banknote, ChartBarStacked, FolderOpenDot, Key, TextCursorInput, X } from "lucide-react"
|
import { Banknote, ChartBarStacked, FolderOpenDot, Key, TextCursorInput, X } from "lucide-react"
|
||||||
import { revalidatePath } from "next/cache"
|
import { revalidatePath } from "next/cache"
|
||||||
import Link from "next/link"
|
import Link from "next/link"
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
|
import { DateRangePicker } from "@/components/forms/date-range-picker"
|
||||||
|
import { FormSelectCategory } from "@/components/forms/select-category"
|
||||||
|
import { FormSelectProject } from "@/components/forms/select-project"
|
||||||
import { Button } from "@/components/ui/button"
|
import { Button } from "@/components/ui/button"
|
||||||
import {
|
import {
|
||||||
Dialog,
|
Dialog,
|
||||||
@@ -16,9 +19,6 @@ import { Category, Field, Project } from "@prisma/client"
|
|||||||
import { formatDate } from "date-fns"
|
import { formatDate } from "date-fns"
|
||||||
import { useRouter } from "next/navigation"
|
import { useRouter } from "next/navigation"
|
||||||
import { useState } from "react"
|
import { useState } from "react"
|
||||||
import { DateRangePicker } from "../forms/date-range-picker"
|
|
||||||
import { FormSelectCategory } from "../forms/select-category"
|
|
||||||
import { FormSelectProject } from "../forms/select-project"
|
|
||||||
|
|
||||||
const deselectedFields = ["files", "text"]
|
const deselectedFields = ["files", "text"]
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
|
import { parseCSVAction, saveTransactionsAction } from "@/app/import/csv/actions"
|
||||||
|
import { FormError } from "@/components/forms/error"
|
||||||
import { Button } from "@/components/ui/button"
|
import { Button } from "@/components/ui/button"
|
||||||
import { Field } from "@prisma/client"
|
import { Field } from "@prisma/client"
|
||||||
import { Loader2, Play, Upload } from "lucide-react"
|
import { Loader2, Play, Upload } from "lucide-react"
|
||||||
import { useRouter } from "next/navigation"
|
import { useRouter } from "next/navigation"
|
||||||
import { startTransition, useActionState, useEffect, useState } from "react"
|
import { startTransition, useActionState, useEffect, useState } from "react"
|
||||||
import { parseCSVAction, saveTransactionsAction } from "../../app/import/csv/actions"
|
|
||||||
import { FormError } from "../forms/error"
|
|
||||||
|
|
||||||
const MAX_PREVIEW_ROWS = 100
|
const MAX_PREVIEW_ROWS = 100
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import { saveSettingsAction } from "@/app/settings/actions"
|
import { saveSettingsAction } from "@/app/settings/actions"
|
||||||
|
import { FormError } from "@/components/forms/error"
|
||||||
import { FormSelectCategory } from "@/components/forms/select-category"
|
import { FormSelectCategory } from "@/components/forms/select-category"
|
||||||
import { FormSelectCurrency } from "@/components/forms/select-currency"
|
import { FormSelectCurrency } from "@/components/forms/select-currency"
|
||||||
import { FormSelectType } from "@/components/forms/select-type"
|
import { FormSelectType } from "@/components/forms/select-type"
|
||||||
@@ -9,7 +10,6 @@ import { Button } from "@/components/ui/button"
|
|||||||
import { Category, Currency } from "@prisma/client"
|
import { Category, Currency } from "@prisma/client"
|
||||||
import { CircleCheckBig } from "lucide-react"
|
import { CircleCheckBig } from "lucide-react"
|
||||||
import { useActionState } from "react"
|
import { useActionState } from "react"
|
||||||
import { FormError } from "../forms/error"
|
|
||||||
|
|
||||||
export default function GlobalSettingsForm({
|
export default function GlobalSettingsForm({
|
||||||
settings,
|
settings,
|
||||||
|
|||||||
@@ -2,14 +2,14 @@
|
|||||||
|
|
||||||
import { fieldsToJsonSchema } from "@/app/ai/schema"
|
import { fieldsToJsonSchema } from "@/app/ai/schema"
|
||||||
import { saveSettingsAction } from "@/app/settings/actions"
|
import { saveSettingsAction } from "@/app/settings/actions"
|
||||||
|
import { FormError } from "@/components/forms/error"
|
||||||
import { FormInput, FormTextarea } from "@/components/forms/simple"
|
import { FormInput, FormTextarea } from "@/components/forms/simple"
|
||||||
import { Button } from "@/components/ui/button"
|
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 { CircleCheckBig, Edit } from "lucide-react"
|
||||||
import Link from "next/link"
|
import Link from "next/link"
|
||||||
import { useActionState } from "react"
|
import { useActionState } from "react"
|
||||||
import { FormError } from "../forms/error"
|
|
||||||
import { Card, CardTitle } from "../ui/card"
|
|
||||||
|
|
||||||
export default function LLMSettingsForm({ settings, fields }: { settings: Record<string, string>; fields: Field[] }) {
|
export default function LLMSettingsForm({ settings, fields }: { settings: Record<string, string>; fields: Field[] }) {
|
||||||
const [saveState, saveAction, pending] = useActionState(saveSettingsAction, null)
|
const [saveState, saveAction, pending] = useActionState(saveSettingsAction, null)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
|
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"
|
||||||
|
import { useSidebar } from "@/components/ui/sidebar"
|
||||||
import Link from "next/link"
|
import Link from "next/link"
|
||||||
import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar"
|
|
||||||
import { useSidebar } from "../ui/sidebar"
|
|
||||||
|
|
||||||
export default function MobileMenu({
|
export default function MobileMenu({
|
||||||
settings,
|
settings,
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
|
import { SidebarMenuItem } from "@/components/ui/sidebar"
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { usePathname } from "next/navigation"
|
import { usePathname } from "next/navigation"
|
||||||
import { ComponentProps } from "react"
|
import { ComponentProps } from "react"
|
||||||
import { SidebarMenuItem } from "../ui/sidebar"
|
|
||||||
|
|
||||||
export function SidebarMenuItemWithHighlight({
|
export function SidebarMenuItemWithHighlight({
|
||||||
href,
|
href,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import { createTransactionAction } from "@/app/transactions/actions"
|
import { createTransactionAction } from "@/app/transactions/actions"
|
||||||
|
import { FormError } from "@/components/forms/error"
|
||||||
import { FormSelectCategory } from "@/components/forms/select-category"
|
import { FormSelectCategory } from "@/components/forms/select-category"
|
||||||
import { FormSelectCurrency } from "@/components/forms/select-currency"
|
import { FormSelectCurrency } from "@/components/forms/select-currency"
|
||||||
import { FormSelectProject } from "@/components/forms/select-project"
|
import { FormSelectProject } from "@/components/forms/select-project"
|
||||||
@@ -13,7 +14,6 @@ import { Import, Loader2 } from "lucide-react"
|
|||||||
import Link from "next/link"
|
import Link from "next/link"
|
||||||
import { useRouter } from "next/navigation"
|
import { useRouter } from "next/navigation"
|
||||||
import { useActionState, useEffect, useState } from "react"
|
import { useActionState, useEffect, useState } from "react"
|
||||||
import { FormError } from "../forms/error"
|
|
||||||
|
|
||||||
export default function TransactionCreateForm({
|
export default function TransactionCreateForm({
|
||||||
categories,
|
categories,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import { deleteTransactionAction, saveTransactionAction } from "@/app/transactions/actions"
|
import { deleteTransactionAction, saveTransactionAction } from "@/app/transactions/actions"
|
||||||
|
import { FormError } from "@/components/forms/error"
|
||||||
import { FormSelectCategory } from "@/components/forms/select-category"
|
import { FormSelectCategory } from "@/components/forms/select-category"
|
||||||
import { FormSelectCurrency } from "@/components/forms/select-currency"
|
import { FormSelectCurrency } from "@/components/forms/select-currency"
|
||||||
import { FormSelectProject } from "@/components/forms/select-project"
|
import { FormSelectProject } from "@/components/forms/select-project"
|
||||||
@@ -12,7 +13,6 @@ import { format } from "date-fns"
|
|||||||
import { Loader2 } from "lucide-react"
|
import { Loader2 } from "lucide-react"
|
||||||
import { useRouter } from "next/navigation"
|
import { useRouter } from "next/navigation"
|
||||||
import { startTransition, useActionState, useEffect, useState } from "react"
|
import { startTransition, useActionState, useEffect, useState } from "react"
|
||||||
import { FormError } from "../forms/error"
|
|
||||||
|
|
||||||
export default function TransactionEditForm({
|
export default function TransactionEditForm({
|
||||||
transaction,
|
transaction,
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import { DateRangePicker } from "@/components/forms/date-range-picker"
|
|||||||
import { Button } from "@/components/ui/button"
|
import { Button } from "@/components/ui/button"
|
||||||
import { Input } from "@/components/ui/input"
|
import { Input } from "@/components/ui/input"
|
||||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
|
||||||
import { TransactionFilters } from "@/data/transactions"
|
|
||||||
import { isFiltered, useTransactionFilters } from "@/hooks/use-transaction-filters"
|
import { isFiltered, useTransactionFilters } from "@/hooks/use-transaction-filters"
|
||||||
|
import { TransactionFilters } from "@/models/transactions"
|
||||||
import { Category, Project } from "@prisma/client"
|
import { Category, Project } from "@prisma/client"
|
||||||
import { X } from "lucide-react"
|
import { X } from "lucide-react"
|
||||||
|
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ import {
|
|||||||
DialogTitle,
|
DialogTitle,
|
||||||
DialogTrigger,
|
DialogTrigger,
|
||||||
} from "@/components/ui/dialog"
|
} from "@/components/ui/dialog"
|
||||||
import { getCategories } from "@/data/categories"
|
import { getCategories } from "@/models/categories"
|
||||||
import { getCurrencies } from "@/data/currencies"
|
import { getCurrencies } from "@/models/currencies"
|
||||||
import { getProjects } from "@/data/projects"
|
import { getProjects } from "@/models/projects"
|
||||||
import { getSettings } from "@/data/settings"
|
import { getSettings } from "@/models/settings"
|
||||||
import TransactionCreateForm from "./create"
|
import TransactionCreateForm from "./create"
|
||||||
|
|
||||||
export async function NewTransactionDialog({ children }: { children: React.ReactNode }) {
|
export async function NewTransactionDialog({ children }: { children: React.ReactNode }) {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { analyzeTransaction, retrieveAllAttachmentsForAI } from "@/app/ai/analyz
|
|||||||
import { useNotification } from "@/app/context"
|
import { useNotification } from "@/app/context"
|
||||||
import { deleteUnsortedFileAction, saveFileAsTransactionAction } from "@/app/unsorted/actions"
|
import { deleteUnsortedFileAction, saveFileAsTransactionAction } from "@/app/unsorted/actions"
|
||||||
import { FormConvertCurrency } from "@/components/forms/convert-currency"
|
import { FormConvertCurrency } from "@/components/forms/convert-currency"
|
||||||
|
import { FormError } from "@/components/forms/error"
|
||||||
import { FormSelectCategory } from "@/components/forms/select-category"
|
import { FormSelectCategory } from "@/components/forms/select-category"
|
||||||
import { FormSelectCurrency } from "@/components/forms/select-currency"
|
import { FormSelectCurrency } from "@/components/forms/select-currency"
|
||||||
import { FormSelectProject } from "@/components/forms/select-project"
|
import { FormSelectProject } from "@/components/forms/select-project"
|
||||||
@@ -13,7 +14,6 @@ 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 { Brain, Loader2 } from "lucide-react"
|
import { Brain, Loader2 } from "lucide-react"
|
||||||
import { startTransition, useActionState, useMemo, useState } from "react"
|
import { startTransition, useActionState, useMemo, useState } from "react"
|
||||||
import { FormError } from "../forms/error"
|
|
||||||
|
|
||||||
export default function AnalyzeForm({
|
export default function AnalyzeForm({
|
||||||
file,
|
file,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { TransactionFilters } from "@/data/transactions"
|
import { TransactionFilters } from "@/models/transactions"
|
||||||
import { format } from "date-fns"
|
import { format } from "date-fns"
|
||||||
import { useRouter, useSearchParams } from "next/navigation"
|
import { useRouter, useSearchParams } from "next/navigation"
|
||||||
import { useEffect, useState } from "react"
|
import { useEffect, useState } from "react"
|
||||||
|
|||||||
@@ -63,11 +63,17 @@ export const updateFile = async (id: string, data: any) => {
|
|||||||
|
|
||||||
export const deleteFile = async (id: string) => {
|
export const deleteFile = async (id: string) => {
|
||||||
const file = await getFileById(id)
|
const file = await getFileById(id)
|
||||||
if (file) {
|
if (!file) {
|
||||||
await unlink(path.resolve(file.path))
|
return
|
||||||
|
|
||||||
return await prisma.file.delete({
|
|
||||||
where: { id },
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await unlink(path.resolve(file.path))
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error deleting file:", error)
|
||||||
|
}
|
||||||
|
|
||||||
|
return await prisma.file.delete({
|
||||||
|
where: { id },
|
||||||
|
})
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "taxhacker",
|
"name": "taxhacker",
|
||||||
"version": "0.1.0",
|
"version": "0.2.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
Reference in New Issue
Block a user