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