From baa560e261247e0fbb43b2dc44d07000e3cd7aa5 Mon Sep 17 00:00:00 2001 From: kimbokon Date: Mon, 5 Jan 2026 05:01:48 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A0=84=EC=B2=B4=EC=A0=81=EC=9D=B8=20?= =?UTF-8?q?=EC=88=98=EB=8B=B9=20=EC=8B=9C=EB=AE=AC=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EB=A1=9C=EC=A7=81=EC=9D=84=20=ED=95=98=EB=93=9C?= =?UTF-8?q?=EC=BD=94=EB=94=A9=EB=90=9C=20=EB=B0=A9=EC=8B=9D=EC=97=90?= =?UTF-8?q?=EC=84=9C=20salesConfig=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EA=B8=B0=EB=B0=98=EC=9D=98=20=EB=8F=99=EC=A0=81=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EC=A0=84=EB=A9=B4=20=EA=B0=9C?= =?UTF-8?q?=ED=8E=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- salesmanagement/index.php | 290 +++++++++++++++++--------------------- 1 file changed, 126 insertions(+), 164 deletions(-) diff --git a/salesmanagement/index.php b/salesmanagement/index.php index 2f2b69a..c8824f3 100644 --- a/salesmanagement/index.php +++ b/salesmanagement/index.php @@ -5094,11 +5094,8 @@ const [editingItem, setEditingItem] = useState(null); const isOperator = selectedRole === '운영자'; - // 1차 선택: 선택모델, 공사관리, 공정/정부지원사업 - const [selectedSelectModels, setSelectedSelectModels] = useState(false); - const [selectedConstruction, setSelectedConstruction] = useState(false); - const [selectedProcessGov, setSelectedProcessGov] = useState(false); - + // 1차 선택: 동적 패키지 관리 + const [selectedPackageIds, setSelectedPackageIds] = useState([]); // 2차 선택: 선택모델의 세부 모델들 const [selectedModels, setSelectedModels] = useState([]); @@ -5123,9 +5120,6 @@ }, []); const packageTypes = salesConfig.package_types || []; - const selectModelsPackage = packageTypes.find(p => p.id === 'select_models'); - const constructionPackage = packageTypes.find(p => p.id === 'construction_management'); - const processGovPackage = packageTypes.find(p => p.id === 'process_government'); // DB 가격 정보와 기본 설정 병합 const getItemPrice = (itemType, itemId, defaultJoinFee, defaultSubFee) => { @@ -5148,44 +5142,36 @@ let totalManagerCommission = 0; let totalEducatorCommission = 0; - // 선택모델의 세부 모델들 합산 - if (selectedSelectModels && selectModelsPackage) { - selectedModels.forEach(modelId => { - const model = selectModelsPackage.models.find(m => m.id === modelId); - if (model) { - const price = getItemPrice('model', modelId, model.join_fee, model.subscription_fee); + packageTypes.forEach(pkg => { + if (pkg.id === 'select_models') { + if (selectedPackageIds.includes(pkg.id)) { + (pkg.models || []).forEach(modelIdOrObj => { + // package_types의 models가 ID 배열일수도, 객체 배열일수도 있음 (company_info.php에선 객체 배열) + const model = typeof modelIdOrObj === 'string' + ? pkg.models.find(m => m.id === modelIdOrObj) + : modelIdOrObj; + + if (model && selectedModels.includes(model.id)) { + const price = getItemPrice('model', model.id, model.join_fee, model.subscription_fee); + totalJoinFee += price.join_fee || 0; + + const rates = model.commission_rates || { seller: { join: 0.20 }, manager: { join: 0.05 }, educator: { join: 0 } }; + totalSellerCommission += (price.join_fee * (rates.seller?.join || 0.20)); + totalManagerCommission += (price.join_fee * (rates.manager?.join || 0.05)); + } + }); + } + } else { + if (selectedPackageIds.includes(pkg.id)) { + const price = getItemPrice('package', pkg.id, pkg.join_fee, pkg.subscription_fee); totalJoinFee += price.join_fee || 0; - // 가입비에 대한 수당만 계산: 판매자 20%, 관리자 5%, 메뉴제작 협업수당 별도 - const rates = model.commission_rates || { seller: { join: 0.20 }, manager: { join: 0.05 }, educator: { join: 0 } }; - totalSellerCommission += (price.join_fee * (rates.seller.join || 0.20)); - totalManagerCommission += (price.join_fee * (rates.manager.join || 0.05)); - totalEducatorCommission += 0; // 운영팀 별도 산정 + const rates = pkg.commission_rates || { seller: { join: 0.20 }, manager: { join: 0.05 }, educator: { join: 0 } }; + totalSellerCommission += (price.join_fee * (rates.seller?.join || 0.20)); + totalManagerCommission += (price.join_fee * (rates.manager?.join || 0.05)); } - }); - } - - // 공사관리 패키지 - if (selectedConstruction && constructionPackage) { - const price = getItemPrice('package', 'construction_management', constructionPackage.join_fee, constructionPackage.subscription_fee); - totalJoinFee += price.join_fee || 0; - - const rates = constructionPackage.commission_rates || { seller: { join: 0.20 }, manager: { join: 0.05 }, educator: { join: 0 } }; - totalSellerCommission += (price.join_fee * (rates.seller.join || 0.20)); - totalManagerCommission += (price.join_fee * (rates.manager.join || 0.05)); - totalEducatorCommission += 0; - } - - // 공정/정부지원사업 패키지 - if (selectedProcessGov && processGovPackage) { - const price = getItemPrice('package', 'process_government', processGovPackage.join_fee, processGovPackage.subscription_fee); - totalJoinFee += price.join_fee || 0; - - const rates = processGovPackage.commission_rates || { seller: { join: 0.20 }, manager: { join: 0.05 }, educator: { join: 0 } }; - totalSellerCommission += (price.join_fee * (rates.seller.join || 0.20)); - totalManagerCommission += (price.join_fee * (rates.manager.join || 0.05)); - totalEducatorCommission += 0; - } + } + }); const totalCommission = totalSellerCommission + totalManagerCommission + totalEducatorCommission; const totalRevenue = totalJoinFee; // 구독료 제거 @@ -5201,6 +5187,18 @@ ); }; + const handlePackageToggle = (pkgId) => { + setSelectedPackageIds(prev => { + const next = prev.includes(pkgId) + ? prev.filter(id => id !== pkgId) + : [...prev, pkgId]; + if (pkgId === 'select_models' && prev.includes(pkgId)) { + setSelectedModels([]); + } + return next; + }); + }; + const handleEditPrice = (itemType, itemId, itemName, subName, defaultJoinFee, defaultSubFee) => { const key = `${itemType}_${itemId}`; const currentPrice = pricingData[key] || { join_fee: defaultJoinFee, subscription_fee: defaultSubFee }; @@ -5279,129 +5277,40 @@
- {/* 선택모델 */} -
- { - setSelectedSelectModels(e.target.checked); - if (!e.target.checked) { - setSelectedModels([]); - } - }} - className="mt-1 w-4 h-4 text-blue-600 border-slate-300 rounded focus:ring-blue-500" - /> - -
- - {/* 공사관리 */} - {constructionPackage && (() => { - const price = getItemPrice('package', 'construction_management', constructionPackage.join_fee, constructionPackage.subscription_fee); - return ( -
- setSelectedConstruction(e.target.checked)} - className="mt-1 w-4 h-4 text-blue-600 border-slate-300 rounded focus:ring-blue-500" - /> - -
- ); - })()} - - {/* 공정/정부지원사업 */} - {processGovPackage && (() => { - const price = getItemPrice('package', 'process_government', processGovPackage.join_fee, processGovPackage.subscription_fee); - return ( -
- setSelectedProcessGov(e.target.checked)} - className="mt-1 w-4 h-4 text-blue-600 border-slate-300 rounded focus:ring-blue-500" - /> - -
- ); - })()} -
-
- - {/* 2차 선택: 선택모델의 세부 모델들 */} - {selectedSelectModels && selectModelsPackage && ( -
- -
- {selectModelsPackage.models.map(model => { - const price = getItemPrice('model', model.id, model.join_fee, model.subscription_fee); +
+ {packageTypes.map(pkg => { + if (pkg.id === 'select_models') { return ( -
+
handleModelToggle(model.id)} + id={pkg.id} + checked={selectedPackageIds.includes(pkg.id)} + onChange={() => handlePackageToggle(pkg.id)} className="mt-1 w-4 h-4 text-blue-600 border-slate-300 rounded focus:ring-blue-500" /> -
+ ); + } else { + const price = getItemPrice('package', pkg.id, pkg.join_fee, pkg.subscription_fee); + return ( +
+ handlePackageToggle(pkg.id)} + className="mt-1 w-4 h-4 text-blue-600 border-slate-300 rounded focus:ring-blue-500" + /> +
- )} +
+
+ + {/* 2차 선택: 선택모델의 세부 모델들 */} + {selectedPackageIds.includes('select_models') && (() => { + const selectModelsPkg = packageTypes.find(p => p.id === 'select_models'); + if (!selectModelsPkg || !selectModelsPkg.models) return null; + return ( +
+ +
+ {selectModelsPkg.models.map(model => { + const price = getItemPrice('model', model.id, model.join_fee, model.subscription_fee); + return ( +
+ handleModelToggle(model.id)} + className="mt-1 w-4 h-4 text-blue-600 border-slate-300 rounded focus:ring-blue-500" + /> + +
+ ); + })} +
+
+ ); + })()}