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 @@