This commit is contained in:
you 2024-09-07 11:24:54 +03:00
parent c56277adb9
commit 7cc40b763f
5 changed files with 327 additions and 29 deletions

View File

@ -7,11 +7,13 @@
import { redirect } from "$lib/tools/url/URLTools";
import { jwtDecode } from "jwt-decode";
let showMenu = false;
</script>
<div class="navbar bg-base-100">
<div class="navbar-start">
<div class="dropdown">
<div tabindex="0" role="button" class="btn btn-ghost lg:hidden">
<button on:click={()=>{showMenu = !showMenu;}} tabindex="0" class="btn btn-ghost lg:hidden">
<svg
xmlns="http://www.w3.org/2000/svg"
class="h-5 w-5"
@ -26,22 +28,7 @@
d="M4 6h16M4 12h8m-8 6h16"
/>
</svg>
</div>
<ul
class="menu menu-sm dropdown-content bg-base-100 rounded-box z-[1] mt-3 w-52 p-2 shadow"
>
<li>
<a href="/admin/userslist">Пользователи</a>
</li>
<li>
<a href="/admin/newuser">Добавить пользователя</a>
</li>
<li><a href="/admin/disputes">Споры</a></li>
<li><a href="/admin/payouts">Выплаты</a></li>
{#if jwtDecode(getAuthInfo()?.a)?.role == "4"}
<li><a href="/admin/merchants">Мерчанты</a></li>
{/if}
</ul>
</button>
</div>
<a href="/admin/" class="btn btn-ghost text-xl">HostaPay</a>
<p class="text-sm ml-1 mt-2">{jwtDecode(getAuthInfo()?.a)?.role == "4" ? "Admin":"Moder"}</p>
@ -56,6 +43,7 @@
</li>
<li><a href="/admin/disputes">Споры</a></li>
<li><a href="/admin/payouts">Выплаты</a></li>
<li><a href="/admin/orders">Заявки</a></li>
{#if jwtDecode(getAuthInfo()?.a)?.role == "4"}
<li><a href="/admin/merchants">Мерчанты</a></li>
{/if}
@ -72,3 +60,22 @@
}} class="btn btn-error btn-outline">Выход</button>
</div>
</div>
<div class={"fixed inset-0 top-16 z-50 flex flex-col items-center justify-center bg-base-100 transition-all duration-150 lg:hidden " + (showMenu ? "":"-translate-x-full")}>
<ul
class="menu menu-sm dropdown-content bg-base-300 rounded-box w-52 p-2 shadow"
>
<li>
<a on:click={()=>{showMenu = false;}} href="/admin/userslist">Пользователи</a>
</li>
<li>
<a on:click={()=>{showMenu = false;}} href="/admin/newuser">Добавить пользователя</a>
</li>
<li><a on:click={()=>{showMenu = false;}} href="/admin/disputes">Споры</a></li>
<li><a on:click={()=>{showMenu = false;}} href="/admin/payouts">Выплаты</a></li>
<li><a on:click={()=>{showMenu = false;}} href="/admin/orders">Заявки</a></li>
{#if jwtDecode(getAuthInfo()?.a)?.role == "4"}
<li><a on:click={()=>{showMenu = false;}} href="/admin/merchants">Мерчанты</a></li>
{/if}
</ul>
</div>

View File

@ -34,7 +34,7 @@
const result = await makePost(
"admin/getDisputes",
{
page: 1,
page: currentPageDisputes,
filter: currentDisputesFilter
},
makeAuthHeaderForAxios(getAuthInfo()?.a)
@ -263,13 +263,13 @@
<div class="rounded-box flex flex-col bg-base-100 p-4 gap-1 mt-4">
<p class="text-lg font-bold">Сумма в споре</p>
<p>
{(Number(selectedDispute.new_amount) / Number(selectedDispute.order_rate)).toFixed(2)} {selectedDispute.out_code} ({Number(selectedDispute.new_amount)} USDT)
{Number(selectedDispute.new_amount)} {selectedDispute.out_code} ({(Number(selectedDispute.new_amount) / Number(selectedDispute.order_rate)).toFixed(2)} USDT)
</p>
</div>
<div class="rounded-box flex flex-col bg-base-100 p-4 gap-1 mt-4">
<p class="text-lg font-bold">Сумма в заявке</p>
<p>
{Number(selectedDispute.order_rate) * Number(selectedDispute.amount)} {selectedDispute.out_code} ({Number(selectedDispute.amount)} USDT)
{Number(selectedDispute.amount)} {selectedDispute.out_code} ({(Number(selectedDispute.amount) / Number(selectedDispute.order_rate)).toFixed(2)} USDT)
</p>
</div>
{#if selectedDispute["order_status"] === "4" || selectedDispute["order_status"] === "8"}

View File

@ -0,0 +1,241 @@
<script>
// @ts-nocheck
import { getAuthInfo, makeAuthHeaderForAxios } from "$lib/auth/Auth";
import { makePost } from "$lib/tools/requests/requests";
import { sayError, sayInfo } from "$lib/tools/toaster/Toaster";
const orderStatusMap = {
"1": "Ожидает исполнения",
"2": "Время заявки истекло",
"3": "Исполнена",
"4": "Спор на проверке у администрации",
"5": "Спор на проверке у трейдера",
"6": "Спор принят трейдером",
"7": "Спор отклонён трейдером",
"8": "Сумма проверяется администрацией",
};
export let data;
let { userData } = data;
let { token } = data;
let showFoundedOrderWindow = false;
let showLoadingFind = false;
let foundedDispute;
let external_uuidValue = "";
let uuidValue = "";
let external_user_idValue = "";
async function findDispute() {
showLoadingFind = true;
let sData = {};
if (external_uuidValue !== "") {
sData["external_uuid"] = external_uuidValue;
} else if (uuidValue !== "") {
sData["uuid"] = uuidValue;
} else if (external_user_idValue !== "") {
sData["external_user_id"] = external_user_idValue;
} else {
showLoadingFind = false;
return;
}
const res = await makePost(
"admin/findOrder",
sData,
makeAuthHeaderForAxios(getAuthInfo()?.a)
);
if (res.error) {
sayError("Заявка не найдена!");
showLoadingFind = false;
return;
}
foundedDispute = res.data;
showFoundedOrderWindow = true;
showLoadingFind = false;
}
let showLoadingRollback = false;
async function rollbackOrder(id) {
showLoadingRollback = true;
const res = await makePost(
"admin/rollbackOrder",
{
id: Number(id),
summa: foundedDispute["summa"],
},
makeAuthHeaderForAxios(getAuthInfo()?.a)
);
if (res.error) {
// console.log(res);
if (res.status == 401) {
sayError("Данные авторизации устарели!");
}
sayError("Не удалось закрыть заявку!");
showLoadingRollback = false;
return;
}
sayInfo("Заявка закрыта!");
showLoadingRollback = false;
showFoundedOrderWindow = false;
}
let showChangeSum = false;
let newSum = 0;
$: if (foundedDispute !== 0) newSum = Number(foundedDispute?.summa);
let showLoadingChangeSum = false;
async function changeSum(id) {
showLoadingChangeSum = true;
const res = await makePost(
"admin/rollbackOrder",
{
id: Number(id),
summa: newSum.toString(),
},
makeAuthHeaderForAxios(getAuthInfo()?.a)
);
if (res.error) {
if (res.status == 401) {
sayError("Данные авторизации устарели!");
}
sayError("Не удалось изменить сумму");
showLoadingChangeSum = false;
return;
}
sayInfo("Сумма успешно изменена!");
showLoadingChangeSum = false;
showChangeSum = false;
showFoundedOrderWindow = false;
}
</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">
<p class="text-sm mt-2">external_uuid</p>
<input
bind:value={external_uuidValue}
type="text"
class="input input-bordered"
/>
<p class="text-sm mt-2">uuid</p>
<input bind:value={uuidValue} type="text" class="input input-bordered" />
<p class="text-sm mt-2">external_user_id</p>
<input
bind:value={external_user_idValue}
type="text"
class="input input-bordered"
/>
<button
on:click={() => {
findDispute();
}}
class="btn btn-outline mt-2"
>
{#if showLoadingFind}
<span class="loading loading-dots loading-xs"></span>
{:else}
{"Найти заявку"}
{/if}
</button>
</div>
</div>
{#if showFoundedOrderWindow}
<div
class="fixed inset-0 z-[1000] bg-black bg-opacity-50 flex justify-center items-center"
>
<div class="flex flex-col p-4 bg-base-100 rounded-md">
<p class="text-sm">UUID</p>
<p class="font-semibold">{foundedDispute["uuid"]}</p>
<p class="text-sm mt-3">ID заявки</p>
<p class="font-semibold">{foundedDispute["id"]}</p>
<p class="text-sm mt-3">ID клиента</p>
<p class="font-semibold">{foundedDispute["external_user_id"]}</p>
<p class="text-sm mt-3">Статус</p>
<p class="">{orderStatusMap[foundedDispute["status"]]}</p>
<p class="text-sm mt-3">Сумма</p>
<p>
{foundedDispute["summa"]}
{foundedDispute["currency_code"]} ({(
Number(foundedDispute["summa"]) / Number(foundedDispute["rate"])
).toFixed(2)} USDT)
</p>
<p class="text-sm mt-3">Курс</p>
<p>{foundedDispute["rate"]} {foundedDispute["currency_code"]}</p>
<p class="text-sm mt-3">Карта</p>
<p>{foundedDispute["cardnumber"]}</p>
<p class="text-sm mt-3">Время создания</p>
<p>{foundedDispute["creationtime"]}</p>
<!-- <p>{foundedDispute["closetime"]}</p> -->
<button
on:click={() => {
rollbackOrder(foundedDispute["id"]);
}}
class="btn btn-outline btn-info mt-4"
>
{#if showLoadingRollback}
<span class="loading loading-dots loading-xs"></span>
{:else}
{"Закрыть заявку ручками"}
{/if}</button
>
<button
on:click={() => {
showChangeSum = true;
}}
class="btn btn-info btn-outline">Изменить сумму</button
>
<button
on:click={() => {
showFoundedOrderWindow = false;
}}
class="btn btn-outline mt-1">Закрыть окно</button
>
</div>
</div>
{/if}
{#if showChangeSum}
<div
class="fixed inset-0 z-[1001] bg-black bg-opacity-50 flex justify-center items-center"
>
<div class="flex flex-col p-4 bg-base-100 rounded-md">
<p>Укажите новую сумму ({foundedDispute["currency_code"]})</p>
<input
on:click={newSum}
type="number"
class="input input-bordered min-w-[320px]"
/>
<button
on:click={() => {
changeSum(foundedDispute["id"]);
}}
class="btn btn-outline btn-info"
>
{#if showLoadingChangeSum}
<span class="loading loading-dots loading-xs"></span>
{:else}
{"Изменить суму ручками"}
{/if}
</button>
<button
on:click={() => {
showChangeSum = false;
}}
class="btn btn-outline">Закрыть</button
>
</div>
</div>
{/if}

View File

@ -12,6 +12,12 @@
let userInfoReloading = false;
const orderStatusMap = {
"1": "Ожидает исполнения",
"2": "Время заявки истекло",
"3": "Исполнена",
};
async function deleteUser() {
const result = await makePost(
"deleteUser",
@ -61,15 +67,16 @@
let numPagesUserOrders = 1;
let currentPageUserOrders = 1;
let disablePagesUserOrders = false;
let ordersFilter = "1";
async function getUserOrders() {
disablePagesUserOrders = true;
const result = await makePost(
"getUserOrders",
"admin/getUserOrders",
{
token: token,
page: currentPageUserOrders - 1,
orderBy: "id",
statuses_to_send: 2,
// orderBy: "id",
statuses_to_send: Number(ordersFilter),
},
makeAuthHeaderForAxios(getAuthInfo()?.a)
);
@ -154,11 +161,25 @@
// console.log(result.data, 'depos');
}
$: if(browser || Number(ordersFilter) > -999) getUserOrders();
if (browser) {
getUserOrders();
getUserRequisites();
getUserDeposits();
}
let findFieldValue = "";
let showLoadingFind = false;
let showFoundedOrderWindow = false;
async function findOrder() {
showLoadingFind = true;
const res = await makePost("admin/find", {
}, makeAuthHeaderForAxios(getAuthInfo()?.a));
}
showLoadingFind = false;
</script>
<div class="w-full flex flex-col gap-8">
@ -299,6 +320,10 @@
</div>
<div class="w-full flex flex-col p-4 rounded-box bg-base-300">
<div class="w-full flex flex-col justify-center items-center">
<!-- <div class="flex items-center gap-2">
<input bind:value={findFieldValue} type="text" class="input input-bordered">
<button on:click={()=>{showFoundedOrderWindow = true;}} class="btn btn-outline">Найти</button>
</div> -->
<Pagination
totalPages={numPagesUserOrders}
pageChangedCallback={(n) => {
@ -306,16 +331,26 @@
getUserOrders();
}}
disableButtons={disablePagesUserOrders}
css={"btn-neutral"}
css={"btn-neutral mt-2"}
/>
<p class="opacity-50 text-xs mt-1">Всего страниц: {numPagesUserOrders}</p>
<select
bind:value={ordersFilter}
class="select select-bordered min-w-[230px] mt-2"
>
<!-- <option value="-1"> Все выплаты </option> -->
<option value="1"> {orderStatusMap["1"]} </option>
<option value="2"> {orderStatusMap["2"]} </option>
<option value="3"> {orderStatusMap["3"]} </option>
</select>
</div>
<div class="overflow-x-auto mt-4">
<table class="table">
<!-- head -->
<thead>
<tr>
<th>ID</th>
<th>UUID</th>
<th>ID клиента</th>
<th>Статус</th>
<th>Сумма</th>
<th>Курс</th>
@ -330,14 +365,18 @@
<tbody>
{#each userOrders as order}
<tr class="hover:bg-neutral group">
<td class="font-semibold">{order["id"]}</td>
<td class="font-semibold">{order["uuid"]}</td>
<td class="font-semibold">{order["external_user_id"]}</td>
<td class="">{order["status"]}</td>
<td>{order["summa"]} USDT</td>
<td>{order["rate"]} RUB</td>
<td>{order["summa"]} {userData?.code}</td>
<td>{order["rate"]} {userData?.code}</td>
<td>{order["is_sbp"] === "t" ? "да" : "нет"}</td>
<td>{order["merchant_id"]}</td>
<td>{order["creationtime"]}</td>
<td>{order["closetime"]}</td>
<!-- <td>
<button class="btn btn-outline">Закрыть ручками</button>
</td> -->
<!-- <td class="flex gap-2">
<a href="" class="btn btn-info">Изменить</a>
<button class="btn btn-error">Удалить</button>
@ -397,3 +436,13 @@
</div>
</div>
</div>
<!-- {#if showFoundedOrderWindow}
<div class="fixed z-[1000] inset-0 flex justify-center items-center bg-black bg-opacity-50">
<div class="bg-base-100 rounded-md p-4 flex flex-col">
<button class="btn btn-outline" on:click={()=>{showFoundedOrderWindow = false;}}>Закрыть</button>
<button class="btn btn-outline" on:click={()=>{showFoundedOrderWindow = false;}}>Закрыть</button>
</div>
</div>
{/if} -->

View File

@ -30,7 +30,8 @@ const config = {
"/userslist",
"/disputes",
"/payouts",
"/merchants"
"/merchants",
"/orders"
],
},
},