addClassName('ServerPart'); } public function getFormFields(): array { return [ "serverinfo_uid", "type", "billing", "part_uid", "title", "cnt", "extra", "amount", ]; } public function getFormFilters(): array { return [ "serverinfo_uid", "type", "part_uid", "billing", ]; } public function getIndexFields(): array { return [ "serverinfo_uid", "type", "part_uid", "billing", "amount", "cnt", "extra", ]; } public function getIndexFilters(): array { return [ "serverinfo_uid", "type", "part_uid", "billing", ]; } public function getBatchjobFields(): array { return ['billing', 'type']; } final public function getServiceService(): ServiceService { if (!$this->_serviceService) { $this->_serviceService = new ServiceService(); } return $this->_serviceService; } final public function getServerService(): ServerService { if (!$this->_serverService) { $this->_serverService = new ServerService(); } return $this->_serverService; } final public function getPaymentService(): PaymentService { if (!$this->_paymentService) { $this->_paymentService = new PaymentService(); } return $this->_paymentService; } final public function getPartService(string $type): object { if (!array_key_exists($type, $this->_partServices)) { $class = "App\\Services\\Equipment\\ServerPart\\{$type}Service"; if (!class_exists($class)) { throw new \Exception("{$class} 클래스가 존재하지 않습니다."); } $this->_partServices[$type] = new $class(); } return $this->_partServices[$type]; } //partEntity 정보 추가 protected function getEntity_process(mixed $entity): ServerPartEntity { if (!$entity instanceof ServerPartEntity) { throw new \Exception(__METHOD__ . "에서 형식오류:ServicePartEntity만 허용됩니다."); } //각 파트서비스 정의 $entity->setPartEntity($this->getPartService($entity->getType())->getEntity($entity->getPartUID())); //결제정보 정의 if ($entity->getPaymentUID()) { $paymentEntity = $this->getPaymentService()->getEntity($entity->getPaymentUID()); if ($paymentEntity instanceof PaymentEntity) { $entity->setPaymentEntity($paymentEntity); } } return $entity; } //기본 기능부분 // FieldForm관련용 public function getFormOption(string $field, array $options = []): array { switch ($field) { case 'serverinfo_uid': $options = $this->getServerService()->getEntities(); break; case 'part_uid': $partOptions = []; foreach (SERVERPART['ALL_PARTTYPES'] as $partType) { $partOptions[$partType] = $this->getPartService($partType)->getEntities(); } $options = $partOptions; // dd($options); break; default: $options = parent::getFormOption($field, $options); break; } if (!is_array($options)) { throw new \Exception(__FUNCTION__ . "에서 {$field}의 options 값이 array가 아닙니다.\n" . var_export($options, true)); } return $options; } //파트별정보 설정 private function action_process(ServerPartEntity $entity, string $action): ServerPartEntity { //Type에 따른 부품서비스 정의 $this->getPartService($entity->getType())->$action($entity); //서비스 및 결제정보 처리 switch ($entity->getBilling()) { case PAYMENT['BILLING']['MONTH']: //월별과금일때만 처리 $entity = $this->getServiceService()->$action($entity); break; case PAYMENT['BILLING']['ONETIME']: //일회성일때만 처리 $entity = $this->getPaymentService()->$action($entity); //결제정보PK정의 $entity = parent::modify($entity, ['payment_uid' => $entity->getPaymentEntity()->getPK()]); break; case PAYMENT['BILLING']['BASE']: //기본처리 //아무처리 않함 break; default: throw new \Exception(__METHOD__ . "에서 오류발생:{$entity->getBilling()}은 지정되지 않은 결제방식입니다."); // break; } return $entity; } //부품연결정보생성 public function create(array $formDatas): ServerPartEntity { //서버정보가져오기 if (!array_key_exists('serverinfo_uid', $formDatas)) { throw new \Exception("서버 정보가 지정되지 않았습니다."); } $serverEntity = $this->getServerService()->getEntity($formDatas['serverinfo_uid']); if (!$serverEntity instanceof ServerEntity) { throw new \Exception("서버 정보가 지정되지 않았습니다."); } //서비스정의확인(기본은 제외) if ($formDatas['billing'] !== PAYMENT['BILLING']['BASE'] && $serverEntity->getServiceInfoUID() === null) { throw new \Exception(__METHOD__ . "에서 오류발생:{월,일회성 과금용은 서비스가 지정되어야 작업이 가능합니다."); } //생성작업 $formDatas["clientinfo_uid"] = $serverEntity->getClientInfoUID(); $formDatas["serviceinfo_uid"] = $serverEntity->getServiceInfoUID(); $formDatas["serverinfo_uid"] = $serverEntity->getPK(); $entity = parent::create($formDatas); //후처리작업 return $this->action_process($entity, __FUNCTION__ . 'ServerPart'); } //수정 public function modify(mixed $entity, array $formDatas): ServerPartEntity { //서버정보가져오기 if (!array_key_exists('serverinfo_uid', $formDatas)) { throw new \Exception("서버 정보가 지정되지 않았습니다."); } $serverEntity = $this->getServerService()->getEntity($formDatas['serverinfo_uid']); if (!$serverEntity instanceof ServerEntity) { throw new \Exception("서버 정보가 지정되지 않았습니다."); } //수정 전 부품연결정보관련 정보처리 if ($entity->getCnt() != $formDatas['cnt'] || $entity->getPartUID() !== $formDatas['part_uid']) { $entity = $this->action_process($entity, 'deleteServerPart'); } //수정작업 $formDatas["clientinfo_uid"] = $serverEntity->getClientInfoUID(); $formDatas["serviceinfo_uid"] = $serverEntity->getServiceInfoUID(); $formDatas["serverinfo_uid"] = $serverEntity->getPK(); $entity = parent::modify($entity, $formDatas); //후처리작업 $entity = $this->action_process($entity, __FUNCTION__ . 'ServerPart'); return $entity; } //삭제 public function delete(mixed $entity): ServerPartEntity { $entity = parent::delete($entity); //서비스금액 관련때문에 후처리작업 return $this->action_process($entity, __FUNCTION__ . 'ServerPart'); } }