aboba
This commit is contained in:
parent
f6ca40aeda
commit
f22743d57c
@ -1,4 +1,6 @@
|
|||||||
<script>
|
<script>
|
||||||
|
// @ts-nocheck
|
||||||
|
|
||||||
|
|
||||||
import { getAuthInfo, saveAuthInfo } from "$lib/auth/Auth";
|
import { getAuthInfo, saveAuthInfo } from "$lib/auth/Auth";
|
||||||
import { AuthStorage } from "$lib/tools/storages/auth-storage";
|
import { AuthStorage } from "$lib/tools/storages/auth-storage";
|
||||||
@ -36,6 +38,9 @@
|
|||||||
</li>
|
</li>
|
||||||
<li><a href="/admin/disputes">Споры</a></li>
|
<li><a href="/admin/disputes">Споры</a></li>
|
||||||
<li><a href="/admin/payouts">Выплаты</a></li>
|
<li><a href="/admin/payouts">Выплаты</a></li>
|
||||||
|
{#if jwtDecode(getAuthInfo()?.a)?.role == "4"}
|
||||||
|
<li><a href="/admin/merchants">Мерчанты</a></li>
|
||||||
|
{/if}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<a href="/admin/" class="btn btn-ghost text-xl">HostaPay</a>
|
<a href="/admin/" class="btn btn-ghost text-xl">HostaPay</a>
|
||||||
@ -51,6 +56,9 @@
|
|||||||
</li>
|
</li>
|
||||||
<li><a href="/admin/disputes">Споры</a></li>
|
<li><a href="/admin/disputes">Споры</a></li>
|
||||||
<li><a href="/admin/payouts">Выплаты</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> -->
|
<!-- <li><a>Item 3</a></li> -->
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</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_bid = 0;
|
||||||
let value_trading = false;
|
let value_trading = false;
|
||||||
let value_currency_code = "-1";
|
let value_currency_code = "-1";
|
||||||
|
let value_paid_bid = 0;
|
||||||
|
let value_deposit_address = "";
|
||||||
|
|
||||||
$: checkFields(
|
$: checkFields(
|
||||||
value_name,
|
value_name,
|
||||||
@ -24,15 +26,21 @@
|
|||||||
value_balance,
|
value_balance,
|
||||||
value_role,
|
value_role,
|
||||||
value_bid,
|
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")
|
if(isStringEmptyOrSpaces(code) || code === "-1")
|
||||||
{
|
{
|
||||||
canCreateUser = false;
|
canCreateUser = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (isStringEmptyOrSpaces(addr) || addr.length < 8) {
|
||||||
|
canCreateUser = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (isStringEmptyOrSpaces(name) || name.length < 3) {
|
if (isStringEmptyOrSpaces(name) || name.length < 3) {
|
||||||
canCreateUser = false;
|
canCreateUser = false;
|
||||||
return;
|
return;
|
||||||
@ -53,6 +61,10 @@
|
|||||||
canCreateUser = false;
|
canCreateUser = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if ((pbid !== 0 && !pbid) || pbid < 0) {
|
||||||
|
canCreateUser = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
canCreateUser = true;
|
canCreateUser = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,7 +109,9 @@
|
|||||||
can_trade: value_trading ? "true":"false",
|
can_trade: value_trading ? "true":"false",
|
||||||
can_trade_global: value_trading ? "true":"false",
|
can_trade_global: value_trading ? "true":"false",
|
||||||
role: value_role,
|
role: value_role,
|
||||||
|
payout_bid: Number(value_paid_bid)+"",
|
||||||
bid: value_bid.toString(),
|
bid: value_bid.toString(),
|
||||||
|
deposit_address: value_deposit_address+"",
|
||||||
},
|
},
|
||||||
makeAuthHeaderForAxios(getAuthInfo()?.a)
|
makeAuthHeaderForAxios(getAuthInfo()?.a)
|
||||||
);
|
);
|
||||||
@ -158,6 +172,23 @@
|
|||||||
class="grow text-lg text-info"
|
class="grow text-lg text-info"
|
||||||
/>
|
/>
|
||||||
</label>
|
</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
|
<select
|
||||||
bind:value={value_role}
|
bind:value={value_role}
|
||||||
class="select select-bordered w-full text-base"
|
class="select select-bordered w-full text-base"
|
||||||
|
@ -181,7 +181,7 @@
|
|||||||
{
|
{
|
||||||
type: 1,
|
type: 1,
|
||||||
uuid: selectedPayout.uuid,
|
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)
|
status: Number(newPayoutStatus)
|
||||||
},
|
},
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
@ -254,7 +254,7 @@
|
|||||||
{
|
{
|
||||||
type: 2,
|
type: 2,
|
||||||
uuid: selectedPayout.uuid,
|
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)
|
// status: Number(newPayoutStatus)
|
||||||
},
|
},
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
@ -413,7 +413,7 @@
|
|||||||
<!-- <p class="text-lg font-bold">{selectedPayout.name}</p> -->
|
<!-- <p class="text-lg font-bold">{selectedPayout.name}</p> -->
|
||||||
<p class="">IP заказчика: {selectedPayout.customer_ip}</p>
|
<p class="">IP заказчика: {selectedPayout.customer_ip}</p>
|
||||||
<p class="">Карта: {selectedPayout.pan}</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>
|
||||||
<div class="rounded-box flex flex-col bg-base-100 p-4 gap-1 mt-4">
|
<div class="rounded-box flex flex-col bg-base-100 p-4 gap-1 mt-4">
|
||||||
<p class="text-lg font-bold">Сумма</p>
|
<p class="text-lg font-bold">Сумма</p>
|
||||||
|
@ -19,10 +19,11 @@
|
|||||||
userData.surname,
|
userData.surname,
|
||||||
userData.balance,
|
userData.balance,
|
||||||
value_role,
|
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);
|
// balance = Number(balance);
|
||||||
// bid = Number(balance);
|
// bid = Number(balance);
|
||||||
if (isStringEmptyOrSpaces(name) || name.length < 3) {
|
if (isStringEmptyOrSpaces(name) || name.length < 3) {
|
||||||
@ -33,6 +34,10 @@
|
|||||||
canChangeUser = false;
|
canChangeUser = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if ((paid_bid !== 0 && !paid_bid) || paid_bid < 0) {
|
||||||
|
canChangeUser = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (isStringEmptyOrSpaces(surname) || surname.length < 3) {
|
if (isStringEmptyOrSpaces(surname) || surname.length < 3) {
|
||||||
canChangeUser = false;
|
canChangeUser = false;
|
||||||
return;
|
return;
|
||||||
@ -62,6 +67,7 @@
|
|||||||
can_trade_global: userData["can_trade_global"] ? "true":"false",
|
can_trade_global: userData["can_trade_global"] ? "true":"false",
|
||||||
role: value_role,
|
role: value_role,
|
||||||
bid: userData.bid.toString(),
|
bid: userData.bid.toString(),
|
||||||
|
paid_bid: userData.paid_bid.toString()
|
||||||
},
|
},
|
||||||
makeAuthHeaderForAxios(getAuthInfo()?.a)
|
makeAuthHeaderForAxios(getAuthInfo()?.a)
|
||||||
);
|
);
|
||||||
@ -122,6 +128,15 @@
|
|||||||
class="grow text-lg text-info"
|
class="grow text-lg text-info"
|
||||||
/>
|
/>
|
||||||
</label>
|
</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
|
<select
|
||||||
bind:value={value_role}
|
bind:value={value_role}
|
||||||
class="select select-bordered w-full text-base"
|
class="select select-bordered w-full text-base"
|
||||||
|
@ -181,7 +181,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="flex gap-2 p-2 items-center text-lg">
|
<div class="flex gap-2 p-2 items-center text-lg">
|
||||||
<p class="font-bold">Баланс:</p>
|
<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>
|
||||||
<div class="flex gap-2 p-2 items-center text-lg">
|
<div class="flex gap-2 p-2 items-center text-lg">
|
||||||
<p class="font-bold">Заморожено:</p>
|
<p class="font-bold">Заморожено:</p>
|
||||||
@ -191,6 +191,14 @@
|
|||||||
<p class="font-bold">Ставка:</p>
|
<p class="font-bold">Ставка:</p>
|
||||||
<p class="text-info">{userData.bid} %</p>
|
<p class="text-info">{userData.bid} %</p>
|
||||||
</div>
|
</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">
|
<div class="flex gap-2 p-2 items-center text-lg">
|
||||||
<p class="font-bold">Торговля:</p>
|
<p class="font-bold">Торговля:</p>
|
||||||
<p class={userData["can_trade"] === "t" ? "text-primary" : "text-error"}>
|
<p class={userData["can_trade"] === "t" ? "text-primary" : "text-error"}>
|
||||||
|
@ -29,7 +29,8 @@ const config = {
|
|||||||
"/newuser",
|
"/newuser",
|
||||||
"/userslist",
|
"/userslist",
|
||||||
"/disputes",
|
"/disputes",
|
||||||
"/payouts"
|
"/payouts",
|
||||||
|
"/merchants"
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user