diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 703a50c..f314327 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -132,6 +132,19 @@ $routes->group('admin', ['namespace' => 'App\Controllers\Admin', 'filter' => 'au $routes->post('batchjob_delete', 'ServiceHistoryController::batchjob_delete'); $routes->get('download/(:alpha)', 'ServiceHistoryController::download/$1'); }); + $routes->group('payment', ['namespace' => 'App\Controllers\Admin\Customer'], function ($routes) { + $routes->get('/', 'ServicePaymentController::index', []); + $routes->get('create', 'ServicePaymentController::create_form'); + $routes->post('create', 'ServicePaymentController::create'); + $routes->get('modify/(:num)', 'ServicePaymentController::modify_form/$1'); + $routes->post('modify/(:num)', 'ServicePaymentController::modify/$1'); + $routes->get('view/(:num)', 'ServicePaymentController::view/$1'); + $routes->get('delete/(:num)', 'ServicePaymentController::delete/$1'); + $routes->get('toggle/(:num)/(:any)', 'ServicePaymentController::toggle/$1/$2'); + $routes->post('batchjob', 'ServicePaymentController::batchjob'); + $routes->post('batchjob_delete', 'ServicePaymentController::batchjob_delete'); + $routes->get('download/(:alpha)', 'ServicePaymentController::download/$1'); + }); }); $routes->group('equipment', ['namespace' => 'App\Controllers\Admin\Equipment'], function ($routes) { $routes->group('code', ['namespace' => 'App\Controllers\Admin\Equipment'], function ($routes) { diff --git a/app/Controllers/Admin/Customer/AccountController.php b/app/Controllers/Admin/Customer/AccountController.php index ab83002..564f8ef 100644 --- a/app/Controllers/Admin/Customer/AccountController.php +++ b/app/Controllers/Admin/Customer/AccountController.php @@ -2,16 +2,13 @@ namespace App\Controllers\Admin\Customer; -use App\Entities\Customer\AccountEntity; -use App\Entities\Customer\ClientEntity; -use App\Helpers\Customer\AccountHelper; -use App\Services\Customer\AccountService; - -use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; use Psr\Log\LoggerInterface; +use App\Helpers\Customer\AccountHelper; +use App\Services\Customer\AccountService; + class AccountController extends CustomerController { public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) @@ -38,26 +35,4 @@ class AccountController extends CustomerController return $this->_helper; } //Index,FieldForm관련. - private function setAccountBalance(array $formDatas): ClientEntity - { - //account_balance 체크 - $entity = $this->getClientService()->getEntity($formDatas['clientinfo_uid']); - if (!$entity) { - throw new \Exception("{$formDatas['clientinfo_uid']}에 대한 고객정보를 찾을수 없습니다."); - } - $amount = intval($formDatas['amount']); - if ($formDatas['status'] === DEFAULTS['STATUS']) { //입금, 쿠폰추가 - $entity = $this->getClientService()->deposit($entity, 'account_balance', $amount); - } else { // 출금, 쿠폰사용 - $entity = $this->getClientService()->withdrawal($entity, 'account_balance', $amount); - } - return $entity; - } - protected function create_process(array $formDatas): AccountEntity - { - $entity = parent::create_process($formDatas); - //고객예치금처리 - $this->setAccountBalance($formDatas); - return $entity; - } } diff --git a/app/Controllers/Admin/Customer/CouponController.php b/app/Controllers/Admin/Customer/CouponController.php index 4df6c78..b7f082f 100644 --- a/app/Controllers/Admin/Customer/CouponController.php +++ b/app/Controllers/Admin/Customer/CouponController.php @@ -2,16 +2,13 @@ namespace App\Controllers\Admin\Customer; -use App\Entities\Customer\ClientEntity; -use App\Entities\Customer\CouponEntity; -use App\Helpers\Customer\CouponHelper; - -use App\Services\Customer\CouponService; -use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; use Psr\Log\LoggerInterface; +use App\Helpers\Customer\CouponHelper; +use App\Services\Customer\CouponService; + class CouponController extends CustomerController { public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) @@ -38,26 +35,4 @@ class CouponController extends CustomerController return $this->_helper; } //Index,FieldForm관련. - private function setCouponBalance(array $formDatas): ClientEntity - { - //coupon_balance 체크 - $entity = $this->getClientService()->getEntity($formDatas['clientinfo_uid']); - if (!$entity) { - throw new \Exception("{$formDatas['clientinfo_uid']}에 대한 고객정보를 찾을수 없습니다."); - } - $amount = intval($formDatas['amount']); - if ($formDatas['status'] === DEFAULTS['STATUS']) { //입금, 쿠폰추가 - $entity = $this->getClientService()->deposit($entity, 'coupon_balance', $amount); - } else { // 출금, 쿠폰사용 - $entity = $this->getClientService()->withdrawal($entity, 'coupon_balance', $amount); - } - return $entity; - } - protected function create_process(array $formDatas): CouponEntity - { - $entity = parent::create_process($formDatas); - //고객쿠폰처리 - $this->setCouponBalance($formDatas); - return $entity; - } } diff --git a/app/Controllers/Admin/Customer/CustomerController.php b/app/Controllers/Admin/Customer/CustomerController.php index 6de07ff..3e5d294 100644 --- a/app/Controllers/Admin/Customer/CustomerController.php +++ b/app/Controllers/Admin/Customer/CustomerController.php @@ -8,20 +8,10 @@ use CodeIgniter\HTTP\ResponseInterface; use Psr\Log\LoggerInterface; use App\Services\Customer\ClientService; -use App\Services\Equipment\Part\CpuService; -use App\Services\Equipment\Part\DefenceService; -use App\Services\Equipment\Part\StorageService; -use App\Services\Equipment\Part\IpService; -use App\Services\Equipment\Part\LineService; -use App\Services\Equipment\Part\RamService; -use App\Services\Equipment\Part\SoftwareService; -use App\Services\Equipment\ServerService; -use App\Services\Equipment\DomainService; abstract class CustomerController extends AdminController { private ?ClientService $_clientService = null; - private $_equipmentService = []; public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) { parent::initController($request, $response, $logger); @@ -49,42 +39,4 @@ abstract class CustomerController extends AdminController return $options; } //Index,FieldForm관련 - //ServiceItemController,ServiceController에서 사용 - final public function getEquipmentService(string $key): mixed - { - if (!array_key_exists($key, $this->_equipmentService)) { - switch ($key) { - case 'SERVER': - $this->_equipmentService[$key] = new ServerService(); - break; - case 'CPU': - $this->_equipmentService[$key] = new CpuService(); - break; - case 'RAM': - $this->_equipmentService[$key] = new RamService(); - break; - case 'STORAGE': - $this->_equipmentService[$key] = new StorageService(); - break; - case 'LINE': - $this->_equipmentService[$key] = new LineService(); - break; - case 'IP': - $this->_equipmentService[$key] = new IpService(); - break; - case 'DEFENCE': - $this->_equipmentService[$key] = new DefenceService(); - break; - case 'SOFTWARE': - $this->_equipmentService[$key] = new SoftwareService(); - break; - case 'DOMAIN': - $this->_equipmentService[$key] = new DomainService(); - break; - default: - throw new \Exception(__FUNCTION__ . "에서 사용하지않는 Service를 요청하였습니다.: {$key}"); - } - } - return $this->_equipmentService[$key]; - } } diff --git a/app/Controllers/Admin/Customer/PointController.php b/app/Controllers/Admin/Customer/PointController.php index 6ef6ab2..bfeff37 100644 --- a/app/Controllers/Admin/Customer/PointController.php +++ b/app/Controllers/Admin/Customer/PointController.php @@ -2,16 +2,13 @@ namespace App\Controllers\Admin\Customer; -use App\Entities\Customer\ClientEntity; -use App\Entities\Customer\PointEntity; -use App\Helpers\Customer\PointHelper; - -use App\Services\Customer\PointService; -use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; use Psr\Log\LoggerInterface; +use App\Helpers\Customer\PointHelper; +use App\Services\Customer\PointService; + class PointController extends CustomerController { public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) @@ -38,27 +35,4 @@ class PointController extends CustomerController return $this->_helper; } //Index,FieldForm관련. - - private function setPointBalance(array $formDatas): ClientEntity - { - //point_balance 체크 - $entity = $this->getClientService()->getEntity($formDatas['clientinfo_uid']); - if (!$entity) { - throw new \Exception("{$formDatas['clientinfo_uid']}에 대한 고객정보를 찾을수 없습니다."); - } - $amount = intval($formDatas['amount']); - if ($formDatas['status'] === DEFAULTS['STATUS']) { //입금, 쿠폰추가 - $entity = $this->getClientService()->deposit($entity, 'point_balance', $amount); - } else { // 출금, 쿠폰사용 - $entity = $this->getClientService()->withdrawal($entity, 'point_balance', $amount); - } - return $entity; - } - protected function create_process(array $formDatas): PointEntity - { - $entity = parent::create_process($formDatas); - //고객포인트처리 - $this->setPointBalance($formDatas); - return $entity; - } } diff --git a/app/Controllers/Admin/Customer/ServiceController.php b/app/Controllers/Admin/Customer/ServiceController.php index 535edc9..a3656fb 100644 --- a/app/Controllers/Admin/Customer/ServiceController.php +++ b/app/Controllers/Admin/Customer/ServiceController.php @@ -2,17 +2,17 @@ namespace App\Controllers\Admin\Customer; -use App\Entities\Equipment\CodeEntity; -use App\Helpers\Customer\ServiceHelper; -use App\Services\Customer\ServiceItemService; -use App\Services\Customer\ServiceService; - -use App\Services\Equipment\CodeService; use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; use Psr\Log\LoggerInterface; +use App\Helpers\Customer\ServiceHelper; +use App\Services\Customer\ServiceService; +use App\Services\Customer\ServiceItemService; +use App\Entities\Equipment\CodeEntity; +use App\Services\Equipment\CodeService; + class ServiceController extends CustomerController { private ?ServiceItemService $_serviceItemService = null; @@ -82,7 +82,7 @@ class ServiceController extends CustomerController case 'DEFENCE': case 'SOFTWARE': case 'DOMAIN': - foreach ($this->getEquipmentService($field)->getEntities() as $entity) { + foreach ($this->getService()->getEquipmentService($field)->getEntities() as $entity) { $options[$entity->getPK()] = $entity->getTitle(); } break; @@ -105,29 +105,6 @@ class ServiceController extends CustomerController return $result; } //Index,FieldForm관련 - protected function create_process(array $formDatas): mixed - { - //code의 경우 서비스중으로 설정작업 - $this->getCodeService()->setStatus($formDatas['code'], CodeEntity::STATUS_OCCUPIED); - return parent::create_process($formDatas); - } - protected function modify_process(mixed $entity, array $formDatas): mixed - { - //code가 기존과 다를경우 //toggle,batchjob의 경우 $formDatas에 code가 없을수도 있음 - if (array_key_exists('code', $formDatas) && $formDatas['code'] !== $entity->getCode()) { - //code의 경우 기존code는 사용가능으로 설정작업 - $this->getCodeService()->setStatus($entity->getCode(), CodeEntity::STATUS_AVAILABLE); - //coded의 경우 변경된 code는 서비스중으로 설정작업 - $this->getCodeService()->setStatus($formDatas['code'], CodeEntity::STATUS_OCCUPIED); - } - return parent::modify_process($entity, $formDatas); - } - protected function delete_process(mixed $entity): mixed - { - //code의 경우 기존code는 사용가능으로 설정작업 - $this->getCodeService()->setStatus($entity->getCode(), CodeEntity::STATUS_AVAILABLE); - return parent::delete_process($entity); - } protected function index_process(): array { //추가 Field작업 처리 diff --git a/app/Controllers/Admin/Customer/ServiceHistoryController.php b/app/Controllers/Admin/Customer/ServiceHistoryController.php index 3baa999..23a24cf 100644 --- a/app/Controllers/Admin/Customer/ServiceHistoryController.php +++ b/app/Controllers/Admin/Customer/ServiceHistoryController.php @@ -14,7 +14,6 @@ use App\Services\Customer\ServiceService; class ServiceHistoryController extends CustomerController { private ?ServiceService $_serviceService = null; - private $_equipmentService = []; public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) { parent::initController($request, $response, $logger); diff --git a/app/Controllers/Admin/Customer/ServiceItemController.php b/app/Controllers/Admin/Customer/ServiceItemController.php index 10204e2..3ba7185 100644 --- a/app/Controllers/Admin/Customer/ServiceItemController.php +++ b/app/Controllers/Admin/Customer/ServiceItemController.php @@ -14,7 +14,6 @@ use App\Services\Customer\ServiceService; class ServiceItemController extends CustomerController { private ?ServiceService $_serviceService = null; - private $_equipmentService = []; public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) { parent::initController($request, $response, $logger); @@ -60,7 +59,7 @@ class ServiceItemController extends CustomerController throw new \Exception(__FUNCTION__ . "에서 item_type이 지정되지 않았습니다."); } //$item_type(CPU,RAM,STORAGE등)에 따라 선언된 getFormFieldOption사용 됨 - foreach ($this->getEquipmentService($item_type)->getEntities() as $entity) { + foreach ($this->getService()->getEquipmentService($item_type)->getEntities() as $entity) { $options[$entity->getPK()] = $entity->getTitle(); } break; @@ -82,22 +81,28 @@ class ServiceItemController extends CustomerController } return $result; } - //Index,FieldForm관련 - protected function create_process(array $formDatas): mixed + + //도메인의 경우 domaininfo에 등록 후 ServiceItemEntity의 item_uid에 넣고 create해야함 + private function createDomain(array $formDatas): array { - //도메인의 경우 domaininfo에 등록 후 ServiceItemEntity의 item_uid에 넣고 create해야함 + $serviceEntity = $this->getServiceService()->getEntity($formDatas['serviceinfo_uid']); + if (!$serviceEntity) { + throw new \Exception("{$formDatas['serviceinfo_uid']}에 대한 서비스정보를 찾을수 없습니다."); + } + $equipmentEntity = $this->getService()->getEquipmentService($formDatas['item_type'])->create([ + 'clientinfo_uid' => $serviceEntity->getClientUID(), + 'domain' => $formDatas['item_uid'] + ]); + //도메인용 항목의 item_uid로 전달함 + $formDatas['item_uid'] = $equipmentEntity->getPK(); + return $formDatas; + } + protected function create_process(array $formDatas): RedirectResponse|string + { + // item_type이 도메인의 경우 domaininfo에 등록 후 ServiceItemEntity의 item_uid에 넣고 create해야함 if ($formDatas['item_type'] === 'DOMAIN') { - $serviceEntity = $this->getServiceService()->getEntity($formDatas['serviceinfo_uid']); - if (!$serviceEntity) { - throw new \Exception("{$formDatas['serviceinfo_uid']}에 대한 서비스정보를 찾을수 없습니다."); - } - $equipmentEntity = $this->getEquipmentService($formDatas['item_type'])->create([ - 'clientinfo_uid' => $serviceEntity->getClientUID(), - 'domain' => $formDatas['item_uid'] - ]); - //도메인용 항목의 item_uid로 전달함 - $formDatas['item_uid'] = $equipmentEntity->getPK(); + $formDatas = $this->createDomain($formDatas); } return parent::create_process($formDatas); } diff --git a/app/Controllers/Admin/Customer/ServicePaymentController.php b/app/Controllers/Admin/Customer/ServicePaymentController.php new file mode 100644 index 0000000..c6130b5 --- /dev/null +++ b/app/Controllers/Admin/Customer/ServicePaymentController.php @@ -0,0 +1,73 @@ +content_title = lang("{$this->getService()->getClassName()}.title"); + $this->class_path .= $this->getService()->getClassName(); + $this->uri_path .= strtolower($this->getService()->getClassName('/')) . '/'; + // $this->view_path .= strtolower($this->getService()->getClassName()) . DIRECTORY_SEPARATOR; + + } + + public function getService(): ServicePaymentService + { + if (!$this->_service) { + $this->_service = new ServicePaymentService($this->request); + } + return $this->_service; + } + public function getHelper(): ServicePaymentHelper + { + if (!$this->_helper) { + $this->_helper = new ServicePaymentHelper($this->request); + } + return $this->_helper; + } + public function getServiceService(): ServiceService + { + if (!$this->_serviceService) { + $this->_serviceService = new ServiceService($this->request); + } + return $this->_serviceService; + } + protected function getFormFieldOption(string $field, array $options = []): array + { + switch ($field) { + case 'serviceinfo_uid': + foreach ($this->getServiceService()->getEntities() as $entity) { + $options[$entity->getPK()] = $entity->getTitle(); + } + break; + case 'item_uid': + //$item_type(CPU,RAM,STORAGE등)에 따라 선언된 getFormFieldOption사용 됨 + $item_types = ['LINE', 'IP', 'SERVER', 'CPU', 'RAM', 'STORAGE', 'SOFTWARE', 'DEFENCE', 'DOMAIN']; + foreach ($item_types as $item_type) { + $options[$item_type] = []; + foreach ($this->getService()->getEquipmentService($item_type)->getEntities() as $entity) { + $options[$item_type][$entity->getPK()] = $entity->getTitle(); + } + } + break; + default: + $options = parent::getFormFieldOption($field, $options); + break; + } + return $options; + } + //Index,FieldForm관련 +} diff --git a/app/Controllers/CommonController.php b/app/Controllers/CommonController.php index 8197356..17b3534 100644 --- a/app/Controllers/CommonController.php +++ b/app/Controllers/CommonController.php @@ -360,11 +360,6 @@ abstract class CommonController extends BaseController //Transaction Start $this->getService()->getModel()->transStart(); try { - //기존 Entity 가져오기 - $entity = $this->getService()->getEntity($uid); - if (!$entity) { - throw new \Exception("{$uid}에 대한 정보를 찾을수 없습니다."); - } //각 Field 초기화 $this->initAction(__FUNCTION__); //FieldRule정의 @@ -376,7 +371,11 @@ abstract class CommonController extends BaseController foreach ($this->getFormFields() as $field) { $formDatas[$field] = $this->request->getPost($field); } - // dd($formDatas); + //기존 Entity 가져오기 + $entity = $this->getService()->getEntity($uid); + if (!$entity) { + throw new \Exception("{$uid}에 대한 정보를 찾을수 없습니다."); + } $this->entity = $this->modify_process($entity, $formDatas); $this->getService()->getModel()->transCommit(); return $this->getResultSuccess(); @@ -396,20 +395,18 @@ abstract class CommonController extends BaseController //Transaction Start $this->getService()->getModel()->transStart(); try { + //각 Field 초기화:조건항목 Field는 한개만 존재하므로 Field와 Rule을 재정의 필요 + $this->setAction(__FUNCTION__); + //Field와 Rule을 재정의 + $this->setFormFields([$field]); + $this->setFieldRule($field, $this->getFormFieldRule($this->getAction(), $field)); + //입력값정의 + $formDatas = [$field => $this->request->getVar($field)]; //기존 Entity 가져오기 $entity = $this->getService()->getEntity($uid); if (!$entity) { throw new \Exception("{$uid}에 대한 정보를 찾을수 없습니다."); } - //각 Field 초기화:Field는 한개만 존재하므로 Field와 Rule을 재정의 - $this->setAction(__FUNCTION__); - //FormField정의 - $this->setFormFields([$field]); - //FieldRule정의 - $this->setFieldRule($field, $this->getFormFieldRule($this->getAction(), $field)); - //입력값정의 - $formDatas = [$field => $this->request->getVar($field)]; - // dd($formDatas); $this->entity = $this->toggle_process($entity, $formDatas); $this->getService()->getModel()->transCommit(); return $this->getResultSuccess(); @@ -429,33 +426,31 @@ abstract class CommonController extends BaseController //Transaction Start $this->getService()->getModel()->transStart(); try { - //변경할 FormField 정의 - $fields = []; + //각 Field 초기화: 일괄작업은 선택된 조건항목 Field만 존재하므로 Field와 Rule을 재정의 필요 + $this->setAction(__FUNCTION__); + $selectedFields = []; $formDatas = []; - foreach ($this->getBatchjobFields() as $field) { - $value = $this->request->getVar($field); + foreach ($this->getService()->getBatchJobFields() as $field) { + //입력한 Field,값정의 + $value = $this->request->getPost($field); if ($value) { - $fields[] = $field; - //입력값정의 - $formDatas[$field] = $this->request->getVar($field); + $selectedFields[] = $field; + $formDatas[$field] = $value; } } - if (!count($fields)) { - throw new \Exception("변경할 정보를 선택하셔야합니다."); + if (!count($selectedFields)) { + throw new \Exception("변경할 조건항목을 선택하셔야합니다."); } - //변경할 UIDS 정의 - $uids = $this->request->getVar('batchjob_uids[]'); - if (!is_array($uids) || !count($uids)) { - throw new \Exception("적용할 리스트를 선택하셔야합니다."); - } - //각 Field 초기화:Bachjob의 데이터가 있는경우 Field만 처리하기위해 Field와 Rule을 재정의 - $this->setAction(__FUNCTION__); - //FormField정의 - $this->setFormFields($fields); - //FieldRule정의 + //선택된 Fields와 Rules을 재정의 + $this->setFormFields([$field]); foreach ($this->getFormFields() as $field) { $this->setFieldRule($field, $this->getFormFieldRule($this->getAction(), $field)); } + //변경할 UIDS 정의 + $uids = $this->request->getPost('batchjob_uids[]'); + if (!is_array($uids) || !count($uids)) { + throw new \Exception("적용할 리스트을 선택하셔야합니다."); + } $entities = []; foreach ($uids as $uid) { //기존 Entity 가져오기 @@ -466,6 +461,7 @@ abstract class CommonController extends BaseController $entities[] = $this->batchjob_process($entity, $formDatas); } } + $this->entities = $entities; $this->getService()->getModel()->transCommit(); LogCollector::debug(sprintf("%s에서 총 %s개중 %s개 일괄작업을 완료하였습니다.", __METHOD__, count($uids), count($entities))); @@ -517,7 +513,7 @@ abstract class CommonController extends BaseController $this->getService()->getModel()->transStart(); try { //변경할 UIDS - $uids = $this->request->getVar('batchjob_uids[]'); + $uids = $this->request->getPost('batchjob_uids[]'); if (!is_array($uids) || !count($uids)) { throw new \Exception("적용할 리스트를 선택하셔야합니다."); } diff --git a/app/Database/erp2_2.vuerd.json b/app/Database/erp2_2.vuerd.json index f7a9323..67a23cc 100644 --- a/app/Database/erp2_2.vuerd.json +++ b/app/Database/erp2_2.vuerd.json @@ -4,9 +4,9 @@ "settings": { "width": 3000, "height": 3000, - "scrollTop": -988.0309, - "scrollLeft": -1051.8446, - "zoomLevel": 0.76, + "scrollTop": -961.8844, + "scrollLeft": -401.9322, + "zoomLevel": 0.79, "show": 511, "database": 4, "databaseName": "", @@ -47,9 +47,7 @@ "dnFyz1CSdGeS6mCbfCMO0", "GRBrbb1hqwKSRMfod3I7U", "QCNA57Pi6A9dJDgybxS5v", - "8GMPyGUFlx2Mw7BwzizfD", "B8haiEbPc1lRBWTv1g25G", - "isiA_oaJNIm3F4nYJuLJ1", "0WXrjcyXXGeoAVM2VB8s2", "eLGlqJ4z_woGP6CLZEuUr", "JoMB-mb6p6NoHpiAvjD2y" @@ -61,15 +59,13 @@ "KtdVJCYZ3DMVnPnFGKi3P", "AH1dyESfueUlhcoiU6KsQ", "wX0DbZb_RcK85hWv9dxcX", - "w-QYHsd8nVKvDaBO9LDbp", - "19PCL5s4M6NxuV-ePUz50", - "6Gx9n7rUrSbXGbvE39xnm", "anhMCXytE7rcE_drKBPWz", "Wma86GpS3BhikEaHSamgX", "I80TuGxKm3tXIO_EO2PSm", "o8yw46vm30cC7wl9cRMdo", "ocWjncqwtYkP02mw4A0-8", - "6oBuPqT-ikPI7X8a05Trv" + "6oBuPqT-ikPI7X8a05Trv", + "Hj5AZkoYGvM_syvnqMeOi" ], "indexIds": [], "memoIds": [] @@ -336,15 +332,15 @@ "liJON6hIBB9aS-pQgM0Q6" ], "ui": { - "x": 938.42, - "y": 1458.0408, + "x": 941.0514, + "y": 1471.1988, "zIndex": 2, "widthName": 60, "widthComment": 60, "color": "" }, "meta": { - "updateAt": 1749008043378, + "updateAt": 1749612916799, "createAt": 1745819764138 } }, @@ -717,38 +713,45 @@ }, "QCNA57Pi6A9dJDgybxS5v": { "id": "QCNA57Pi6A9dJDgybxS5v", - "name": "invoiceinfo", - "comment": "청구서정보", + "name": "serviceinfo_payment", + "comment": "결제정보", "columnIds": [ "GMPyqxaroK2OjQZnoCRwn", - "2Re7GlIDs1MKhwQ1n_5Ty", - "RDhib2G4b-Yqi880m4yME", - "T8UART66GUy4LWDk0yUxl", + "ZWV8iXrgQovfYTm32QGbZ", + "xWCCXo-zVdNuL4E9AhjCN", + "4O3Qit9vqva-izvWHJLTD", + "N-ESuxOk84rEdS2SzpVcx", "FhnUrn_dOrdhaBe_P3ty-", + "T8UART66GUy4LWDk0yUxl", + "RDhib2G4b-Yqi880m4yME", "Mr5BhlD6XqcH6mwPZ0jIP", "YTvLb43yvXQGMq7T4fDUQ", "vN8DhuVpVf6RJ1T_soB6W" ], "seqColumnIds": [ "GMPyqxaroK2OjQZnoCRwn", + "ZWV8iXrgQovfYTm32QGbZ", "2Re7GlIDs1MKhwQ1n_5Ty", - "RDhib2G4b-Yqi880m4yME", - "T8UART66GUy4LWDk0yUxl", + "xWCCXo-zVdNuL4E9AhjCN", + "4O3Qit9vqva-izvWHJLTD", + "N-ESuxOk84rEdS2SzpVcx", "FhnUrn_dOrdhaBe_P3ty-", + "T8UART66GUy4LWDk0yUxl", + "RDhib2G4b-Yqi880m4yME", "Mr5BhlD6XqcH6mwPZ0jIP", "YTvLb43yvXQGMq7T4fDUQ", "vN8DhuVpVf6RJ1T_soB6W" ], "ui": { - "x": 918.841, - "y": 619.9814, + "x": 134.6305, + "y": 798.9288, "zIndex": 2278, - "widthName": 60, - "widthComment": 62, + "widthName": 110, + "widthComment": 60, "color": "" }, "meta": { - "updateAt": 1748510675618, + "updateAt": 1749616861214, "createAt": 1748484896313 } }, @@ -858,11 +861,9 @@ "columnIds": [ "YMx_XwTS1PatRlZtoxW8Z", "1tE_0qGYDjR3udy5-odYS", - "YVqb-AsjUrGwO2OfTLrOY", "CoJPWxyzPJBARBaOijyTz", "5cXK6q9-zhiD08pCjjXuW", "TVw0yqODUSPTpELO89_Dh", - "Y7aavM4QK2DOr1WfKnOXB", "mkLkPRKSqWPEBbwxKt2Cj" ], "seqColumnIds": [ @@ -874,19 +875,20 @@ "5cXK6q9-zhiD08pCjjXuW", "TVw0yqODUSPTpELO89_Dh", "N1z70y9IzSHgCozvR5hKZ", + "uhJTXyt09V-wQHSVkgzUL", "Y7aavM4QK2DOr1WfKnOXB", "mkLkPRKSqWPEBbwxKt2Cj" ], "ui": { - "x": 143.2625, - "y": 1029.6963, + "x": 556.4204, + "y": 607.3278, "zIndex": 2408, "widthName": 69, "widthComment": 60, "color": "" }, "meta": { - "updateAt": 1748831907917, + "updateAt": 1749616246431, "createAt": 1748505950663 } }, @@ -5268,20 +5270,20 @@ "T8UART66GUy4LWDk0yUxl": { "id": "T8UART66GUy4LWDk0yUxl", "tableId": "QCNA57Pi6A9dJDgybxS5v", - "name": "due_at", - "comment": "지급기한일", + "name": "billing_at", + "comment": "(청구)지급기한일", "dataType": "DATE", "default": "", "options": 0, "ui": { "keys": 0, "widthName": 60, - "widthComment": 62, + "widthComment": 93, "widthDataType": 60, "widthDefault": 60 }, "meta": { - "updateAt": 1748485419209, + "updateAt": 1749616540581, "createAt": 1748485346073 } }, @@ -5328,20 +5330,20 @@ "2Re7GlIDs1MKhwQ1n_5Ty": { "id": "2Re7GlIDs1MKhwQ1n_5Ty", "tableId": "QCNA57Pi6A9dJDgybxS5v", - "name": "clientinfo_uid", - "comment": "", + "name": "ownerinfo_uid", + "comment": "관리자정보", "dataType": "INT", "default": "", "options": 8, "ui": { - "keys": 2, - "widthName": 73, - "widthComment": 60, + "keys": 0, + "widthName": 77, + "widthComment": 62, "widthDataType": 60, "widthDefault": 60 }, "meta": { - "updateAt": 1748485367195, + "updateAt": 1749613292282, "createAt": 1748485358690 } }, @@ -5368,20 +5370,20 @@ "FhnUrn_dOrdhaBe_P3ty-": { "id": "FhnUrn_dOrdhaBe_P3ty-", "tableId": "QCNA57Pi6A9dJDgybxS5v", - "name": "total_amount", - "comment": "총금액", + "name": "amount", + "comment": "청구금액", "dataType": "INT", "default": "0", "options": 8, "ui": { "keys": 0, - "widthName": 72, + "widthName": 60, "widthComment": 60, "widthDataType": 60, "widthDefault": 60 }, "meta": { - "updateAt": 1748485472922, + "updateAt": 1749613774661, "createAt": 1748485472922 } }, @@ -5674,7 +5676,7 @@ "default": "", "options": 8, "ui": { - "keys": 2, + "keys": 0, "widthName": 81, "widthComment": 60, "widthDataType": 60, @@ -5974,7 +5976,7 @@ "default": "", "options": 8, "ui": { - "keys": 2, + "keys": 0, "widthName": 81, "widthComment": 60, "widthDataType": 60, @@ -6149,7 +6151,7 @@ "id": "5OcpSdnrgDxZ9eZ7_pQr9", "tableId": "0WXrjcyXXGeoAVM2VB8s2", "name": "billing_cycle", - "comment": "", + "comment": "청구방식", "dataType": "VARCHAR(20)", "default": "", "options": 8, @@ -6161,7 +6163,7 @@ "widthDefault": 60 }, "meta": { - "updateAt": 1748846158655, + "updateAt": 1749614882559, "createAt": 1748507306328 } }, @@ -6924,6 +6926,106 @@ "updateAt": 1749529387909, "createAt": 1749527376195 } + }, + "uhJTXyt09V-wQHSVkgzUL": { + "id": "uhJTXyt09V-wQHSVkgzUL", + "tableId": "isiA_oaJNIm3F4nYJuLJ1", + "name": "status", + "comment": "상태", + "dataType": "VARCHAR(20)", + "default": "'default'", + "options": 8, + "ui": { + "keys": 0, + "widthName": 60, + "widthComment": 60, + "widthDataType": 75, + "widthDefault": 60 + }, + "meta": { + "updateAt": 1749613648954, + "createAt": 1749613648952 + } + }, + "xWCCXo-zVdNuL4E9AhjCN": { + "id": "xWCCXo-zVdNuL4E9AhjCN", + "tableId": "QCNA57Pi6A9dJDgybxS5v", + "name": "item_type", + "comment": "", + "dataType": "VARCHAR(20)", + "default": "", + "options": 8, + "ui": { + "keys": 0, + "widthName": 60, + "widthComment": 60, + "widthDataType": 75, + "widthDefault": 60 + }, + "meta": { + "updateAt": 1749613743913, + "createAt": 1749613743913 + } + }, + "4O3Qit9vqva-izvWHJLTD": { + "id": "4O3Qit9vqva-izvWHJLTD", + "tableId": "QCNA57Pi6A9dJDgybxS5v", + "name": "item_uid", + "comment": "", + "dataType": "INT", + "default": "", + "options": 8, + "ui": { + "keys": 0, + "widthName": 60, + "widthComment": 60, + "widthDataType": 60, + "widthDefault": 60 + }, + "meta": { + "updateAt": 1749613743913, + "createAt": 1749613743913 + } + }, + "N-ESuxOk84rEdS2SzpVcx": { + "id": "N-ESuxOk84rEdS2SzpVcx", + "tableId": "QCNA57Pi6A9dJDgybxS5v", + "name": "billing_cycle", + "comment": "청구방식", + "dataType": "VARCHAR(20)", + "default": "", + "options": 8, + "ui": { + "keys": 0, + "widthName": 66, + "widthComment": 60, + "widthDataType": 75, + "widthDefault": 60 + }, + "meta": { + "updateAt": 1749616591995, + "createAt": 1749614891880 + } + }, + "ZWV8iXrgQovfYTm32QGbZ": { + "id": "ZWV8iXrgQovfYTm32QGbZ", + "tableId": "QCNA57Pi6A9dJDgybxS5v", + "name": "serviceinfo_uid", + "comment": "서비스정보", + "dataType": "INT", + "default": "", + "options": 8, + "ui": { + "keys": 2, + "widthName": 80, + "widthComment": 62, + "widthDataType": 60, + "widthDefault": 60 + }, + "meta": { + "updateAt": 1749615248043, + "createAt": 1749615226177 + } } }, "relationshipEntities": { @@ -7049,8 +7151,8 @@ "columnIds": [ "7B0zaLoZnOoMNW8OHZlrQ" ], - "x": 938.42, - "y": 1594.0408, + "x": 941.0514, + "y": 1607.1988, "direction": 1 }, "end": { @@ -7086,8 +7188,8 @@ "columnIds": [ "Z2KizkUFrIaV_R_Quv4Ho" ], - "x": 1454.42, - "y": 1594.0408, + "x": 1457.0513999999998, + "y": 1607.1988, "direction": 2 }, "meta": { @@ -7114,8 +7216,8 @@ "columnIds": [ "2Re7GlIDs1MKhwQ1n_5Ty" ], - "x": 1428.841, - "y": 743.9814, + "x": 1439.4198999999999, + "y": 714.1919, "direction": 2 }, "meta": { @@ -7134,7 +7236,7 @@ "GMPyqxaroK2OjQZnoCRwn" ], "x": 918.841, - "y": 681.9814, + "y": 693.9814, "direction": 1 }, "end": { @@ -7161,18 +7263,18 @@ "columnIds": [ "GMPyqxaroK2OjQZnoCRwn" ], - "x": 918.841, - "y": 805.9814, - "direction": 1 + "x": 399.7092, + "y": 773.9289, + "direction": 4 }, "end": { "tableId": "isiA_oaJNIm3F4nYJuLJ1", "columnIds": [ "1tE_0qGYDjR3udy5-odYS" ], - "x": 659.2625, - "y": 1153.6963, - "direction": 2 + "x": 556.4204, + "y": 707.3278, + "direction": 1 }, "meta": { "updateAt": 1748506047447, @@ -7190,7 +7292,7 @@ "_AcWUYKzNJd-V0fRHq8Cx" ], "x": 1615.2084, - "y": 864.0747999999999, + "y": 784.0748, "direction": 1 }, "end": { @@ -7218,7 +7320,7 @@ "N_yJVoCN4oUEDhYqdzApb" ], "x": 934.3741, - "y": 1132.673, + "y": 1236.673, "direction": 1 }, "end": { @@ -7274,7 +7376,7 @@ "_AcWUYKzNJd-V0fRHq8Cx" ], "x": 1615.2084, - "y": 970.7414666666665, + "y": 944.0748, "direction": 1 }, "end": { @@ -7302,7 +7404,7 @@ "N_yJVoCN4oUEDhYqdzApb" ], "x": 934.3741, - "y": 1340.673, + "y": 1375.3396666666667, "direction": 1 }, "end": { @@ -7346,6 +7448,34 @@ "updateAt": 1749527376196, "createAt": 1749527376196 } + }, + "Hj5AZkoYGvM_syvnqMeOi": { + "id": "Hj5AZkoYGvM_syvnqMeOi", + "identification": false, + "relationshipType": 16, + "startRelationshipType": 2, + "start": { + "tableId": "B8haiEbPc1lRBWTv1g25G", + "columnIds": [ + "N_yJVoCN4oUEDhYqdzApb" + ], + "x": 934.3741, + "y": 1098.0063333333333, + "direction": 1 + }, + "end": { + "tableId": "QCNA57Pi6A9dJDgybxS5v", + "columnIds": [ + "ZWV8iXrgQovfYTm32QGbZ" + ], + "x": 682.6305, + "y": 958.9288, + "direction": 2 + }, + "meta": { + "updateAt": 1749615226177, + "createAt": 1749615226177 + } } }, "indexEntities": {}, diff --git a/app/Entities/Customer/ServicePaymentEntity.php b/app/Entities/Customer/ServicePaymentEntity.php new file mode 100644 index 0000000..8db046b --- /dev/null +++ b/app/Entities/Customer/ServicePaymentEntity.php @@ -0,0 +1,27 @@ +attributes['serviceinfo_uid']); + } + public function getItemUid(): int + { + return intval($this->attributes['item_uid']); + } + public function getAmount(): int + { + return intval($this->attributes['amount']); + } + public function getView_BillingCycle(): string + { + return $this->attributes['billing_cycle'] == "month" ? "" : ICONS['ONETIME'];; + } +} diff --git a/app/Helpers/Customer/ServicePaymentHelper.php b/app/Helpers/Customer/ServicePaymentHelper.php new file mode 100644 index 0000000..2935132 --- /dev/null +++ b/app/Helpers/Customer/ServicePaymentHelper.php @@ -0,0 +1,53 @@ +setTitleField(field: ServicePaymentModel::TITLE); + } + + //ItemType에 따른 조건부 추가 Index Page + public function getFieldFormByItemType(string $field, mixed $value, array $viewDatas, array $extras = []): string + { + $form = ""; + if (in_array($viewDatas['control']['action'], ['create', 'modify', 'create_form', 'modify_form'])) { + $extras = (strpos($viewDatas['control']['field_rules'][$field], 'required') !== false) ? ["class" => "form-control", "required" => "", ...$extras] : ["class" => "form-control", ...$extras]; + } + switch ($viewDatas['item_type']) { + case 'DOMAIN': + if (in_array($viewDatas['control']['action'], ['create', 'modify', 'create_form', 'modify_form'])) { + $form = form_input($field, $value ?? "", ["placeholder" => "예)example.com", ...$extras]); + } else { + $form = parent::getFieldForm($field, $value, $viewDatas, $extras); + } + break; + default: + $form = parent::getFieldForm($field, $value, $viewDatas, $extras); + break; + } + return $form; + } + public function getFieldForm(string $field, mixed $value, array $viewDatas, array $extras = []): string + { + if (in_array($viewDatas['control']['action'], ['create', 'modify', 'create_form', 'modify_form'])) { + $extras = (strpos($viewDatas['control']['field_rules'][$field], 'required') !== false) ? ["class" => "form-control", "required" => "", ...$extras] : ["class" => "form-control", ...$extras]; + } + switch ($field) { + case 'item_uid': + $form = $this->getFieldFormByItemType($field, $value, $viewDatas, $extras); + break; + default: + $form = parent::getFieldForm($field, $value, $viewDatas, $extras); + break; + } + return $form; + } +} diff --git a/app/Language/en/Customer/ServicePayment.php b/app/Language/en/Customer/ServicePayment.php new file mode 100644 index 0000000..71290fc --- /dev/null +++ b/app/Language/en/Customer/ServicePayment.php @@ -0,0 +1,42 @@ + "서비스결제제정보", + 'label' => [ + 'serviceinfo_uid' => "서비스명", + 'item_type' => "항목형식", + 'item_uid' => "항목", + 'billing_cycle' => "청구방식", + 'amount' => "결제금액", + 'billing_at' => "지급기한일", + 'issue_at' => "발행일", + 'status' => "상태", + 'updated_at' => "수정일", + 'created_at' => "신청일", + 'deleted_at' => "삭제일", + ], + 'DEFAULTS' => [ + 'item_type' => "server", + 'billing_cycle' => "month", + 'status' => 'default' + ], + "ITEM_TYPE" => [ + "LINE" => "라인", + "IP" => "IP주소", + "SERVER" => "서버", + "CPU" => "CPU", + "RAM" => "메모리", + "STORAGE" => "저장장치", + "SOFTWARE" => "소프트웨어", + "DEFENCE" => "방어(CS)", + "DOMAIN" => "도메인", + ], + "BILLING_CYCLE" => [ + "month" => "매월", + "onetime" => "일회성", + ], + "STATUS" => [ + 'default' => "미지급", + "paid" => "지급완료", + "delete" => "삭제", + ], +]; diff --git a/app/Models/Customer/ServicePaymentModel.php b/app/Models/Customer/ServicePaymentModel.php new file mode 100644 index 0000000..205a688 --- /dev/null +++ b/app/Models/Customer/ServicePaymentModel.php @@ -0,0 +1,56 @@ + field가 array 입니다.\n" . var_export($field, true)); + } + switch ($field) { + case "serviceinfo_uid": + case "item_uid": + case "amount": + $rule = "required|numeric"; + break; + case "item_type": + case "billing_cycle": + case "status": + $rule = "required|trim|string"; + break; + case "billing_at": + case "issue_at": + $rule = "required|valid_date"; + break; + default: + $rule = parent::getFormFieldRule($action, $field); + break; + } + return $rule; + } +} diff --git a/app/Services/CommonService.php b/app/Services/CommonService.php index a5d8746..5b78e57 100644 --- a/app/Services/CommonService.php +++ b/app/Services/CommonService.php @@ -102,7 +102,7 @@ abstract class CommonService LogCollector::info("[{$entity->getTitle()}]" . MESSAGES["UPDATED"] . ":"); return $entity; } - final public function delete(mixed $entity): bool + public function delete(mixed $entity): bool { $result = $this->getModel()->delete($entity->getPK()); if (!$result) { diff --git a/app/Services/Customer/AccountService.php b/app/Services/Customer/AccountService.php index 5e37411..757cc4d 100644 --- a/app/Services/Customer/AccountService.php +++ b/app/Services/Customer/AccountService.php @@ -6,6 +6,8 @@ use App\Entities\Customer\AccountEntity; use App\Models\Customer\AccountModel; use CodeIgniter\HTTP\IncomingRequest; +use App\Entities\Customer\ClientEntity; + class AccountService extends CustomerService { protected ?IncomingRequest $request = null; @@ -40,4 +42,25 @@ class AccountService extends CustomerService { return ['status']; } + //고객예치금처리 + private function setBalance(array $formDatas): ClientEntity + { + //account_balance 체크 + $entity = $this->getClientService()->getEntity($formDatas['clientinfo_uid']); + if (!$entity) { + throw new \Exception("{$formDatas['clientinfo_uid']}에 대한 고객정보를 찾을수 없습니다."); + } + $amount = intval($formDatas['amount']); + if ($formDatas['status'] === DEFAULTS['STATUS']) { //입금, 쿠폰추가 + $entity = $this->getClientService()->deposit($entity, 'account_balance', $amount); + } else { // 출금, 쿠폰사용 + $entity = $this->getClientService()->withdrawal($entity, 'account_balance', $amount); + } + return $entity; + } + public function create(array $formDatas, mixed $entity = null): AccountEntity + { + $this->setBalance($formDatas); + return parent::create($entity, $formDatas); + } } diff --git a/app/Services/Customer/CouponService.php b/app/Services/Customer/CouponService.php index 9985b12..c8a242d 100644 --- a/app/Services/Customer/CouponService.php +++ b/app/Services/Customer/CouponService.php @@ -6,6 +6,8 @@ use App\Entities\Customer\CouponEntity; use App\Models\Customer\CouponModel; use CodeIgniter\HTTP\IncomingRequest; +use App\Entities\Customer\ClientEntity; + class CouponService extends CustomerService { protected ?IncomingRequest $request = null; @@ -39,4 +41,25 @@ class CouponService extends CustomerService { return ['status']; } + //고객예치금처리 + private function setBalance(array $formDatas): ClientEntity + { + //coupon_balance 체크 + $entity = $this->getClientService()->getEntity($formDatas['clientinfo_uid']); + if (!$entity) { + throw new \Exception("{$formDatas['clientinfo_uid']}에 대한 고객정보를 찾을수 없습니다."); + } + $amount = intval($formDatas['amount']); + if ($formDatas['status'] === DEFAULTS['STATUS']) { //입금, 쿠폰추가 + $entity = $this->getClientService()->deposit($entity, 'coupon_balance', $amount); + } else { // 출금, 쿠폰사용 + $entity = $this->getClientService()->withdrawal($entity, 'coupon_balance', $amount); + } + return $entity; + } + public function create(array $formDatas, mixed $entity = null): CouponEntity + { + $this->setBalance($formDatas); + return parent::create($entity, $formDatas); + } } diff --git a/app/Services/Customer/CustomerService.php b/app/Services/Customer/CustomerService.php index 4df309f..f54eee1 100644 --- a/app/Services/Customer/CustomerService.php +++ b/app/Services/Customer/CustomerService.php @@ -6,10 +6,20 @@ use App\Services\CommonService; use CodeIgniter\HTTP\IncomingRequest; use App\Services\Customer\ClientService; +use App\Services\Equipment\Part\CpuService; +use App\Services\Equipment\Part\DefenceService; +use App\Services\Equipment\Part\StorageService; +use App\Services\Equipment\Part\IpService; +use App\Services\Equipment\Part\LineService; +use App\Services\Equipment\Part\RamService; +use App\Services\Equipment\Part\SoftwareService; +use App\Services\Equipment\ServerService; +use App\Services\Equipment\DomainService; abstract class CustomerService extends CommonService { private ?ClientService $_clientService = null; + private $_equipmentService = []; protected function __construct(?IncomingRequest $request = null) { parent::__construct($request); @@ -22,4 +32,43 @@ abstract class CustomerService extends CommonService } return $this->_clientService; } + + //ServiceItemController,ServiceController에서 사용 + final public function getEquipmentService(string $key): mixed + { + if (!array_key_exists($key, $this->_equipmentService)) { + switch ($key) { + case 'SERVER': + $this->_equipmentService[$key] = new ServerService(); + break; + case 'CPU': + $this->_equipmentService[$key] = new CpuService(); + break; + case 'RAM': + $this->_equipmentService[$key] = new RamService(); + break; + case 'STORAGE': + $this->_equipmentService[$key] = new StorageService(); + break; + case 'LINE': + $this->_equipmentService[$key] = new LineService(); + break; + case 'IP': + $this->_equipmentService[$key] = new IpService(); + break; + case 'DEFENCE': + $this->_equipmentService[$key] = new DefenceService(); + break; + case 'SOFTWARE': + $this->_equipmentService[$key] = new SoftwareService(); + break; + case 'DOMAIN': + $this->_equipmentService[$key] = new DomainService(); + break; + default: + throw new \Exception(__FUNCTION__ . "에서 사용하지않는 Service를 요청하였습니다.: {$key}"); + } + } + return $this->_equipmentService[$key]; + } } diff --git a/app/Services/Customer/PointService.php b/app/Services/Customer/PointService.php index 387d894..4e4fd4e 100644 --- a/app/Services/Customer/PointService.php +++ b/app/Services/Customer/PointService.php @@ -6,6 +6,8 @@ use App\Entities\Customer\PointEntity; use App\Models\Customer\PointModel; use CodeIgniter\HTTP\IncomingRequest; +use App\Entities\Customer\ClientEntity; + class PointService extends CustomerService { protected ?IncomingRequest $request = null; @@ -39,4 +41,24 @@ class PointService extends CustomerService { return ['status']; } + private function setBalance(array $formDatas): ClientEntity + { + //point_balance 체크 + $entity = $this->getClientService()->getEntity($formDatas['clientinfo_uid']); + if (!$entity) { + throw new \Exception("{$formDatas['clientinfo_uid']}에 대한 고객정보를 찾을수 없습니다."); + } + $amount = intval($formDatas['amount']); + if ($formDatas['status'] === DEFAULTS['STATUS']) { //입금, 쿠폰추가 + $entity = $this->getClientService()->deposit($entity, 'point_balance', $amount); + } else { // 출금, 쿠폰사용 + $entity = $this->getClientService()->withdrawal($entity, 'point_balance', $amount); + } + return $entity; + } + public function create(array $formDatas, mixed $entity = null): PointEntity + { + $this->setBalance($formDatas); + return parent::create($entity, $formDatas); + } } diff --git a/app/Services/Customer/ServiceItemService.php b/app/Services/Customer/ServiceItemService.php index fffe220..0263a46 100644 --- a/app/Services/Customer/ServiceItemService.php +++ b/app/Services/Customer/ServiceItemService.php @@ -6,9 +6,12 @@ use App\Entities\Customer\ServiceItemEntity; use App\Models\Customer\ServiceItemModel; use CodeIgniter\HTTP\IncomingRequest; +use App\Services\Customer\ServiceService; + class ServiceItemService extends CustomerService { protected ?IncomingRequest $request = null; + private ?ServiceService $_serviceService = null; public function __construct(?IncomingRequest $request = null) { parent::__construct($request); @@ -22,6 +25,13 @@ class ServiceItemService extends CustomerService { return new ServiceItemEntity(); } + public function getServiceService(): ServiceService + { + if (!$this->_serviceService) { + $this->_serviceService = new ServiceService($this->request); + } + return $this->_serviceService; + } public function getFormFields(): array { return [ diff --git a/app/Services/Customer/ServicePaymentService.php b/app/Services/Customer/ServicePaymentService.php new file mode 100644 index 0000000..c8bcf8f --- /dev/null +++ b/app/Services/Customer/ServicePaymentService.php @@ -0,0 +1,50 @@ +addClassName('ServicePayment'); + } + public function getModelClass(): ServicePaymentModel + { + return new ServicePaymentModel(); + } + public function getEntityClass(): ServicePaymentEntity + { + return new ServicePaymentEntity(); + } + public function getFormFields(): array + { + return [ + "serviceinfo_uid", + "item_type", + "item_uid", + "billing_cycle", + "amount", + "billing_at", + "issue_at", + "status", + ]; + } + public function getFilterFields(): array + { + return ["serviceinfo_uid", 'item_type', 'item_uid', 'billing_cycle', 'status']; + } + public function getBatchJobFields(): array + { + return ['status']; + } + public function getIndexFields(): array + { + return ['serviceinfo_uid', 'item_type', 'item_uid', 'billing_cycle', 'amount', 'billing_at', 'issue_at', 'status']; + } +} diff --git a/app/Services/Customer/ServiceService.php b/app/Services/Customer/ServiceService.php index baa6b65..53d692c 100644 --- a/app/Services/Customer/ServiceService.php +++ b/app/Services/Customer/ServiceService.php @@ -6,9 +6,13 @@ use App\Entities\Customer\ServiceEntity; use App\Models\Customer\ServiceModel; use CodeIgniter\HTTP\IncomingRequest; +use App\Entities\Equipment\CodeEntity; +use App\Services\Equipment\CodeService; + class ServiceService extends CustomerService { protected ?IncomingRequest $request = null; + private ?CodeService $_codeService = null; public function __construct(?IncomingRequest $request = null) { parent::__construct($request); @@ -51,4 +55,35 @@ class ServiceService extends CustomerService { return ['clientinfo_uid', 'ownerinfo_uid', 'title', 'type', 'location', 'switch', 'code', 'raid', 'billing_at', 'start_at', 'status']; } + + public function getCodeService(): CodeService + { + if (!$this->_codeService) { + $this->_codeService = new CodeService($this->request); + } + return $this->_codeService; + } + public function create(array $formDatas, mixed $entity = null): ServiceEntity + { + //code의 경우 서비스중으로 설정작업 + $this->getCodeService()->setStatus($formDatas['code'], CodeEntity::STATUS_OCCUPIED); + return parent::create($entity, $formDatas); + } + public function modify(mixed $entity, array $formDatas): ServiceEntity + { + //code가 기존과 다를경우 //toggle,batchjob의 경우 $formDatas에 code가 없을수도 있음 + if (array_key_exists('code', $formDatas) && $formDatas['code'] !== $entity->getCode()) { + //code의 경우 기존code는 사용가능으로 설정작업 + $this->getCodeService()->setStatus($entity->getCode(), CodeEntity::STATUS_AVAILABLE); + //coded의 경우 변경된 code는 서비스중으로 설정작업 + $this->getCodeService()->setStatus($formDatas['code'], CodeEntity::STATUS_OCCUPIED); + } + return parent::modify($entity, $formDatas); + } + final public function delete(mixed $entity): bool + { + //code의 경우 기존code는 사용가능으로 설정작업 + $this->getCodeService()->setStatus($entity->getCode(), CodeEntity::STATUS_AVAILABLE); + return parent::delete($entity); + } } diff --git a/app/Views/layouts/admin/left_menu/customer.php b/app/Views/layouts/admin/left_menu/customer.php index 1af5c96..0e5d099 100644 --- a/app/Views/layouts/admin/left_menu/customer.php +++ b/app/Views/layouts/admin/left_menu/customer.php @@ -21,6 +21,6 @@ = ICONS['CARD'] ?> 서비스내역
\ No newline at end of file diff --git a/dbms_init_all.sq b/dbms_init_all.sq index 62cda62..bed942b 100644 --- a/dbms_init_all.sq +++ b/dbms_init_all.sq @@ -373,7 +373,7 @@ CREATE TABLE `logger` ( PRIMARY KEY (`uid`), KEY `FK_user_TO_logger` (`user_uid`), CONSTRAINT `FK_user_TO_logger` FOREIGN KEY (`user_uid`) REFERENCES `user` (`uid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='작업 기록 로그'; +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='작업 기록 로그'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -382,6 +382,7 @@ CREATE TABLE `logger` ( LOCK TABLES `logger` WRITE; /*!40000 ALTER TABLE `logger` DISABLE KEYS */; +INSERT INTO `logger` VALUES (1,1,'Customer/ServiceItem','getResultFail','getFormFieldOption에서 item_type이 지정되지 않았습니다.','10:25:57[debug]: getFormFieldOption에서 item_type이 지정되지 않았습니다.','default','2025-06-11 01:25:57'),(2,1,'Customer/ServiceHistory','getResultSuccess','작업이 성공적으로 완료되었습니다.','10:38:31[debug]: 입력내용\n10:38:31[debug]: array (\n 'serviceinfo_uid' => '2',\n 'title' => 'sadfsf',\n 'description' => '',\n 'status' => 'default',\n)\n10:38:31[debug]: [5/sadfsf] 입력 후 내용\n10:38:31[debug]: array (\n 'serviceinfo_uid' => '2',\n 'title' => 'sadfsf',\n 'status' => 'default',\n 'uid' => 5,\n)\n10:38:31[info]: [sadfsf]생성되었습니다.:','default','2025-06-11 01:38:31'),(3,1,'User','getResultFail','Undefined variable $entity','11:09:58[debug]: Undefined variable $entity','default','2025-06-11 02:09:58'),(4,1,'MyLog','getResultFail','Undefined variable $entity','11:12:24[debug]: Undefined variable $entity','default','2025-06-11 02:12:24'),(5,1,'User','getResultFail','Undefined variable $entity','11:12:32[debug]: Undefined variable $entity','default','2025-06-11 02:12:32'); /*!40000 ALTER TABLE `logger` ENABLE KEYS */; UNLOCK TABLES; @@ -561,7 +562,7 @@ CREATE TABLE `serviceinfo_history` ( PRIMARY KEY (`uid`), KEY `FK_serviceinfo_TO_serviceinfo_history` (`serviceinfo_uid`), CONSTRAINT `FK_serviceinfo_TO_serviceinfo_history` FOREIGN KEY (`serviceinfo_uid`) REFERENCES `serviceinfo` (`uid`) -) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='서비스정보_history'; +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='서비스정보_history'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -570,7 +571,7 @@ CREATE TABLE `serviceinfo_history` ( LOCK TABLES `serviceinfo_history` WRITE; /*!40000 ALTER TABLE `serviceinfo_history` DISABLE KEYS */; -INSERT INTO `serviceinfo_history` VALUES (1,2,'히스토리1111','히스토리1111
히스토리1111
히스토리222
히스토리222
히스토리12222
히스토리12222
히스토리22222222
히스토리22222222
히스토리1111
히스토리1111
히스토리222
히스토리222
히스토리12222
히스토리12222
히스토리22222222
히스토리22222222