From 98865cb0558cb10fa1e309b7d92ee989f5cf0b8d Mon Sep 17 00:00:00 2001 From: Hyojin Ahn Date: Fri, 22 May 2026 09:56:08 -0400 Subject: [PATCH] =?UTF-8?q?=EC=B6=94=EA=B0=80:=20Customer=20Region=20Custo?= =?UTF-8?q?mer=20Container=20Customer=20Daily=20Install=20Customer=20Daily?= =?UTF-8?q?=20Install=20Container=20Customer=20Daily=20Order=20=EC=97=90?= =?UTF-8?q?=20Region=20=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + http/change-password.http | 45 -- http/http-test.http | 17 - http/jpa-auditing.http | 44 -- jwt-security.drawio | 517 ------------------ logs/integration-service.log | 25 - logs/integration-service.log.2026-03-19.0.gz | Bin 1695 -> 0 bytes logs/integration-service.log.2026-03-30.0.gz | Bin 1696 -> 0 bytes .../erp/config/JwtAuthenticationFilter.java | 22 +- .../CustomerContainerController.java | 93 ++++ ...stomerDailyInstallContainerController.java | 96 ++++ .../CustomerDailyInstallController.java | 99 ++++ .../controller/CustomerRegionController.java | 103 ++++ .../erp/dto/CustomerContainerRequestDto.java | 42 ++ .../erp/dto/CustomerContainerResponseDto.java | 46 ++ ...stomerDailyInstallContainerRequestDto.java | 31 ++ ...tomerDailyInstallContainerResponseDto.java | 33 ++ .../dto/CustomerDailyInstallRequestDto.java | 63 +++ .../dto/CustomerDailyInstallResponseDto.java | 46 ++ .../erp/dto/CustomerDailyOrderRequestDto.java | 14 +- .../dto/CustomerDailyOrderResponseDto.java | 6 +- .../com/goi/erp/entity/CustomerContainer.java | 84 +++ .../goi/erp/entity/CustomerDailyInstall.java | 110 ++++ .../entity/CustomerDailyInstallContainer.java | 54 ++ .../goi/erp/entity/CustomerDailyOrder.java | 3 + .../CustomerContainerRepository.java | 15 + ...stomerDailyInstallContainerRepository.java | 19 + .../CustomerDailyInstallRepository.java | 25 + .../repository/CustomerRegionRepository.java | 15 + .../erp/service/CustomerContainerService.java | 101 ++++ .../CustomerDailyInstallContainerService.java | 100 ++++ .../service/CustomerDailyInstallService.java | 96 ++++ .../service/CustomerDailyOrderService.java | 8 +- .../erp/service/CustomerRegionService.java | 97 ++++ 34 files changed, 1409 insertions(+), 663 deletions(-) delete mode 100644 http/change-password.http delete mode 100644 http/http-test.http delete mode 100644 http/jpa-auditing.http delete mode 100644 jwt-security.drawio delete mode 100644 logs/integration-service.log delete mode 100644 logs/integration-service.log.2026-03-19.0.gz delete mode 100644 logs/integration-service.log.2026-03-30.0.gz create mode 100644 src/main/java/com/goi/erp/controller/CustomerContainerController.java create mode 100644 src/main/java/com/goi/erp/controller/CustomerDailyInstallContainerController.java create mode 100644 src/main/java/com/goi/erp/controller/CustomerDailyInstallController.java create mode 100644 src/main/java/com/goi/erp/controller/CustomerRegionController.java create mode 100644 src/main/java/com/goi/erp/dto/CustomerContainerRequestDto.java create mode 100644 src/main/java/com/goi/erp/dto/CustomerContainerResponseDto.java create mode 100644 src/main/java/com/goi/erp/dto/CustomerDailyInstallContainerRequestDto.java create mode 100644 src/main/java/com/goi/erp/dto/CustomerDailyInstallContainerResponseDto.java create mode 100644 src/main/java/com/goi/erp/dto/CustomerDailyInstallRequestDto.java create mode 100644 src/main/java/com/goi/erp/dto/CustomerDailyInstallResponseDto.java create mode 100644 src/main/java/com/goi/erp/entity/CustomerContainer.java create mode 100644 src/main/java/com/goi/erp/entity/CustomerDailyInstall.java create mode 100644 src/main/java/com/goi/erp/entity/CustomerDailyInstallContainer.java create mode 100644 src/main/java/com/goi/erp/repository/CustomerContainerRepository.java create mode 100644 src/main/java/com/goi/erp/repository/CustomerDailyInstallContainerRepository.java create mode 100644 src/main/java/com/goi/erp/repository/CustomerDailyInstallRepository.java create mode 100644 src/main/java/com/goi/erp/repository/CustomerRegionRepository.java create mode 100644 src/main/java/com/goi/erp/service/CustomerContainerService.java create mode 100644 src/main/java/com/goi/erp/service/CustomerDailyInstallContainerService.java create mode 100644 src/main/java/com/goi/erp/service/CustomerDailyInstallService.java create mode 100644 src/main/java/com/goi/erp/service/CustomerRegionService.java diff --git a/.gitignore b/.gitignore index 549e00a..c12e8ef 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,6 @@ build/ ### VS Code ### .vscode/ +/http/ +/logs/ +/jwt-security.drawio diff --git a/http/change-password.http b/http/change-password.http deleted file mode 100644 index 66f47d2..0000000 --- a/http/change-password.http +++ /dev/null @@ -1,45 +0,0 @@ -### Register User -POST http://localhost:8080/api/v1/auth/register -Content-Type: application/json - -{ - "firstname": "Ali", - "lastname": "Bouali", - "email": "alibou@mail.com", - "password": "password", - "role": "ADMIN" -} - -> {% client.global.set("auth-token", response.body.access_token); %} - -### Query the Demo endpoint -GET http://localhost:8080/api/v1/demo-controller -Authorization: Bearer {{auth-token}} - - -### Change the password -PATCH http://localhost:8080/api/v1/users -Content-Type: application/json -Authorization: Bearer {{auth-token}} - -{ - "currentPassword": "password", - "newPassword": "newPassword", - "confirmationPassword": "newPassword" -} - -### Login again and update the token -POST http://localhost:8080/api/v1/auth/authenticate -Content-Type: application/json - -{ - "email": "alibou@mail.com", - "password": "newPassword" -} - -> {% client.global.set("new-auth-token", response.body.access_token); %} - - -### Query the Demo endpoint after password change -GET http://localhost:8080/api/v1/demo-controller -Authorization: Bearer {{new-auth-token}} diff --git a/http/http-test.http b/http/http-test.http deleted file mode 100644 index 918cb2e..0000000 --- a/http/http-test.http +++ /dev/null @@ -1,17 +0,0 @@ -### Register User -POST http://localhost:8080/api/v1/auth/register -Content-Type: application/json - -{ - "firstname": "Ali", - "lastname": "Bouali", - "email": "alibou21@mail.com", - "password": "password", - "role": "ADMIN" -} - -> {% client.global.set("auth-token", response.body.access_token); %} - -### Query the Demo endpoint -GET http://localhost:8080/api/v1/demo-controller -Authorization: Bearer {{auth-token}} diff --git a/http/jpa-auditing.http b/http/jpa-auditing.http deleted file mode 100644 index a8245bb..0000000 --- a/http/jpa-auditing.http +++ /dev/null @@ -1,44 +0,0 @@ -### Register User -POST http://localhost:8080/api/v1/auth/register -Content-Type: application/json - -{ - "firstname": "Ali", - "lastname": "Bouali", - "email": "alibou@mail.com", - "password": "password", - "role": "ADMIN" -} - -> {% client.global.set("auth-token", response.body.access_token); %} - - -###Create a new book -POST http://localhost:8080/api/v1/books -Authorization: Bearer {{auth-token}} -Content-Type: application/json - -{ - "author": "Alibou", - "isbn": "12345" -} - -### Query Books -GET http://localhost:8080/api/v1/books -Authorization: Bearer {{auth-token}} - -### Update one book -POST http://localhost:8080/api/v1/books -Authorization: Bearer {{auth-token}} -Content-Type: application/json - -{ - "id": 1, - "author": "Alibou 2", - "isbn": "12345" -} - - -### Query the Books one more time -GET http://localhost:8080/api/v1/books -Authorization: Bearer {{auth-token}} diff --git a/jwt-security.drawio b/jwt-security.drawio deleted file mode 100644 index 75c044a..0000000 --- a/jwt-security.drawio +++ /dev/null @@ -1,517 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/logs/integration-service.log b/logs/integration-service.log deleted file mode 100644 index 02a4341..0000000 --- a/logs/integration-service.log +++ /dev/null @@ -1,25 +0,0 @@ -2026-05-20T08:25:45.241-04:00 INFO 5596 --- [main] com.goi.erp.SecurityApplication : Starting SecurityApplication using Java 17.0.16 with PID 5596 (D:\workspace-eclipse\crm-rest-api\target\classes started by Hyojin Ahn in D:\workspace-eclipse\crm-rest-api) -2026-05-20T08:25:45.246-04:00 INFO 5596 --- [main] com.goi.erp.SecurityApplication : The following 1 profile is active: "default" -2026-05-20T08:25:45.694-04:00 INFO 5596 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2026-05-20T08:25:45.786-04:00 INFO 5596 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 87 ms. Found 3 JPA repository interfaces. -2026-05-20T08:25:46.383-04:00 INFO 5596 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8082 (http) -2026-05-20T08:25:46.389-04:00 INFO 5596 --- [main] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2026-05-20T08:25:46.389-04:00 INFO 5596 --- [main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.13] -2026-05-20T08:25:46.457-04:00 INFO 5596 --- [main] o.a.c.c.C.[.[localhost].[/crm-rest-api] : Initializing Spring embedded WebApplicationContext -2026-05-20T08:25:46.457-04:00 INFO 5596 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1173 ms -2026-05-20T08:25:46.602-04:00 INFO 5596 --- [main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2026-05-20T08:25:46.632-04:00 INFO 5596 --- [main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.2.9.Final -2026-05-20T08:25:46.635-04:00 INFO 5596 --- [main] org.hibernate.cfg.Environment : HHH000406: Using bytecode reflection optimizer -2026-05-20T08:25:46.716-04:00 INFO 5596 --- [main] o.h.b.i.BytecodeProviderInitiator : HHH000021: Bytecode provider name : bytebuddy -2026-05-20T08:25:46.783-04:00 INFO 5596 --- [main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer -2026-05-20T08:25:46.793-04:00 INFO 5596 --- [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2026-05-20T08:25:46.891-04:00 INFO 5596 --- [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@674e4c82 -2026-05-20T08:25:46.892-04:00 INFO 5596 --- [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2026-05-20T08:25:47.044-04:00 INFO 5596 --- [main] o.h.b.i.BytecodeProviderInitiator : HHH000021: Bytecode provider name : bytebuddy -2026-05-20T08:25:47.499-04:00 INFO 5596 --- [main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] -2026-05-20T08:25:47.549-04:00 INFO 5596 --- [main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2026-05-20T08:25:47.931-04:00 WARN 5596 --- [main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning -2026-05-20T08:25:48.177-04:00 INFO 5596 --- [main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint(s) beneath base path '/actuator' -2026-05-20T08:25:48.210-04:00 INFO 5596 --- [main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@466fd19b, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@348d1a5e, org.springframework.security.web.context.SecurityContextHolderFilter@3fc92211, org.springframework.security.web.header.HeaderWriterFilter@227ae4e4, org.springframework.security.web.authentication.logout.LogoutFilter@3ae5cbb9, org.springframework.web.filter.CorsFilter@7f746160, com.goi.erp.config.JwtAuthenticationFilter@16ea0f22, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@117bfeb8, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@31aec04a, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@17524c36, org.springframework.security.web.session.SessionManagementFilter@440309c5, org.springframework.security.web.access.ExceptionTranslationFilter@1b2213b2, org.springframework.security.web.access.intercept.AuthorizationFilter@24e0bdb] -2026-05-20T08:25:48.496-04:00 INFO 5596 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8082 (http) with context path '/crm-rest-api' -2026-05-20T08:25:48.505-04:00 INFO 5596 --- [main] com.goi.erp.SecurityApplication : Started SecurityApplication in 3.548 seconds (process running for 3.992) diff --git a/logs/integration-service.log.2026-03-19.0.gz b/logs/integration-service.log.2026-03-19.0.gz deleted file mode 100644 index 7e30c440ae0d37b88d186c8a963d02504494d477..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1695 zcmV;Q24MLgiwFP!00000|GijEZ`(K!y)V%JKokqK1!`7bwk)6O<^xHPwn36^4rvdR zG_sk>q)Jk8++V*#N>1!nu9DsE<|0R;W*%qWycsI+g3-VW2YzztB@^GDggy;?ycJD6 zkC5XJhaX8025~?Jg8{i-FfP83OfKk5atf-V7m(G8o7J?cN}e&pr6Biz6LMjgGF;3^ z*ScEUCnxNd5kICL^+#mM&77Pa@3&50?oU21rTVHXmcanBl2;l&XKFD}pv{0){4+Y3 zf%%-3Ol#0YTZfR7bVZI<@`ejCoeP4OUQ4f@{SkCUBk+G)G%n{r3R#wNX*ceZO38wk zK)5C>GyE1NC2IXX$Ee!)9UM+SonDfK%z<`;i-*x~19!*;*KW!T+9pWJX(^6$6-N9jr`^HRT>kg+#LTF;HCI{AiZqMi&(%8x>di;zrFPDGl72e~4*` zbjfJD?|XLqY#uS4V+nTqo;+})N%k2i&9woM!6!s{EDA}k1zTWxTlw0N z&*8Wanwo8Z`^);-l+aBvZJ^;Q2Cq^y|H z198ih6blfh6OuQYkWVg9>B>Ncf{A)ml#sbZ%F6HsDue3AGm3lFXpU;c>ATi8=H-^> zpc;OoG?hX{D?<-TB9=VI{Bp0$) zP9xhmxd&%bmII#*?zM~39UWsFg-`Wep>g`)hwSn_b#jzRA=Y$3`e83KGZeFLCB4bh zjGoQ*?iaj`{n0SZVYCZs51syHm>zU#N34>hUyc4ZK8G|4hy8GX8pmi(PYgRNnXyFt z5zl?OC*Hc;H&zpF!(t`E$v5`BZ5?UaA$2roE|K)cFj}>*KWOp?xnZ?aR&i6~QM+W(>( zogJ5ad8~|E8 z)Xv=~z}OaElN@QCq8IY51~=L+*ovfJcjMG1Cwc9p$k|gMkXqIiIk>YenwxTEtJ9%@ zoj8mnIoB2lF>?g9WXcY!U4eT}StbhBqeNkl1i zbGU$Z9gdy2K>-ZMP`C5S{(A8SQ(0R&ccu$bB|WD=i%L60`%RqJho3`UB6s)ZxT-~U z#mf@4KC>ZXVufMF=xfuA#;!1$Ko$yX*q+j;Zf!aH+KwGqAp1>74}>lJPpWJjy$#1f z66Qhpn)F)An&FDJ04UQdkx@H<*&i**k8#bcp<3&~2MFUVW>4_24n{l99mx`jv<3`C z?2V%I5$5K=@I89uE?0Q_-bgeWWnq%TBaE=x%u$Hi0h5+;CTnBoJiN5lhF%yKQQ~)7 zvqlQHknTyP*9ek0%vn~v-Z}y|#X(P&X1e9JeW@5GISZplpw>7cCPlXh#g{*aF5QbSA1&{`hLfvrx zqPaE{wQXe`fVjwqi1INIGdsW2gS!kW3+B@Ho^lgcG|q-2g!Xu2u1#5c)NT}qxbIv0 zWNDGGc+}apA{vf+KCL|c;JyC*gI%KQ$lWMTTcc|s+&n4n5W_He#1!?EPh$4NM#nN# pOzh@yXvI>BT$7hobLt|hZa#O|&KuGs7`=M-$KNmraS6Q>008VUISBv& diff --git a/logs/integration-service.log.2026-03-30.0.gz b/logs/integration-service.log.2026-03-30.0.gz deleted file mode 100644 index 0364b6bf7852d10965b29cb576de4db90df1561c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1696 zcmV;R24DFfiwFP!00000|GijEZ`(K!y%*?zAc_Ur0`*jqZTaI=Hy=oXZZ}BM%^~f9 zlEyYunN&$Cj{EC(NJ)v^%65wFZZ2{pa^`8~&6}a3Ac{Ldx6=)-g5fv}#=Q{)!$BwL zje~%((~rl0u|c;Vu}-JMZWdg~FDz9Hm?;6M3%JCz)WWVNMUjh?TcIR-_#3lJ%e579 z#@g1E#yvUXcbtU-2q28vQrI~=KRv8`zB(L#UMl_76gbz(58XQnCBhnVAxTO=^= zm9oZaUKBn%g?5)iZaF(UpD^9*7Zg($y`$sFrw>at}_Qkq_|mkroMSo!Ta)`cs`OdA@Qe**LOKuhW_E0-AufRI!L*W*Y2RQf^sQjk4@N@Nea(TM2YjxP>(<5Msf32I3-2Db$V zUmKF=P+F102Q@pvyr`&ra&i&`K}6QrxmHv?UZ~Ge8(}QU6h9HjQ#n=aM)C#awwA3e z$&7n@lBs8F*#35I)|GQzLn~yxFruH$4))i@pUm-*-PK!Th+qUHBRt=RXiuy*5T(-@ z9LYPOm0X~-t%!nn%s%-rB`b?5=_KjUG{@9uQ59A!ND_2AoI!UV+vlW00^ZlADJgd% zLtRmulrDQ;_v+a9yR6eE7t-}{Kd78OI2zw zjdhg#gL9?wPRKeBngy_>O^l-b6VayYf^5U18@A2$#LG~sq->}{)T91oXCz|Za=6Ws z6wYS{4-4MKgC6$MVYChD?&ST;AU*0)YotP&9rrcV|BuQc^!vMq5{CxCdNK<*v-~{g z)^YGhI1hC`3Yt1!Tg`+Eiqi%!+SKbd1*B?$;2F++7U9-%DC+HxQv6Y^S#4F*5aM8W z8QhYVQ$KVKh5ko+D}tyS>;+{!pu;N4%{k{-X8z1HB+T^qa9ruNF4iVl8oA| zIU`fQ5Dt_!^`60W(2K)3c(ZZZtx5yVmUgn?w%!!R$b)GVJps0%$slVobx~ap+*x5l z#e|K$aF9$f89v2cHG|UupglX@Z0)BBOUN+|di>XeJdsMS7OFJuQ5f{2UfPYHgt{XC zWp%AM>Uv7U{$9`xMrr>k5K}j^!_j?;g#&Zt8c)7~D create( + @RequestBody CustomerContainerRequestDto dto + ) { + + if (!PermissionChecker.canCreateCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + return new ResponseEntity<>( + service.create(dto), + HttpStatus.CREATED + ); + } + + @GetMapping("/customer/{customerId}") + public ResponseEntity> getByCustomerId( + @PathVariable Long customerId + ) { + + if (!PermissionChecker.canReadCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + return ResponseEntity.ok(service.getByCustomerId(customerId)); + } + + @PatchMapping("/{id}") + public ResponseEntity update( + @PathVariable Long id, + @RequestBody CustomerContainerRequestDto dto + ) { + + if (!PermissionChecker.canUpdateCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + return ResponseEntity.ok(service.update(id, dto)); + } + + @DeleteMapping("/{id}") + public ResponseEntity delete(@PathVariable Long id) { + + if (!PermissionChecker.canDeleteCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + service.delete(id); + + return ResponseEntity.noContent().build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/controller/CustomerDailyInstallContainerController.java b/src/main/java/com/goi/erp/controller/CustomerDailyInstallContainerController.java new file mode 100644 index 0000000..19c30e5 --- /dev/null +++ b/src/main/java/com/goi/erp/controller/CustomerDailyInstallContainerController.java @@ -0,0 +1,96 @@ +package com.goi.erp.controller; + +import com.goi.erp.common.permission.PermissionChecker; +import com.goi.erp.common.permission.PermissionSet; +import com.goi.erp.dto.CustomerDailyInstallContainerRequestDto; +import com.goi.erp.dto.CustomerDailyInstallContainerResponseDto; +import com.goi.erp.service.CustomerDailyInstallContainerService; +import com.goi.erp.token.PermissionAuthenticationToken; + +import lombok.RequiredArgsConstructor; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.core.context.SecurityContextHolder; + +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/customer-daily-install-container") +@RequiredArgsConstructor +public class CustomerDailyInstallContainerController { + + private final CustomerDailyInstallContainerService service; + + private PermissionSet getPermission() { + + PermissionAuthenticationToken auth = + (PermissionAuthenticationToken) + SecurityContextHolder.getContext().getAuthentication(); + + if (auth == null || auth.getPermissionSet() == null) { + throw new AccessDeniedException("Permission missing"); + } + + return auth.getPermissionSet(); + } + + @PostMapping + public ResponseEntity create( + @RequestBody CustomerDailyInstallContainerRequestDto dto + ) { + + if (!PermissionChecker.canCreateCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + return new ResponseEntity<>( + service.create(dto), + HttpStatus.CREATED + ); + } + + @GetMapping("/daily-install/{dailyInstallId}") + public ResponseEntity> + getByDailyInstallId( + @PathVariable Long dailyInstallId + ) { + + if (!PermissionChecker.canReadCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + return ResponseEntity.ok( + service.getByDailyInstallId(dailyInstallId) + ); + } + + @PatchMapping("/{id}") + public ResponseEntity update( + @PathVariable Long id, + @RequestBody CustomerDailyInstallContainerRequestDto dto + ) { + + if (!PermissionChecker.canUpdateCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + return ResponseEntity.ok(service.update(id, dto)); + } + + @DeleteMapping("/{id}") + public ResponseEntity delete(@PathVariable Long id) { + + if (!PermissionChecker.canDeleteCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + service.delete(id); + + return ResponseEntity.noContent().build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/controller/CustomerDailyInstallController.java b/src/main/java/com/goi/erp/controller/CustomerDailyInstallController.java new file mode 100644 index 0000000..6cff7a9 --- /dev/null +++ b/src/main/java/com/goi/erp/controller/CustomerDailyInstallController.java @@ -0,0 +1,99 @@ +package com.goi.erp.controller; + +import com.goi.erp.common.permission.PermissionChecker; +import com.goi.erp.common.permission.PermissionSet; +import com.goi.erp.dto.CustomerDailyInstallRequestDto; +import com.goi.erp.dto.CustomerDailyInstallResponseDto; +import com.goi.erp.service.CustomerDailyInstallService; +import com.goi.erp.token.PermissionAuthenticationToken; + +import lombok.RequiredArgsConstructor; + +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.core.context.SecurityContextHolder; + +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; +import java.util.List; + +@RestController +@RequestMapping("/customer-daily-install") +@RequiredArgsConstructor +public class CustomerDailyInstallController { + + private final CustomerDailyInstallService service; + + private PermissionSet getPermission() { + + PermissionAuthenticationToken auth = + (PermissionAuthenticationToken) + SecurityContextHolder.getContext().getAuthentication(); + + if (auth == null || auth.getPermissionSet() == null) { + throw new AccessDeniedException("Permission missing"); + } + + return auth.getPermissionSet(); + } + + @PostMapping + public ResponseEntity create( + @RequestBody CustomerDailyInstallRequestDto dto + ) { + + if (!PermissionChecker.canCreateCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + return new ResponseEntity<>( + service.create(dto), + HttpStatus.CREATED + ); + } + + @GetMapping("/date/{installDate}") + public ResponseEntity> getByInstallDate( + @PathVariable + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) + LocalDate installDate + ) { + + if (!PermissionChecker.canReadCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + return ResponseEntity.ok( + service.getByInstallDate(installDate) + ); + } + + @PatchMapping("/{id}") + public ResponseEntity update( + @PathVariable Long id, + @RequestBody CustomerDailyInstallRequestDto dto + ) { + + if (!PermissionChecker.canUpdateCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + return ResponseEntity.ok(service.update(id, dto)); + } + + @DeleteMapping("/{id}") + public ResponseEntity delete(@PathVariable Long id) { + + if (!PermissionChecker.canDeleteCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + service.delete(id); + + return ResponseEntity.noContent().build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/controller/CustomerRegionController.java b/src/main/java/com/goi/erp/controller/CustomerRegionController.java new file mode 100644 index 0000000..cd77c02 --- /dev/null +++ b/src/main/java/com/goi/erp/controller/CustomerRegionController.java @@ -0,0 +1,103 @@ +package com.goi.erp.controller; + +import com.goi.erp.common.permission.PermissionChecker; +import com.goi.erp.common.permission.PermissionSet; +import com.goi.erp.dto.CustomerRegionRequestDto; +import com.goi.erp.dto.CustomerRegionResponseDto; +import com.goi.erp.service.CustomerRegionService; +import com.goi.erp.token.PermissionAuthenticationToken; + +import lombok.RequiredArgsConstructor; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.core.context.SecurityContextHolder; + +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/customer-region") +@RequiredArgsConstructor +public class CustomerRegionController { + + private final CustomerRegionService service; + + private PermissionSet getPermission() { + + PermissionAuthenticationToken auth = + (PermissionAuthenticationToken) + SecurityContextHolder.getContext().getAuthentication(); + + if (auth == null || auth.getPermissionSet() == null) { + throw new AccessDeniedException("Permission information is missing"); + } + + return auth.getPermissionSet(); + } + + @PostMapping + public ResponseEntity create( + @RequestBody CustomerRegionRequestDto dto + ) { + + if (!PermissionChecker.canCreateCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + return new ResponseEntity<>( + service.create(dto), + HttpStatus.CREATED + ); + } + + @GetMapping + public ResponseEntity> getAll() { + + if (!PermissionChecker.canReadCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + return ResponseEntity.ok(service.getAll()); + } + + @GetMapping("/{id}") + public ResponseEntity getById( + @PathVariable Long id + ) { + + if (!PermissionChecker.canReadCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + return ResponseEntity.ok(service.getById(id)); + } + + @PatchMapping("/{id}") + public ResponseEntity update( + @PathVariable Long id, + @RequestBody CustomerRegionRequestDto dto + ) { + + if (!PermissionChecker.canUpdateCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + return ResponseEntity.ok(service.update(id, dto)); + } + + @DeleteMapping("/{id}") + public ResponseEntity delete(@PathVariable Long id) { + + if (!PermissionChecker.canDeleteCRM(getPermission())) { + throw new AccessDeniedException("No permission"); + } + + service.delete(id); + + return ResponseEntity.noContent().build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/dto/CustomerContainerRequestDto.java b/src/main/java/com/goi/erp/dto/CustomerContainerRequestDto.java new file mode 100644 index 0000000..bbd13fa --- /dev/null +++ b/src/main/java/com/goi/erp/dto/CustomerContainerRequestDto.java @@ -0,0 +1,42 @@ +package com.goi.erp.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CustomerContainerRequestDto { + + private Long ccoCustomerId; + + private String ccoType; + private Integer ccoCapacity; + + private String ccoOwnerType; + private String ccoIsUsed; + + private String ccoHasLock; + private String ccoHasWheel; + private String ccoHasWoodframe; + + private String ccoStatus; + + private String ccoCreateddate; + private String ccoUpdateddate; + + private String ccoInstallNote; + private String ccoPickupNote; + + private LocalDate ccoInstallDate; + private LocalDate ccoPickupDate; + + private LocalDateTime ccoInstallAt; + private LocalDateTime ccoPickupAt; +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/dto/CustomerContainerResponseDto.java b/src/main/java/com/goi/erp/dto/CustomerContainerResponseDto.java new file mode 100644 index 0000000..d346175 --- /dev/null +++ b/src/main/java/com/goi/erp/dto/CustomerContainerResponseDto.java @@ -0,0 +1,46 @@ +package com.goi.erp.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CustomerContainerResponseDto { + + private Long ccoId; + + private Long ccoCustomerId; + + private String ccoType; + private Integer ccoCapacity; + + private String ccoOwnerType; + private String ccoIsUsed; + + private String ccoHasLock; + private String ccoHasWheel; + private String ccoHasWoodframe; + + private String ccoStatus; + + private String ccoCreateddate; + private String ccoUpdateddate; + + private String ccoInstallNote; + private String ccoPickupNote; + + private LocalDate ccoInstallDate; + private LocalDate ccoPickupDate; + + private LocalDateTime ccoInstallAt; + private LocalDateTime ccoPickupAt; + + private LocalDateTime ccoModifiedAt; +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/dto/CustomerDailyInstallContainerRequestDto.java b/src/main/java/com/goi/erp/dto/CustomerDailyInstallContainerRequestDto.java new file mode 100644 index 0000000..c4328b9 --- /dev/null +++ b/src/main/java/com/goi/erp/dto/CustomerDailyInstallContainerRequestDto.java @@ -0,0 +1,31 @@ +package com.goi.erp.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CustomerDailyInstallContainerRequestDto { + + private Long cdicDailyInstallId; + + private String cdicAction; + + private String cdicType; + + private Integer cdicCapacity; + + private String cdicIsUsed; + + private String cdicHasLock; + + private String cdicHasWheel; + + private String cdicHasWoodframe; + + private String cdicOwnerType; +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/dto/CustomerDailyInstallContainerResponseDto.java b/src/main/java/com/goi/erp/dto/CustomerDailyInstallContainerResponseDto.java new file mode 100644 index 0000000..70ddbc9 --- /dev/null +++ b/src/main/java/com/goi/erp/dto/CustomerDailyInstallContainerResponseDto.java @@ -0,0 +1,33 @@ +package com.goi.erp.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CustomerDailyInstallContainerResponseDto { + + private Long cdicId; + + private Long cdicDailyInstallId; + + private String cdicAction; + + private String cdicType; + + private Integer cdicCapacity; + + private String cdicIsUsed; + + private String cdicHasLock; + + private String cdicHasWheel; + + private String cdicHasWoodframe; + + private String cdicOwnerType; +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/dto/CustomerDailyInstallRequestDto.java b/src/main/java/com/goi/erp/dto/CustomerDailyInstallRequestDto.java new file mode 100644 index 0000000..65a7e4a --- /dev/null +++ b/src/main/java/com/goi/erp/dto/CustomerDailyInstallRequestDto.java @@ -0,0 +1,63 @@ +package com.goi.erp.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CustomerDailyInstallRequestDto { + + private Integer cdiOrderSeq; + + private Long cdiDriverId; + + private LocalDate cdiInstallDate; + + private LocalTime cdiInstallTime; + + private Long cdiCustomerId; + + private String cdiAccountNo; + + private String cdiCustomerName; + + private String cdiPhone; + + private String cdiAddress; + + private String cdiCity; + + private String cdiPostalCode; + + private BigDecimal cdiGeoLat; + + private BigDecimal cdiGeoLon; + + private Long cdiCustomerDriverId; + + private String cdiWorkType; + + private Integer cdiOilPickup; + + private Integer cdiSludge; + + private String cdiRequestNote; + + private String cdiWorkNote; + + private String cdiInstallNote; + + private String cdiCsNote; + + private String cdiStatus; + + private String cdiCreatedBy; +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/dto/CustomerDailyInstallResponseDto.java b/src/main/java/com/goi/erp/dto/CustomerDailyInstallResponseDto.java new file mode 100644 index 0000000..9b9d3e1 --- /dev/null +++ b/src/main/java/com/goi/erp/dto/CustomerDailyInstallResponseDto.java @@ -0,0 +1,46 @@ +package com.goi.erp.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.UUID; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CustomerDailyInstallResponseDto { + + private UUID cdiUuid; // UUID + private Integer cdiOrderSeq; + private Long cdiDriverId; + private LocalDate cdiInstallDate; + private LocalTime cdiInstallTime; + private Long cdiCustomerId; + private String cdiAccountNo; + private String cdiCustomerName; + private String cdiPhone; + private String cdiAddress; + private String cdiCity; + private String cdiPostalCode; + private BigDecimal cdiGeoLat; + private BigDecimal cdiGeoLon; + private Long cdiCustomerDriverId; + private String cdiWorkType; + private Integer cdiOilPickup; + private Integer cdiSludge; + private String cdiRequestNote; + private String cdiWorkNote; + private String cdiInstallNote; + private String cdiCsNote; + private String cdiStatus; + private String cdiCreatedBy; + private LocalDateTime cdiCreatedAt; + private LocalDateTime cdiUpdatedAt; +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/dto/CustomerDailyOrderRequestDto.java b/src/main/java/com/goi/erp/dto/CustomerDailyOrderRequestDto.java index 2e7c670..3845949 100644 --- a/src/main/java/com/goi/erp/dto/CustomerDailyOrderRequestDto.java +++ b/src/main/java/com/goi/erp/dto/CustomerDailyOrderRequestDto.java @@ -12,14 +12,16 @@ import java.util.UUID; @NoArgsConstructor public class CustomerDailyOrderRequestDto { - private LocalDate cdoOrderDate; // 주문 날짜 (YYYY-MM-DD) - private String cdoOrderType; // 주문 타입 ('N' 등) - private String cdoRequestNote; // 주문 요청 메모 + private LocalDate cdoOrderDate; // 주문 날짜 (YYYY-MM-DD) + private String cdoJobType; // UCO | INSTALL + private String cdoOrderType; // 주문 타입 ('N' 등) + private String cdoRequestNote; // 주문 요청 메모 private String cdoExternalDriverId; // MIS 에서 driverId 로 호출해서 employee_external_map 참조해야함 private String cdoExternalCreatedBy; // MIS 에서 memberId 로 호출해서 employee_external_map 참조해야함 - private Long cdoDriverId; // 배정된 driver id - private UUID cdoDriverUuid; // ERP 에서는 uuid 로 호출 - private Long cdoCustomerId; // 고객 ID + private Long cdoRegionId; // 배정 지역 + private Long cdoDriverId; // 배정된 driver id + private UUID cdoDriverUuid; // ERP 에서는 uuid 로 호출 + private Long cdoCustomerId; // 고객 ID private String cdoCustomerNo; private UUID cdoCustomerUuid; private String cdoPaymentType; // 결제 타입 diff --git a/src/main/java/com/goi/erp/dto/CustomerDailyOrderResponseDto.java b/src/main/java/com/goi/erp/dto/CustomerDailyOrderResponseDto.java index 4611fe7..69aa68a 100644 --- a/src/main/java/com/goi/erp/dto/CustomerDailyOrderResponseDto.java +++ b/src/main/java/com/goi/erp/dto/CustomerDailyOrderResponseDto.java @@ -17,10 +17,12 @@ import java.util.UUID; public class CustomerDailyOrderResponseDto { private UUID cdoUuid; // UUID - private LocalDate cdoOrderDate; // YYYYMMDD + private LocalDate cdoOrderDate; // YYYYMMDD + private String cdoJobType; // UCO | INSTALL private String cdoOrderType; // 주문 타입 private String cdoRequestNote; // 요청 메모 - //private Long cdoDriverId; // Driver ID + private Long cdoRegionId; // 지역 ID + private Long cdoDriverId; // Driver ID //private Long cdoCustomerId; // private String cdoCustomerNo; private String cdoPaymentType; // 결제 방식 diff --git a/src/main/java/com/goi/erp/entity/CustomerContainer.java b/src/main/java/com/goi/erp/entity/CustomerContainer.java new file mode 100644 index 0000000..253276d --- /dev/null +++ b/src/main/java/com/goi/erp/entity/CustomerContainer.java @@ -0,0 +1,84 @@ +package com.goi.erp.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Entity +@Table(schema = "crm", name = "customer_container") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CustomerContainer { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "cco_id") + private Long ccoId; + + @Column(name = "cco_customer_id", nullable = false) + private Long ccoCustomerId; + + @Column(name = "cco_type", nullable = false, length = 10) + private String ccoType; + + @Column(name = "cco_capacity") + private Integer ccoCapacity; + + @Column(name = "cco_owner_type", length = 1) + private String ccoOwnerType; + + @Column(name = "cco_is_used", length = 1) + private String ccoIsUsed; + + @Column(name = "cco_has_lock", length = 1) + private String ccoHasLock; + + @Column(name = "cco_has_wheel", length = 1) + private String ccoHasWheel; + + @Column(name = "cco_has_woodframe", length = 1) + private String ccoHasWoodframe; + + @Column(name = "cco_status", length = 1) + private String ccoStatus; + + @Column(name = "cco_createddate", length = 14) + private String ccoCreateddate; + + @Column(name = "cco_updateddate", length = 14) + private String ccoUpdateddate; + + @Column(name = "cco_install_note", length = 500) + private String ccoInstallNote; + + @Column(name = "cco_pickup_note", length = 500) + private String ccoPickupNote; + + @Column(name = "cco_install_date") + private LocalDate ccoInstallDate; + + @Column(name = "cco_pickup_date") + private LocalDate ccoPickupDate; + + @Column(name = "cco_install_at") + private LocalDateTime ccoInstallAt; + + @Column(name = "cco_pickup_at") + private LocalDateTime ccoPickupAt; + + @Column(name = "cco_modified_at") + private LocalDateTime ccoModifiedAt; +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/entity/CustomerDailyInstall.java b/src/main/java/com/goi/erp/entity/CustomerDailyInstall.java new file mode 100644 index 0000000..f2fb040 --- /dev/null +++ b/src/main/java/com/goi/erp/entity/CustomerDailyInstall.java @@ -0,0 +1,110 @@ +package com.goi.erp.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.UUID; + +@Entity +@Table(schema = "crm", name = "customer_daily_install") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CustomerDailyInstall { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "cdi_id") + private Long cdiId; + + private UUID cdiUuid; + + @Column(name = "cdi_order_seq", nullable = false) + private Integer cdiOrderSeq; + + @Column(name = "cdi_driver_id", nullable = false) + private Long cdiDriverId; + + @Column(name = "cdi_install_date", nullable = false) + private LocalDate cdiInstallDate; + + @Column(name = "cdi_install_time") + private LocalTime cdiInstallTime; + + @Column(name = "cdi_customer_id", nullable = false) + private Long cdiCustomerId; + + @Column(name = "cdi_account_no", length = 20) + private String cdiAccountNo; + + @Column(name = "cdi_customer_name", length = 100) + private String cdiCustomerName; + + @Column(name = "cdi_phone", length = 50) + private String cdiPhone; + + @Column(name = "cdi_address", length = 200) + private String cdiAddress; + + @Column(name = "cdi_city", length = 50) + private String cdiCity; + + @Column(name = "cdi_postal_code", length = 20) + private String cdiPostalCode; + + @Column(name = "cdi_geo_lat", precision = 10, scale = 8) + private BigDecimal cdiGeoLat; + + @Column(name = "cdi_geo_lon", precision = 11, scale = 8) + private BigDecimal cdiGeoLon; + + @Column(name = "cdi_customer_driver_id") + private Long cdiCustomerDriverId; + + @Column(name = "cdi_work_type", length = 10) + private String cdiWorkType; + + @Column(name = "cdi_oil_pickup") + private Integer cdiOilPickup; + + @Column(name = "cdi_sludge") + private Integer cdiSludge; + + @Column(name = "cdi_request_note") + private String cdiRequestNote; + + @Column(name = "cdi_work_note") + private String cdiWorkNote; + + @Column(name = "cdi_install_note") + private String cdiInstallNote; + + @Column(name = "cdi_cs_note") + private String cdiCsNote; + + @Column(name = "cdi_status", length = 1) + private String cdiStatus; + + @Column(name = "cdi_created_by", length = 50) + private String cdiCreatedBy; + + @Column(name = "cdi_created_at") + private LocalDateTime cdiCreatedAt; + + @Column(name = "cdi_updated_at") + private LocalDateTime cdiUpdatedAt; +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/entity/CustomerDailyInstallContainer.java b/src/main/java/com/goi/erp/entity/CustomerDailyInstallContainer.java new file mode 100644 index 0000000..a868226 --- /dev/null +++ b/src/main/java/com/goi/erp/entity/CustomerDailyInstallContainer.java @@ -0,0 +1,54 @@ +package com.goi.erp.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Table(schema = "crm", name = "customer_daily_install_container") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CustomerDailyInstallContainer { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "cdic_id") + private Long cdicId; + + @Column(name = "cdic_daily_install_id", nullable = false) + private Long cdicDailyInstallId; + + @Column(name = "cdic_action", nullable = false, length = 10) + private String cdicAction; + + @Column(name = "cdic_type", nullable = false, length = 10) + private String cdicType; + + @Column(name = "cdic_capacity") + private Integer cdicCapacity; + + @Column(name = "cdic_is_used", length = 1) + private String cdicIsUsed; + + @Column(name = "cdic_has_lock", length = 1) + private String cdicHasLock; + + @Column(name = "cdic_has_wheel", length = 1) + private String cdicHasWheel; + + @Column(name = "cdic_has_woodframe", length = 1) + private String cdicHasWoodframe; + + @Column(name = "cdic_owner_type", length = 1) + private String cdicOwnerType; +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/entity/CustomerDailyOrder.java b/src/main/java/com/goi/erp/entity/CustomerDailyOrder.java index 6c4fd8e..239729a 100644 --- a/src/main/java/com/goi/erp/entity/CustomerDailyOrder.java +++ b/src/main/java/com/goi/erp/entity/CustomerDailyOrder.java @@ -39,12 +39,15 @@ public class CustomerDailyOrder { private UUID cdoUuid; private LocalDate cdoOrderDate; + + private String cdoJobType; @Column(length = 1) private String cdoOrderType; private String cdoRequestNote; + private Long cdoRegionId; private Long cdoDriverId; private Long cdoCustomerId; diff --git a/src/main/java/com/goi/erp/repository/CustomerContainerRepository.java b/src/main/java/com/goi/erp/repository/CustomerContainerRepository.java new file mode 100644 index 0000000..83b464a --- /dev/null +++ b/src/main/java/com/goi/erp/repository/CustomerContainerRepository.java @@ -0,0 +1,15 @@ +package com.goi.erp.repository; + +import com.goi.erp.entity.CustomerContainer; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface CustomerContainerRepository extends JpaRepository { + + List findByCcoCustomerId(Long ccoCustomerId); + + List findByCcoCustomerIdAndCcoStatus(Long ccoCustomerId, String ccoStatus); +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/repository/CustomerDailyInstallContainerRepository.java b/src/main/java/com/goi/erp/repository/CustomerDailyInstallContainerRepository.java new file mode 100644 index 0000000..23bdde8 --- /dev/null +++ b/src/main/java/com/goi/erp/repository/CustomerDailyInstallContainerRepository.java @@ -0,0 +1,19 @@ +package com.goi.erp.repository; + +import com.goi.erp.entity.CustomerDailyInstallContainer; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface CustomerDailyInstallContainerRepository + extends JpaRepository { + + List findByCdicDailyInstallId(Long cdicDailyInstallId); + + List findByCdicDailyInstallIdAndCdicAction( + Long cdicDailyInstallId, + String cdicAction + ); +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/repository/CustomerDailyInstallRepository.java b/src/main/java/com/goi/erp/repository/CustomerDailyInstallRepository.java new file mode 100644 index 0000000..4bcf281 --- /dev/null +++ b/src/main/java/com/goi/erp/repository/CustomerDailyInstallRepository.java @@ -0,0 +1,25 @@ +package com.goi.erp.repository; + +import com.goi.erp.entity.CustomerDailyInstall; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.time.LocalDate; +import java.util.List; + +@Repository +public interface CustomerDailyInstallRepository extends JpaRepository { + + List findByCdiInstallDate(LocalDate cdiInstallDate); + + List findByCdiDriverId(Long cdiDriverId); + + List findByCdiDriverIdAndCdiInstallDate( + Long cdiDriverId, + LocalDate cdiInstallDate + ); + + List findByCdiCustomerId(Long cdiCustomerId); + + List findByCdiStatus(String cdiStatus); +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/repository/CustomerRegionRepository.java b/src/main/java/com/goi/erp/repository/CustomerRegionRepository.java new file mode 100644 index 0000000..c946f3d --- /dev/null +++ b/src/main/java/com/goi/erp/repository/CustomerRegionRepository.java @@ -0,0 +1,15 @@ +package com.goi.erp.repository; + +import com.goi.erp.entity.CustomerRegion; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface CustomerRegionRepository extends JpaRepository { + + List findByCreStatus(String creStatus); + + boolean existsByCreName(String creName); +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/service/CustomerContainerService.java b/src/main/java/com/goi/erp/service/CustomerContainerService.java new file mode 100644 index 0000000..cd1bfb4 --- /dev/null +++ b/src/main/java/com/goi/erp/service/CustomerContainerService.java @@ -0,0 +1,101 @@ +package com.goi.erp.service; + +import com.goi.erp.dto.CustomerContainerRequestDto; +import com.goi.erp.dto.CustomerContainerResponseDto; +import com.goi.erp.entity.CustomerContainer; +import com.goi.erp.repository.CustomerContainerRepository; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; + +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class CustomerContainerService { + + private final CustomerContainerRepository customerContainerRepository; + + public CustomerContainerResponseDto create(CustomerContainerRequestDto dto) { + + CustomerContainer entity = CustomerContainer.builder() + .ccoCustomerId(dto.getCcoCustomerId()) + .ccoType(dto.getCcoType()) + .ccoCapacity(dto.getCcoCapacity()) + .ccoOwnerType(dto.getCcoOwnerType()) + .ccoIsUsed(dto.getCcoIsUsed()) + .ccoHasLock(dto.getCcoHasLock()) + .ccoHasWheel(dto.getCcoHasWheel()) + .ccoHasWoodframe(dto.getCcoHasWoodframe()) + .ccoStatus(dto.getCcoStatus()) + .ccoInstallNote(dto.getCcoInstallNote()) + .ccoPickupNote(dto.getCcoPickupNote()) + .ccoInstallDate(dto.getCcoInstallDate()) + .ccoPickupDate(dto.getCcoPickupDate()) + .ccoInstallAt(dto.getCcoInstallAt()) + .ccoPickupAt(dto.getCcoPickupAt()) + .build(); + + entity = customerContainerRepository.save(entity); + + return mapToDto(entity); + } + + public List getByCustomerId(Long customerId) { + + return customerContainerRepository.findByCcoCustomerId(customerId) + .stream() + .map(this::mapToDto) + .collect(Collectors.toList()); + } + + @Transactional + public CustomerContainerResponseDto update(Long id, CustomerContainerRequestDto dto) { + + CustomerContainer entity = customerContainerRepository.findById(id) + .orElseThrow(() -> new RuntimeException("CustomerContainer not found")); + + updateInternal(entity, dto); + + return mapToDto(entity); + } + + public void delete(Long id) { + + CustomerContainer entity = customerContainerRepository.findById(id) + .orElseThrow(() -> new RuntimeException("CustomerContainer not found")); + + customerContainerRepository.delete(entity); + } + + private void updateInternal(CustomerContainer entity, CustomerContainerRequestDto dto) { + + if (dto.getCcoType() != null) entity.setCcoType(dto.getCcoType()); + if (dto.getCcoCapacity() != null) entity.setCcoCapacity(dto.getCcoCapacity()); + if (dto.getCcoOwnerType() != null) entity.setCcoOwnerType(dto.getCcoOwnerType()); + if (dto.getCcoIsUsed() != null) entity.setCcoIsUsed(dto.getCcoIsUsed()); + if (dto.getCcoHasLock() != null) entity.setCcoHasLock(dto.getCcoHasLock()); + if (dto.getCcoHasWheel() != null) entity.setCcoHasWheel(dto.getCcoHasWheel()); + if (dto.getCcoHasWoodframe() != null) entity.setCcoHasWoodframe(dto.getCcoHasWoodframe()); + if (dto.getCcoStatus() != null) entity.setCcoStatus(dto.getCcoStatus()); + } + + private CustomerContainerResponseDto mapToDto(CustomerContainer entity) { + + return CustomerContainerResponseDto.builder() + .ccoId(entity.getCcoId()) + .ccoCustomerId(entity.getCcoCustomerId()) + .ccoType(entity.getCcoType()) + .ccoCapacity(entity.getCcoCapacity()) + .ccoOwnerType(entity.getCcoOwnerType()) + .ccoIsUsed(entity.getCcoIsUsed()) + .ccoHasLock(entity.getCcoHasLock()) + .ccoHasWheel(entity.getCcoHasWheel()) + .ccoHasWoodframe(entity.getCcoHasWoodframe()) + .ccoStatus(entity.getCcoStatus()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/service/CustomerDailyInstallContainerService.java b/src/main/java/com/goi/erp/service/CustomerDailyInstallContainerService.java new file mode 100644 index 0000000..df03fd9 --- /dev/null +++ b/src/main/java/com/goi/erp/service/CustomerDailyInstallContainerService.java @@ -0,0 +1,100 @@ +package com.goi.erp.service; + +import com.goi.erp.dto.CustomerDailyInstallContainerRequestDto; +import com.goi.erp.dto.CustomerDailyInstallContainerResponseDto; +import com.goi.erp.entity.CustomerDailyInstallContainer; +import com.goi.erp.repository.CustomerDailyInstallContainerRepository; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; + +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class CustomerDailyInstallContainerService { + + private final CustomerDailyInstallContainerRepository repository; + + public CustomerDailyInstallContainerResponseDto create( + CustomerDailyInstallContainerRequestDto dto + ) { + + CustomerDailyInstallContainer entity = + CustomerDailyInstallContainer.builder() + .cdicDailyInstallId(dto.getCdicDailyInstallId()) + .cdicAction(dto.getCdicAction()) + .cdicType(dto.getCdicType()) + .cdicCapacity(dto.getCdicCapacity()) + .cdicIsUsed(dto.getCdicIsUsed()) + .cdicHasLock(dto.getCdicHasLock()) + .cdicHasWheel(dto.getCdicHasWheel()) + .cdicHasWoodframe(dto.getCdicHasWoodframe()) + .cdicOwnerType(dto.getCdicOwnerType()) + .build(); + + entity = repository.save(entity); + + return mapToDto(entity); + } + + public List getByDailyInstallId( + Long dailyInstallId + ) { + + return repository.findByCdicDailyInstallId(dailyInstallId) + .stream() + .map(this::mapToDto) + .collect(Collectors.toList()); + } + + @Transactional + public CustomerDailyInstallContainerResponseDto update( + Long id, + CustomerDailyInstallContainerRequestDto dto + ) { + + CustomerDailyInstallContainer entity = repository.findById(id) + .orElseThrow(() -> new RuntimeException("Container not found")); + + updateInternal(entity, dto); + + return mapToDto(entity); + } + + public void delete(Long id) { + + CustomerDailyInstallContainer entity = repository.findById(id) + .orElseThrow(() -> new RuntimeException("Container not found")); + + repository.delete(entity); + } + + private void updateInternal( + CustomerDailyInstallContainer entity, + CustomerDailyInstallContainerRequestDto dto + ) { + + if (dto.getCdicAction() != null) entity.setCdicAction(dto.getCdicAction()); + if (dto.getCdicType() != null) entity.setCdicType(dto.getCdicType()); + if (dto.getCdicCapacity() != null) entity.setCdicCapacity(dto.getCdicCapacity()); + if (dto.getCdicIsUsed() != null) entity.setCdicIsUsed(dto.getCdicIsUsed()); + } + + private CustomerDailyInstallContainerResponseDto mapToDto( + CustomerDailyInstallContainer entity + ) { + + return CustomerDailyInstallContainerResponseDto.builder() + .cdicId(entity.getCdicId()) + .cdicDailyInstallId(entity.getCdicDailyInstallId()) + .cdicAction(entity.getCdicAction()) + .cdicType(entity.getCdicType()) + .cdicCapacity(entity.getCdicCapacity()) + .cdicIsUsed(entity.getCdicIsUsed()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/service/CustomerDailyInstallService.java b/src/main/java/com/goi/erp/service/CustomerDailyInstallService.java new file mode 100644 index 0000000..719d5ea --- /dev/null +++ b/src/main/java/com/goi/erp/service/CustomerDailyInstallService.java @@ -0,0 +1,96 @@ +package com.goi.erp.service; + +import com.goi.erp.dto.CustomerDailyInstallRequestDto; +import com.goi.erp.dto.CustomerDailyInstallResponseDto; +import com.goi.erp.entity.CustomerDailyInstall; +import com.goi.erp.repository.CustomerDailyInstallRepository; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; + +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class CustomerDailyInstallService { + + private final CustomerDailyInstallRepository repository; + + public CustomerDailyInstallResponseDto create(CustomerDailyInstallRequestDto dto) { + + CustomerDailyInstall entity = CustomerDailyInstall.builder() + .cdiOrderSeq(dto.getCdiOrderSeq()) + .cdiDriverId(dto.getCdiDriverId()) + .cdiInstallDate(dto.getCdiInstallDate()) + .cdiInstallTime(dto.getCdiInstallTime()) + .cdiCustomerId(dto.getCdiCustomerId()) + .cdiAccountNo(dto.getCdiAccountNo()) + .cdiCustomerName(dto.getCdiCustomerName()) + .cdiPhone(dto.getCdiPhone()) + .cdiAddress(dto.getCdiAddress()) + .cdiCity(dto.getCdiCity()) + .cdiPostalCode(dto.getCdiPostalCode()) + .cdiGeoLat(dto.getCdiGeoLat()) + .cdiGeoLon(dto.getCdiGeoLon()) + .cdiWorkType(dto.getCdiWorkType()) + .cdiStatus(dto.getCdiStatus()) + .build(); + + entity = repository.save(entity); + + return mapToDto(entity); + } + + public List getByInstallDate(LocalDate date) { + + return repository.findByCdiInstallDate(date) + .stream() + .map(this::mapToDto) + .collect(Collectors.toList()); + } + + @Transactional + public CustomerDailyInstallResponseDto update(Long id, CustomerDailyInstallRequestDto dto) { + + CustomerDailyInstall entity = repository.findById(id) + .orElseThrow(() -> new RuntimeException("CustomerDailyInstall not found")); + + updateInternal(entity, dto); + + return mapToDto(entity); + } + + public void delete(Long id) { + + CustomerDailyInstall entity = repository.findById(id) + .orElseThrow(() -> new RuntimeException("CustomerDailyInstall not found")); + + repository.delete(entity); + } + + private void updateInternal(CustomerDailyInstall entity, CustomerDailyInstallRequestDto dto) { + + if (dto.getCdiDriverId() != null) entity.setCdiDriverId(dto.getCdiDriverId()); + if (dto.getCdiInstallTime() != null) entity.setCdiInstallTime(dto.getCdiInstallTime()); + if (dto.getCdiStatus() != null) entity.setCdiStatus(dto.getCdiStatus()); + if (dto.getCdiWorkNote() != null) entity.setCdiWorkNote(dto.getCdiWorkNote()); + } + + private CustomerDailyInstallResponseDto mapToDto(CustomerDailyInstall entity) { + + return CustomerDailyInstallResponseDto.builder() + .cdiUuid(entity.getCdiUuid()) + .cdiOrderSeq(entity.getCdiOrderSeq()) + .cdiDriverId(entity.getCdiDriverId()) + .cdiInstallDate(entity.getCdiInstallDate()) + .cdiInstallTime(entity.getCdiInstallTime()) + .cdiCustomerId(entity.getCdiCustomerId()) + .cdiCustomerName(entity.getCdiCustomerName()) + .cdiStatus(entity.getCdiStatus()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/goi/erp/service/CustomerDailyOrderService.java b/src/main/java/com/goi/erp/service/CustomerDailyOrderService.java index 1e9cb27..64b3bda 100644 --- a/src/main/java/com/goi/erp/service/CustomerDailyOrderService.java +++ b/src/main/java/com/goi/erp/service/CustomerDailyOrderService.java @@ -44,8 +44,10 @@ public class CustomerDailyOrderService { CustomerDailyOrder order = CustomerDailyOrder.builder() .cdoUuid(UUID.randomUUID()) .cdoOrderDate(dto.getCdoOrderDate()) + .cdoJobType(dto.getCdoJobType()) .cdoOrderType(dto.getCdoOrderType()) .cdoRequestNote(dto.getCdoRequestNote()) + .cdoRegionId(dto.getCdoRegionId()) .cdoDriverId(driverId) .cdoCustomerId(customerId) .cdoCustomerNo(dto.getCdoCustomerNo()) @@ -166,8 +168,10 @@ public class CustomerDailyOrderService { Long driverId = resolveDriverId(dto); // null 이 아닌 경우만 업데이트 + if (dto.getCdoJobType() != null) order.setCdoJobType(dto.getCdoJobType()); if (dto.getCdoOrderType() != null) order.setCdoOrderType(dto.getCdoOrderType()); if (dto.getCdoRequestNote() != null) order.setCdoRequestNote(dto.getCdoRequestNote()); + if (dto.getCdoRegionId() != null) order.setCdoRegionId(dto.getCdoRegionId()); if (dto.getCdoDriverId() != null || dto.getCdoExternalDriverId() != null || dto.getCdoDriverUuid() != null) order.setCdoDriverId(driverId); if (dto.getCdoPaymentType() != null) order.setCdoPaymentType(dto.getCdoPaymentType()); if (dto.getCdoCycle() != null) order.setCdoCycle(dto.getCdoCycle()); @@ -199,9 +203,11 @@ public class CustomerDailyOrderService { return CustomerDailyOrderResponseDto.builder() .cdoUuid(order.getCdoUuid()) .cdoOrderDate(order.getCdoOrderDate()) + .cdoJobType(order.getCdoJobType()) .cdoOrderType(order.getCdoOrderType()) .cdoRequestNote(order.getCdoRequestNote()) -// .cdoDriverId(order.getCdoDriverId()) + .cdoRegionId(order.getCdoRegionId()) + .cdoDriverId(order.getCdoDriverId()) .cdoCustomerNo(order.getCdoCustomerNo()) .cdoPaymentType(order.getCdoPaymentType()) .cdoCycle(order.getCdoCycle()) diff --git a/src/main/java/com/goi/erp/service/CustomerRegionService.java b/src/main/java/com/goi/erp/service/CustomerRegionService.java new file mode 100644 index 0000000..a982025 --- /dev/null +++ b/src/main/java/com/goi/erp/service/CustomerRegionService.java @@ -0,0 +1,97 @@ +package com.goi.erp.service; + +import com.goi.erp.dto.CustomerRegionRequestDto; +import com.goi.erp.dto.CustomerRegionResponseDto; +import com.goi.erp.entity.CustomerRegion; +import com.goi.erp.repository.CustomerRegionRepository; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; + +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class CustomerRegionService { + + private final CustomerRegionRepository customerRegionRepository; + + /** + * CREATE + */ + public CustomerRegionResponseDto create(CustomerRegionRequestDto dto) { + + CustomerRegion entity = CustomerRegion.builder() + .creName(dto.getCreName()) + .creStatus(dto.getCreStatus()) + .build(); + + entity = customerRegionRepository.save(entity); + + return mapToDto(entity); + } + + /** + * GET ALL + */ + public List getAll() { + return customerRegionRepository.findAll() + .stream() + .map(this::mapToDto) + .collect(Collectors.toList()); + } + + /** + * GET BY ID + */ + public CustomerRegionResponseDto getById(Long id) { + + CustomerRegion entity = customerRegionRepository.findById(id) + .orElseThrow(() -> new RuntimeException("CustomerRegion not found")); + + return mapToDto(entity); + } + + /** + * UPDATE + */ + @Transactional + public CustomerRegionResponseDto update(Long id, CustomerRegionRequestDto dto) { + + CustomerRegion entity = customerRegionRepository.findById(id) + .orElseThrow(() -> new RuntimeException("CustomerRegion not found")); + + updateInternal(entity, dto); + + return mapToDto(entity); + } + + /** + * DELETE + */ + public void delete(Long id) { + + CustomerRegion entity = customerRegionRepository.findById(id) + .orElseThrow(() -> new RuntimeException("CustomerRegion not found")); + + customerRegionRepository.delete(entity); + } + + private void updateInternal(CustomerRegion entity, CustomerRegionRequestDto dto) { + + if (dto.getCreName() != null) entity.setCreName(dto.getCreName()); + if (dto.getCreStatus() != null) entity.setCreStatus(dto.getCreStatus()); + } + + private CustomerRegionResponseDto mapToDto(CustomerRegion entity) { + + return CustomerRegionResponseDto.builder() + .creId(entity.getCreId()) + .creName(entity.getCreName()) + .creStatus(entity.getCreStatus()) + .build(); + } +} \ No newline at end of file