transaction edit
This commit is contained in:
@@ -39,7 +39,7 @@ public class Transaction implements Serializable {
|
||||
private Event event;
|
||||
|
||||
@OneToMany(fetch = FetchType.LAZY, mappedBy = "transaction", cascade = CascadeType.ALL, orphanRemoval = true)
|
||||
@JsonIgnoreProperties(value = { "userAccount", "transaction", "event", "registration" }, allowSetters = true)
|
||||
@JsonIgnoreProperties(value = { "transaction", "event", "registration" }, allowSetters = true)
|
||||
private Set<TransactionItem> transactionItems = new HashSet<>();
|
||||
|
||||
// jhipster-needle-entity-add-field - JHipster will add fields here
|
||||
|
||||
@@ -30,7 +30,7 @@ public class TransactionItem implements Serializable {
|
||||
@Column(name = "locked")
|
||||
private Boolean locked;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@ManyToOne(fetch = FetchType.EAGER)
|
||||
@JsonIgnoreProperties(value = { "users", "transactionItems" }, allowSetters = true)
|
||||
private UserAccount userAccount;
|
||||
|
||||
|
||||
@@ -35,7 +35,9 @@ public interface TransactionRepository extends JpaRepository<Transaction, Long>
|
||||
@Query("select transaction from Transaction transaction left join fetch transaction.event")
|
||||
List<Transaction> findAllWithToOneRelationships();
|
||||
|
||||
@Query("select transaction from Transaction transaction left join fetch transaction.event where transaction.id =:id")
|
||||
@Query(
|
||||
"select transaction from Transaction transaction left join fetch transaction.event left join fetch transaction.transactionItems where transaction.id =:id"
|
||||
)
|
||||
Optional<Transaction> findOneWithToOneRelationships(@Param("id") Long id);
|
||||
|
||||
@Query(
|
||||
|
||||
@@ -272,6 +272,10 @@ public class TransactionResource {
|
||||
public ResponseEntity<Transaction> getTransaction(@PathVariable("id") Long id) {
|
||||
LOG.debug("REST request to get Transaction : {}", id);
|
||||
Optional<Transaction> transaction = transactionRepository.findOneWithEagerRelationships(id);
|
||||
// if (transaction.isPresent()) {
|
||||
// transaction.get().getTransactionItems().stream().sorted();
|
||||
// transaction.get().getTransactionItems().sort(Comparator.comparing(item -> item.getUserAccount().getName()));
|
||||
// }
|
||||
return ResponseUtil.wrapOrNotFound(transaction);
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,8 @@ export default defineComponent({
|
||||
setup() {
|
||||
const transactionService = inject('transactionService', () => new TransactionService());
|
||||
const alertService = inject('alertService', () => useAlertService(), true);
|
||||
|
||||
const hasAnyAuthorityValues: Ref<any> = ref({});
|
||||
const accountService = inject<AccountService>('accountService');
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
|
||||
@@ -34,8 +35,19 @@ export default defineComponent({
|
||||
return {
|
||||
alertService,
|
||||
transaction,
|
||||
|
||||
accountService,
|
||||
hasAnyAuthorityValues,
|
||||
previousState,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
hasAnyAuthority(authorities: any): boolean {
|
||||
this.accountService.hasAnyAuthorityAndCheckAuth(authorities).then(value => {
|
||||
if (this.hasAnyAuthorityValues[authorities] !== value) {
|
||||
this.hasAnyAuthorityValues = { ...this.hasAnyAuthorityValues, [authorities]: value };
|
||||
}
|
||||
});
|
||||
return this.hasAnyAuthorityValues[authorities] ?? false;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-8">
|
||||
<div class="col-12">
|
||||
<div v-if="transaction">
|
||||
<h2 class="jh-entity-heading" data-cy="transactionDetailsHeading"><span>Transaction</span> {{ transaction.id }}</h2>
|
||||
<dl class="row jh-entity-details">
|
||||
@@ -40,11 +40,41 @@
|
||||
custom
|
||||
v-slot="{ navigate }"
|
||||
>
|
||||
<button @click="navigate" class="btn btn-primary">
|
||||
<button @click="navigate" class="btn btn-primary" v-if="hasAnyAuthority('ROLE_ADMIN')">
|
||||
<font-awesome-icon icon="pencil-alt"></font-awesome-icon> <span>Edit</span>
|
||||
</button>
|
||||
</router-link>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped" aria-describedby="event.registrations">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col"><span>#</span></th>
|
||||
<th scope="col"><span>Account</span></th>
|
||||
<th scope="col"><span>Amount</span></th>
|
||||
<th scope="col"><span>Comment</span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="(item, index) in transaction.transactionItems" :key="index" class="transaction-item">
|
||||
<td>
|
||||
{{ index }}
|
||||
</td>
|
||||
<td>
|
||||
{{ item.userAccount?.name }}
|
||||
</td>
|
||||
<td>
|
||||
{{ item.amount }}
|
||||
</td>
|
||||
<td>
|
||||
{{ item.comment }}
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -10,6 +10,8 @@ import EventService from '@/entities/event/event.service';
|
||||
import { type IEvent } from '@/shared/model/event.model';
|
||||
import { type ITransaction, Transaction } from '@/shared/model/transaction.model';
|
||||
import { TransactionType } from '@/shared/model/enumerations/transaction-type.model';
|
||||
import { type IUserAccount } from '@/shared/model/user-account.model';
|
||||
import UserAccountService from '@/entities/user-account/user-account.service';
|
||||
|
||||
export default defineComponent({
|
||||
compatConfig: { MODE: 3 },
|
||||
@@ -20,7 +22,11 @@ export default defineComponent({
|
||||
|
||||
const transaction: Ref<ITransaction> = ref(new Transaction());
|
||||
|
||||
transaction.value.transactionItems = [];
|
||||
const dictUserAccounts = ref([]) as Ref<IUserAccount[]>;
|
||||
|
||||
const eventService = inject('eventService', () => new EventService());
|
||||
const userAccountService = inject('userAccountService', () => new UserAccountService());
|
||||
|
||||
const events: Ref<IEvent[]> = ref([]);
|
||||
const transactionTypeValues: Ref<string[]> = ref(Object.keys(TransactionType));
|
||||
@@ -34,13 +40,37 @@ export default defineComponent({
|
||||
|
||||
const retrieveTransaction = async transactionId => {
|
||||
try {
|
||||
const res2 = await userAccountService().retrieve();
|
||||
console.log('got accounts' + res2);
|
||||
dictUserAccounts.value = res2.data;
|
||||
const res = await transactionService().find(transactionId);
|
||||
transaction.value = res;
|
||||
// console.log('len'+transaction.value.transactionItems?.length);
|
||||
// console.log('len'+dictUserAccounts.value.length);
|
||||
// console.log('id'+transaction.value.transactionItems[0].userAccount.id);
|
||||
// console.log('id'+(dictUserAccounts.value.find(account => account.id === transaction.value.transactionItems[0].userAccount.id) || null));
|
||||
// transaction.value.transactionItems[0].userAccount = dictUserAccounts.value.find(account => account.id === transaction.value.transactionItems[0].userAccount.id) || null;
|
||||
transaction.value.transactionItems.forEach((item, index) => {
|
||||
const matchingAccount = dictUserAccounts.value.find(account => account.id === item.userAccount.id);
|
||||
transaction.value.transactionItems[index].userAccount = matchingAccount || null;
|
||||
});
|
||||
} catch (error) {
|
||||
alertService.showHttpError(error.response);
|
||||
}
|
||||
};
|
||||
|
||||
// const retrieveUserAccounts = async () => {
|
||||
// try {
|
||||
// const res = await userAccountService().retrieve();
|
||||
// console.log('got accounts'+ res);
|
||||
// dictUserAccounts.value = res.data;
|
||||
// } catch (error) {
|
||||
// alertService.showHttpError(error.response);
|
||||
// }
|
||||
// };
|
||||
//
|
||||
// retrieveUserAccounts();
|
||||
|
||||
if (route.params?.transactionId) {
|
||||
retrieveTransaction(route.params.transactionId);
|
||||
}
|
||||
@@ -61,10 +91,36 @@ export default defineComponent({
|
||||
date: {},
|
||||
comment: {},
|
||||
event: {},
|
||||
// transactionItems: {
|
||||
// $each: {
|
||||
// amount: { required: validations.required, minValue: validations.minValue(0.01) },
|
||||
// comment: {},
|
||||
// locked: {},
|
||||
// userAccount: {},
|
||||
// },
|
||||
// },
|
||||
};
|
||||
const v$ = useVuelidate(validationRules, transaction as any);
|
||||
v$.value.$validate();
|
||||
|
||||
const addTransactionItem = () => {
|
||||
transaction.value.transactionItems.push({
|
||||
amount: 0,
|
||||
comment: '',
|
||||
locked: false,
|
||||
userAccount: null,
|
||||
});
|
||||
};
|
||||
|
||||
const removeTransactionItem = (index: number) => {
|
||||
transaction.value.transactionItems.splice(index, 1);
|
||||
};
|
||||
|
||||
const calculateUnsettledBalance = (): string => {
|
||||
const balance = transaction.value.transactionItems.reduce((sum, item) => sum + item.amount, 0);
|
||||
return balance.toFixed(2);
|
||||
};
|
||||
|
||||
return {
|
||||
transactionService,
|
||||
alertService,
|
||||
@@ -75,9 +131,12 @@ export default defineComponent({
|
||||
currentLanguage,
|
||||
events,
|
||||
v$,
|
||||
dictUserAccounts,
|
||||
addTransactionItem,
|
||||
removeTransactionItem,
|
||||
calculateUnsettledBalance,
|
||||
};
|
||||
},
|
||||
created(): void {},
|
||||
methods: {
|
||||
save(): void {
|
||||
this.isSaving = true;
|
||||
|
||||
@@ -76,6 +76,52 @@
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<button type="button" @click="addTransactionItem" class="btn btn-success">Add Transaction Item</button>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped" aria-describedby="event.registrations">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col"><span></span></th>
|
||||
<th scope="col"><span>Locked</span></th>
|
||||
<th scope="col"><span>Account</span></th>
|
||||
<th scope="col"><span>Amount</span></th>
|
||||
<th scope="col"><span>Comment</span></th>
|
||||
<th scope="col"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="(item, index) in transaction.transactionItems" :key="index" class="transaction-item">
|
||||
<td>
|
||||
{{ item.id }}
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" v-model="item.locked" class="form-check-input" />
|
||||
</td>
|
||||
<td>
|
||||
<select v-model="item.userAccount" class="form-control" v-if="dictUserAccounts.length">
|
||||
<option v-for="account in dictUserAccounts" :key="account.id" :value="account">{{ account.name }}</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<input type="number" v-model="item.amount" step="0.01" class="form-control" />
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" v-model="item.comment" class="form-control" placeholder="Comment" />
|
||||
</td>
|
||||
<td>
|
||||
<button type="button" @click="removeTransactionItem(index)" class="btn btn-danger">Remove</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Unsettled Balance:</label>
|
||||
<input type="text" class="form-control" :value="calculateUnsettledBalance()" readonly />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<button type="button" id="cancel-save" data-cy="entityCreateCancelButton" class="btn btn-secondary" @click="previousState()">
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<th scope="row"><span>Comment</span></th>
|
||||
|
||||
<th scope="row"><span>Event</span></th>
|
||||
<th scope="row" v-for="item in transactions[0].items">
|
||||
<th scope="row" v-for="item in transactions[0].transactionItems">
|
||||
<span>{{ item.userAccount?.name }}</span>
|
||||
</th>
|
||||
<th scope="row"></th>
|
||||
@@ -54,7 +54,7 @@
|
||||
}}</router-link>
|
||||
</div>
|
||||
</td>
|
||||
<td v-for="item in transaction.items">{{ item.amount }}</td>
|
||||
<td v-for="item in transaction.transactionItems">{{ item.amount }}</td>
|
||||
<td class="text-right">
|
||||
<div class="btn-group">
|
||||
<router-link :to="{ name: 'TransactionView', params: { transactionId: transaction.id } }" custom v-slot="{ navigate }">
|
||||
|
||||
@@ -8,7 +8,7 @@ export interface ITransaction {
|
||||
date?: Date | null;
|
||||
comment?: string | null;
|
||||
event?: IEvent | null;
|
||||
items?: ITransactionItem[] | [];
|
||||
transactionItems?: ITransactionItem[] | [];
|
||||
}
|
||||
|
||||
export class Transaction implements ITransaction {
|
||||
@@ -18,7 +18,7 @@ export class Transaction implements ITransaction {
|
||||
public date?: Date | null,
|
||||
public comment?: string | null,
|
||||
public event?: IEvent | null,
|
||||
public items?: ITransactionItem[] | [],
|
||||
public transactionItems?: ITransactionItem[] | [],
|
||||
) {}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user