feat:상품 수정 시 개발비/가입비 분리 입력 지원
This commit is contained in:
@@ -60,6 +60,7 @@ public function store(Request $request): JsonResponse
|
|||||||
'name' => 'required|string|max:100',
|
'name' => 'required|string|max:100',
|
||||||
'description' => 'nullable|string',
|
'description' => 'nullable|string',
|
||||||
'development_fee' => 'required|numeric|min:0',
|
'development_fee' => 'required|numeric|min:0',
|
||||||
|
'registration_fee' => 'required|numeric|min:0',
|
||||||
'subscription_fee' => 'required|numeric|min:0',
|
'subscription_fee' => 'required|numeric|min:0',
|
||||||
'partner_commission_rate' => 'nullable|numeric|min:0|max:100',
|
'partner_commission_rate' => 'nullable|numeric|min:0|max:100',
|
||||||
'manager_commission_rate' => 'nullable|numeric|min:0|max:100',
|
'manager_commission_rate' => 'nullable|numeric|min:0|max:100',
|
||||||
@@ -105,6 +106,7 @@ public function update(Request $request, int $id): JsonResponse
|
|||||||
'name' => 'sometimes|string|max:100',
|
'name' => 'sometimes|string|max:100',
|
||||||
'description' => 'nullable|string',
|
'description' => 'nullable|string',
|
||||||
'development_fee' => 'sometimes|numeric|min:0',
|
'development_fee' => 'sometimes|numeric|min:0',
|
||||||
|
'registration_fee' => 'sometimes|numeric|min:0',
|
||||||
'subscription_fee' => 'sometimes|numeric|min:0',
|
'subscription_fee' => 'sometimes|numeric|min:0',
|
||||||
'partner_commission_rate' => 'nullable|numeric|min:0|max:100',
|
'partner_commission_rate' => 'nullable|numeric|min:0|max:100',
|
||||||
'manager_commission_rate' => 'nullable|numeric|min:0|max:100',
|
'manager_commission_rate' => 'nullable|numeric|min:0|max:100',
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
* @property string $name
|
* @property string $name
|
||||||
* @property string|null $description
|
* @property string|null $description
|
||||||
* @property float $development_fee
|
* @property float $development_fee
|
||||||
|
* @property float $registration_fee
|
||||||
* @property float $subscription_fee
|
* @property float $subscription_fee
|
||||||
* @property float $partner_commission_rate
|
* @property float $partner_commission_rate
|
||||||
* @property float $manager_commission_rate
|
* @property float $manager_commission_rate
|
||||||
@@ -35,6 +36,7 @@ class SalesProduct extends Model
|
|||||||
'name',
|
'name',
|
||||||
'description',
|
'description',
|
||||||
'development_fee',
|
'development_fee',
|
||||||
|
'registration_fee',
|
||||||
'subscription_fee',
|
'subscription_fee',
|
||||||
'partner_commission_rate',
|
'partner_commission_rate',
|
||||||
'manager_commission_rate',
|
'manager_commission_rate',
|
||||||
@@ -47,6 +49,7 @@ class SalesProduct extends Model
|
|||||||
protected $casts = [
|
protected $casts = [
|
||||||
'category_id' => 'integer',
|
'category_id' => 'integer',
|
||||||
'development_fee' => 'decimal:2',
|
'development_fee' => 'decimal:2',
|
||||||
|
'registration_fee' => 'decimal:2',
|
||||||
'subscription_fee' => 'decimal:2',
|
'subscription_fee' => 'decimal:2',
|
||||||
'partner_commission_rate' => 'decimal:2',
|
'partner_commission_rate' => 'decimal:2',
|
||||||
'manager_commission_rate' => 'decimal:2',
|
'manager_commission_rate' => 'decimal:2',
|
||||||
@@ -104,6 +107,14 @@ public function getFormattedDevelopmentFeeAttribute(): string
|
|||||||
return '₩' . number_format($this->development_fee);
|
return '₩' . number_format($this->development_fee);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 포맷된 가입비
|
||||||
|
*/
|
||||||
|
public function getFormattedRegistrationFeeAttribute(): string
|
||||||
|
{
|
||||||
|
return '₩' . number_format($this->registration_fee);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 포맷된 구독료
|
* 포맷된 구독료
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -117,22 +117,31 @@ class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:rin
|
|||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2 gap-4">
|
<div class="grid grid-cols-2 gap-4">
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-sm font-medium text-gray-700 mb-1">개발비 (가입비)</label>
|
<label class="block text-sm font-medium text-gray-700 mb-1">개발비 (원가)</label>
|
||||||
<input type="text"
|
<input type="text"
|
||||||
:value="formatNumber(productForm.development_fee)"
|
:value="formatNumber(productForm.development_fee)"
|
||||||
x-on:input="productForm.development_fee = parseNumber($event.target.value); $event.target.value = formatNumber(productForm.development_fee)"
|
x-on:input="updateDevelopmentFee($event.target.value)"
|
||||||
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 text-right"
|
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 text-right"
|
||||||
placeholder="0" required>
|
placeholder="0" required>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-sm font-medium text-gray-700 mb-1">월 구독료</label>
|
<label class="block text-sm font-medium text-gray-700 mb-1">가입비 (할인가)</label>
|
||||||
<input type="text"
|
<input type="text"
|
||||||
:value="formatNumber(productForm.subscription_fee)"
|
:value="formatNumber(productForm.registration_fee)"
|
||||||
x-on:input="productForm.subscription_fee = parseNumber($event.target.value); $event.target.value = formatNumber(productForm.subscription_fee)"
|
x-on:input="productForm.registration_fee = parseNumber($event.target.value); $event.target.value = formatNumber(productForm.registration_fee)"
|
||||||
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 text-right"
|
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 text-right bg-indigo-50"
|
||||||
placeholder="0" required>
|
placeholder="0" required>
|
||||||
|
<p class="text-xs text-gray-500 mt-1">기본: 개발비의 25%</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div>
|
||||||
|
<label class="block text-sm font-medium text-gray-700 mb-1">월 구독료</label>
|
||||||
|
<input type="text"
|
||||||
|
:value="formatNumber(productForm.subscription_fee)"
|
||||||
|
x-on:input="productForm.subscription_fee = parseNumber($event.target.value); $event.target.value = formatNumber(productForm.subscription_fee)"
|
||||||
|
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 text-right"
|
||||||
|
placeholder="0" required>
|
||||||
|
</div>
|
||||||
<div class="grid grid-cols-2 gap-4">
|
<div class="grid grid-cols-2 gap-4">
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-sm font-medium text-gray-700 mb-1">영업파트너 수당 (%)</label>
|
<label class="block text-sm font-medium text-gray-700 mb-1">영업파트너 수당 (%)</label>
|
||||||
@@ -245,6 +254,7 @@ function productManager() {
|
|||||||
name: '',
|
name: '',
|
||||||
description: '',
|
description: '',
|
||||||
development_fee: 0,
|
development_fee: 0,
|
||||||
|
registration_fee: 0,
|
||||||
subscription_fee: 0,
|
subscription_fee: 0,
|
||||||
partner_commission_rate: 20,
|
partner_commission_rate: 20,
|
||||||
manager_commission_rate: 5,
|
manager_commission_rate: 5,
|
||||||
@@ -280,6 +290,7 @@ function productManager() {
|
|||||||
name: '',
|
name: '',
|
||||||
description: '',
|
description: '',
|
||||||
development_fee: 0,
|
development_fee: 0,
|
||||||
|
registration_fee: 0,
|
||||||
subscription_fee: 0,
|
subscription_fee: 0,
|
||||||
partner_commission_rate: 20,
|
partner_commission_rate: 20,
|
||||||
manager_commission_rate: 5,
|
manager_commission_rate: 5,
|
||||||
@@ -392,6 +403,13 @@ function productManager() {
|
|||||||
parseNumber(value) {
|
parseNumber(value) {
|
||||||
if (!value) return 0;
|
if (!value) return 0;
|
||||||
return parseInt(String(value).replace(/[^\d]/g, ''), 10) || 0;
|
return parseInt(String(value).replace(/[^\d]/g, ''), 10) || 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
updateDevelopmentFee(value) {
|
||||||
|
const fee = this.parseNumber(value);
|
||||||
|
this.productForm.development_fee = fee;
|
||||||
|
// 가입비 자동 계산 (개발비의 25%)
|
||||||
|
this.productForm.registration_fee = Math.floor(fee * 0.25);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ class="p-1 text-gray-400 hover:text-indigo-600 transition-colors">
|
|||||||
<div class="flex items-center justify-between">
|
<div class="flex items-center justify-between">
|
||||||
<span class="text-sm text-gray-500">가입비</span>
|
<span class="text-sm text-gray-500">가입비</span>
|
||||||
<div class="text-right">
|
<div class="text-right">
|
||||||
<span class="text-sm text-gray-400 line-through">₩{{ number_format($product->development_fee) }}</span>
|
<span class="text-sm text-gray-400 line-through">{{ $product->formatted_development_fee }}</span>
|
||||||
<span class="ml-2 font-bold text-indigo-600">₩{{ number_format($product->development_fee * 0.25) }}</span>
|
<span class="ml-2 font-bold text-indigo-600">{{ $product->formatted_registration_fee }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center justify-between">
|
<div class="flex items-center justify-between">
|
||||||
|
|||||||
Reference in New Issue
Block a user