added finance
This commit is contained in:
parent
46005c648b
commit
053a26ffaa
207
src/routes/finance/+page.svelte
Normal file
207
src/routes/finance/+page.svelte
Normal file
@ -0,0 +1,207 @@
|
||||
<script>
|
||||
import { getAuthInfo, makeAuthHeaderForAxios } from "$lib/auth/Auth";
|
||||
import { makePost } from "$lib/tools/requests/requests";
|
||||
import { sayError, sayInfo } from "$lib/tools/toaster/Toaster";
|
||||
import Pagination from "$lib/ui-components/pagination.svelte";
|
||||
import { onMount } from "svelte";
|
||||
|
||||
let orderID = "";
|
||||
let inProcess = false;
|
||||
let showFullInfoModal = false;
|
||||
let events = [];
|
||||
let selectedEvents = [];
|
||||
let selectedForFullInfo = {};
|
||||
|
||||
async function fetchFinance() {
|
||||
if (inProcess) return;
|
||||
inProcess = true;
|
||||
const authInfo = await getAuthInfo();
|
||||
const headers = makeAuthHeaderForAxios(authInfo?.a);
|
||||
const response = await makePost(
|
||||
"admin/orders/finance_events/load",
|
||||
{ order_id: orderID },
|
||||
headers,
|
||||
);
|
||||
if (response.error) {
|
||||
sayError("Ошибка при получении финансовых событий");
|
||||
} else {
|
||||
// sayInfo("Информация успешно получена");
|
||||
events = response.data.data;
|
||||
console.log(response);
|
||||
}
|
||||
inProcess = false;
|
||||
}
|
||||
|
||||
const glossary = {
|
||||
amount: "Сумма",
|
||||
comment: "Комментарий",
|
||||
transaction_id: "ID транзакции",
|
||||
old_event: "Предыдущие событие",
|
||||
name: "Владелец",
|
||||
owner_type: "Тип владельца",
|
||||
time: "Время",
|
||||
type: "Тип",
|
||||
user_id: "ID Пользователя",
|
||||
uuid: "UUID",
|
||||
};
|
||||
|
||||
let inProcessReverting = false;
|
||||
async function rollback() {
|
||||
if (inProcessReverting) return;
|
||||
inProcessReverting = true;
|
||||
|
||||
const res = await makePost(
|
||||
"admin/orders/finance_events/revert",
|
||||
{
|
||||
finance_events: [...selectedEvents],
|
||||
},
|
||||
makeAuthHeaderForAxios(getAuthInfo()?.a),
|
||||
);
|
||||
|
||||
if (res.error) {
|
||||
sayError("Не удалось откатить события");
|
||||
} else {
|
||||
sayInfo("Откат успешен");
|
||||
selectedEvents = [];
|
||||
fetchFinance();
|
||||
}
|
||||
inProcessReverting = false;
|
||||
}
|
||||
|
||||
onMount(() => {});
|
||||
</script>
|
||||
|
||||
<div class="w-full flex flex-col gap-8">
|
||||
<div class="flex gap-4">
|
||||
<div class="bg-accent rounded-[4px] w-[10px] h-full"></div>
|
||||
<h1 class="text-2xl font-semibold">Финансовые события</h1>
|
||||
</div>
|
||||
<div class="w-full flex flex-col p-4 rounded-box bg-base-300">
|
||||
<label class={"input input-bordered flex items-center gap-2 "}>
|
||||
ID заявки:
|
||||
<input
|
||||
bind:value={orderID}
|
||||
type="text"
|
||||
class="grow text-lg text-info"
|
||||
/>
|
||||
</label>
|
||||
<button
|
||||
on:click={() => {
|
||||
selectedEvents = [];
|
||||
fetchFinance();
|
||||
}}
|
||||
class="btn btn-outline btn-info mt-4"
|
||||
>
|
||||
{#if inProcess}
|
||||
<span class="loading loading-md"></span>
|
||||
{:else}
|
||||
Поиск
|
||||
{/if}
|
||||
</button>
|
||||
{#if selectedEvents.length > 0}
|
||||
<button
|
||||
on:click={() => {
|
||||
rollback();
|
||||
}}
|
||||
class="btn btn-outline btn-warning mt-4"
|
||||
>
|
||||
{#if inProcessReverting}
|
||||
<span class="loading loading-md"></span>
|
||||
{:else}
|
||||
Откатить
|
||||
{/if}
|
||||
</button>
|
||||
{:else}
|
||||
<div class="h-[64px]"></div>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="overflow-x-auto mt-4 bg-base-300">
|
||||
{#if inProcess}
|
||||
<span class="loading loading-md"></span>
|
||||
{:else}
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Сумма</th>
|
||||
<th>Пользователь</th>
|
||||
<th>Тип операции</th>
|
||||
<th>Тип владельца</th>
|
||||
<th></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{#each events as eve}
|
||||
<tr class="hover:bg-neutral group">
|
||||
<td>{eve["amount"]}</td>
|
||||
<td>{eve["name"]}</td>
|
||||
<td>{eve["type"]}</td>
|
||||
<td>{eve["owner_type"]}</td>
|
||||
<td>
|
||||
<input
|
||||
on:change={(e) => {
|
||||
if (e.target.checked) {
|
||||
selectedEvents = [
|
||||
...selectedEvents,
|
||||
eve["uuid"],
|
||||
];
|
||||
console.log(selectedEvents);
|
||||
} else {
|
||||
const t = selectedEvents.filter(
|
||||
(i) => i !== eve["uuid"],
|
||||
);
|
||||
selectedEvents = [...t];
|
||||
}
|
||||
}}
|
||||
type="checkbox"
|
||||
class="checkbox-primary checkbox"
|
||||
/>
|
||||
</td>
|
||||
<td>
|
||||
<button
|
||||
class="btn btn-info btn-sm"
|
||||
on:click={() => {
|
||||
selectedForFullInfo = eve;
|
||||
showFullInfoModal = true;
|
||||
}}
|
||||
>
|
||||
Подробнее
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
{/each}
|
||||
</tbody>
|
||||
</table>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if showFullInfoModal}
|
||||
<div
|
||||
class="fixed inset-0 z-[1001] bg-black bg-opacity-50 flex justify-center items-center"
|
||||
>
|
||||
<div class="flex flex-col p-8 bg-base-100 rounded-md gap-1">
|
||||
{#each Object.keys(selectedForFullInfo) as key}
|
||||
{#if key === "metadata"}
|
||||
{#each Object.keys(selectedForFullInfo[key]) as subKey}
|
||||
<p class="font-bold text-lg">
|
||||
{glossary[subKey] ?? subKey}
|
||||
</p>
|
||||
<p>{selectedForFullInfo[key][subKey]}</p>
|
||||
{/each}
|
||||
{:else}
|
||||
<p class="font-bold text-lg">{glossary[key] ?? key}</p>
|
||||
<p>{selectedForFullInfo[key]}</p>
|
||||
{/if}
|
||||
{/each}
|
||||
<button
|
||||
class="btn btn-outline mt-4"
|
||||
on:click={() => {
|
||||
showFullInfoModal = false;
|
||||
}}
|
||||
>
|
||||
Закрыть
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
Loading…
x
Reference in New Issue
Block a user