aboba
This commit is contained in:
parent
f6ca40aeda
commit
f22743d57c
@ -1,4 +1,6 @@
|
||||
<script>
|
||||
// @ts-nocheck
|
||||
|
||||
|
||||
import { getAuthInfo, saveAuthInfo } from "$lib/auth/Auth";
|
||||
import { AuthStorage } from "$lib/tools/storages/auth-storage";
|
||||
@ -36,6 +38,9 @@
|
||||
</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>
|
||||
</div>
|
||||
<a href="/admin/" class="btn btn-ghost text-xl">HostaPay</a>
|
||||
@ -51,6 +56,9 @@
|
||||
</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}
|
||||
<!-- <li><a>Item 3</a></li> -->
|
||||
</ul>
|
||||
</div>
|
||||
|
173
src/routes/merchants/+page.svelte
Normal file
173
src/routes/merchants/+page.svelte
Normal file
@ -0,0 +1,173 @@
|
||||
<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";
|
||||
import Pagination from "$lib/ui-components/pagination.svelte";
|
||||
import { redirect } from "$lib/tools/url/URLTools";
|
||||
import axios from "axios";
|
||||
import { isStringEmptyOrSpaces } from "$lib/tools/strings/Strings";
|
||||
|
||||
let merchants = [];
|
||||
let value_merchantsFilter = "true";
|
||||
let showMerchants = false;
|
||||
|
||||
$: value_merchantsFilter, getMerchants();
|
||||
|
||||
async function getMerchants() {
|
||||
showMerchants = false;
|
||||
let res = await makePost(
|
||||
"admin/merchants",
|
||||
{
|
||||
active: value_merchantsFilter === "true",
|
||||
},
|
||||
makeAuthHeaderForAxios(getAuthInfo()?.a),
|
||||
);
|
||||
// console.log(res);
|
||||
merchants = res.data;
|
||||
if (Array.isArray(merchants) === false) {
|
||||
merchants = [];
|
||||
}
|
||||
showMerchants = true;
|
||||
selectedMerchant = "";
|
||||
}
|
||||
|
||||
let selectedMerchant = "";
|
||||
let value_startTime = "0";
|
||||
let value_endTime = "0";
|
||||
|
||||
function checkTime() {
|
||||
if (isStringEmptyOrSpaces(value_endTime) || value_endTime === "0")
|
||||
{
|
||||
// showStats = true;
|
||||
return;
|
||||
}
|
||||
if (isStringEmptyOrSpaces(value_startTime) || value_startTime === "0")
|
||||
{
|
||||
// showStats = true;
|
||||
return;
|
||||
}
|
||||
|
||||
getStatistics();
|
||||
}
|
||||
|
||||
$: value_startTime, value_endTime, checkTime();
|
||||
|
||||
let statsResult = {};
|
||||
let showStats = false;
|
||||
async function getStatistics() {
|
||||
showStats = false;
|
||||
let res = await makePost(
|
||||
"admin/merchantPayouts",
|
||||
{
|
||||
date_from: new Date(value_startTime)
|
||||
.toISOString()
|
||||
.replace(".000Z", "Z"),
|
||||
date_to: new Date(value_endTime).toISOString().replace(".000Z", "Z"),
|
||||
merchant_id: Number(selectedMerchant),
|
||||
},
|
||||
makeAuthHeaderForAxios(getAuthInfo()?.a),
|
||||
);
|
||||
statsResult = res.data;
|
||||
showStats = true;
|
||||
}
|
||||
</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 bg-base-300 p-4 rounded-box">
|
||||
<div class="flex p-4">
|
||||
<select
|
||||
bind:value={value_merchantsFilter}
|
||||
class="select select-bordered w-full text-base"
|
||||
>
|
||||
<option selected value="true">Активные</option>
|
||||
<option value="false">Неактивные</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="overflow-x-auto mt-4 flex flex-col">
|
||||
{#if showMerchants}
|
||||
<table class="table">
|
||||
<!-- head -->
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Интеграция</th>
|
||||
<th>Имя</th>
|
||||
<th>Комиссия</th>
|
||||
<!-- <th></th> -->
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{#each merchants as merch}
|
||||
<tr
|
||||
on:click={() => {
|
||||
if (selectedMerchant !== merch["id"]) {
|
||||
selectedMerchant = merch["id"];
|
||||
getStatistics();
|
||||
}
|
||||
}}
|
||||
class={"group " +
|
||||
(selectedMerchant === merch["id"]
|
||||
? "bg-secondary text-black"
|
||||
: "hover:bg-neutral")}
|
||||
>
|
||||
<td class="font-semibold">{merch["id"]}</td>
|
||||
<td>{merch["integration_type"]}</td>
|
||||
<td>{merch["name"]}</td>
|
||||
<td>{merch["rate"]}%</td>
|
||||
</tr>
|
||||
{/each}
|
||||
</tbody>
|
||||
</table>
|
||||
{:else}
|
||||
<span class="loading loading-spinner self-center mt-4"></span>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
<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 bg-base-300 p-4 rounded-box">
|
||||
{#if selectedMerchant === ""}
|
||||
<p class="text-center">
|
||||
Выберите мерчанта из таблицы, чтобы посмотреть его статистику
|
||||
</p>
|
||||
{:else}
|
||||
<div class="flex flex-col p-2">
|
||||
<p>Показать статистику за период для ID: {selectedMerchant}</p>
|
||||
<div class="mt-3">
|
||||
C: <input
|
||||
bind:value={value_startTime}
|
||||
type="datetime-local"
|
||||
class="input input-bordered input-sm max-w-[200px]"
|
||||
/>
|
||||
</div>
|
||||
<div class="mt-1">
|
||||
По: <input
|
||||
bind:value={value_endTime}
|
||||
type="datetime-local"
|
||||
class="input input-bordered input-sm max-w-[200px]"
|
||||
/>
|
||||
</div>
|
||||
{#if statsResult?.total !== undefined}
|
||||
{#if showStats}
|
||||
<p class="mt-4 text-lg text-primary">
|
||||
Сумма по закрытым заявкам: {statsResult?.success} USDT
|
||||
</p>
|
||||
<p class="text-lg text-primary">
|
||||
Сумма по поступившим заявкам: {statsResult?.total} USDT
|
||||
</p>
|
||||
{:else}
|
||||
<span class="loading loading-spinner self-center mt-4"></span>
|
||||
{/if}
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
@ -17,6 +17,8 @@
|
||||
let value_bid = 0;
|
||||
let value_trading = false;
|
||||
let value_currency_code = "-1";
|
||||
let value_paid_bid = 0;
|
||||
let value_deposit_address = "";
|
||||
|
||||
$: checkFields(
|
||||
value_name,
|
||||
@ -24,15 +26,21 @@
|
||||
value_balance,
|
||||
value_role,
|
||||
value_bid,
|
||||
value_currency_code
|
||||
value_currency_code,
|
||||
value_paid_bid,
|
||||
value_deposit_address
|
||||
);
|
||||
|
||||
function checkFields(name, surname, balance, role, bid, code) {
|
||||
function checkFields(name, surname, balance, role, bid, code, pbid, addr) {
|
||||
if(isStringEmptyOrSpaces(code) || code === "-1")
|
||||
{
|
||||
canCreateUser = false;
|
||||
return;
|
||||
}
|
||||
if (isStringEmptyOrSpaces(addr) || addr.length < 8) {
|
||||
canCreateUser = false;
|
||||
return;
|
||||
}
|
||||
if (isStringEmptyOrSpaces(name) || name.length < 3) {
|
||||
canCreateUser = false;
|
||||
return;
|
||||
@ -53,6 +61,10 @@
|
||||
canCreateUser = false;
|
||||
return;
|
||||
}
|
||||
if ((pbid !== 0 && !pbid) || pbid < 0) {
|
||||
canCreateUser = false;
|
||||
return;
|
||||
}
|
||||
canCreateUser = true;
|
||||
}
|
||||
|
||||
@ -97,7 +109,9 @@
|
||||
can_trade: value_trading ? "true":"false",
|
||||
can_trade_global: value_trading ? "true":"false",
|
||||
role: value_role,
|
||||
payout_bid: Number(value_paid_bid)+"",
|
||||
bid: value_bid.toString(),
|
||||
deposit_address: value_deposit_address+"",
|
||||
},
|
||||
makeAuthHeaderForAxios(getAuthInfo()?.a)
|
||||
);
|
||||
@ -158,6 +172,23 @@
|
||||
class="grow text-lg text-info"
|
||||
/>
|
||||
</label>
|
||||
<label class={"input input-bordered flex items-center gap-2 "}>
|
||||
Ставка на выплаты (%):
|
||||
<input
|
||||
bind:value={value_paid_bid}
|
||||
type="number"
|
||||
min="0"
|
||||
class="grow text-lg text-info"
|
||||
/>
|
||||
</label>
|
||||
<label class={"input input-bordered flex items-center gap-2 "}>
|
||||
Кошелёк пополнения:
|
||||
<input
|
||||
bind:value={value_deposit_address}
|
||||
type="text"
|
||||
class="grow text-lg text-info"
|
||||
/>
|
||||
</label>
|
||||
<select
|
||||
bind:value={value_role}
|
||||
class="select select-bordered w-full text-base"
|
||||
|
@ -181,7 +181,7 @@
|
||||
{
|
||||
type: 1,
|
||||
uuid: selectedPayout.uuid,
|
||||
trader_uuid: (isStringEmptyOrSpaces(newPayoutTraderUUID) || newPayoutTraderUUID.length < 10) ? selectedPayout.traider_uuid:newPayoutTraderUUID,
|
||||
trader_uuid: (isStringEmptyOrSpaces(newPayoutTraderUUID) || newPayoutTraderUUID.length < 10) ? selectedPayout.trader_uuid:newPayoutTraderUUID,
|
||||
status: Number(newPayoutStatus)
|
||||
},
|
||||
// @ts-ignore
|
||||
@ -254,7 +254,7 @@
|
||||
{
|
||||
type: 2,
|
||||
uuid: selectedPayout.uuid,
|
||||
// trader_uuid: (isStringEmptyOrSpaces(newPayoutTraderUUID) || newPayoutTraderUUID.length < 10) ? selectedPayout.traider_uuid:newPayoutTraderUUID,
|
||||
// trader_uuid: (isStringEmptyOrSpaces(newPayoutTraderUUID) || newPayoutTraderUUID.length < 10) ? selectedPayout.trader_uuid:newPayoutTraderUUID,
|
||||
// status: Number(newPayoutStatus)
|
||||
},
|
||||
// @ts-ignore
|
||||
@ -413,7 +413,7 @@
|
||||
<!-- <p class="text-lg font-bold">{selectedPayout.name}</p> -->
|
||||
<p class="">IP заказчика: {selectedPayout.customer_ip}</p>
|
||||
<p class="">Карта: {selectedPayout.pan}</p>
|
||||
<p class="">ID трейдера: {selectedPayout.traider_uuid === "" ? "---":selectedPayout.traider_uuid}</p>
|
||||
<p class="">ID трейдера: {selectedPayout.trader_uuid === "" ? "---":selectedPayout.trader_uuid}</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>
|
||||
|
@ -19,10 +19,11 @@
|
||||
userData.surname,
|
||||
userData.balance,
|
||||
value_role,
|
||||
userData.bid
|
||||
userData.bid,
|
||||
userData.paid_bid
|
||||
);
|
||||
|
||||
function checkFields(name, surname, balance, role, bid) {
|
||||
function checkFields(name, surname, balance, role, bid, paid_bid) {
|
||||
// balance = Number(balance);
|
||||
// bid = Number(balance);
|
||||
if (isStringEmptyOrSpaces(name) || name.length < 3) {
|
||||
@ -33,6 +34,10 @@
|
||||
canChangeUser = false;
|
||||
return;
|
||||
}
|
||||
if ((paid_bid !== 0 && !paid_bid) || paid_bid < 0) {
|
||||
canChangeUser = false;
|
||||
return;
|
||||
}
|
||||
if (isStringEmptyOrSpaces(surname) || surname.length < 3) {
|
||||
canChangeUser = false;
|
||||
return;
|
||||
@ -62,6 +67,7 @@
|
||||
can_trade_global: userData["can_trade_global"] ? "true":"false",
|
||||
role: value_role,
|
||||
bid: userData.bid.toString(),
|
||||
paid_bid: userData.paid_bid.toString()
|
||||
},
|
||||
makeAuthHeaderForAxios(getAuthInfo()?.a)
|
||||
);
|
||||
@ -122,6 +128,15 @@
|
||||
class="grow text-lg text-info"
|
||||
/>
|
||||
</label>
|
||||
<label class={"input input-bordered flex items-center gap-2 "}>
|
||||
Ставка на выплату (%):
|
||||
<input
|
||||
bind:value={userData.payout_bid}
|
||||
type="number"
|
||||
min="0"
|
||||
class="grow text-lg text-info"
|
||||
/>
|
||||
</label>
|
||||
<select
|
||||
bind:value={value_role}
|
||||
class="select select-bordered w-full text-base"
|
||||
|
@ -181,7 +181,7 @@
|
||||
</div>
|
||||
<div class="flex gap-2 p-2 items-center text-lg">
|
||||
<p class="font-bold">Баланс:</p>
|
||||
<p class="text-info">{userData.balance} USDT</p>
|
||||
<p class="text-info">{Number(userData.balance)/1e6} USDT</p>
|
||||
</div>
|
||||
<div class="flex gap-2 p-2 items-center text-lg">
|
||||
<p class="font-bold">Заморожено:</p>
|
||||
@ -191,6 +191,14 @@
|
||||
<p class="font-bold">Ставка:</p>
|
||||
<p class="text-info">{userData.bid} %</p>
|
||||
</div>
|
||||
<div class="flex gap-2 p-2 items-center text-lg">
|
||||
<p class="font-bold">Ставка на выплаты:</p>
|
||||
<p class="text-info">{userData.payout_bid} %</p>
|
||||
</div>
|
||||
<div class="flex gap-2 p-2 items-center text-lg">
|
||||
<p class="font-bold">Кошелёк пополнения:</p>
|
||||
<p class="text-info">{userData.deposit_address}</p>
|
||||
</div>
|
||||
<div class="flex gap-2 p-2 items-center text-lg">
|
||||
<p class="font-bold">Торговля:</p>
|
||||
<p class={userData["can_trade"] === "t" ? "text-primary" : "text-error"}>
|
||||
|
@ -29,7 +29,8 @@ const config = {
|
||||
"/newuser",
|
||||
"/userslist",
|
||||
"/disputes",
|
||||
"/payouts"
|
||||
"/payouts",
|
||||
"/merchants"
|
||||
],
|
||||
},
|
||||
},
|
||||
|
Loading…
x
Reference in New Issue
Block a user