added finance

This commit is contained in:
FIRST_NAME LAST_NAME 2026-02-25 20:39:25 +03:00
parent 46005c648b
commit 053a26ffaa

View 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}