From 01e5077ad95306f8ffe255fe2caefd96e83d2ca8 Mon Sep 17 00:00:00 2001 From: meglerhagen Date: Thu, 15 Aug 2024 07:44:58 +0200 Subject: [PATCH 1/2] update v1 --- packages/db/prisma/schema.prisma | 78 +++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 21 deletions(-) diff --git a/packages/db/prisma/schema.prisma b/packages/db/prisma/schema.prisma index 796c31c3..ad040d73 100644 --- a/packages/db/prisma/schema.prisma +++ b/packages/db/prisma/schema.prisma @@ -81,22 +81,23 @@ model VerificationToken { } model Workspace { - id String @id @default(cuid()) - name String - orgnr Int? - address String? - postalCode String? - city String? - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @default(now()) @map("updated_at") - buildings Building[] - contracts Contract[] - invoices CustomerInvoice[] - Document Document[] - properties Property[] - apiKeys WSApiKey[] - accessTokens WorkspaceAccessToken[] - users User[] + id String @id @default(cuid()) + name String + orgnr Int? + address String? + postalCode String? + city String? + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @default(now()) @map("updated_at") + buildings Building[] + contracts Contract[] + invoices CustomerInvoice[] + Document Document[] + properties Property[] + apiKeys WSApiKey[] + accessTokens WorkspaceAccessToken[] + users User[] + internalInvoices InternalInvoice[] } model Property { @@ -257,10 +258,10 @@ model BalancedAccounts { } model FinancialAnalysisBuilding { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) buildingId String - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @default(now()) @map("updated_at") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @default(now()) @map("updated_at") name String rentableArea Int ratioAreaOffice Float? @@ -305,11 +306,12 @@ model FinancialAnalysisBuilding { manYieldMerch Float? manYieldMisc Float? manYieldWeighted Float? - building Building @relation(fields: [buildingId], references: [id]) + building Building @relation(fields: [buildingId], references: [id]) + incomeUnits FinancialAnalysisBuildingIncome[] } model FinancialAnalysisProperty { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) propertyId String createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @default(now()) @map("updated_at") @@ -424,6 +426,40 @@ model Document { @@index([workspaceId]) } +model InternalInvoice { + id String @id @default(cuid()) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @default(now()) @map("updated_at") + workspaceId String + amount Float? + currency String? + dueDate DateTime? + paidAt DateTime? + status String? + description String? + invoiceNumber String? + downloadUrl String? + workspace Workspace @relation(fields: [workspaceId], references: [id]) + + @@map("internal_invoices") +} + +model FinancialAnalysisBuildingIncome { + id String @id @default(cuid()) + financialAnalysisBuildingId String + numberOfUnits Int + typeDescription String + areaPerUnit Float? + valuePerUnit Float? + totalArea Float? + totalValue Float? + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @default(now()) @map("updated_at") + financialAnalysisBuilding FinancialAnalysisBuilding @relation(fields: [financialAnalysisBuildingId], references: [id]) + + @@map("financial_analysis_building_income") +} + enum ContractType { LEASE SUBLEASE From 4acdb3a184fa265c8607d1f35aaf6234a2af8fc2 Mon Sep 17 00:00:00 2001 From: meglerhagen Date: Thu, 15 Aug 2024 19:29:12 +0200 Subject: [PATCH 2/2] update with cost and income --- apps/www/src/actions/create-analyse.ts | 44 ++++++++++----- apps/www/src/actions/get-analysis-details.ts | 6 +- apps/www/src/actions/update-analysis.ts | 2 +- .../app/(analytics)/analytics/[id]/page.tsx | 32 +++++------ .../app/(tenant)/tenant/[id]/invoice/page.tsx | 17 +++++- .../analyse/EditAnalysisNameCard.tsx | 2 +- .../components/analyse/EditKpiCard.tsx.tsx | 2 +- .../components/analyse/EditMarketDataCard.tsx | 2 +- .../components/analyse/EditOwnerCostsCard.tsx | 55 +++++++++---------- .../src/components/analyse/EditROICard.tsx | 2 +- .../analyse/EditRentableAreaCard.tsx | 2 +- .../components/analyse/EditVacancyCard.tsx | 2 +- packages/db/prisma/schema.prisma | 38 ++++++++----- 13 files changed, 121 insertions(+), 85 deletions(-) diff --git a/apps/www/src/actions/create-analyse.ts b/apps/www/src/actions/create-analyse.ts index 0e3c67b1..e4d89b20 100644 --- a/apps/www/src/actions/create-analyse.ts +++ b/apps/www/src/actions/create-analyse.ts @@ -29,7 +29,7 @@ export async function createAnalysis(analysisData) { const newAnalysis = await prisma.financialAnalysisBuilding.create({ data: { buildingId: analysisData.buildingId, - name: analysisData.name, // Include the name field + name: analysisData.name, rentableArea: 1000, ratioAreaOffice: 0.5, ratioAreaMerch: 0.3, @@ -43,19 +43,6 @@ export async function createAnalysis(analysisData) { sumValueNow: 1000000, sumValueExit: 1200000, vacancyPerYear: JSON.stringify({ "2024": "10.5", "2025": "9.8" }), - ownerCostsMethod: true, - ownerCostsManual: 50000, - costMaintenance: 10000, - costInsurance: 5000, - costRevision: 3000, - costAdm: 2000, - costOther: 1000, - costNegotiation: 2000, - costLegalFees: 1000, - costConsultFees: 1500, - costAssetMgmt: 2500, - costSum: 45000, - costBigExpenses: JSON.stringify({ "2024": "100000", "2025": "20500" }), useCalcROI: true, roiWeightedYield: 0.05, roiInflation: 0.02, @@ -73,6 +60,35 @@ export async function createAnalysis(analysisData) { kpi2: 0, kpi3: 0, kpi4: 0, + costs: { + create: { + ownerCostsMethod: true, + ownerCostsManual: 50000, + costMaintenance: 10000, + costInsurance: 5000, + costRevision: 3000, + costAdm: 2000, + costOther: 1000, + costNegotiation: 2000, + costLegalFees: 1000, + costConsultFees: 1500, + costAssetMgmt: 2500, + costSum: 45000, + }, + }, + incomeUnits: { + create: [ + { + numberOfUnits: 8, + typeDescription: "Office Space", + areaPerUnit: 125, + valuePerUnit: 62500, + totalArea: 1000, + totalValue: 500000, + }, + // You can add more income units here if needed + ], + }, }, }) console.log( diff --git a/apps/www/src/actions/get-analysis-details.ts b/apps/www/src/actions/get-analysis-details.ts index c7ca2756..78eba96f 100644 --- a/apps/www/src/actions/get-analysis-details.ts +++ b/apps/www/src/actions/get-analysis-details.ts @@ -4,19 +4,19 @@ import { prisma } from "@/lib/db" export async function getAnalysisDetails(analysisId: string) { try { - const numericId = parseInt(analysisId, 10) - if (isNaN(numericId)) { + if (!analysisId) { throw new Error("Invalid analysis ID") } const analysisDetails = await prisma.financialAnalysisBuilding.findUnique({ - where: { id: numericId }, + where: { id: analysisId }, include: { building: { select: { name: true, }, }, + costs: true, // Include the costs relation }, }) diff --git a/apps/www/src/actions/update-analysis.ts b/apps/www/src/actions/update-analysis.ts index 01b9e9d5..a1113d1e 100644 --- a/apps/www/src/actions/update-analysis.ts +++ b/apps/www/src/actions/update-analysis.ts @@ -14,7 +14,7 @@ export async function updateAnalysis(analysisId, updateData) { try { const updatedAnalysis = await prisma.financialAnalysisBuilding.update({ - where: { id: parseInt(analysisId, 10) }, + where: { id: analysisId }, data: { ...updateData, }, diff --git a/apps/www/src/app/(analytics)/analytics/[id]/page.tsx b/apps/www/src/app/(analytics)/analytics/[id]/page.tsx index e7124c59..8c9937ea 100644 --- a/apps/www/src/app/(analytics)/analytics/[id]/page.tsx +++ b/apps/www/src/app/(analytics)/analytics/[id]/page.tsx @@ -47,13 +47,7 @@ export default async function AnalysisDetailsPage({ - {/* */} - + > Oversikt @@ -97,18 +91,18 @@ export default async function AnalysisDetailsPage({
- + + + + + Legg til regnskapsprogram + + + Legg til regnskapsprogram for å sende faktura. + + + ) } diff --git a/apps/www/src/components/analyse/EditAnalysisNameCard.tsx b/apps/www/src/components/analyse/EditAnalysisNameCard.tsx index 87564c5a..6507926d 100644 --- a/apps/www/src/components/analyse/EditAnalysisNameCard.tsx +++ b/apps/www/src/components/analyse/EditAnalysisNameCard.tsx @@ -45,7 +45,7 @@ const FormSchema = z.object({ }) interface EditAnalysisNameCardProps { - analysisId: number + analysisId: string initialName: string initialDate: Date } diff --git a/apps/www/src/components/analyse/EditKpiCard.tsx.tsx b/apps/www/src/components/analyse/EditKpiCard.tsx.tsx index e731a355..4b70d29a 100644 --- a/apps/www/src/components/analyse/EditKpiCard.tsx.tsx +++ b/apps/www/src/components/analyse/EditKpiCard.tsx.tsx @@ -53,7 +53,7 @@ const FormSchema = z.object({ }) interface EditKpiCardProps { - analysisId: number + analysisId: string initialKpi1: number initialKpi2: number initialKpi3: number diff --git a/apps/www/src/components/analyse/EditMarketDataCard.tsx b/apps/www/src/components/analyse/EditMarketDataCard.tsx index ae808431..3df108de 100644 --- a/apps/www/src/components/analyse/EditMarketDataCard.tsx +++ b/apps/www/src/components/analyse/EditMarketDataCard.tsx @@ -65,7 +65,7 @@ const FormSchema = z.object({ }) interface EditMarketDataCardProps { - analysisId: number + analysisId: string initialMarketRentOffice: number initialMarketRentMerch: number initialMarketRentMisc: number diff --git a/apps/www/src/components/analyse/EditOwnerCostsCard.tsx b/apps/www/src/components/analyse/EditOwnerCostsCard.tsx index 17343cdd..9ba85c8d 100644 --- a/apps/www/src/components/analyse/EditOwnerCostsCard.tsx +++ b/apps/www/src/components/analyse/EditOwnerCostsCard.tsx @@ -69,7 +69,7 @@ const FormSchema = z.object({ }) interface EditOwnerCostsCardProps { - analysisId: number + analysisId: string initialOwnerCostsMethod: boolean initialOwnerCostsManual?: number initialCostMaintenance?: number @@ -99,8 +99,8 @@ export function EditOwnerCostsCard({ initialCostAssetMgmt, initialCostSum, }: EditOwnerCostsCardProps) { + console.log(analysisId) const [isLoading, setIsLoading] = useState(false) - const form = useForm>({ resolver: zodResolver(FormSchema), defaultValues: { @@ -123,33 +123,32 @@ export function EditOwnerCostsCard({ setIsLoading(true) try { const result = await updateAnalysis(analysisId, { - ownerCostsMethod: data.ownerCostsMethod, - ownerCostsManual: data.ownerCostsManual - ? Number(data.ownerCostsManual) - : undefined, - costMaintenance: data.costMaintenance - ? Number(data.costMaintenance) - : undefined, - costInsurance: data.costInsurance - ? Number(data.costInsurance) - : undefined, - costRevision: data.costRevision ? Number(data.costRevision) : undefined, - costAdm: data.costAdm ? Number(data.costAdm) : undefined, - costOther: data.costOther ? Number(data.costOther) : undefined, - costNegotiation: data.costNegotiation - ? Number(data.costNegotiation) - : undefined, - costLegalFees: data.costLegalFees - ? Number(data.costLegalFees) - : undefined, - costConsultFees: data.costConsultFees - ? Number(data.costConsultFees) - : undefined, - costAssetMgmt: data.costAssetMgmt - ? Number(data.costAssetMgmt) - : undefined, - costSum: data.costSum ? Number(data.costSum) : undefined, + costs: { + update: { + ownerCostsMethod: data.ownerCostsMethod, + ownerCostsManual: data.ownerCostsManual + ? Number(data.ownerCostsManual) + : 0, + costMaintenance: data.costMaintenance + ? Number(data.costMaintenance) + : 0, + costInsurance: data.costInsurance ? Number(data.costInsurance) : 0, + costRevision: data.costRevision ? Number(data.costRevision) : 0, + costAdm: data.costAdm ? Number(data.costAdm) : 0, + costOther: data.costOther ? Number(data.costOther) : 0, + costNegotiation: data.costNegotiation + ? Number(data.costNegotiation) + : 0, + costLegalFees: data.costLegalFees ? Number(data.costLegalFees) : 0, + costConsultFees: data.costConsultFees + ? Number(data.costConsultFees) + : 0, + costAssetMgmt: data.costAssetMgmt ? Number(data.costAssetMgmt) : 0, + costSum: data.costSum ? Number(data.costSum) : 0, + }, + }, }) + if (result.success) { toast.success("Analysen ble oppdatert.") } else { diff --git a/apps/www/src/components/analyse/EditROICard.tsx b/apps/www/src/components/analyse/EditROICard.tsx index 351a2cdd..a00bff42 100644 --- a/apps/www/src/components/analyse/EditROICard.tsx +++ b/apps/www/src/components/analyse/EditROICard.tsx @@ -35,7 +35,7 @@ const FormSchema = z.object({ }) interface EditROICardProps { - analysisId: number + analysisId: string initialUseCalcROI: boolean initialROIWeightedYield?: number initialROIInflation?: number diff --git a/apps/www/src/components/analyse/EditRentableAreaCard.tsx b/apps/www/src/components/analyse/EditRentableAreaCard.tsx index 7547dc38..24eea365 100644 --- a/apps/www/src/components/analyse/EditRentableAreaCard.tsx +++ b/apps/www/src/components/analyse/EditRentableAreaCard.tsx @@ -65,7 +65,7 @@ const FormSchema = z.object({ }) interface EditRentableAreaCardProps { - analysisId: number + analysisId: string initialRentableArea: number initialRatioAreaOffice: number initialRatioAreaMerch: number diff --git a/apps/www/src/components/analyse/EditVacancyCard.tsx b/apps/www/src/components/analyse/EditVacancyCard.tsx index d9f1ffdc..295123ee 100644 --- a/apps/www/src/components/analyse/EditVacancyCard.tsx +++ b/apps/www/src/components/analyse/EditVacancyCard.tsx @@ -47,7 +47,7 @@ const FormSchema = z.object({ }) interface EditVacancyCardProps { - analysisId: number + analysisId: string initialVacancyPerYear: string // JSON-streng av ledighet per år } diff --git a/packages/db/prisma/schema.prisma b/packages/db/prisma/schema.prisma index ad040d73..a1c887e5 100644 --- a/packages/db/prisma/schema.prisma +++ b/packages/db/prisma/schema.prisma @@ -280,19 +280,7 @@ model FinancialAnalysisBuilding { kpi4 Float sumValueNow Int sumValueExit Int - ownerCostsMethod Boolean - ownerCostsManual Float? - costMaintenance Float? - costInsurance Float? - costRevision Float? - costAdm Float? - costOther Float? - costNegotiation Float? - costLegalFees Float? - costConsultFees Float? - costAssetMgmt Float? - costSum Float? - costBigExpenses Json? + costs FinancialAnalysisBuildingCosts? useCalcROI Boolean roiWeightedYield Float? roiInflation Float? @@ -460,6 +448,30 @@ model FinancialAnalysisBuildingIncome { @@map("financial_analysis_building_income") } +model FinancialAnalysisBuildingCosts { + id String @id @default(cuid()) + financialAnalysisBuildingId String @unique + costName String? + costType String? + ownerCostsMethod Boolean + ownerCostsManual Float? + costMaintenance Float? + costInsurance Float? + costRevision Float? + costAdm Float? + costOther Float? + costNegotiation Float? + costLegalFees Float? + costConsultFees Float? + costAssetMgmt Float? + costSum Float? + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @default(now()) @map("updated_at") + financialAnalysisBuilding FinancialAnalysisBuilding @relation(fields: [financialAnalysisBuildingId], references: [id]) + + @@map("financial_analysis_building_costs") +} + enum ContractType { LEASE SUBLEASE