000
This commit is contained in:
parent
c56277adb9
commit
7cc40b763f
@ -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>
|
@ -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"}
|
||||
|
241
src/routes/orders/+page.svelte
Normal file
241
src/routes/orders/+page.svelte
Normal 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}
|
@ -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} -->
|
@ -30,7 +30,8 @@ const config = {
|
||||
"/userslist",
|
||||
"/disputes",
|
||||
"/payouts",
|
||||
"/merchants"
|
||||
"/merchants",
|
||||
"/orders"
|
||||
],
|
||||
},
|
||||
},
|
||||
|
Loading…
x
Reference in New Issue
Block a user