mirror of
https://github.com/vas3k/TaxHacker.git
synced 2026-01-10 15:40:27 -06:00
164 lines
3.9 KiB
TypeScript
164 lines
3.9 KiB
TypeScript
import { prisma } from "@/lib/db"
|
|
import { codeFromName } from "@/lib/utils"
|
|
import { formatDate } from "date-fns"
|
|
import { createCategory, getCategoryByCode } from "./categories"
|
|
import { createProject, getProjectByCode } from "./projects"
|
|
import { TransactionFilters } from "./transactions"
|
|
|
|
export type ExportFilters = TransactionFilters
|
|
|
|
export type ExportFields = string[]
|
|
|
|
export type ExportImportFieldSettings = {
|
|
code: string
|
|
type: string
|
|
export?: (userId: string, value: any) => Promise<any>
|
|
import?: (userId: string, value: any) => Promise<any>
|
|
}
|
|
|
|
export const EXPORT_AND_IMPORT_FIELD_MAP: Record<string, ExportImportFieldSettings> = {
|
|
name: {
|
|
code: "name",
|
|
type: "string",
|
|
},
|
|
description: {
|
|
code: "description",
|
|
type: "string",
|
|
},
|
|
merchant: {
|
|
code: "merchant",
|
|
type: "string",
|
|
},
|
|
total: {
|
|
code: "total",
|
|
type: "number",
|
|
export: async function (userId: string, value: number) {
|
|
return value / 100
|
|
},
|
|
import: async function (userId: string, value: string) {
|
|
const num = parseFloat(value)
|
|
return isNaN(num) ? 0.0 : num * 100
|
|
},
|
|
},
|
|
currencyCode: {
|
|
code: "currencyCode",
|
|
type: "string",
|
|
},
|
|
convertedTotal: {
|
|
code: "convertedTotal",
|
|
type: "number",
|
|
export: async function (userId: string, value: number | null) {
|
|
if (!value) {
|
|
return null
|
|
}
|
|
return value / 100
|
|
},
|
|
import: async function (userId: string, value: string) {
|
|
const num = parseFloat(value)
|
|
return isNaN(num) ? 0.0 : num * 100
|
|
},
|
|
},
|
|
convertedCurrencyCode: {
|
|
code: "convertedCurrencyCode",
|
|
type: "string",
|
|
},
|
|
type: {
|
|
code: "type",
|
|
type: "string",
|
|
export: async function (userId: string, value: string | null) {
|
|
return value ? value.toLowerCase() : ""
|
|
},
|
|
import: async function (userId: string, value: string) {
|
|
return value.toLowerCase()
|
|
},
|
|
},
|
|
note: {
|
|
code: "note",
|
|
type: "string",
|
|
},
|
|
categoryCode: {
|
|
code: "categoryCode",
|
|
type: "string",
|
|
export: async function (userId: string, value: string | null) {
|
|
if (!value) {
|
|
return null
|
|
}
|
|
const category = await getCategoryByCode(userId, value)
|
|
return category?.name
|
|
},
|
|
import: async function (userId: string, value: string) {
|
|
const category = await importCategory(userId, value)
|
|
return category?.code
|
|
},
|
|
},
|
|
projectCode: {
|
|
code: "projectCode",
|
|
type: "string",
|
|
export: async function (userId: string, value: string | null) {
|
|
if (!value) {
|
|
return null
|
|
}
|
|
const project = await getProjectByCode(userId, value)
|
|
return project?.name
|
|
},
|
|
import: async function (userId: string, value: string) {
|
|
const project = await importProject(userId, value)
|
|
return project?.code
|
|
},
|
|
},
|
|
issuedAt: {
|
|
code: "issuedAt",
|
|
type: "date",
|
|
export: async function (userId: string, value: Date | null) {
|
|
if (!value || isNaN(value.getTime())) {
|
|
return null
|
|
}
|
|
|
|
try {
|
|
return formatDate(value, "yyyy-MM-dd")
|
|
} catch (error) {
|
|
return null
|
|
}
|
|
},
|
|
import: async function (userId: string, value: string) {
|
|
try {
|
|
return new Date(value)
|
|
} catch (error) {
|
|
return null
|
|
}
|
|
},
|
|
},
|
|
}
|
|
|
|
export const importProject = async (userId: string, name: string) => {
|
|
const code = codeFromName(name)
|
|
|
|
const existingProject = await prisma.project.findFirst({
|
|
where: {
|
|
OR: [{ code }, { name }],
|
|
},
|
|
})
|
|
|
|
if (existingProject) {
|
|
return existingProject
|
|
}
|
|
|
|
return await createProject(userId, { code, name })
|
|
}
|
|
|
|
export const importCategory = async (userId: string, name: string) => {
|
|
const code = codeFromName(name)
|
|
|
|
const existingCategory = await prisma.category.findFirst({
|
|
where: {
|
|
OR: [{ code }, { name }],
|
|
},
|
|
})
|
|
|
|
if (existingCategory) {
|
|
return existingCategory
|
|
}
|
|
|
|
return await createCategory(userId, { code, name })
|
|
}
|