fix amount 5
This commit is contained in:
@@ -92,6 +92,11 @@ class ProductController extends SuperController
|
|||||||
// return 1;
|
// return 1;
|
||||||
|
|
||||||
$data = $this->filterProductData($request->all());
|
$data = $this->filterProductData($request->all());
|
||||||
|
$clearingReadingMethod = array_key_exists('reading_method', $data)
|
||||||
|
&& ($data['reading_method'] === null || $data['reading_method'] === '');
|
||||||
|
if ($clearingReadingMethod) {
|
||||||
|
$data['reading_method'] = null;
|
||||||
|
}
|
||||||
if (isset($data["price"])) {
|
if (isset($data["price"])) {
|
||||||
$data["reading_method"] = null;
|
$data["reading_method"] = null;
|
||||||
if (Product::hasPriceOffsetColumn()) {
|
if (Product::hasPriceOffsetColumn()) {
|
||||||
@@ -121,6 +126,7 @@ class ProductController extends SuperController
|
|||||||
Product::hasPriceOffsetColumn()
|
Product::hasPriceOffsetColumn()
|
||||||
&& $product->reading_method
|
&& $product->reading_method
|
||||||
&& array_key_exists('price_offset_percent', $data)
|
&& array_key_exists('price_offset_percent', $data)
|
||||||
|
&& !$clearingReadingMethod
|
||||||
) {
|
) {
|
||||||
ProductPriceService::reapplyOffsetPercent(
|
ProductPriceService::reapplyOffsetPercent(
|
||||||
$product,
|
$product,
|
||||||
@@ -150,7 +156,11 @@ class ProductController extends SuperController
|
|||||||
$products = Product::with(['file'])->where('active', 1)->get();
|
$products = Product::with(['file'])->where('active', 1)->get();
|
||||||
|
|
||||||
if (Product::hasPriceOffsetColumn() && str_contains(request()->path(), '/customer/')) {
|
if (Product::hasPriceOffsetColumn() && str_contains(request()->path(), '/customer/')) {
|
||||||
$products->each->makeHidden(['price_offset_percent']);
|
$products->each(function (Product $product) {
|
||||||
|
if ($product->reading_method) {
|
||||||
|
$product->makeHidden(['price_offset_percent']);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($products);
|
return response()->json($products);
|
||||||
|
|||||||
@@ -280,12 +280,64 @@ class Controller extends BaseController
|
|||||||
return self::productSellTitle(self::metalTypeLabel());
|
return self::productSellTitle(self::metalTypeLabel());
|
||||||
}
|
}
|
||||||
|
|
||||||
/** واحد وزن معاملات فلز اصلی — مس: کیلوگرم، طلا: گرم */
|
/** واحد وزن معاملات فلز — از ستینگ unit؛ پیشفرض گرم */
|
||||||
public static function tradeWeightUnit(): string
|
public static function tradeWeightUnit(): string
|
||||||
{
|
{
|
||||||
$label = self::metalTypeLabel();
|
return self::resolveTradeWeightUnit(
|
||||||
|
Setting::where('key', 'unit')->value('value')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return str_contains($label, 'مس') ? 'کیلوگرم' : 'گرم';
|
public static function resolveTradeWeightUnit(?string $value): string
|
||||||
|
{
|
||||||
|
$unit = trim((string) $value);
|
||||||
|
|
||||||
|
if ($unit === 'کیلوگرم' || $unit === 'kilogram' || $unit === 'kg') {
|
||||||
|
return 'کیلوگرم';
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'گرم';
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function weightToGrams(float $value, ?string $fromUnit = null): float
|
||||||
|
{
|
||||||
|
$from = $fromUnit ?? self::tradeWeightUnit();
|
||||||
|
|
||||||
|
return $from === 'کیلوگرم' ? $value * 1000 : $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function gramsToTradeUnit(float $grams): float
|
||||||
|
{
|
||||||
|
return self::tradeWeightUnit() === 'کیلوگرم' ? $grams / 1000 : $grams;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function productStorageWeightUnit($product): string
|
||||||
|
{
|
||||||
|
$unit = trim((string) (is_object($product) ? ($product->unit ?? '') : ($product['unit'] ?? '')));
|
||||||
|
|
||||||
|
if (self::isWeightBasedProductUnit($unit)) {
|
||||||
|
return $unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'گرم';
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function productLineWeightToGrams($product, $quantity): float
|
||||||
|
{
|
||||||
|
$groupType = is_object($product) ? ($product->group_type ?? '') : ($product['group_type'] ?? '');
|
||||||
|
if ((string) $groupType === 'سکه') {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$qty = (float) $quantity;
|
||||||
|
$unit = trim((string) (is_object($product) ? ($product->unit ?? '') : ($product['unit'] ?? '')));
|
||||||
|
$amount = (float) (is_object($product) ? ($product->amount ?? 0) : ($product['amount'] ?? 0));
|
||||||
|
|
||||||
|
if (self::isWeightBasedProductUnit($unit)) {
|
||||||
|
return self::weightToGrams($qty, $unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::weightToGrams($amount * $qty, self::productStorageWeightUnit($product));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function isWeightBasedProductUnit(?string $unit): bool
|
public static function isWeightBasedProductUnit(?string $unit): bool
|
||||||
@@ -330,7 +382,7 @@ class Controller extends BaseController
|
|||||||
}
|
}
|
||||||
|
|
||||||
$group = trim((string) ($product['group_type'] ?? ''));
|
$group = trim((string) ($product['group_type'] ?? ''));
|
||||||
if (in_array($group, ['مفتول مس', 'کاتد مس'], true)) {
|
if (in_array($group, ['مفتول مس'], true)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,72 +50,71 @@ class CustomerController extends Controller
|
|||||||
->where('owner_type', $user->type)
|
->where('owner_type', $user->type)
|
||||||
->whereNull('fund_id')
|
->whereNull('fund_id')
|
||||||
->first() ?? new Wallet();
|
->first() ?? new Wallet();
|
||||||
$wallet->gold_ab = round(Wallet::where('owner', $user->id)->where('product_id', null)->sum('gold'), 2);
|
|
||||||
|
$treasureGrams = 0;
|
||||||
$wallet->wp = Wallet::with('product')->where('owner', $user->id)->get();
|
$wallet->wp = Wallet::with('product')->where('owner', $user->id)->get();
|
||||||
foreach ($wallet->wp as $row) {
|
foreach ($wallet->wp as $row) {
|
||||||
if ($row->product_id != null) {
|
if ($row->product_id != null) {
|
||||||
$wallet->treasure +=$row->product->amount*$row->gold;
|
$treasureGrams += self::productLineWeightToGrams($row->product, $row->gold);
|
||||||
}
|
}
|
||||||
$wallet->treasure_sum =$user->gold+$wallet->treasure;
|
|
||||||
}
|
}
|
||||||
$wallet->gold_sum = $wallet->treasure_sum+$wallet->gold_ab;
|
|
||||||
|
$goldAbGrams = self::weightToGrams((float) Wallet::where('owner', $user->id)->where('product_id', null)->sum('gold'));
|
||||||
|
$userGoldGrams = self::weightToGrams((float) $user->gold);
|
||||||
|
|
||||||
|
$wallet->treasure = round(self::gramsToTradeUnit($treasureGrams), 3);
|
||||||
|
$wallet->treasure_sum = round(self::gramsToTradeUnit($userGoldGrams + $treasureGrams), 3);
|
||||||
|
$wallet->gold_ab = round(self::gramsToTradeUnit($goldAbGrams), 2);
|
||||||
|
$wallet->gold_sum = round($wallet->treasure_sum + $wallet->gold_ab, 2);
|
||||||
|
|
||||||
$user->wallets = Wallet::with(['product'])->where('owner', $user->id)->get() ?? new Wallet();
|
$user->wallets = Wallet::with(['product'])->where('owner', $user->id)->get() ?? new Wallet();
|
||||||
|
|
||||||
$count_gold = 0;
|
$count_gold = 0;
|
||||||
$count_silver = 0; // وزن نقره
|
$count_silver = 0;
|
||||||
$count_copper = 0; // وزن مس
|
$count_copper = 0;
|
||||||
$count_cash_from_gold = 0; // مبلغ حاصل از طلا
|
$count_cash_from_gold = 0;
|
||||||
$count_cash_from_silver = 0; // مبلغ حاصل از نقره
|
$count_cash_from_silver = 0;
|
||||||
$count_cash_from_copper = 0; // مبلغ حاصل از مس
|
$count_cash_from_copper = 0;
|
||||||
$count_cash_pure = 0; // نقدینگی خالص بدون ارزش محصولات
|
$count_cash_pure = 0;
|
||||||
|
|
||||||
$count_product = 0;
|
$count_product = 0;
|
||||||
foreach ($user->wallets as $walletSingle) {
|
foreach ($user->wallets as $walletSingle) {
|
||||||
if ($walletSingle->product_id) {
|
if ($walletSingle->product_id) {
|
||||||
|
|
||||||
// محاسبه برای طلا (metal_id = 1)
|
|
||||||
if ($walletSingle->product->metal_id == 1) {
|
if ($walletSingle->product->metal_id == 1) {
|
||||||
|
|
||||||
if (!($walletSingle->product->group_type == "سکه")) {
|
if (!($walletSingle->product->group_type == "سکه")) {
|
||||||
(float)$count_gold += $walletSingle->product->amount*$walletSingle->gold;
|
$count_gold += self::productLineWeightToGrams($walletSingle->product, $walletSingle->gold);
|
||||||
}
|
}
|
||||||
$count_cash_from_gold += $walletSingle->product->price * $walletSingle->gold;
|
$count_cash_from_gold += $walletSingle->product->price * $walletSingle->gold;
|
||||||
$count_product += $walletSingle->gold;
|
$count_product += $walletSingle->gold;
|
||||||
}
|
} elseif ($walletSingle->product->metal_id == 2) {
|
||||||
// محاسبه برای نقره (metal_id = 2)
|
|
||||||
elseif ($walletSingle->product->metal_id == 2) {
|
|
||||||
if (!($walletSingle->product->group_type == "سکه")) {
|
if (!($walletSingle->product->group_type == "سکه")) {
|
||||||
(float)$count_silver += $walletSingle->product->amount * $walletSingle->gold;
|
$count_silver += self::productLineWeightToGrams($walletSingle->product, $walletSingle->gold);
|
||||||
}
|
}
|
||||||
$count_cash_from_silver += ($walletSingle->product->price * $walletSingle->product->amount) * $walletSingle->gold;
|
$count_cash_from_silver += ($walletSingle->product->price * $walletSingle->product->amount) * $walletSingle->gold;
|
||||||
$count_product += $walletSingle->gold;
|
$count_product += $walletSingle->gold;
|
||||||
}
|
} elseif ($walletSingle->product->metal_id == 3) {
|
||||||
// محاسبه برای مس (metal_id = 3)
|
|
||||||
elseif ($walletSingle->product->metal_id == 3) {
|
|
||||||
if (!($walletSingle->product->group_type == "سکه")) {
|
if (!($walletSingle->product->group_type == "سکه")) {
|
||||||
(float)$count_copper += $walletSingle->product->amount * $walletSingle->gold;
|
$count_copper += self::productLineWeightToGrams($walletSingle->product, $walletSingle->gold);
|
||||||
}
|
}
|
||||||
$count_cash_from_copper += ($walletSingle->product->price * $walletSingle->product->amount) * $walletSingle->gold;
|
$count_cash_from_copper += ($walletSingle->product->price * $walletSingle->product->amount) * $walletSingle->gold;
|
||||||
$count_product += $walletSingle->gold;
|
$count_product += $walletSingle->gold;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
(float)$count_gold += $walletSingle->gold;
|
$count_gold += self::weightToGrams((float) $walletSingle->gold);
|
||||||
(float)$count_cash_pure += $walletSingle->cash;
|
$count_cash_pure += $walletSingle->cash;
|
||||||
$wallet->count_cash_wallet = $walletSingle->cash;
|
$wallet->count_cash_wallet = $walletSingle->cash;
|
||||||
$wallet->count_gold_wallet = $walletSingle->gold;
|
$wallet->count_gold_wallet = round(self::gramsToTradeUnit(self::weightToGrams((float) $walletSingle->gold)), 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// محاسبه مجموع کل ارزش دارایی
|
|
||||||
$count_cash_total = $count_cash_from_gold + $count_cash_from_silver + $count_cash_from_copper + $count_cash_pure;
|
$count_cash_total = $count_cash_from_gold + $count_cash_from_silver + $count_cash_from_copper + $count_cash_pure;
|
||||||
|
|
||||||
$wallet->count_cash_wallets = $count_cash_total - $wallet->count_cash_wallet;
|
$wallet->count_cash_wallets = $count_cash_total - $wallet->count_cash_wallet;
|
||||||
$wallet->count_gold_wallets = $count_gold - $wallet->count_gold_wallet;
|
$wallet->count_gold = round(self::gramsToTradeUnit($count_gold), 3);
|
||||||
|
$wallet->count_gold_wallets = round($wallet->count_gold - $wallet->count_gold_wallet, 3);
|
||||||
$wallet->count_gold = $count_gold;
|
$wallet->count_silver = round(self::gramsToTradeUnit($count_silver), 3);
|
||||||
$wallet->count_silver = $count_silver;
|
$wallet->count_copper = round(self::gramsToTradeUnit($count_copper), 3);
|
||||||
$wallet->count_copper = $count_copper;
|
|
||||||
$wallet->count_cash = $count_cash_pure;
|
$wallet->count_cash = $count_cash_pure;
|
||||||
$wallet->count_product = $count_product;
|
$wallet->count_product = $count_product;
|
||||||
$wallet->cash_from_gold = $count_cash_from_gold;
|
$wallet->cash_from_gold = $count_cash_from_gold;
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
-- واحد نمایش وزن داراییها و معاملات فلز (گرم / کیلوگرم)
|
||||||
|
-- مقدار خالی = گرم (پیشفرض در اپ و ادمین)
|
||||||
|
|
||||||
|
INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
|
||||||
|
SELECT
|
||||||
|
'unit',
|
||||||
|
'',
|
||||||
|
'واحد وزن دارایی و معاملات',
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
'واحد نمایش وزن فلز در داراییها، کیف پول و تراکنشها|گرم,کیلوگرم',
|
||||||
|
'select'
|
||||||
|
WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'unit' LIMIT 1);
|
||||||
|
|
||||||
|
-- برای بورس مس که دادهها بر اساس کیلوگرم ذخیره شدهاند (اختیاری — فقط در صورت نیاز اجرا کنید):
|
||||||
|
-- UPDATE `settings` SET `value` = 'کیلوگرم' WHERE `key` = 'unit';
|
||||||
Reference in New Issue
Block a user