This commit is contained in:
you 2024-08-15 13:11:13 +03:00
parent f6ca40aeda
commit f22743d57c
7 changed files with 245 additions and 9 deletions

View File

@ -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>

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

View File

@ -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"

View File

@ -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>

View File

@ -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"

View File

@ -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"}>

View File

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