Skip to content

Commit

Permalink
Merge pull request #123 from Kerosene-Labs/build-expenses
Browse files Browse the repository at this point in the history
Finishing up the initial one-off expense implementation
  • Loading branch information
hlafaille authored Dec 26, 2024
2 parents 3a0a914 + be41774 commit cfb03fb
Show file tree
Hide file tree
Showing 10 changed files with 54 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class ExpensesController(private val expenseService: ExpenseService) {
@Parameter(hidden = true) user: UserEntity,
@Valid @RequestBody request: CreateOneOffExpenseRequest,
) {
expenseService.createOneOffExpense(request.amount, user, request.date)
expenseService.createOneOffExpense(request.amount, user, request.date, request.description)
}

@GetMapping("/expenses")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import java.util.*
* [ExpenseEventEntity.recurringExpenseEventCreator] being `null`).
*/
@Entity
@Table(name = "expense_event", schema = "public")
class ExpenseEventEntity(
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Expand All @@ -25,6 +26,9 @@ class ExpenseEventEntity(
@Column(nullable = false)
var date: Instant = Instant.now(),

@Column(nullable = false)
var description: String = "",

@ManyToOne
var recurringExpenseEventCreator: RecurringExpenseEventCreatorEntity? = null
)
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.kerosenelabs.billtracker.entity

import jakarta.persistence.Entity
import jakarta.persistence.GeneratedValue
import jakarta.persistence.GenerationType
import jakarta.persistence.Id
import jakarta.persistence.*
import java.util.*

/**
Expand All @@ -14,6 +11,7 @@ import java.util.*
* occurrences and will create the [ExpenseEventEntity] for these events.
*/
@Entity
@Table(name = "recurring_expense_event_creator", schema = "public")
class RecurringExpenseEventCreatorEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,6 @@ data class ExpenseEvent(
val id: UUID,
val amount: BigDecimal,
val date: Instant,
val expenseEventType: ExpenseEventType
val expenseEventType: ExpenseEventType,
val description: String
)
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package com.kerosenelabs.billtracker.model.request

import jakarta.validation.constraints.NotBlank
import jakarta.validation.constraints.Positive
import java.math.BigDecimal
import java.time.Instant

data class CreateOneOffExpenseRequest(
@field:Positive val amount: BigDecimal,
val date: Instant,
@field:NotBlank
val description: String,
)
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,12 @@ class ExpenseService(
* Creates a one-off expense. For example, one might create a one-off expense for purchasing dinner or groceries.
* @see ExpenseEventEntity
*/
fun createOneOffExpense(amount: BigDecimal, user: UserEntity, date: Instant): ExpenseEventEntity {
fun createOneOffExpense(amount: BigDecimal, user: UserEntity, date: Instant, description: String): ExpenseEventEntity {
val expenseEvent = ExpenseEventEntity(
amount = amount,
user = user,
date = date,
description = description
)
return expenseEventRepository.save(expenseEvent)
}
Expand All @@ -47,6 +48,7 @@ class ExpenseService(
date = expenseEventEntity.date,
expenseEventType = ExpenseEventType.ONE_OFF,
amount = expenseEventEntity.amount,
description = expenseEventEntity.description,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,28 +21,33 @@
})
</script>

<div class="rounded-2xl bg-neutral-800 flex flex-col gap-2 text-center">
<!-- Header -->
<div class="grid grid-cols-4 font-mono font-bold text-sm rounded-t-2xl bg-neutral-900/80 p-4 text-neutral-400">
<span>Amount</span>
<span>Date</span>
<span>Description</span>
<span>Type</span>
</div>
<div class="rounded-2xl bg-neutral-800 flex flex-col text-center overflow-clip max-h-[20rem]">
{#if expenses === undefined}
<!--Loading Spinner-->
<div class="flex w-full">
<div class="flex w-full justify-center p-6">
<Spinner></Spinner>
</div>
{:else if expenses !== undefined && expenses.length == 0}
<div class="flex p-8 items-center justify-center flex-col gap-2">
<p class="font-mono font-black text-2xl text-neutral-300">🦗...crickets</p>
<p class="text-neutral-100 font-semibold">There's no expenses here.</p>
</div>
{:else}
<!-- Header -->
<div class="grid grid-cols-4 font-mono font-bold text-sm rounded-t-2xl bg-neutral-900/80 p-4 text-neutral-400">
<span>Amount</span>
<span>Occurred On</span>
<span>Description</span>
<span>Type</span>
</div>
<!--Content-->
<div class="flex flex-col gap-2 p-2 font-semibold text-white">
<div class="flex flex-col font-semibold text-white overflow-y-auto">
{#each expenses as expense}
<div class="grid grid-cols-4">
<div class="grid grid-cols-4 items-center hover:bg-neutral-700/10 active:bg-neutral-700/20 p-4 transition-colors border-b border-b-neutral-700/50">
<span>${expense.amount}</span>
<span>{expense.date.toDateString()}</span>
<span>...</span>
<span>...</span>
<span>{expense.description}</span>
<span class="bg-neutral-900/50 p-2 rounded-xl font-mono text-neutral-300 text-sm">One-off</span>
</div>
{/each}
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@
import {goto} from "$app/navigation";
let amount: number = 0.00;
let description: string;
let date: string = "";
function createOneOff() {
new ExpensesApi(getPrivateApiConfig()).createOneOff({createOneOffExpenseRequest: {amount, date: new Date(date)}})
new ExpensesApi(getPrivateApiConfig()).createOneOff({createOneOffExpenseRequest: {amount, date: new Date(date), description: description}})
.then((response) => {
addToToastQueue({message: "Successfully created one-off expense.", type: ToastType.SUCCESS})
goto("/app/expenses")
Expand All @@ -28,6 +29,7 @@
<div class="flex flex-col gap-4">
<div class="flex flex-col xl:flex-row gap-4 h-fit w-full">
<LineEdit id="amount" type="number" label="Amount" bind:value={amount}></LineEdit>
<LineEdit id="description" type="text" label="Description" bind:value={description}></LineEdit>
<LineEdit id="date" type="date" label="Date" bind:value={date}></LineEdit>
</div>
<Button on:click={createOneOff}>Create</Button>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@ export interface CreateOneOffExpenseRequest {
* @memberof CreateOneOffExpenseRequest
*/
date: Date;
/**
*
* @type {string}
* @memberof CreateOneOffExpenseRequest
*/
description: string;
}

/**
Expand All @@ -39,6 +45,7 @@ export interface CreateOneOffExpenseRequest {
export function instanceOfCreateOneOffExpenseRequest(value: object): value is CreateOneOffExpenseRequest {
if (!('amount' in value) || value['amount'] === undefined) return false;
if (!('date' in value) || value['date'] === undefined) return false;
if (!('description' in value) || value['description'] === undefined) return false;
return true;
}

Expand All @@ -54,6 +61,7 @@ export function CreateOneOffExpenseRequestFromJSONTyped(json: any, ignoreDiscrim

'amount': json['amount'],
'date': (new Date(json['date'])),
'description': json['description'],
};
}

Expand All @@ -70,6 +78,7 @@ export function CreateOneOffExpenseRequestToJSONTyped(value?: CreateOneOffExpens

'amount': value['amount'],
'date': ((value['date']).toISOString()),
'description': value['description'],
};
}

9 changes: 9 additions & 0 deletions src/main/svelte/src/lib/sdk/models/ExpenseEvent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ export interface ExpenseEvent {
* @memberof ExpenseEvent
*/
expenseEventType: ExpenseEventExpenseEventTypeEnum;
/**
*
* @type {string}
* @memberof ExpenseEvent
*/
description: string;
}


Expand All @@ -65,6 +71,7 @@ export function instanceOfExpenseEvent(value: object): value is ExpenseEvent {
if (!('amount' in value) || value['amount'] === undefined) return false;
if (!('date' in value) || value['date'] === undefined) return false;
if (!('expenseEventType' in value) || value['expenseEventType'] === undefined) return false;
if (!('description' in value) || value['description'] === undefined) return false;
return true;
}

Expand All @@ -82,6 +89,7 @@ export function ExpenseEventFromJSONTyped(json: any, ignoreDiscriminator: boolea
'amount': json['amount'],
'date': (new Date(json['date'])),
'expenseEventType': json['expenseEventType'],
'description': json['description'],
};
}

Expand All @@ -100,6 +108,7 @@ export function ExpenseEventToJSONTyped(value?: ExpenseEvent | null, ignoreDiscr
'amount': value['amount'],
'date': ((value['date']).toISOString()),
'expenseEventType': value['expenseEventType'],
'description': value['description'],
};
}

0 comments on commit cfb03fb

Please sign in to comment.