diff --git a/app/Controllers/Admin/Customer/ClientController.php b/app/Controllers/Admin/Customer/ClientController.php index 8f06a27..125b30a 100644 --- a/app/Controllers/Admin/Customer/ClientController.php +++ b/app/Controllers/Admin/Customer/ClientController.php @@ -52,6 +52,7 @@ class ClientController extends CustomerController } } + //비고사항 변경 public function history(int $uid): RedirectResponse|string { try { @@ -59,7 +60,7 @@ class ClientController extends CustomerController if (!$history) { throw new RuntimeException(static::class . '->' . __FUNCTION__ . "에서 오류발생: 비고가 정의되지 않았습니다."); } - $this->addViewDatas('entity', $this->service->modify($uid, $history)); + $this->addViewDatas('entity', $this->service->modify($uid, ['history' => $history])); return $this->action_redirect_process('info', static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()} 비고설정이 완료되었습니다."); } catch (\Throwable $e) { return $this->action_redirect_process('error', static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()} 비고설정 오류:" . $e->getMessage()); diff --git a/app/Controllers/Admin/Customer/ServiceController.php b/app/Controllers/Admin/Customer/ServiceController.php index 3edd9b7..abcb84c 100644 --- a/app/Controllers/Admin/Customer/ServiceController.php +++ b/app/Controllers/Admin/Customer/ServiceController.php @@ -43,6 +43,7 @@ class ServiceController extends CustomerController parent::index_process($action); } + //비고사항 변경 public function history(int $uid): RedirectResponse|string { try { @@ -50,12 +51,14 @@ class ServiceController extends CustomerController if (!$history) { throw new RuntimeException(static::class . '->' . __FUNCTION__ . "에서 오류발생: 비고가 정의되지 않았습니다."); } - $this->addViewDatas('entity', parent::modify_process($uid, $this->request->getPost())); + $this->addViewDatas('entity', $this->service->modify($uid, ['history' => $history])); return $this->action_redirect_process('info', static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()} 비고설정이 완료되었습니다."); } catch (\Throwable $e) { return $this->action_redirect_process('error', static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()} 비고설정 오류:" . $e->getMessage()); } } + + //결제일 변경 public function billingat(int $uid): RedirectResponse|string { try { @@ -63,14 +66,14 @@ class ServiceController extends CustomerController if (!$billing_at) { throw new RuntimeException(static::class . '->' . __FUNCTION__ . "에서 오류발생: 결제일이 정의되지 않았습니다."); } - $this->addViewDatas('entity', parent::modify_process($uid, $this->request->getPost())); + $this->addViewDatas('entity', $this->service->modify($uid, ['billing_at' => $billing_at])); return $this->action_redirect_process('info', static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()} 결제일 변경이 완료되었습니다."); } catch (\Throwable $e) { return $this->action_redirect_process('error', static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()} 결제일 변경 오류:" . $e->getMessage()); } } - //대체서버 추가 + //대체서버 생성폼 public function alternative_create_form(int $uid): string|RedirectResponse { try { @@ -80,6 +83,7 @@ class ServiceController extends CustomerController return $this->action_redirect_process('error', static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()} 대체서버 추가폼 오류:" . $e->getMessage()); } } + //대체서버 생성 public function alternative_create(int $uid): string|RedirectResponse { try { @@ -123,6 +127,8 @@ class ServiceController extends CustomerController return $this->action_redirect_process('error', static::class . '->' . __FUNCTION__ . "에서 {$this->getTitle()} 메인서버 설정 오류:" . $e->getMessage()); } } + + //대체서버 해지 public function alternative_delete(int $uid): string|RedirectResponse { try { diff --git a/app/Controllers/Admin/Equipment/CHASSISController.php b/app/Controllers/Admin/Equipment/CHASSISController.php index 6a7e39c..adbcd39 100644 --- a/app/Controllers/Admin/Equipment/CHASSISController.php +++ b/app/Controllers/Admin/Equipment/CHASSISController.php @@ -2,7 +2,6 @@ namespace App\Controllers\Admin\Equipment; -use App\Entities\Equipment\CHASSISEntity; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; use Psr\Log\LoggerInterface; diff --git a/app/Forms/CommonForm.php b/app/Forms/CommonForm.php index 895c03c..b1a1421 100644 --- a/app/Forms/CommonForm.php +++ b/app/Forms/CommonForm.php @@ -2,11 +2,11 @@ namespace App\Forms; -use App\Entities\CommonEntity; use RuntimeException; abstract class CommonForm { + private $_validation = null; private array $_attributes = []; private array $_formFields = []; private array $_formRules = []; @@ -16,7 +16,10 @@ abstract class CommonForm private array $_formOptions = []; private array $_actionButtons = ['view' => ICONS['SEARCH'], 'delete' => ICONS['DELETE']]; private array $_batchjobButtons = ['batchjob' => '일괄처리', 'batchjob_delete' => '일괄삭제']; - protected function __construct() {} + protected function __construct() + { + $this->_validation = service('validation'); + } final public function setAttributes(array $attributes): void { $this->_attributes = $attributes; @@ -113,21 +116,11 @@ abstract class CommonForm return $this->_batchjobButtons; } //Validation용 - // final public function validate(array $formDatas): bool - // { - // $validation = service('validation'); - // $dynamicRules = []; - // foreach ($this->getFormRules() as $field => $rule) { - // //field별 추가 커스텀 룰 적용 - // list($field, $rule) = $this->getValidationRule($field, $rule); - // $dynamicRules[$field] = ['rules' => $rule, 'label' => $this->getFormFields()[$field]]; - // } - // $validation->setRules($dynamicRules); - // return $validation->run($formDatas); - // } final public function validate(array $formDatas): bool { - $validation = service('validation'); + if ($this->_validation === null) { + $this->_validation = service('validation'); + } $dynamicRules = []; $dynamicLabels = []; // 레이블 배열 추가 if (!count($this->getFormRules())) { @@ -142,12 +135,12 @@ abstract class CommonForm log_message('debug', 'Rules: ' . var_export($dynamicRules, true)); log_message('debug', 'Data: ' . var_export($formDatas, true)); // setRules의 세 번째 인자로 레이블 전달 - $validation->setRules($dynamicRules, [], $dynamicLabels); + $this->_validation->setRules($dynamicRules, [], $dynamicLabels); // run()에는 데이터만 전달 (setRules에서 이미 설정됨) - $result = $validation->run($formDatas); + $result = $this->_validation->run($formDatas); if ($result === false) { - $message = __METHOD__ . "에서 데이터 검증 오류발생: " . var_export($validation->getErrors(), true); + $message = __METHOD__ . "에서 데이터 검증 오류발생: " . var_export($this->_validation->getErrors(), true); log_message('debug', $message); throw new RuntimeException($message); } else { diff --git a/app/Services/Customer/ServiceService.php b/app/Services/Customer/ServiceService.php index 31a0797..4d2ab02 100644 --- a/app/Services/Customer/ServiceService.php +++ b/app/Services/Customer/ServiceService.php @@ -3,10 +3,7 @@ namespace App\Services\Customer; use App\DTOs\Customer\ServiceDTO; -use App\Entities\CommonEntity; use App\Entities\Customer\ServiceEntity; -use App\Entities\Equipment\ServerEntity; -use App\Entities\PaymentEntity; use App\Forms\Customer\ServiceForm; use App\Helpers\Customer\ServiceHelper; use App\Models\Customer\ServiceModel; @@ -176,22 +173,27 @@ class ServiceService extends CustomerService return $date->format('Y-m-d'); } // 서비스금액관련처리 - private function updateAmount(ServiceEntity $entity): ServiceEntity + private function saveAmount(ServiceEntity $entity): ServiceEntity { //총 서비스금액 구하기 $server_amount = service('equipment_serverservice')->getCalculatedAmount($entity->getServerInfoUID()); //기본:서버금액(서버비+서버파트(월비용))+상면비+회선비-할인액 - $caculatedAmount = (int)$server_amount + $entity->getRack() + $entity->getLine() - $entity->getSale(); - //총 서비스금액 설정 - return parent::modify_process($entity, ['amount' => $caculatedAmount]); + $entity->amount = (int)$server_amount + $entity->getRack() + $entity->getLine() - $entity->getSale(); + //총 서비스금액 설정 및 저장 + if (!$this->model->save($entity)) { + // 저장 실패 시 예외 처리 + $errors = $this->model->errors(); + throw new RuntimeException("금액 업데이트 중 DB 저장 오류: " . implode(', ', $errors)); + } + return $entity; } - final public function updateAmountByPK(int $uid): ServiceEntity + final public function saveAmountByPK(int $uid): ServiceEntity { $entity = $this->getEntity($uid); if (!$entity instanceof ServiceEntity) { throw new RuntimeException(static::class . '->' . __FUNCTION__ . "에서 오류발생:Return Type은 ServiceEntity만 가능"); } - return $this->updateAmount($entity); + return $this->saveAmount($entity); } //기본 기능부분 protected function getEntity_process(mixed $entity): ServiceEntity @@ -200,10 +202,6 @@ class ServiceService extends CustomerService } protected function create_process(array $formDatas): ServiceEntity { - //필수항목검사 - if (!array_key_exists('serverinfo_uid', $formDatas)) { - throw new RuntimeException(__METHOD__ . '에서 오류발생: 서버정보가 정의되지 않았습니다.'); - } //서비스코드생성 $formDatas['code'] = $formDatas['site'] . "_s" . uniqid(); //서비스 생성 @@ -214,17 +212,13 @@ class ServiceService extends CustomerService //서버정보 연결 service('equipment_serverservice')->attachToService($entity, $entity->getServerInfoUID()); //서비스비용 설정 - $entity = $this->updateAmount($entity); + $entity = $this->saveAmount($entity); //결제정보 생성 service('paymentservice')->createByService($entity); return $entity; } protected function modify_process($entity, array $formDatas): ServiceEntity { - //필수항목검사 - if (!array_key_exists('serverinfo_uid', $formDatas)) { - throw new RuntimeException(__METHOD__ . '에서 오류발생: 서버정보가 정의되지 않았습니다.'); - } //변경전 정보 $oldEntity = clone $entity; //서비스 수정 @@ -237,7 +231,7 @@ class ServiceService extends CustomerService service('equipment_serverservice')->attachToService($entity, $entity->getServerInfoUID()); } //서비스비용 설정 - $entity = $this->updateAmount($entity); + $entity = $this->saveAmount($entity); //결제정보 생성 service('paymentservice')->modifyByService($entity); return $entity; diff --git a/app/Services/Equipment/ServerPartService.php b/app/Services/Equipment/ServerPartService.php index c0dc6f4..e8715a7 100644 --- a/app/Services/Equipment/ServerPartService.php +++ b/app/Services/Equipment/ServerPartService.php @@ -135,7 +135,7 @@ class ServerPartService extends EquipmentService if ($entity->getServiceInfoUID() !== null) { //Billing형식이 Month이면 서비스 금액설정 호출 if ($entity->getBilling() == PAYMENT['BILLING']['MONTH']) { - service('customer_serviceservice')->updateAmountByPK($entity->getServiceInfoUID()); + service('customer_serviceservice')->saveAmountByPK($entity->getServiceInfoUID()); } //Billing형식이 Onetime이면 일회성결제 추가 if ($entity->getBilling() == PAYMENT['BILLING']['ONETIME']) { @@ -159,7 +159,7 @@ class ServerPartService extends EquipmentService if ($entity->getServiceInfoUID() !== null) { //월비용 서버파트 인경우 서비스 금액 재설정 if ($entity->getBilling() == PAYMENT['BILLING']['MONTH']) { - service('customer_serviceservice')->updateAmountByPK($entity->getServiceInfoUID()); + service('customer_serviceservice')->saveAmountByPK($entity->getServiceInfoUID()); } //Billing형식이 Onetime이면 일회성결제 수정 (필요없는듯 하여 주석처리) // if ($entity->getBilling() == PAYMENT['BILLING']['ONETIME']) { @@ -176,7 +176,7 @@ class ServerPartService extends EquipmentService if ($entity->getServiceInfoUID() !== null) { //월비용 서버파트 인경우 서비스 금액 재설정 if ($entity->getBilling() == PAYMENT['BILLING']['MONTH']) { - service('customer_serviceservice')->updateAmountByPK($entity->getServiceInfoUID()); + service('customer_serviceservice')->saveAmountByPK($entity->getServiceInfoUID()); } //Billing형식이 Onetime이면 일회성결제 수정 (필요없는듯 하여 주석처리) // if ($entity->getBilling() == PAYMENT['BILLING']['ONETIME']) { diff --git a/app/Services/Equipment/ServerService.php b/app/Services/Equipment/ServerService.php index 2624de1..26a9aaf 100644 --- a/app/Services/Equipment/ServerService.php +++ b/app/Services/Equipment/ServerService.php @@ -249,7 +249,7 @@ class ServerService extends EquipmentService service('equipment_chassisservice')->attachToServer($entity); } if ($entity->getServiceInfoUID() !== null) { //서비스가 정의 되어 있으면 - service('customer_serviceservice')->updateAmountByPK($entity->getServiceInfoUID()); + service('customer_serviceservice')->saveAmountByPK($entity->getServiceInfoUID()); } return $entity; } diff --git a/app/Services/MylogService.php b/app/Services/MylogService.php index ecb6fba..0c22db1 100644 --- a/app/Services/MylogService.php +++ b/app/Services/MylogService.php @@ -98,9 +98,12 @@ class MylogService extends CommonService implements PipelineStepInterface $message = "[{$context->action}_{$status}] Steps Executed: " . count($context->pipelineDatas); } log_message('debug', $message); - $formDatas = []; - $formDatas['user'] = $context->auth->getUID(); - $this->create(new MylogDTO()); + $this->create([ + 'title' => "{$context->action} 작업 {$status} 로그", + 'content' => $message, + 'status' => $status, + 'user_uid' => $context->auth->getUID(), + ]); } // PipelineStep 구현은 이 예시에서는 사용하지 않습니다. (로그는 Executor가 감쌈) diff --git a/app/Views/layouts/admin/top.php b/app/Views/layouts/admin/top.php index 237710f..6fc3a36 100644 --- a/app/Views/layouts/admin/top.php +++ b/app/Views/layouts/admin/top.php @@ -138,8 +138,8 @@ } loadNotices(); // 최초 로드 loadrequesttasks(); // 최초 로드 - setInterval(loadNotices, 10000); // 10초마다 갱신 - setInterval(loadrequesttasks, 10000); // 10초마다 갱신 + setInterval(loadNotices, 60000); // 60초마다 갱신 + setInterval(loadrequesttasks, 60000); // 60초마다 갱신 }); \ No newline at end of file diff --git a/public/js/admin/service.js b/public/js/admin/service.js index a461ffe..2f53c3d 100644 --- a/public/js/admin/service.js +++ b/public/js/admin/service.js @@ -12,23 +12,23 @@ function getTotalPrice() { } // 공통 업데이트 함수 -function updateAmount() { +function setAmount() { if (amountInput) { amountInput.value = getTotalPrice(); } } // 이벤트 리스너 등록 -if (rackSelect) rackSelect.addEventListener("change", updateAmount); -if (lineSelect) lineSelect.addEventListener("change", updateAmount); +if (rackSelect) rackSelect.addEventListener("change", setAmount); +if (lineSelect) lineSelect.addEventListener("change", setAmount); // ✅ select2는 전용 이벤트 사용 if (serverSelect) { $(serverSelect).on("select2:select", function () { - updateAmount(); + setAmount(); if (titleInput) { titleInput.value = serverSelect?.options[serverSelect.selectedIndex]?.text || ""; } }); } //페이지 로드 시 초기 실행 -document.addEventListener("DOMContentLoaded", updateAmount); \ No newline at end of file +document.addEventListener("DOMContentLoaded", setAmount); \ No newline at end of file