From 6b40f17e1d75dda3692e9c708df3a1a23f249f6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A4=80=ED=9D=A0?= Date: Mon, 8 Dec 2025 16:51:22 +0900 Subject: [PATCH] dbmsv4 init...2 --- app/Cells/PaymentCell.php | 2 +- app/Config/Constants.php | 10 +++++ app/Controllers/Admin/PaymentController.php | 12 ++++++ app/Database/dbmsv4_test1.sql | 6 +-- app/Helpers/PaymentHelper.php | 3 ++ app/Language/ko/Customer/Account.php | 8 +--- app/Services/Customer/AccountService.php | 15 +++---- app/Services/Customer/ClientService.php | 44 ++++++++++++++++++-- app/Services/Customer/CouponService.php | 2 +- app/Services/Customer/PointService.php | 2 +- app/Services/PaymentService.php | 39 +++++++++++++++--- app/Views/cells/payment/detail.php | 45 ++++++++++++--------- 12 files changed, 142 insertions(+), 46 deletions(-) diff --git a/app/Cells/PaymentCell.php b/app/Cells/PaymentCell.php index eb5fb6a..627ae06 100644 --- a/app/Cells/PaymentCell.php +++ b/app/Cells/PaymentCell.php @@ -18,7 +18,7 @@ class PaymentCell extends CommonCell $entities = $this->getService()->getEntities(['clientinfo_uid' => $params['clientinfo_uid'], 'billing' => PAYMENT['BILLING']['ONETIME'], 'status' => STATUS['UNPAID']]); $template = array_key_exists('template', $params) ? $params['template'] : __FUNCTION__; return view('cells/payment/' . $template, [ - 'serviceCellDatas' => [ + 'paymentCellDatas' => [ 'formFilters' => $this->getService()->getFormService()->getFormFilters(), 'formOptions' => $this->getService()->getFormService()->getFormOptions(), 'helper' => $this->getService()->getHelper(), diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 528b637..a4c917c 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -416,6 +416,16 @@ define("SITES", [ "itsolution" => "ITSOLUTION", "gdidc" => "GDIDC", ]); +//사이트별 은행관련 +define( + "BANKS", + [ + '국민은행' => "국민은행", + "하나은행" => "하나은행", + "신한은행" => "신한은행", + "농협" => "농협", + ], +); //서비스 관련 define("SERVICE", [ "NEW_INTERVAL" => $_ENV['SERVICE_NEW_INTERVAL'] ?? $_SERVER['SERVICE_NEW_INTERVAL'] ?? 7, diff --git a/app/Controllers/Admin/PaymentController.php b/app/Controllers/Admin/PaymentController.php index 17884e1..37c8ba5 100644 --- a/app/Controllers/Admin/PaymentController.php +++ b/app/Controllers/Admin/PaymentController.php @@ -96,4 +96,16 @@ class PaymentController extends AdminController return $this->action_redirect_process('error', "{$this->getTitle()}에서 청구서발행 오류:" . $e->getMessage()); } } + public function paid($uid): string|RedirectResponse + { + try { + $entity = $this->service->paid($uid); + $action = __FUNCTION__; + //FormService에서 필요한 기존 데이터를 $entity에서 추출해서 넘김 + $this->action_init_process($action, $entity->toArray()); + return $this->modify_form_result_process($action); + } catch (\Throwable $e) { + return $this->action_redirect_process('error', "{$this->getTitle()}에서 수정폼 오류:" . $e->getMessage()); + } + } } diff --git a/app/Database/dbmsv4_test1.sql b/app/Database/dbmsv4_test1.sql index e8c1743..2b5a038 100644 --- a/app/Database/dbmsv4_test1.sql +++ b/app/Database/dbmsv4_test1.sql @@ -450,7 +450,7 @@ CREATE TABLE `payment` ( LOCK TABLES `payment` WRITE; /*!40000 ALTER TABLE `payment` DISABLE KEYS */; -INSERT INTO `payment` VALUES (17,1,820,52,NULL,'[[2548E-M68]13.220.20.6] 2025년 9월 서비스비용',NULL,500000,'month','2025-09-25',NULL,'unpaid','2025-10-29 00:58:09','2025-09-25 06:29:25',NULL),(18,1,1161,53,NULL,'itsolution_s68d4e1b6',NULL,800000,'month','2025-11-14',NULL,'unpaid','2025-10-16 00:58:10','2025-09-25 06:31:18',NULL),(19,1,820,52,NULL,'2G',NULL,40000,'onetime','2025-09-25',NULL,'unpaid','2025-09-25 08:27:17','2025-09-25 08:15:08',NULL),(20,1,1087,54,NULL,'gdidc_s68d4ff1b03fab',NULL,1800000,'month','2025-09-25',NULL,'unpaid','2025-10-16 00:58:28','2025-09-25 08:36:43',NULL),(21,1,820,52,NULL,'16G',NULL,300000,'onetime','2025-09-26',NULL,'unpaid',NULL,'2025-09-26 07:03:50',NULL),(22,1,820,52,NULL,'NVME 512G',NULL,120000,'onetime','2025-09-30','account','paid','2025-10-02 05:07:08','2025-09-30 00:56:19',NULL),(23,1,820,52,NULL,'NVME 512G',NULL,240000,'onetime','2025-09-30','account','paid','2025-10-02 05:07:08','2025-09-30 01:02:43',NULL),(24,1,820,52,NULL,'NVME 1T',NULL,150000,'onetime','2025-09-30',NULL,'unpaid',NULL,'2025-09-30 01:50:08',NULL),(28,1,820,52,NULL,'SSD 256G',NULL,160000,'onetime','2025-09-30',NULL,'unpaid',NULL,'2025-09-30 05:35:30',NULL),(29,1,820,56,NULL,'[[2530Z-M22]HITACH HA3000] 2025년 10월 서비스비용',NULL,1550000,'month','2025-10-01',NULL,'unpaid','2025-10-31 03:36:49','2025-10-01 00:08:02',NULL),(32,1,819,57,NULL,'[[JPN-S23]DESKTOP I5] 2025년 10월 서비스비용',NULL,650000,'month','2025-10-01',NULL,'unpaid','2025-10-31 03:36:20','2025-10-01 08:19:25',NULL),(33,1,820,52,NULL,'NVME 2T',NULL,180000,'onetime','2025-10-02',NULL,'unpaid',NULL,'2025-10-02 00:07:28',NULL),(34,1,711,58,NULL,'prime_s68ddf9a191864',NULL,1100000,'month','2025-10-02',NULL,'unpaid','2025-10-16 01:48:27','2025-10-02 04:03:45',NULL),(35,1,1185,59,NULL,'itsolution_s68e30467',NULL,900000,'month','2025-10-06','account','unpaid','2025-10-16 01:53:30','2025-10-05 23:51:03',NULL),(36,45,1185,59,NULL,'서버비',NULL,600000,'month','2025-11-06',NULL,'paid','2025-10-05 23:54:41','2025-10-05 23:53:43',NULL),(37,45,1185,59,NULL,'서버비',NULL,400000,'month','2025-11-06','account','paid','2025-10-05 23:57:23','2025-10-05 23:56:03',NULL),(38,45,1185,59,NULL,'도메인','도메인 구매',40000,'onetime','2025-10-06','account','paid','2025-10-05 23:57:23','2025-10-05 23:56:59',NULL),(39,45,1185,59,NULL,'서버비',NULL,400000,'month','2025-10-06','account','paid','2025-10-06 00:51:24','2025-10-06 00:48:36',NULL),(40,45,1185,59,NULL,'도메인',NULL,1000000,'onetime','2025-10-06','account','paid','2025-10-06 01:02:46','2025-10-06 00:54:59',NULL),(41,1,1186,60,NULL,'prime_s68e37906ad1bd',NULL,1100000,'month','2025-10-06','account','unpaid','2025-10-16 01:53:52','2025-10-06 08:08:38',NULL),(42,1,1186,61,NULL,'prime_s68e37b9e918a2',NULL,1300000,'month','2025-10-06','account','unpaid','2025-10-16 01:54:10','2025-10-06 08:19:42',NULL),(43,11,1186,60,NULL,'SSD 2T',NULL,600000,'onetime','2025-10-06','account','paid','2025-10-06 08:36:38','2025-10-06 08:25:57',NULL),(44,11,1186,60,NULL,'SSD 1T',NULL,400000,'onetime','2025-10-06','account','paid','2025-10-06 08:36:38','2025-10-06 08:31:15',NULL),(45,11,1186,61,NULL,'8G',NULL,50000,'onetime','2025-10-06','account','paid','2025-10-06 08:38:35','2025-10-06 08:34:46',NULL),(46,1,1186,61,NULL,'test.co.kr 도메인','test.co.kr 도메인',50000,'onetime','2025-10-14',NULL,'unpaid',NULL,'2025-10-14 02:24:26',NULL),(50,1,1161,53,NULL,'itsolution_s68d4e1b6',NULL,800000,'month','2025-10-14',NULL,'unpaid',NULL,'2025-10-14 08:28:35',NULL),(51,1,819,57,NULL,'테스트','테스트\r\n테스트\r\n테스트\r\n테스트',100000,'onetime','2025-10-15',NULL,'unpaid',NULL,'2025-10-15 03:35:39',NULL),(52,1,842,62,NULL,'prime_s68ef4901c563f',NULL,800000,'month','2025-10-15',NULL,'unpaid','2025-10-16 07:52:10','2025-10-15 07:10:57',NULL),(53,1,842,63,NULL,'itsolution_s68ef4cbd',NULL,400000,'month','2025-10-15',NULL,'unpaid','2025-10-16 01:54:36','2025-10-15 07:26:53',NULL),(54,1,820,56,NULL,'fffff','ffdgdfgdf',430000,'onetime','2025-10-15',NULL,'unpaid',NULL,'2025-10-15 07:33:28',NULL),(55,1,1155,64,NULL,'[2543E-M32/13.220.20.25] 2025년 10월 서비스비용',NULL,900000,'month','2025-10-22',NULL,'unpaid','2025-10-21 00:15:04','2025-10-17 06:22:15',NULL),(56,11,1186,60,NULL,'도메인 구매','<p>test.com</p>',40000,'onetime','2025-10-21',NULL,'unpaid',NULL,'2025-10-21 05:19:26',NULL),(57,11,1186,60,NULL,'a.com','<p>도메인 구매</p>',40000,'onetime','2025-10-21','account','paid','2025-10-31 06:01:08','2025-10-21 05:20:08',NULL),(58,1,820,66,NULL,'[2549E-M65/13.220.20.4] 2025년 10월 서비스비용',NULL,1000000,'month','2025-10-22',NULL,'unpaid','2025-10-22 09:50:41','2025-10-22 09:27:56',NULL),(59,1,820,66,NULL,'8G',NULL,80000,'onetime','2025-10-22',NULL,'unpaid',NULL,'2025-10-22 09:45:01',NULL),(60,1,820,71,NULL,'[2548D-M67/13.220.20.15] 2025년 10월 서비스비용',NULL,400000,'month','2025-10-25',NULL,'unpaid',NULL,'2025-10-23 05:01:53',NULL),(61,1,820,74,NULL,'[] 2025년 10월 서비스비용',NULL,1100000,'month','2025-10-23',NULL,'unpaid','2025-10-28 08:01:13','2025-10-23 05:06:15',NULL),(64,1,820,78,NULL,'[[2547C-M26]] 2025년 10월 서비스비용',NULL,1000000,'month','2025-10-24',NULL,'unpaid','2025-10-28 08:00:15','2025-10-24 01:45:56',NULL),(65,0,1161,79,NULL,'[[KCS-M33]KCS] 2025년 10월 서비스비용',NULL,850000,'month','2025-10-25',NULL,'unpaid','2025-10-28 08:21:20','2025-10-27 02:41:33',NULL),(66,0,1161,79,NULL,'13.220.20.8',NULL,200000,'onetime','2025-10-28',NULL,'unpaid','2025-10-28 08:23:21','2025-10-28 08:22:04',NULL),(67,1,820,78,NULL,'test.co.kr 도메인추가외 5개','<p>test1.co.kr<br>test2.co.kr<br><span style="color: #e03e2d;">test3.co.kr</span><br><span style="color: #e03e2d;">test4.co.kr</span><br>test5.co.k</p>',500000,'onetime','2025-10-29',NULL,'unpaid',NULL,'2025-10-29 00:08:44',NULL),(68,0,820,80,NULL,'[[2548E-M73]13.220.20.16] 2025년 10월 서비스비용',NULL,1000000,'month','2025-10-30',NULL,'unpaid','2025-10-30 08:14:04','2025-10-30 06:36:44',NULL),(69,0,820,NULL,NULL,'NVME 1T',NULL,150000,'onetime','2025-10-30',NULL,'unpaid','2025-10-30 08:09:16','2025-10-30 06:56:29',NULL),(86,1,599,81,NULL,'[2548E-M79]23.125.207.3 2025년 12월 서비스비용',NULL,1000000,'month','2025-12-25','account','unpaid',NULL,'2025-12-02 06:28:57',NULL),(87,1,598,109,NULL,'[2548E-M106]23.125.207.6 2025년 12월 서비스비용',NULL,600000,'month','2025-12-26','account','unpaid',NULL,'2025-12-02 09:03:34',NULL),(88,1,598,109,NULL,'test.com 도메인 외 5개',NULL,500000,'onetime','2025-12-05','coupon','unpaid',NULL,'2025-12-04 23:53:44',NULL),(89,1,598,109,NULL,'[2548E-M106]23.125.207.6 2026년 03월 서비스비용',NULL,600000,'month','2026-03-05','account','unpaid',NULL,'2025-12-05 00:01:41',NULL),(90,1,598,109,NULL,'2개월 선결제처리',NULL,1200000,'prepayment','2026-01-25','account','paid',NULL,'2025-12-05 00:15:22',NULL),(91,1,598,109,NULL,'[2548E-M106]23.125.207.6 2026년 01월 서비스비용',NULL,500000,'month','2026-01-25','account','unpaid',NULL,'2025-12-05 00:33:13',NULL); +INSERT INTO `payment` VALUES (17,1,820,52,NULL,'[[2548E-M68]13.220.20.6] 2025년 9월 서비스비용',NULL,500000,'month','2025-09-25',NULL,'unpaid','2025-10-29 00:58:09','2025-09-25 06:29:25',NULL),(18,1,1161,53,NULL,'itsolution_s68d4e1b6',NULL,800000,'month','2025-11-14',NULL,'unpaid','2025-10-16 00:58:10','2025-09-25 06:31:18',NULL),(19,1,820,52,NULL,'2G',NULL,40000,'onetime','2025-09-25',NULL,'unpaid','2025-09-25 08:27:17','2025-09-25 08:15:08',NULL),(20,1,1087,54,NULL,'gdidc_s68d4ff1b03fab',NULL,1800000,'month','2025-09-25',NULL,'unpaid','2025-10-16 00:58:28','2025-09-25 08:36:43',NULL),(21,1,820,52,NULL,'16G',NULL,300000,'onetime','2025-09-26',NULL,'unpaid',NULL,'2025-09-26 07:03:50',NULL),(22,1,820,52,NULL,'NVME 512G',NULL,120000,'onetime','2025-09-30','account','paid','2025-10-02 05:07:08','2025-09-30 00:56:19',NULL),(23,1,820,52,NULL,'NVME 512G',NULL,240000,'onetime','2025-09-30','account','paid','2025-10-02 05:07:08','2025-09-30 01:02:43',NULL),(24,1,820,52,NULL,'NVME 1T',NULL,150000,'onetime','2025-09-30',NULL,'unpaid',NULL,'2025-09-30 01:50:08',NULL),(28,1,820,52,NULL,'SSD 256G',NULL,160000,'onetime','2025-09-30',NULL,'unpaid',NULL,'2025-09-30 05:35:30',NULL),(29,1,820,56,NULL,'[[2530Z-M22]HITACH HA3000] 2025년 10월 서비스비용',NULL,1550000,'month','2025-10-01',NULL,'unpaid','2025-10-31 03:36:49','2025-10-01 00:08:02',NULL),(32,1,819,57,NULL,'[[JPN-S23]DESKTOP I5] 2025년 10월 서비스비용',NULL,650000,'month','2025-10-01',NULL,'unpaid','2025-10-31 03:36:20','2025-10-01 08:19:25',NULL),(33,1,820,52,NULL,'NVME 2T',NULL,180000,'onetime','2025-10-02',NULL,'unpaid',NULL,'2025-10-02 00:07:28',NULL),(34,1,711,58,NULL,'prime_s68ddf9a191864',NULL,1100000,'month','2025-10-02',NULL,'unpaid','2025-10-16 01:48:27','2025-10-02 04:03:45',NULL),(35,1,1185,59,NULL,'itsolution_s68e30467',NULL,900000,'month','2025-10-06','account','unpaid','2025-10-16 01:53:30','2025-10-05 23:51:03',NULL),(36,45,1185,59,NULL,'서버비',NULL,600000,'month','2025-11-06',NULL,'paid','2025-10-05 23:54:41','2025-10-05 23:53:43',NULL),(37,45,1185,59,NULL,'서버비',NULL,400000,'month','2025-11-06','account','paid','2025-10-05 23:57:23','2025-10-05 23:56:03',NULL),(38,45,1185,59,NULL,'도메인','도메인 구매',40000,'onetime','2025-10-06','account','paid','2025-10-05 23:57:23','2025-10-05 23:56:59',NULL),(39,45,1185,59,NULL,'서버비',NULL,400000,'month','2025-10-06','account','paid','2025-10-06 00:51:24','2025-10-06 00:48:36',NULL),(40,45,1185,59,NULL,'도메인',NULL,1000000,'onetime','2025-10-06','account','paid','2025-10-06 01:02:46','2025-10-06 00:54:59',NULL),(41,1,1186,60,NULL,'prime_s68e37906ad1bd',NULL,1100000,'month','2025-10-06','account','unpaid','2025-10-16 01:53:52','2025-10-06 08:08:38',NULL),(42,1,1186,61,NULL,'prime_s68e37b9e918a2',NULL,1300000,'month','2025-10-06','account','unpaid','2025-10-16 01:54:10','2025-10-06 08:19:42',NULL),(43,11,1186,60,NULL,'SSD 2T',NULL,600000,'onetime','2025-10-06','account','paid','2025-10-06 08:36:38','2025-10-06 08:25:57',NULL),(44,11,1186,60,NULL,'SSD 1T',NULL,400000,'onetime','2025-10-06','account','paid','2025-10-06 08:36:38','2025-10-06 08:31:15',NULL),(45,11,1186,61,NULL,'8G',NULL,50000,'onetime','2025-10-06','account','paid','2025-10-06 08:38:35','2025-10-06 08:34:46',NULL),(46,1,1186,61,NULL,'test.co.kr 도메인','test.co.kr 도메인',50000,'onetime','2025-10-14',NULL,'unpaid',NULL,'2025-10-14 02:24:26',NULL),(50,1,1161,53,NULL,'itsolution_s68d4e1b6',NULL,800000,'month','2025-10-14',NULL,'unpaid',NULL,'2025-10-14 08:28:35',NULL),(51,1,819,57,NULL,'테스트','테스트\r\n테스트\r\n테스트\r\n테스트',100000,'onetime','2025-10-15',NULL,'unpaid',NULL,'2025-10-15 03:35:39',NULL),(52,1,842,62,NULL,'prime_s68ef4901c563f',NULL,800000,'month','2025-10-15',NULL,'unpaid','2025-10-16 07:52:10','2025-10-15 07:10:57',NULL),(53,1,842,63,NULL,'itsolution_s68ef4cbd',NULL,400000,'month','2025-10-15',NULL,'unpaid','2025-10-16 01:54:36','2025-10-15 07:26:53',NULL),(54,1,820,56,NULL,'fffff','ffdgdfgdf',430000,'onetime','2025-10-15',NULL,'unpaid',NULL,'2025-10-15 07:33:28',NULL),(55,1,1155,64,NULL,'[2543E-M32/13.220.20.25] 2025년 10월 서비스비용',NULL,900000,'month','2025-10-22',NULL,'unpaid','2025-10-21 00:15:04','2025-10-17 06:22:15',NULL),(56,11,1186,60,NULL,'도메인 구매','<p>test.com</p>',40000,'onetime','2025-10-21',NULL,'unpaid',NULL,'2025-10-21 05:19:26',NULL),(57,11,1186,60,NULL,'a.com','<p>도메인 구매</p>',40000,'onetime','2025-10-21','account','paid','2025-10-31 06:01:08','2025-10-21 05:20:08',NULL),(58,1,820,66,NULL,'[2549E-M65/13.220.20.4] 2025년 10월 서비스비용',NULL,1000000,'month','2025-10-22',NULL,'unpaid','2025-10-22 09:50:41','2025-10-22 09:27:56',NULL),(59,1,820,66,NULL,'8G',NULL,80000,'onetime','2025-10-22',NULL,'unpaid',NULL,'2025-10-22 09:45:01',NULL),(60,1,820,71,NULL,'[2548D-M67/13.220.20.15] 2025년 10월 서비스비용',NULL,400000,'month','2025-10-25',NULL,'unpaid',NULL,'2025-10-23 05:01:53',NULL),(61,1,820,74,NULL,'[] 2025년 10월 서비스비용',NULL,1100000,'month','2025-10-23',NULL,'unpaid','2025-10-28 08:01:13','2025-10-23 05:06:15',NULL),(64,1,820,78,NULL,'[[2547C-M26]] 2025년 10월 서비스비용',NULL,1000000,'month','2025-10-24',NULL,'unpaid','2025-10-28 08:00:15','2025-10-24 01:45:56',NULL),(65,0,1161,79,NULL,'[[KCS-M33]KCS] 2025년 10월 서비스비용',NULL,850000,'month','2025-10-25',NULL,'unpaid','2025-10-28 08:21:20','2025-10-27 02:41:33',NULL),(66,0,1161,79,NULL,'13.220.20.8',NULL,200000,'onetime','2025-10-28',NULL,'unpaid','2025-10-28 08:23:21','2025-10-28 08:22:04',NULL),(67,1,820,78,NULL,'test.co.kr 도메인추가외 5개','<p>test1.co.kr<br>test2.co.kr<br><span style="color: #e03e2d;">test3.co.kr</span><br><span style="color: #e03e2d;">test4.co.kr</span><br>test5.co.k</p>',500000,'onetime','2025-10-29',NULL,'unpaid',NULL,'2025-10-29 00:08:44',NULL),(68,0,820,80,NULL,'[[2548E-M73]13.220.20.16] 2025년 10월 서비스비용',NULL,1000000,'month','2025-10-30',NULL,'unpaid','2025-10-30 08:14:04','2025-10-30 06:36:44',NULL),(69,0,820,NULL,NULL,'NVME 1T',NULL,150000,'onetime','2025-10-30',NULL,'unpaid','2025-10-30 08:09:16','2025-10-30 06:56:29',NULL),(86,1,599,81,NULL,'[2549E-M80]23.125.207.5 2025년 12월 서비스비용',NULL,1000000,'month','2025-12-25','account','unpaid',NULL,'2025-12-02 06:28:57',NULL),(87,1,598,109,NULL,'[2548E-M106]23.125.207.6 2025년 12월 서비스비용',NULL,600000,'month','2025-12-26','account','unpaid',NULL,'2025-12-02 09:03:34',NULL),(88,1,598,109,NULL,'test.com 도메인 외 5개',NULL,500000,'onetime','2025-12-05','coupon','unpaid',NULL,'2025-12-04 23:53:44',NULL),(89,1,598,109,NULL,'[2548E-M106]23.125.207.6 2026년 03월 서비스비용',NULL,600000,'month','2026-03-05','account','unpaid',NULL,'2025-12-05 00:01:41',NULL),(90,1,598,109,NULL,'2개월 선결제처리',NULL,1200000,'prepayment','2026-01-25','account','paid',NULL,'2025-12-05 00:15:22',NULL),(91,1,598,109,NULL,'[2547D-M107]23.125.207.7 2026년 01월 서비스비용',NULL,500000,'month','2026-01-25','account','unpaid',NULL,'2025-12-05 00:33:13',NULL); /*!40000 ALTER TABLE `payment` ENABLE KEYS */; UNLOCK TABLES; @@ -652,7 +652,7 @@ CREATE TABLE `serviceinfo` ( LOCK TABLES `serviceinfo` WRITE; /*!40000 ALTER TABLE `serviceinfo` DISABLE KEYS */; -INSERT INTO `serviceinfo` VALUES (52,1,820,72,'prime_s68d4e145a474d','[2548E-M68]13.220.20.6','prime','chiba',100000,300000,'2025-09-25',100000,500000,'2025-09-25',NULL,'test1234\r\ntesst2123','available','2025-10-29 00:58:09','2025-09-25 06:29:25',NULL),(53,1,1161,18,'itsolution_s68d4e1b6','[2537B-M18]HP DL360 GEN7C','itsolution','chiba',100000,300000,'2025-11-14',0,800000,'2025-09-25',NULL,NULL,'available','2025-10-16 00:58:10','2025-09-25 06:31:18',NULL),(54,1,1087,19,'gdidc_s68d4ff1b03fab','[2528C-M19]HP DL360 GEN8D','gdidc','chiba',300000,300000,'2025-09-25',100000,1800000,'2025-09-25',NULL,NULL,'available','2025-10-16 00:58:28','2025-09-25 08:36:43',NULL),(56,1,820,22,'gdidc_s68dc70e2edb68','[2530Z-M22]HITACH HA3000','gdidc','chiba',100000,300000,'2025-10-01',0,1550000,'2025-10-01',NULL,NULL,'available','2025-10-31 03:36:49','2025-10-01 00:08:02',NULL),(57,1,819,23,'prime_s68dce40dd65df','[JPN-S23]DESKTOP I5','prime','chiba',100000,300000,'2025-10-01',100000,650000,'2025-10-01',NULL,NULL,'available','2025-10-31 03:36:20','2025-10-01 08:19:25',NULL),(58,1,711,27,'prime_s68ddf9a191864','[2548D-M27]HP DL360 GEN8D','prime','chiba',100000,300000,'2025-10-02',200000,1100000,'2025-10-02',NULL,NULL,'available','2025-10-16 01:48:27','2025-10-02 04:03:45',NULL),(59,1,1185,31,'itsolution_s68e30467','[2412E-M29]HP DL360 GEN9E','itsolution','chiba',100000,300000,'2025-10-06',0,900000,'2025-10-06',NULL,NULL,'available','2025-10-16 01:53:30','2025-10-05 23:51:03',NULL),(60,1,1186,21,'prime_s68e37906ad1bd','[2520Z-M21]HP DL360 GEN10','prime','chiba',100000,300000,'2025-10-06',0,1100000,'2025-10-06',NULL,'test / test\r\n','available','2025-10-16 01:53:52','2025-10-06 08:08:38',NULL),(61,1,1186,17,'prime_s68e37b9e918a2','[2526A-M1]HP DL360 GEN6B','prime','chiba',100000,300000,'2025-10-06',100000,1300000,'2025-10-06',NULL,NULL,'available','2025-10-16 01:54:10','2025-10-06 08:19:42',NULL),(62,1,842,63,'prime_s68ef4901c563f','[254D9-M56]HP DL360 GEN9E','prime','chiba',100000,300000,'2025-10-15',0,800000,'2025-10-15',NULL,NULL,'available','2025-10-16 07:52:10','2025-10-15 07:10:57',NULL),(63,1,842,64,'itsolution_s68ef4cbd','[2549D-M64]HP DL360 GEN9E','itsolution','chiba',100000,300000,'2025-10-15',400000,400000,'2025-10-15',NULL,NULL,'available','2025-10-16 01:54:36','2025-10-15 07:26:53',NULL),(64,1,1155,32,'gdidc_s68f1e0977ed19','[2543E-M32]HP DL360 GEN6B','gdidc','chiba',100000,300000,'2025-10-22',0,900000,'2025-10-17',NULL,'','available','2025-10-21 00:15:04','2025-10-17 06:22:15',NULL),(66,1,820,66,'gdidc_s68f8a39c1c110','[2549E-M65]HP DL360 GEN9E','gdidc','chiba',300000,300000,'2025-10-22',0,1000000,'2025-10-22',NULL,'','available','2025-10-22 09:50:41','2025-10-22 09:27:56',NULL),(71,1,820,67,'prime_s68f9b6c15cd13','[2548D-M67]HP DL360 GEN8D','prime','tokyo',100000,300000,'2025-10-25',500000,400000,'2025-10-23',NULL,NULL,'available','2025-10-23 05:01:53','2025-10-23 05:01:53',NULL),(74,1,820,25,'gdidc_s68f9b7c71552f','[2548E-M25]HP DL360 GEN8D','gdidc','chiba',100000,300000,'2025-10-23',0,1100000,'2025-10-23',NULL,NULL,'available','2025-10-28 08:01:13','2025-10-23 05:06:15',NULL),(78,1,820,26,'itsolution_s68fada54','[2547C-M26]HP DL360 GEN7C','itsolution','chiba',200000,300000,'2025-10-24',0,1000000,'2025-10-24',NULL,'','available','2025-10-28 08:00:15','2025-10-24 01:45:56',NULL),(79,1,1161,55,'prime_s68fedbddaedbd','[KCS-M33]KCS','prime','chiba',100000,300000,'2025-10-25',0,850000,'2025-10-27',NULL,NULL,'available','2025-10-28 08:21:20','2025-10-27 02:41:33',NULL),(80,1,820,73,'itsolution_s6903077c','[2548E-M73]13.220.20.16','itsolution','chiba',100000,300000,'2025-10-30',0,1000000,'2025-10-30',NULL,'','available','2025-10-30 08:14:04','2025-10-30 06:36:44',NULL),(81,1,599,105,'prime_s692e5f28c1783','[2548E-M79]23.125.207.3','prime','chiba',200000,500000,'2025-12-25',100000,1000000,'2025-12-02',NULL,NULL,'available',NULL,'2025-12-02 03:38:16',NULL),(109,1,598,107,'gdidc_s692eab6613856','[2548E-M106]23.125.207.6','gdidc','chiba',100000,300000,'2026-01-25',0,500000,'2025-12-02',NULL,NULL,'available',NULL,'2025-12-02 09:03:34',NULL); +INSERT INTO `serviceinfo` VALUES (52,1,820,72,'prime_s68d4e145a474d','[2548E-M68]13.220.20.6','prime','chiba',100000,300000,'2025-09-25',100000,500000,'2025-09-25',NULL,'test1234\r\ntesst2123','available','2025-10-29 00:58:09','2025-09-25 06:29:25',NULL),(53,1,1161,18,'itsolution_s68d4e1b6','[2537B-M18]HP DL360 GEN7C','itsolution','chiba',100000,300000,'2025-11-14',0,800000,'2025-09-25',NULL,NULL,'available','2025-10-16 00:58:10','2025-09-25 06:31:18',NULL),(54,1,1087,19,'gdidc_s68d4ff1b03fab','[2528C-M19]HP DL360 GEN8D','gdidc','chiba',300000,300000,'2025-09-25',100000,1800000,'2025-09-25',NULL,NULL,'available','2025-10-16 00:58:28','2025-09-25 08:36:43',NULL),(56,1,820,22,'gdidc_s68dc70e2edb68','[2530Z-M22]HITACH HA3000','gdidc','chiba',100000,300000,'2025-10-01',0,1550000,'2025-10-01',NULL,NULL,'available','2025-10-31 03:36:49','2025-10-01 00:08:02',NULL),(57,1,819,23,'prime_s68dce40dd65df','[JPN-S23]DESKTOP I5','prime','chiba',100000,300000,'2025-10-01',100000,650000,'2025-10-01',NULL,NULL,'available','2025-10-31 03:36:20','2025-10-01 08:19:25',NULL),(58,1,711,27,'prime_s68ddf9a191864','[2548D-M27]HP DL360 GEN8D','prime','chiba',100000,300000,'2025-10-02',200000,1100000,'2025-10-02',NULL,NULL,'available','2025-10-16 01:48:27','2025-10-02 04:03:45',NULL),(59,1,1185,31,'itsolution_s68e30467','[2412E-M29]HP DL360 GEN9E','itsolution','chiba',100000,300000,'2025-10-06',0,900000,'2025-10-06',NULL,NULL,'available','2025-10-16 01:53:30','2025-10-05 23:51:03',NULL),(60,1,1186,21,'prime_s68e37906ad1bd','[2520Z-M21]HP DL360 GEN10','prime','chiba',100000,300000,'2025-10-06',0,1100000,'2025-10-06',NULL,'test / test\r\n','available','2025-10-16 01:53:52','2025-10-06 08:08:38',NULL),(61,1,1186,17,'prime_s68e37b9e918a2','[2526A-M1]HP DL360 GEN6B','prime','chiba',100000,300000,'2025-10-06',100000,1300000,'2025-10-06',NULL,NULL,'available','2025-10-16 01:54:10','2025-10-06 08:19:42',NULL),(62,1,842,63,'prime_s68ef4901c563f','[254D9-M56]HP DL360 GEN9E','prime','chiba',100000,300000,'2025-10-15',0,800000,'2025-10-15',NULL,NULL,'available','2025-10-16 07:52:10','2025-10-15 07:10:57',NULL),(63,1,842,64,'itsolution_s68ef4cbd','[2549D-M64]HP DL360 GEN9E','itsolution','chiba',100000,300000,'2025-10-15',400000,400000,'2025-10-15',NULL,NULL,'available','2025-10-16 01:54:36','2025-10-15 07:26:53',NULL),(64,1,1155,32,'gdidc_s68f1e0977ed19','[2543E-M32]HP DL360 GEN6B','gdidc','chiba',100000,300000,'2025-10-22',0,900000,'2025-10-17',NULL,'','available','2025-10-21 00:15:04','2025-10-17 06:22:15',NULL),(66,1,820,66,'gdidc_s68f8a39c1c110','[2549E-M65]HP DL360 GEN9E','gdidc','chiba',300000,300000,'2025-10-22',0,1000000,'2025-10-22',NULL,'','available','2025-10-22 09:50:41','2025-10-22 09:27:56',NULL),(71,1,820,67,'prime_s68f9b6c15cd13','[2548D-M67]HP DL360 GEN8D','prime','tokyo',100000,300000,'2025-10-25',500000,400000,'2025-10-23',NULL,NULL,'available','2025-10-23 05:01:53','2025-10-23 05:01:53',NULL),(74,1,820,25,'gdidc_s68f9b7c71552f','[2548E-M25]HP DL360 GEN8D','gdidc','chiba',100000,300000,'2025-10-23',0,1100000,'2025-10-23',NULL,NULL,'available','2025-10-28 08:01:13','2025-10-23 05:06:15',NULL),(78,1,820,26,'itsolution_s68fada54','[2547C-M26]HP DL360 GEN7C','itsolution','chiba',200000,300000,'2025-10-24',0,1000000,'2025-10-24',NULL,'','available','2025-10-28 08:00:15','2025-10-24 01:45:56',NULL),(79,1,1161,55,'prime_s68fedbddaedbd','[KCS-M33]KCS','prime','chiba',100000,300000,'2025-10-25',0,850000,'2025-10-27',NULL,NULL,'available','2025-10-28 08:21:20','2025-10-27 02:41:33',NULL),(80,1,820,73,'itsolution_s6903077c','[2548E-M73]13.220.20.16','itsolution','chiba',100000,300000,'2025-10-30',0,1000000,'2025-10-30',NULL,'','available','2025-10-30 08:14:04','2025-10-30 06:36:44',NULL),(81,1,599,105,'prime_s692e5f28c1783','[2549E-M80]23.125.207.5','prime','chiba',200000,500000,'2025-12-25',100000,1000000,'2025-12-02',NULL,NULL,'available',NULL,'2025-12-02 03:38:16',NULL),(109,1,598,107,'gdidc_s692eab6613856','[2547D-M107]23.125.207.7','gdidc','chiba',100000,300000,'2026-01-25',0,500000,'2025-12-02',NULL,NULL,'available',NULL,'2025-12-02 09:03:34',NULL); /*!40000 ALTER TABLE `serviceinfo` ENABLE KEYS */; UNLOCK TABLES; @@ -771,4 +771,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-12-08 12:44:52 +-- Dump completed on 2025-12-08 14:34:34 diff --git a/app/Helpers/PaymentHelper.php b/app/Helpers/PaymentHelper.php index b4a85cb..10ec209 100644 --- a/app/Helpers/PaymentHelper.php +++ b/app/Helpers/PaymentHelper.php @@ -74,6 +74,9 @@ class PaymentHelper extends CommonHelper "class" => "btn btn-outline btn-warning", ]); break; + case 'onetime_paid': + $action = "getPK()}\">{$label}"; + break; default: $action = parent::getListButton($action, $label, $viewDatas, $extras); break; diff --git a/app/Language/ko/Customer/Account.php b/app/Language/ko/Customer/Account.php index 921fa11..eb88c4c 100644 --- a/app/Language/ko/Customer/Account.php +++ b/app/Language/ko/Customer/Account.php @@ -15,15 +15,9 @@ return [ 'created_at' => "작성일", 'deleted_at' => "삭제일", ], - "BANK" => [ - '국민은행' => "국민은행", - "하나은행" => "하나은행", - "신한은행" => "신한은행", - "농협" => "농협", - ], + "BANK" => [...BANKS, '결제차감' => '결제차감'], "STATUS" => [ STATUS['DEPOSIT'] => "입금", STATUS['WITHDRAWAL'] => "출금", - STATUS['PAID'] => "결제", ], ]; diff --git a/app/Services/Customer/AccountService.php b/app/Services/Customer/AccountService.php index 643af9e..e4619ec 100644 --- a/app/Services/Customer/AccountService.php +++ b/app/Services/Customer/AccountService.php @@ -2,13 +2,14 @@ namespace App\Services\Customer; -use RuntimeException; -use App\Models\Customer\AccountModel; -use App\Helpers\Customer\AccountHelper; -use App\Forms\Customer\AccountForm; -use App\Entities\Customer\AccountEntity; -use App\Entities\CommonEntity; use App\DTOs\Customer\AccountDTO; +use App\Entities\CommonEntity; +use App\Entities\Customer\AccountEntity; +use App\Entities\PaymentEntity; +use App\Forms\Customer\AccountForm; +use App\Helpers\Customer\AccountHelper; +use App\Models\Customer\AccountModel; +use RuntimeException; class AccountService extends CustomerService { @@ -118,7 +119,7 @@ class AccountService extends CustomerService protected function create_process(array $formDatas): AccountEntity { $entity = parent::create_process($formDatas); - service('customer_clientservice')->updateBalance($entity->getClientInfoUID(), 'account_balance', $entity->getAmount()); + service('customer_clientservice')->updateBalance($entity->getClientInfoUID(), "예치금", PAYMENT['PAY']['ACCOUNT'], $entity->getAmount(), $entity->getStatus()); return $entity; } protected function modify_process($entity, array $formDatas): AccountEntity diff --git a/app/Services/Customer/ClientService.php b/app/Services/Customer/ClientService.php index d6dd22c..2365191 100644 --- a/app/Services/Customer/ClientService.php +++ b/app/Services/Customer/ClientService.php @@ -110,14 +110,52 @@ class ClientService extends CustomerService $this->getFormService()->setIndexFilters($indexFilter); $this->getFormService()->setBatchjobFilters($batchjobFilters); } - final public function updateBalance(int|ClientEntity $uid, string $field, int $value): ClientEntity + final public function updateBalance(int|ClientEntity $uid, string $title, string $key, int $value, string $status): ClientEntity { $entity = is_int($uid) ? $this->getEntity($uid) : $uid; if (!$entity instanceof ClientEntity) { throw new RuntimeException(__METHOD__ . "에서 오류발생: {$uid}에 해당하는 서비스정보를 찾을수 없습니다."); } - //총 서비스금액 설정 - $formDatas = [$field => $value]; + + $calculatedValue = null; + $balance = 0; + $title = ""; + switch ($key) { + case PAYMENT['PAY']['ACCOUNT']: + $balance = $entity->getAccountBalance(); + break; + case PAYMENT['PAY']['COUPON']: + $balance = $entity->getCouponBalance(); + $title = "쿠폰"; + break; + case PAYMENT['PAY']['POINT']: + $balance = $entity->getPointBalance(); + $title = "포인트"; + break; + } + //입금,추가 처리 + if ($status === STATUS['DEPOSIT']) { + $calculatedValue = $balance - $value; + } + //출금,사용 처리 + if ($status === STATUS['WITHDRAWAL']) { + if ($balance < $value) { + throw new RuntimeException(sprintf( + "%s 에서 오류발생: 고객 %s[%s]이/가 사용한 %s 금액/수[%s] 보다 작습니다.", + __METHOD__, + $title, + number_format($balance), + $title, + number_format($value) + )); + } + $calculatedValue = $balance - $value; + } + if (!is_int($calculatedValue) || $calculatedValue < 0) { + throw new RuntimeException(__METHOD__ . "에서 {$title}의 계산결과 값이 NULL이거나 0보다 작은 값입니다."); + } + //balance 수정 + $formDatas = ["{$key}_balance" => $calculatedValue, 'status' => $status]; $fields = array_keys($formDatas); $this->getFormService()->setFormFields($fields); $this->getFormService()->setFormRules('modify', $fields); diff --git a/app/Services/Customer/CouponService.php b/app/Services/Customer/CouponService.php index 18484ff..5d2c2e5 100644 --- a/app/Services/Customer/CouponService.php +++ b/app/Services/Customer/CouponService.php @@ -108,7 +108,7 @@ class CouponService extends CustomerService protected function create_process(array $formDatas): CouponEntity { $entity = parent::create_process($formDatas); - service('customer_clientservice')->updateBalance($entity->getClientInfoUID(), 'coupon_balance', $entity->getCnt()); + service('customer_clientservice')->updateBalance($entity->getClientInfoUID(), "쿠폰", PAYMENT['PAY']['COUPON'], $entity->getCnt(), $entity->getStatus()); return $entity; } protected function modify_process($entity, array $formDatas): CouponEntity diff --git a/app/Services/Customer/PointService.php b/app/Services/Customer/PointService.php index 2fbd17d..4c772ed 100644 --- a/app/Services/Customer/PointService.php +++ b/app/Services/Customer/PointService.php @@ -109,7 +109,7 @@ class PointService extends CustomerService protected function create_process(array $formDatas): PointEntity { $entity = parent::create_process($formDatas); - service('customer_clientservice')->updateBalance($entity->getClientInfoUID(), 'point_balance', $entity->getAmount()); + service('customer_clientservice')->updateBalance($entity->getClientInfoUID(), "포인트", PAYMENT['PAY']['POINT'], $entity->getAmount(), $entity->getStatus()); return $entity; } protected function modify_process($entity, array $formDatas): PointEntity diff --git a/app/Services/PaymentService.php b/app/Services/PaymentService.php index bd60f5b..75d844b 100644 --- a/app/Services/PaymentService.php +++ b/app/Services/PaymentService.php @@ -221,7 +221,6 @@ class PaymentService extends CommonService if (!array_key_exists($serviceEntity->getPK(), $rows[$clientEntity->getPK()]['services'])) { $serverEntity = service('equipment_serverservice')->getEntity($serviceEntity->getServerInfoUID()); if (!$serverEntity instanceof ServerEntity) { - dd($serverEntity); throw new \Exception(__METHOD__ . "에서 오류발생:[{$serviceEntity->getServerInfoUID()}]에 대한 서버정보를 찾을 수 없습니다."); } $rows[$clientEntity->getPK()]['services'][$serviceEntity->getPK()] = [ @@ -242,14 +241,44 @@ class PaymentService extends CommonService } //지불 관련 - public function setPaid(PaymentEntity $entity, array $formDatas): PaymentEntity + private function paid_process(PaymentEntity $entity): PaymentEntity { + //pay방식에따른 고객 정보 처리 + $formDatas = [ + 'clientinfo_uid' => $entity->getClientInfoUID(), + 'bank' => '결제차감', + 'title' => $entity->getTitle(), + 'alias' => '결제차감', + 'issue_at' => date('Y-m-d'), + 'amount' => $entity->getAmount(), + 'status' => STATUS['WITHDRAWAL'], + ]; + switch ($entity->getPay()) { + case PAYMENT['PAY']['ACCOUNT']: + service('customer_accountservice')->create($formDatas); + break; + case PAYMENT['PAY']['COUPON']: + service('customer_couponservice')->create($formDatas); + break; + case PAYMENT['PAY']['POINT']: + service('customer_pointservice')->create($formDatas); + break; + default: + throw new RuntimeException(__METHOD__ . "에서 오류발생: {$entity->getPay()}는 지정되지 않은 지불방식입니다."); + // break; + } + return $entity; + } + public function paid($uid): PaymentEntity + { + $entity = $this->getEntity($uid); + if (!$entity instanceof PaymentEntity) { + throw new \Exception(__METHOD__ . "에서 오류발생:[{$uid}]에 대한 결제정보를 찾을 수 없습니다."); + } //결제 완료 처리 후 추가정보 처리 $formDatas['status'] = STATUS['PAID']; $entity = parent::modify_process($entity, $formDatas); - //pay방식에따른 고객 정보 처리 - service('customer_client')->setBalance($entity); - return $entity; + return $this->paid_process($entity); } //서비스관련 diff --git a/app/Views/cells/payment/detail.php b/app/Views/cells/payment/detail.php index fefe3c8..7f35c28 100644 --- a/app/Views/cells/payment/detail.php +++ b/app/Views/cells/payment/detail.php @@ -2,29 +2,38 @@
미지급 1회성정보
+ - + - - - - - + + + + + - - + + + - - - - - - - - - - + + + + + + + + + +
서비스날자항목 결제금액항목청구방식지불방법관리자결제처리청구방식지불방법결제처리등록일관리자
getFieldView('serviceinfo_uid', $entity->getServiceInfoUID(), $serviceCellDatas) ?>getFieldView('create_at', $entity->getCreatedAt(), $serviceCellDatas) ?>getFieldView('amount', $entity->getAmount(), $serviceCellDatas) ?>getFieldView('title', $entity->getTitle(), $serviceCellDatas) ?>getFieldView('billing', $entity->getBilling(), $serviceCellDatas) ?>getFieldView('pay', $entity->getPay(), $serviceCellDatas) ?>getFieldView('user_uid', $entity->getUserUID(), $serviceCellDatas) ?>
getFieldView('content', $entity->getTitle(), $serviceCellDatas) ?>getFieldView('serviceinfo_uid', $entity->getServiceInfoUID(), $paymentCellDatas) ?> + getFieldView('title', $entity->getTitle(), $paymentCellDatas) ?> +
getFieldView('content', $entity->getContent(), $paymentCellDatas) ?>
+
getFieldView('amount', $entity->getAmount(), $paymentCellDatas) ?>getFieldView('billing', $entity->getBilling(), $paymentCellDatas) ?>getFieldView('pay', $entity->getPay(), $paymentCellDatas) ?>getListButton( + 'onetime_paid', + $serverCellDatas['helper']->getFieldView('status', $entity->getStatus(), $paymentCellDatas), + $paymentCellDatas + ) ?>getFieldView('create_at', $entity->getCreatedAt(), $paymentCellDatas) ?>getFieldView('user_uid', $entity->getUserUID(), $paymentCellDatas) ?>
\ No newline at end of file