testing new payouts

This commit is contained in:
torgaw 2024-11-06 15:27:33 +03:00
parent 2b6a9f7c5a
commit 03f8f1b2e1
23 changed files with 122 additions and 83 deletions

View File

@ -16,7 +16,7 @@ function defaultDataResponseProcessor(data) {
export const API_PATH_MAIN = "https://hostapay.trade/api/v1/"; export const API_PATH_MAIN = "https://hostapay.trade/api/v1/";
export const API_PATH_TEST = "https://test.0x000f.ru/api/v1/"; export const API_PATH_TEST = "https://test.0x000f.ru/api/v1/";
let BasicURLValue = API_PATH_MAIN; let BasicURLValue = API_PATH_TEST;
async function makePost(url, data, options = undefined, async function makePost(url, data, options = undefined,
responseProcessor = defaultResponseProcessor, responseProcessor = defaultResponseProcessor,

View File

@ -1,7 +1,7 @@
<script> <script>
import { SvelteToast } from "@zerodevx/svelte-toast"; import { SvelteToast } from "@zerodevx/svelte-toast";
import { onMount } from "svelte"; import { onMount } from "svelte";
import "../app.css"; import "../../app.css";
import Navbar from "$lib/ui-components/navbar.svelte"; import Navbar from "$lib/ui-components/navbar.svelte";
import { checkAuth, checkAuthSync } from "$lib/auth/Auth"; import { checkAuth, checkAuthSync } from "$lib/auth/Auth";
import { redirect } from "$lib/tools/url/URLTools"; import { redirect } from "$lib/tools/url/URLTools";

View File

@ -1,6 +1,10 @@
<script> <script>
import { getAuthInfo, makeAuthHeaderForAxios } from "$lib/auth/Auth"; import { getAuthInfo, makeAuthHeaderForAxios } from "$lib/auth/Auth";
import { API_PATH_TEST, API_PATH_MAIN, makePost } from "$lib/tools/requests/requests"; import {
API_PATH_TEST,
API_PATH_MAIN,
makePost,
} from "$lib/tools/requests/requests";
import { sayError, sayInfo } from "$lib/tools/toaster/Toaster"; import { sayError, sayInfo } from "$lib/tools/toaster/Toaster";
import Pagination from "$lib/ui-components/pagination.svelte"; import Pagination from "$lib/ui-components/pagination.svelte";
import { redirect } from "$lib/tools/url/URLTools"; import { redirect } from "$lib/tools/url/URLTools";
@ -11,7 +15,7 @@
"5": "На проверке у трейдера", "5": "На проверке у трейдера",
"6": "Принят", "6": "Принят",
"7": "Отклонён", "7": "Отклонён",
"8": "Чек на проверке" "8": "Чек на проверке",
}; };
const disputesStatusMapColors = { const disputesStatusMapColors = {
@ -35,7 +39,7 @@
"admin/getDisputes", "admin/getDisputes",
{ {
page: currentPageDisputes, page: currentPageDisputes,
filter: currentDisputesFilter filter: currentDisputesFilter,
}, },
makeAuthHeaderForAxios(getAuthInfo()?.a) makeAuthHeaderForAxios(getAuthInfo()?.a)
); );
@ -76,7 +80,7 @@
new_amount: "", new_amount: "",
creation_time: "", creation_time: "",
out_code: "", out_code: "",
in_code: "" in_code: "",
}; };
let showFullInfo = false; let showFullInfo = false;
@ -85,9 +89,9 @@
const result = await makePost( const result = await makePost(
"admin/changeDispute", "admin/changeDispute",
{ {
action: selectedDispute.order_status === "8" ? 3:1, action: selectedDispute.order_status === "8" ? 3 : 1,
order_id: selectedDispute.order_id, order_id: selectedDispute.order_id,
dispute_uuid: selectedDispute.dispute_uuid dispute_uuid: selectedDispute.dispute_uuid,
}, },
makeAuthHeaderForAxios(getAuthInfo()?.a) makeAuthHeaderForAxios(getAuthInfo()?.a)
); );
@ -112,9 +116,9 @@
const result = await makePost( const result = await makePost(
"admin/changeDispute", "admin/changeDispute",
{ {
action: selectedDispute.order_status === "8" ? 4:2, action: selectedDispute.order_status === "8" ? 4 : 2,
order_id: selectedDispute.order_id, order_id: selectedDispute.order_id,
dispute_uuid: selectedDispute.dispute_uuid dispute_uuid: selectedDispute.dispute_uuid,
}, },
makeAuthHeaderForAxios(getAuthInfo()?.a) makeAuthHeaderForAxios(getAuthInfo()?.a)
); );
@ -159,11 +163,9 @@
showDisputeReceiptImage = false; showDisputeReceiptImage = false;
showLoadingReceiptShowing = true; showLoadingReceiptShowing = true;
try { try {
const response = await axios.get( const response = await axios.get(
API_PATH_MAIN + "loadFile?dispute=" + API_PATH_TEST + "loadFile?dispute=" + selectedDispute["order_id"],
selectedDispute["order_id"], // "17731",
// "17731",
{ {
responseType: "blob", responseType: "blob",
headers: makeAuthHeaderForAxios(getAuthInfo()?.a).headers, headers: makeAuthHeaderForAxios(getAuthInfo()?.a).headers,
@ -192,7 +194,6 @@
//console.log(error); //console.log(error);
} }
} }
</script> </script>
<div class="w-full flex flex-col gap-8"> <div class="w-full flex flex-col gap-8">
@ -203,10 +204,10 @@
<div class="w-full flex flex-col bg-base-300 p-4 rounded-box"> <div class="w-full flex flex-col bg-base-300 p-4 rounded-box">
<div class="flex p-4"> <div class="flex p-4">
<select <select
on:change={(e)=>{ on:change={(e) => {
currentDisputesFilter = Number(e.target.value); currentDisputesFilter = Number(e.target.value);
getDisputes(); getDisputes();
}} }}
class="select select-bordered w-full text-base" class="select select-bordered w-full text-base"
> >
<option selected value="-1">Показать все споры</option> <option selected value="-1">Показать все споры</option>
@ -286,7 +287,7 @@
class="fixed inset-0 flex justify-center items-center md:p-32 p-8 pt-[68px] bg-black bg-opacity-50" class="fixed inset-0 flex justify-center items-center md:p-32 p-8 pt-[68px] bg-black bg-opacity-50"
> >
<div class="flex flex-col w-full max-w-[600px] p-4 rounded-box bg-base-300"> <div class="flex flex-col w-full max-w-[600px] p-4 rounded-box bg-base-300">
<p class="self-center opacity-60">ID: {selectedDispute['order_id']}</p> <p class="self-center opacity-60">ID: {selectedDispute["order_id"]}</p>
<p <p
class={"self-center text-3xl " + class={"self-center text-3xl " +
disputesStatusMapColors[selectedDispute["order_status"]]} disputesStatusMapColors[selectedDispute["order_status"]]}
@ -306,13 +307,20 @@
<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>
<p> <p>
{Number(selectedDispute.new_amount)} {selectedDispute.out_code} ({(Number(selectedDispute.new_amount) / Number(selectedDispute.order_rate)).toFixed(2)} USDT) {Number(selectedDispute.new_amount)}
{selectedDispute.out_code} ({(
Number(selectedDispute.new_amount) /
Number(selectedDispute.order_rate)
).toFixed(2)} USDT)
</p> </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>
<p> <p>
{Number(selectedDispute.amount)} {selectedDispute.out_code} ({(Number(selectedDispute.amount) / Number(selectedDispute.order_rate)).toFixed(2)} USDT) {Number(selectedDispute.amount)}
{selectedDispute.out_code} ({(
Number(selectedDispute.amount) / Number(selectedDispute.order_rate)
).toFixed(2)} USDT)
</p> </p>
</div> </div>
{#if selectedDispute["order_status"] === "4" || selectedDispute["order_status"] === "8"} {#if selectedDispute["order_status"] === "4" || selectedDispute["order_status"] === "8"}
@ -338,7 +346,8 @@
on:click={() => { on:click={() => {
axios axios
.get( .get(
API_PATH_MAIN + "loadFile?dispute=" + API_PATH_TEST +
"loadFile?dispute=" +
selectedDispute["order_id"], selectedDispute["order_id"],
{ {
responseType: "blob", responseType: "blob",
@ -397,10 +406,21 @@
{/if} {/if}
{#if showDisputeReceiptImage} {#if showDisputeReceiptImage}
<div class="fixed inset-0 p-4 md:p-8 flex flex-col items-center bg-base-300 z-[100]"> <div
class="fixed inset-0 p-4 md:p-8 flex flex-col items-center bg-base-300 z-[100]"
>
<div class="w-[90%] h-[90%] flex"> <div class="w-[90%] h-[90%] flex">
<img src={receiptImage} alt="receipt" class="w-full h-full object-scale-down"> <img
src={receiptImage}
alt="receipt"
class="w-full h-full object-scale-down"
/>
</div> </div>
<button on:click={()=>{showDisputeReceiptImage = false;}} class="btn btn-info w-full mt-auto">Закрыть</button> <button
on:click={() => {
showDisputeReceiptImage = false;
}}
class="btn btn-info w-full mt-auto">Закрыть</button
>
</div> </div>
{/if} {/if}

View File

@ -2,18 +2,23 @@
// @ts-nocheck // @ts-nocheck
import { getAuthInfo, makeAuthHeaderForAxios } from "$lib/auth/Auth"; import { getAuthInfo, makeAuthHeaderForAxios } from "$lib/auth/Auth";
import { API_PATH_TEST, API_PATH_MAIN, makePost } from "$lib/tools/requests/requests"; import {
API_PATH_TEST,
API_PATH_MAIN,
makePost,
} from "$lib/tools/requests/requests";
import { sayError, sayInfo } from "$lib/tools/toaster/Toaster"; import { sayError, sayInfo } from "$lib/tools/toaster/Toaster";
import Pagination from "$lib/ui-components/pagination.svelte"; import Pagination from "$lib/ui-components/pagination.svelte";
import { redirect } from "$lib/tools/url/URLTools"; import { redirect } from "$lib/tools/url/URLTools";
import axios from "axios"; import axios from "axios";
import { isStringEmptyOrSpaces } from "$lib/tools/strings/Strings"; import { isStringEmptyOrSpaces } from "$lib/tools/strings/Strings";
const payoutsStatusMap = { const payoutsStatusMap = {
"0": "Открыта", "0": "Открыта",
"1": "Ожидает оплаты", "1": "Ожидает оплаты",
"2": "Оплачена", "2": "Оплачена",
"3": "Отказано", "3": "Отказано",
"4": "Требует проверки",
}; };
const payoutsStatusMapColors = { const payoutsStatusMapColors = {
@ -21,6 +26,7 @@
"1": "text-warning", "1": "text-warning",
"2": "text-success", "2": "text-success",
"3": "text-error", "3": "text-error",
"4": "text-warning",
}; };
//admin/getDisputes //admin/getDisputes
@ -29,7 +35,7 @@
let numOfPagesPayouts = 1; let numOfPagesPayouts = 1;
let currentPagePayouts = 1; let currentPagePayouts = 1;
let disablePagesPayouts = false; let disablePagesPayouts = false;
let currentPayoutsFilter = 0; let currentPayoutsFilter = -1;
async function getPayouts() { async function getPayouts() {
disablePagesPayouts = true; disablePagesPayouts = true;
@ -41,7 +47,7 @@
filter: currentPayoutsFilter, filter: currentPayoutsFilter,
}, },
// @ts-ignore // @ts-ignore
makeAuthHeaderForAxios(getAuthInfo()?.a), makeAuthHeaderForAxios(getAuthInfo()?.a)
); );
console.log(result); console.log(result);
if (result.status === 401) { if (result.status === 401) {
@ -59,7 +65,7 @@
} }
payouts = result.data.payouts; payouts = result.data.payouts;
console.log(payouts); console.log(payouts);
numOfPagesPayouts = result.data.pages === 0 ? 1:result.data?.pages; numOfPagesPayouts = result.data.pages === 0 ? 1 : result.data?.pages;
disablePagesPayouts = false; disablePagesPayouts = false;
} }
getPayouts(); getPayouts();
@ -154,20 +160,21 @@
} }
function checkFields() { function checkFields() {
if(!isStringEmptyOrSpaces(newPayoutTraderUUID) && newPayoutTraderUUID.length > 10) if (
{ !isStringEmptyOrSpaces(newPayoutTraderUUID) &&
newPayoutTraderUUID.length > 10
) {
allowToSave = true; allowToSave = true;
return; return;
} }
if(newPayoutStatus !== selectedPayout.status) if (newPayoutStatus !== selectedPayout.status) {
{
allowToSave = true; allowToSave = true;
return; return;
} }
allowToSave = false; allowToSave = false;
} }
let newPayoutTraderUUID= ""; let newPayoutTraderUUID = "";
let newPayoutStatus = selectedPayout.status; let newPayoutStatus = selectedPayout.status;
let allowToSave = false; let allowToSave = false;
// $: selectedPayout, newPayoutStatus = selectedPayout.status; // $: selectedPayout, newPayoutStatus = selectedPayout.status;
@ -181,11 +188,15 @@
{ {
type: 1, type: 1,
uuid: selectedPayout.uuid, uuid: selectedPayout.uuid,
trader_uuid: (isStringEmptyOrSpaces(newPayoutTraderUUID) || newPayoutTraderUUID.length < 10) ? selectedPayout.trader_uuid:newPayoutTraderUUID, trader_uuid:
status: Number(newPayoutStatus) isStringEmptyOrSpaces(newPayoutTraderUUID) ||
newPayoutTraderUUID.length < 10
? selectedPayout.trader_uuid
: newPayoutTraderUUID,
status: Number(newPayoutStatus),
}, },
// @ts-ignore // @ts-ignore
makeAuthHeaderForAxios(getAuthInfo()?.a), makeAuthHeaderForAxios(getAuthInfo()?.a)
); );
console.log(result); console.log(result);
if (result.status === 401) { if (result.status === 401) {
@ -215,10 +226,10 @@
const result = await makePost( const result = await makePost(
"admin/payouts", "admin/payouts",
{ {
type: 3 type: 3,
}, },
// @ts-ignore // @ts-ignore
makeAuthHeaderForAxios(getAuthInfo()?.a), makeAuthHeaderForAxios(getAuthInfo()?.a)
); );
console.log(result); console.log(result);
if (result.status === 401) { if (result.status === 401) {
@ -245,7 +256,6 @@
} }
getStats(); getStats();
let awaitChangingNull = false; let awaitChangingNull = false;
async function nullificatePayout() { async function nullificatePayout() {
awaitChangingNull = true; awaitChangingNull = true;
@ -258,7 +268,7 @@
// status: Number(newPayoutStatus) // status: Number(newPayoutStatus)
}, },
// @ts-ignore // @ts-ignore
makeAuthHeaderForAxios(getAuthInfo()?.a), makeAuthHeaderForAxios(getAuthInfo()?.a)
); );
console.log(result); console.log(result);
if (result.status === 401) { if (result.status === 401) {
@ -325,7 +335,7 @@
}} }}
class="select select-bordered w-full text-base" class="select select-bordered w-full text-base"
> >
<option selected value="0">Показать все выплаты</option> <option selected value="-1">Показать все выплаты</option>
<option value="2">Оплаченные</option> <option value="2">Оплаченные</option>
<option value="3">Отклонённые</option> <option value="3">Отклонённые</option>
<option value="1">Принятые</option> <option value="1">Принятые</option>
@ -356,7 +366,7 @@
<th>Статус</th> <th>Статус</th>
<th>Сумма</th> <th>Сумма</th>
<th>Карта</th> <th>Карта</th>
<th>Курс</th> <!-- <th>Курс</th> -->
<th>Время создания</th> <th>Время создания</th>
<th>Опции</th> <th>Опции</th>
<!-- <th></th> --> <!-- <th></th> -->
@ -372,7 +382,7 @@
<!-- <td>{payout["is_sbp"] === "t" ? "да" : "нет"}</td> --> <!-- <td>{payout["is_sbp"] === "t" ? "да" : "нет"}</td> -->
<td>{payout["amount"]} {payout["code"]}</td> <td>{payout["amount"]} {payout["code"]}</td>
<td>{payout["pan"]}</td> <td>{payout["pan"]}</td>
<td>{payout["rate"]} {payout["code"]}</td> <!-- <td>{payout["rate"]} {payout["code"]}</td> -->
<!-- <td>{payout["amount"]}</td> --> <!-- <td>{payout["amount"]}</td> -->
<td>{payout["creation_time"]}</td> <td>{payout["creation_time"]}</td>
<td <td
@ -413,55 +423,64 @@
<!-- <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.trader_uuid === "" ? "---":selectedPayout.trader_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>
<p> <p>
{selectedPayout.amount} {selectedPayout.amount}
{selectedPayout.code} ({( {selectedPayout.code}
Number(selectedPayout.amount) /
Number(selectedPayout.rate)
).toFixed(2)} USDT)
</p> </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>
<p>{selectedPayout.rate} {selectedPayout.code}</p> <p>{selectedPayout.rate} {selectedPayout.code}</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">ID нового трейдера:</p> <p class="text-lg font-bold">ID нового трейдера:</p>
<p class="text-sm opacity-50">Оставьте пустым, чтобы оставить прежнего трейдера</p> <p class="text-sm opacity-50">
<input bind:value={newPayoutTraderUUID} type="text" placeholder="ID" class="input input-bordered w-full max-w-xs" /> Оставьте пустым, чтобы оставить прежнего трейдера
</p>
<input
bind:value={newPayoutTraderUUID}
type="text"
placeholder="ID"
class="input input-bordered w-full max-w-xs"
/>
</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>
<select <select
bind:value={newPayoutStatus} bind:value={newPayoutStatus}
class="select select-bordered w-full text-base" class="select select-bordered w-full text-base"
> >
<option value="0">Открыта</option> <option value="0">Открыта</option>
<option value="2">Оплачена</option> <option value="2">Оплачена</option>
<option value="3">Отклонена</option> <option value="3">Отклонена</option>
<option value="1">Принята</option> <option value="1">Принята</option>
</select> </select>
</div> </div>
{#if selectedPayout["status"] === "2"} {#if selectedPayout["status"] === "2"}
<button <button
on:click={() => { on:click={() => {
axios axios
.get( .get(
API_PATH_MAIN + "loadFile?dispute=" + API_PATH_TEST +
"loadFile?dispute=" +
selectedPayout["order_id"], selectedPayout["order_id"],
{ {
responseType: "blob", responseType: "blob",
headers: makeAuthHeaderForAxios(getAuthInfo()?.a).headers, headers: makeAuthHeaderForAxios(getAuthInfo()?.a).headers,
}, }
) )
.then(function (response) { .then(function (response) {
// Создаем ссылку для скачивания // Создаем ссылку для скачивания
const url = window.URL.createObjectURL( const url = window.URL.createObjectURL(
new Blob([response.data]), new Blob([response.data])
); );
const contentType = response?.data?.type; // Извлекаем MIME-тип из Blob const contentType = response?.data?.type; // Извлекаем MIME-тип из Blob
let extension = mimeToExtension(contentType); // Получаем расширение из функции let extension = mimeToExtension(contentType); // Получаем расширение из функции
@ -495,7 +514,7 @@
> >
Сорханить Сорханить
{#if awaitChanging} {#if awaitChanging}
<span class="loading loading-spinner loading-md"></span> <span class="loading loading-spinner loading-md"></span>
{/if} {/if}
</button> </button>
<button <button
@ -506,7 +525,7 @@
> >
Обнулить выплату Обнулить выплату
{#if awaitChangingNull} {#if awaitChangingNull}
<span class="loading loading-spinner loading-md"></span> <span class="loading loading-spinner loading-md"></span>
{/if} {/if}
</button> </button>
<button <button

View File

@ -20,21 +20,21 @@ const config = {
prerender: { prerender: {
// default: true, // default: true,
entries: [ entries: [
"/user/change/sampleToken", "/admin/user/change/sampleToken",
"/user/edit/req/sampleToken/sampleReqID", "/admin/user/edit/req/sampleToken/sampleReqID",
"/user/neworder/sampleToken", "/admin/user/neworder/sampleToken",
"/user/profile/sampleToken", "/admin/user/profile/sampleToken",
"/", "/admin/",
"/login", "/admin/login",
"/newuser", "/admin/newuser",
"/userslist", "/admin/userslist",
"/disputes", "/admin/disputes",
"/payouts", "/admin/payouts",
"/merchants", "/admin/merchants",
"/orders", "/admin/orders",
"/currencies", "/admin/currencies",
"/sms", "/admin/sms",
"/withdrawals" "/admin/withdrawals"
], ],
}, },
}, },