fix report 2
This commit is contained in:
@@ -385,7 +385,7 @@ class WalletController extends Controller
|
|||||||
|
|
||||||
$records = Transaction::with([
|
$records = Transaction::with([
|
||||||
'customer',
|
'customer',
|
||||||
'wallet.product:id,metal_id',
|
'wallet.product:id,title,metal_id',
|
||||||
'product:id,title,metal_id,group_type,unit,amount,trade_by_quantity,direct_price',
|
'product:id,title,metal_id,group_type,unit,amount,trade_by_quantity,direct_price',
|
||||||
])->whereNull('fund_id');
|
])->whereNull('fund_id');
|
||||||
TableEngine::create($records, $request->all())
|
TableEngine::create($records, $request->all())
|
||||||
|
|||||||
@@ -253,6 +253,14 @@ class Controller extends BaseController
|
|||||||
return self::metalTypeLabel();
|
return self::metalTypeLabel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** عنوان محصول(ات) کیف اصلی از `main_wallet_products` */
|
||||||
|
public static function mainWalletProductLabel(): string
|
||||||
|
{
|
||||||
|
$labels = app(ConfigService::class)->mainWalletProductLabels();
|
||||||
|
|
||||||
|
return $labels !== '' ? $labels : self::mainWalletMetalLabel();
|
||||||
|
}
|
||||||
|
|
||||||
/** برچسب معاملات آبشده: مقدار setting یا «آبشده» */
|
/** برچسب معاملات آبشده: مقدار setting یا «آبشده» */
|
||||||
public static function meltedGoldLabel(): string
|
public static function meltedGoldLabel(): string
|
||||||
{
|
{
|
||||||
@@ -328,22 +336,22 @@ class Controller extends BaseController
|
|||||||
|
|
||||||
public static function mainMetalBuyTitle(): string
|
public static function mainMetalBuyTitle(): string
|
||||||
{
|
{
|
||||||
return self::productBuyTitle(self::mainWalletMetalLabel());
|
return self::productBuyTitle(self::mainWalletProductLabel());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function mainMetalSellTitle(): string
|
public static function mainMetalSellTitle(): string
|
||||||
{
|
{
|
||||||
return self::productSellTitle(self::mainWalletMetalLabel());
|
return self::productSellTitle(self::mainWalletProductLabel());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function mainMetalDepositTitle(): string
|
public static function mainMetalDepositTitle(): string
|
||||||
{
|
{
|
||||||
return 'واریز ' . self::mainWalletMetalLabel();
|
return 'واریز ' . self::mainWalletProductLabel();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function mainMetalWithdrawTitle(): string
|
public static function mainMetalWithdrawTitle(): string
|
||||||
{
|
{
|
||||||
return 'برداشت ' . self::mainWalletMetalLabel();
|
return 'برداشت ' . self::mainWalletProductLabel();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -280,23 +280,160 @@ class BalanceReportService
|
|||||||
|
|
||||||
public function resolveTransactionDisplayTypeStr(mixed $transaction, ?int $metalId = null): ?string
|
public function resolveTransactionDisplayTypeStr(mixed $transaction, ?int $metalId = null): ?string
|
||||||
{
|
{
|
||||||
$type = (int) ($this->lineValue($transaction, 'type') ?? 0);
|
$type = $this->resolveTransactionType($transaction);
|
||||||
if (!in_array($type, [1, 2, 7, 10], true)) {
|
if (in_array($type, [3, 4, 8, 9], true)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$metalId ??= $this->resolveTransactionMetalId($transaction);
|
$currentLabel = trim((string) ($this->lineValue($transaction, 'type_str') ?? ''));
|
||||||
$label = $this->metalLabel($metalId);
|
$prefix = $this->resolveTransactionActionPrefix($transaction);
|
||||||
|
$productLabel = $this->resolveTransactionProductLabel($transaction);
|
||||||
|
|
||||||
return match ($type) {
|
if ($prefix !== null && $productLabel !== null) {
|
||||||
1 => 'خرید ' . $label,
|
return trim($prefix . ' ' . $productLabel);
|
||||||
2 => 'فروش ' . $label,
|
}
|
||||||
7 => 'واریز ' . $label,
|
|
||||||
10 => 'برداشت ' . $label,
|
if ($prefix !== null) {
|
||||||
|
$metalId ??= $this->resolveTransactionMetalId($transaction);
|
||||||
|
|
||||||
|
return trim($prefix . ' ' . $this->metalLabel($metalId));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($currentLabel === 'تعریف نشده' || $currentLabel === '') {
|
||||||
|
return $this->resolveFallbackMetalTransactionLabel($transaction, $metalId);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->shouldReplaceGenericTransactionLabel($currentLabel) && $productLabel !== null) {
|
||||||
|
$fallbackPrefix = $this->resolveTransactionActionPrefix($transaction)
|
||||||
|
?? $this->inferActionPrefixFromLabel($currentLabel)
|
||||||
|
?? $this->inferActionPrefixFromGold($transaction);
|
||||||
|
|
||||||
|
if ($fallbackPrefix !== null) {
|
||||||
|
return trim($fallbackPrefix . ' ' . $productLabel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function resolveFallbackMetalTransactionLabel(mixed $transaction, ?int $metalId = null): ?string
|
||||||
|
{
|
||||||
|
$gold = (float) ($this->lineValue($transaction, 'gold') ?? 0);
|
||||||
|
if (abs($gold) < 0.0000001) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$prefix = $this->resolveTransactionActionPrefix($transaction)
|
||||||
|
?? $this->inferActionPrefixFromGold($transaction);
|
||||||
|
if ($prefix === null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$productLabel = $this->resolveTransactionProductLabel($transaction);
|
||||||
|
if ($productLabel !== null) {
|
||||||
|
return trim($prefix . ' ' . $productLabel);
|
||||||
|
}
|
||||||
|
|
||||||
|
$metalId ??= $this->resolveTransactionMetalId($transaction);
|
||||||
|
|
||||||
|
return trim($prefix . ' ' . $this->metalLabel($metalId));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function resolveTransactionType(mixed $transaction): int
|
||||||
|
{
|
||||||
|
$type = $this->lineValue($transaction, 'type');
|
||||||
|
if ($type !== null && $type !== '' && is_numeric($type)) {
|
||||||
|
return (int) $type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function resolveTransactionActionPrefix(mixed $transaction): ?string
|
||||||
|
{
|
||||||
|
$type = $this->resolveTransactionType($transaction);
|
||||||
|
$gold = (float) ($this->lineValue($transaction, 'gold') ?? 0);
|
||||||
|
|
||||||
|
return match (true) {
|
||||||
|
$type === 1 => 'خرید',
|
||||||
|
$type === 2 => 'فروش',
|
||||||
|
$type === 51 => 'اصلاح',
|
||||||
|
in_array($type, [6, 10], true) => 'برداشت',
|
||||||
|
$type === 5 => 'واریز',
|
||||||
|
$type === 7 => $gold >= 0 ? 'واریز' : 'برداشت',
|
||||||
|
$type === 12 => 'برداشت وجه',
|
||||||
|
abs($gold) > 0 => $gold > 0 ? 'واریز' : 'برداشت',
|
||||||
default => null,
|
default => null,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function inferActionPrefixFromGold(mixed $transaction): ?string
|
||||||
|
{
|
||||||
|
$gold = (float) ($this->lineValue($transaction, 'gold') ?? 0);
|
||||||
|
if (abs($gold) < 0.0000001) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $gold > 0 ? 'واریز' : 'برداشت';
|
||||||
|
}
|
||||||
|
|
||||||
|
private function inferActionPrefixFromLabel(string $label): ?string
|
||||||
|
{
|
||||||
|
if (preg_match('/^خرید/u', $label)) {
|
||||||
|
return 'خرید';
|
||||||
|
}
|
||||||
|
if (preg_match('/^فروش/u', $label)) {
|
||||||
|
return 'فروش';
|
||||||
|
}
|
||||||
|
if (preg_match('/^برداشت/u', $label)) {
|
||||||
|
return 'برداشت';
|
||||||
|
}
|
||||||
|
if (preg_match('/^(واریز|موجودی)/u', $label)) {
|
||||||
|
return 'واریز';
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function shouldReplaceGenericTransactionLabel(string $label): bool
|
||||||
|
{
|
||||||
|
if ($label === 'تعریف نشده') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$generic = [
|
||||||
|
'واریز',
|
||||||
|
'برداشت',
|
||||||
|
'واریز طلایی',
|
||||||
|
'برداشت طلایی',
|
||||||
|
'خرید طلا',
|
||||||
|
'فروش طلا',
|
||||||
|
];
|
||||||
|
|
||||||
|
return in_array($label, $generic, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function resolveTransactionProductLabel(mixed $transaction): ?string
|
||||||
|
{
|
||||||
|
$product = $this->transactionProduct($transaction);
|
||||||
|
if ($product !== null && !empty($product->title)) {
|
||||||
|
return trim((string) $product->title);
|
||||||
|
}
|
||||||
|
|
||||||
|
$walletProduct = $this->transactionWalletProduct($transaction);
|
||||||
|
if ($walletProduct !== null && !empty($walletProduct->title)) {
|
||||||
|
return trim((string) $walletProduct->title);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->isMainWalletMetalTransaction($transaction)) {
|
||||||
|
$labels = $this->configService->mainWalletProductLabels();
|
||||||
|
|
||||||
|
return $labels !== '' ? $labels : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public function transactionGoldGrams(mixed $transaction): float
|
public function transactionGoldGrams(mixed $transaction): float
|
||||||
{
|
{
|
||||||
$gold = (float) ($this->lineValue($transaction, 'gold') ?? 0);
|
$gold = (float) ($this->lineValue($transaction, 'gold') ?? 0);
|
||||||
@@ -354,6 +491,11 @@ class BalanceReportService
|
|||||||
$metalId = $this->resolveTransactionMetalId($row);
|
$metalId = $this->resolveTransactionMetalId($row);
|
||||||
$metalLabel = $this->metalLabel($metalId);
|
$metalLabel = $this->metalLabel($metalId);
|
||||||
$displayType = $this->resolveTransactionDisplayTypeStr($row, $metalId);
|
$displayType = $this->resolveTransactionDisplayTypeStr($row, $metalId);
|
||||||
|
$currentTypeStr = trim((string) ($this->lineValue($row, 'type_str') ?? ''));
|
||||||
|
|
||||||
|
if ($displayType === null && ($currentTypeStr === 'تعریف نشده' || $currentTypeStr === '')) {
|
||||||
|
$displayType = $this->resolveFallbackMetalTransactionLabel($row, $metalId);
|
||||||
|
}
|
||||||
|
|
||||||
if (is_array($row)) {
|
if (is_array($row)) {
|
||||||
$row['metal_gold'] = $metalMap;
|
$row['metal_gold'] = $metalMap;
|
||||||
@@ -419,25 +561,27 @@ class BalanceReportService
|
|||||||
|
|
||||||
private function isMainWalletMetalTransaction(mixed $transaction): bool
|
private function isMainWalletMetalTransaction(mixed $transaction): bool
|
||||||
{
|
{
|
||||||
$type = (int) ($this->lineValue($transaction, 'type') ?? 0);
|
|
||||||
if (!in_array($type, [1, 2, 7, 10], true)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$wallet = $this->lineValue($transaction, 'wallet');
|
$wallet = $this->lineValue($transaction, 'wallet');
|
||||||
if ($wallet === null) {
|
if ($wallet === null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_object($wallet)) {
|
if (is_object($wallet)) {
|
||||||
return $wallet->product_id === null && $wallet->fund_id === null;
|
if ($wallet->product_id !== null || $wallet->fund_id !== null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} elseif (is_array($wallet)) {
|
||||||
|
if (($wallet['product_id'] ?? null) !== null || ($wallet['fund_id'] ?? null) !== null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_array($wallet)) {
|
$type = $this->resolveTransactionType($transaction);
|
||||||
return ($wallet['product_id'] ?? null) === null && ($wallet['fund_id'] ?? null) === null;
|
$gold = (float) ($this->lineValue($transaction, 'gold') ?? 0);
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return in_array($type, [1, 2, 5, 6, 7, 10, 51], true) || abs($gold) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function resolveOrderMetalId(mixed $order): int
|
public function resolveOrderMetalId(mixed $order): int
|
||||||
|
|||||||
@@ -244,6 +244,20 @@ class ConfigService
|
|||||||
return $metalId > 0 ? $metalId : 1;
|
return $metalId > 0 ? $metalId : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** عنوان محصول(ات) متصل به کیف اصلی — ترتیب همان main_wallet_products */
|
||||||
|
public function mainWalletProductLabels(): string
|
||||||
|
{
|
||||||
|
$titles = [];
|
||||||
|
foreach ($this->mainWalletProductIds() as $productId) {
|
||||||
|
$title = Product::query()->whereKey($productId)->value('title');
|
||||||
|
if ($title !== null && trim((string) $title) !== '') {
|
||||||
|
$titles[] = trim((string) $title);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return implode(' و ', $titles);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* شناسه محصول آبشده: اول settings، بعد const.
|
* شناسه محصول آبشده: اول settings، بعد const.
|
||||||
* مقدار settings میتواند id عددی (مثل 13) یا reading_method (مثل estjt_...) باشد.
|
* مقدار settings میتواند id عددی (مثل 13) یا reading_method (مثل estjt_...) باشد.
|
||||||
|
|||||||
Reference in New Issue
Block a user