@k2works/claude-code-booster 4.7.0 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (744) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +42 -42
  3. package/bin/claude-code-booster +90 -90
  4. package/lib/assets/.claude/README.md +271 -269
  5. package/lib/assets/.claude/agents/xp-architect.md +250 -250
  6. package/lib/assets/.claude/agents/xp-executive.md +207 -207
  7. package/lib/assets/.claude/agents/xp-interaction-designer.md +239 -239
  8. package/lib/assets/.claude/agents/xp-product-manager.md +245 -245
  9. package/lib/assets/.claude/agents/xp-programmer.md +268 -268
  10. package/lib/assets/.claude/agents/xp-project-manager.md +229 -229
  11. package/lib/assets/.claude/agents/xp-technical-writer.md +224 -224
  12. package/lib/assets/.claude/agents/xp-tester.md +265 -265
  13. package/lib/assets/.claude/agents/xp-user-representative.md +204 -204
  14. package/lib/assets/.claude/scripts/generate-inception-deck.mjs +911 -911
  15. package/lib/assets/.claude/settings.json +11 -11
  16. package/lib/assets/.claude/skills/ai-agent-guidelines/SKILL.md +111 -111
  17. package/lib/assets/.claude/skills/analyzing-architecture/SKILL.md +83 -83
  18. package/lib/assets/.claude/skills/analyzing-business-architecture/SKILL.md +122 -122
  19. package/lib/assets/.claude/skills/analyzing-business-case/SKILL.md +148 -148
  20. package/lib/assets/.claude/skills/analyzing-business-strategy/SKILL.md +277 -277
  21. package/lib/assets/.claude/skills/analyzing-data-model/SKILL.md +77 -77
  22. package/lib/assets/.claude/skills/analyzing-domain-model/SKILL.md +117 -117
  23. package/lib/assets/.claude/skills/analyzing-inception-deck/SKILL.md +84 -84
  24. package/lib/assets/.claude/skills/analyzing-non-functional/SKILL.md +95 -95
  25. package/lib/assets/.claude/skills/analyzing-operation/SKILL.md +95 -95
  26. package/lib/assets/.claude/skills/analyzing-requirements/SKILL.md +91 -91
  27. package/lib/assets/.claude/skills/analyzing-review/SKILL.md +174 -174
  28. package/lib/assets/.claude/skills/analyzing-tech-stack/SKILL.md +101 -101
  29. package/lib/assets/.claude/skills/analyzing-test-strategy/SKILL.md +89 -89
  30. package/lib/assets/.claude/skills/analyzing-ui-design/SKILL.md +80 -80
  31. package/lib/assets/.claude/skills/analyzing-usecases/SKILL.md +72 -72
  32. package/lib/assets/.claude/skills/creating-adr/SKILL.md +113 -113
  33. package/lib/assets/.claude/skills/creating-iteration-report/SKILL.md +210 -210
  34. package/lib/assets/.claude/skills/creating-journal/SKILL.md +129 -0
  35. package/lib/assets/.claude/skills/creating-release-report/SKILL.md +161 -161
  36. package/lib/assets/.claude/skills/creating-slides/SKILL.md +86 -86
  37. package/lib/assets/.claude/skills/creating-slides/agents/openai.yaml +4 -4
  38. package/lib/assets/.claude/skills/creating-slides/references/manga-css.md +45 -45
  39. package/lib/assets/.claude/skills/creating-slides/scripts/slide_tools.py +239 -239
  40. package/lib/assets/.claude/skills/developing-backend/SKILL.md +100 -100
  41. package/lib/assets/.claude/skills/developing-frontend/SKILL.md +93 -93
  42. package/lib/assets/.claude/skills/developing-release/SKILL.md +120 -120
  43. package/lib/assets/.claude/skills/developing-review/SKILL.md +175 -175
  44. package/lib/assets/.claude/skills/developing-uiux-review/SKILL.md +207 -207
  45. package/lib/assets/.claude/skills/generating-bmc/SKILL.md +123 -123
  46. package/lib/assets/.claude/skills/generating-slides/SKILL.md +94 -94
  47. package/lib/assets/.claude/skills/git-commit/SKILL.md +81 -81
  48. package/lib/assets/.claude/skills/killing-processes/SKILL.md +44 -44
  49. package/lib/assets/.claude/skills/operating-backup/SKILL.md +59 -59
  50. package/lib/assets/.claude/skills/operating-cicd/SKILL.md +54 -54
  51. package/lib/assets/.claude/skills/operating-deploy/SKILL.md +67 -67
  52. package/lib/assets/.claude/skills/operating-docs/SKILL.md +219 -219
  53. package/lib/assets/.claude/skills/operating-provision/SKILL.md +77 -77
  54. package/lib/assets/.claude/skills/operating-qt/SKILL.md +147 -147
  55. package/lib/assets/.claude/skills/operating-review/SKILL.md +171 -171
  56. package/lib/assets/.claude/skills/operating-script/SKILL.md +145 -145
  57. package/lib/assets/.claude/skills/operating-setup/SKILL.md +63 -63
  58. package/lib/assets/.claude/skills/orchestrating-analysis/SKILL.md +104 -104
  59. package/lib/assets/.claude/skills/orchestrating-development/SKILL.md +168 -168
  60. package/lib/assets/.claude/skills/orchestrating-operation/SKILL.md +158 -158
  61. package/lib/assets/.claude/skills/orchestrating-project/SKILL.md +144 -144
  62. package/lib/assets/.claude/skills/planning-releases/SKILL.md +119 -119
  63. package/lib/assets/.claude/skills/practicing-getting-start-tdd/SKILL.md +266 -266
  64. package/lib/assets/.claude/skills/syncing-github-project/SKILL.md +151 -151
  65. package/lib/assets/.claude/skills/tracking-progress/SKILL.md +91 -91
  66. package/lib/assets/.claude/skills/validating-iteration-plan/SKILL.md +238 -238
  67. package/lib/assets/.devcontainer/devcontainer.json +37 -37
  68. package/lib/assets/.env.example +17 -17
  69. package/lib/assets/.gitattributes +4 -4
  70. package/lib/assets/.github/workflows/docker-publish.yml +77 -77
  71. package/lib/assets/.github/workflows/mkdocs.yml +39 -39
  72. package/lib/assets/AGENTS.md +94 -94
  73. package/lib/assets/CLAUDE.md +193 -193
  74. package/lib/assets/README.md +291 -291
  75. package/lib/assets/docker-compose.yml +33 -33
  76. package/lib/assets/docs/adr/index.md +10 -10
  77. package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +475 -475
  78. package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +519 -519
  79. package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +537 -537
  80. package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +300 -300
  81. package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +320 -320
  82. package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +498 -498
  83. package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +298 -298
  84. package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +291 -291
  85. package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +336 -336
  86. package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +303 -303
  87. package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +286 -286
  88. package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +322 -322
  89. package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +319 -319
  90. package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +365 -365
  91. package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +156 -156
  92. package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +178 -178
  93. package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +312 -312
  94. package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +287 -287
  95. package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +286 -286
  96. package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +274 -274
  97. package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +294 -294
  98. package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +337 -337
  99. package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +388 -388
  100. package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +273 -273
  101. package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +380 -380
  102. package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +384 -384
  103. package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +350 -350
  104. package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +352 -352
  105. package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +383 -383
  106. package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +529 -529
  107. package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +395 -395
  108. package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +399 -399
  109. package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +485 -485
  110. package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +566 -566
  111. package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +567 -567
  112. package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +475 -475
  113. package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +462 -462
  114. package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +325 -325
  115. package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +401 -401
  116. package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +450 -450
  117. package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +475 -475
  118. package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +739 -739
  119. package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +567 -567
  120. package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +518 -518
  121. package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +532 -532
  122. package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +241 -241
  123. package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +383 -383
  124. package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +374 -374
  125. package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +375 -375
  126. package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +195 -195
  127. package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +268 -268
  128. package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +294 -294
  129. package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +164 -164
  130. package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +168 -168
  131. package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +254 -254
  132. package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +269 -269
  133. package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +148 -148
  134. package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +176 -176
  135. package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +604 -604
  136. package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +729 -729
  137. package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +291 -291
  138. package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +420 -420
  139. package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +319 -319
  140. package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +466 -466
  141. package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +523 -523
  142. package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +287 -287
  143. package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +340 -340
  144. package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +395 -395
  145. package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +248 -248
  146. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +384 -384
  147. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +452 -452
  148. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +495 -495
  149. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +416 -416
  150. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +382 -382
  151. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +687 -687
  152. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +442 -442
  153. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +479 -479
  154. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +479 -479
  155. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +427 -427
  156. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +428 -428
  157. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +339 -339
  158. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +309 -309
  159. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +596 -596
  160. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +355 -355
  161. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +350 -350
  162. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +414 -414
  163. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +367 -367
  164. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +403 -403
  165. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +291 -291
  166. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +324 -324
  167. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +332 -332
  168. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +274 -274
  169. package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +298 -298
  170. package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +304 -304
  171. package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +362 -362
  172. package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +257 -257
  173. package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +254 -254
  174. package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +283 -283
  175. package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +395 -395
  176. package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +319 -319
  177. package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +382 -382
  178. package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +287 -287
  179. package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +303 -303
  180. package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +326 -326
  181. package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +332 -332
  182. package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +379 -379
  183. package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +177 -177
  184. package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +219 -219
  185. package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +244 -244
  186. package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +363 -363
  187. package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +438 -438
  188. package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +325 -325
  189. package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +403 -403
  190. package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +469 -469
  191. package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +174 -174
  192. package/lib/assets/docs/article/functional-desgin-ppp/index.md +90 -90
  193. package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +450 -450
  194. package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +463 -463
  195. package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +425 -425
  196. package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +273 -273
  197. package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +247 -247
  198. package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +841 -841
  199. package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +384 -384
  200. package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +383 -383
  201. package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +339 -339
  202. package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +331 -331
  203. package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +356 -356
  204. package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +379 -379
  205. package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +361 -361
  206. package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +392 -392
  207. package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +300 -300
  208. package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +297 -297
  209. package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +304 -304
  210. package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +315 -315
  211. package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +311 -311
  212. package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +304 -304
  213. package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +336 -336
  214. package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +349 -349
  215. package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +243 -243
  216. package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +328 -328
  217. package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +348 -348
  218. package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +357 -357
  219. package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +364 -364
  220. package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +515 -515
  221. package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +557 -557
  222. package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +363 -363
  223. package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +327 -327
  224. package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +517 -517
  225. package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +441 -441
  226. package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +407 -407
  227. package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +379 -379
  228. package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +398 -398
  229. package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +476 -476
  230. package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +391 -391
  231. package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +342 -342
  232. package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +324 -324
  233. package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +730 -730
  234. package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +624 -624
  235. package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +512 -512
  236. package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +433 -433
  237. package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +688 -688
  238. package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +243 -243
  239. package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +166 -166
  240. package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +162 -162
  241. package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +135 -135
  242. package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +88 -88
  243. package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +299 -299
  244. package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +241 -241
  245. package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +131 -131
  246. package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +130 -130
  247. package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +127 -127
  248. package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +114 -114
  249. package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +138 -138
  250. package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +161 -161
  251. package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +65 -65
  252. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +232 -232
  253. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +244 -244
  254. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +202 -202
  255. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +92 -92
  256. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +256 -256
  257. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +195 -195
  258. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +214 -214
  259. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +249 -249
  260. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +174 -174
  261. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +166 -166
  262. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +192 -192
  263. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +211 -211
  264. package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +83 -83
  265. package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +87 -87
  266. package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +95 -95
  267. package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +109 -109
  268. package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +96 -96
  269. package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +88 -88
  270. package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +71 -71
  271. package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +110 -110
  272. package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +108 -108
  273. package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +104 -104
  274. package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +178 -178
  275. package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +142 -142
  276. package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +145 -145
  277. package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +35 -35
  278. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +202 -202
  279. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +246 -246
  280. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +218 -218
  281. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +179 -179
  282. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +267 -267
  283. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +190 -190
  284. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +161 -161
  285. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +175 -175
  286. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +222 -222
  287. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +189 -189
  288. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +212 -212
  289. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +215 -215
  290. package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +71 -71
  291. package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +213 -213
  292. package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +302 -302
  293. package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +339 -339
  294. package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +112 -112
  295. package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +272 -272
  296. package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +233 -233
  297. package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +394 -394
  298. package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +422 -422
  299. package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +400 -400
  300. package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +226 -226
  301. package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +296 -296
  302. package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +411 -411
  303. package/lib/assets/docs/article/getting-start-tdd/go/index.md +83 -83
  304. package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +279 -279
  305. package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +337 -337
  306. package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +257 -257
  307. package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +182 -182
  308. package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +313 -313
  309. package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +309 -309
  310. package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +412 -412
  311. package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +390 -390
  312. package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +461 -461
  313. package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +434 -434
  314. package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +392 -392
  315. package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +631 -631
  316. package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +49 -49
  317. package/lib/assets/docs/article/getting-start-tdd/index.md +93 -93
  318. package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +375 -375
  319. package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +349 -349
  320. package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +445 -445
  321. package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +409 -409
  322. package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +330 -330
  323. package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +290 -290
  324. package/lib/assets/docs/article/getting-start-tdd/integration/index.md +69 -69
  325. package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +234 -234
  326. package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +261 -261
  327. package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +185 -185
  328. package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +115 -115
  329. package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +382 -382
  330. package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +272 -272
  331. package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +626 -626
  332. package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +393 -393
  333. package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +310 -310
  334. package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +188 -188
  335. package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +167 -167
  336. package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +205 -205
  337. package/lib/assets/docs/article/getting-start-tdd/java/index.md +61 -61
  338. package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +244 -244
  339. package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +262 -262
  340. package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +169 -169
  341. package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +112 -112
  342. package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +314 -314
  343. package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +235 -235
  344. package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +327 -327
  345. package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +322 -322
  346. package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +285 -285
  347. package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +199 -199
  348. package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +207 -207
  349. package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +295 -295
  350. package/lib/assets/docs/article/getting-start-tdd/node/index.md +56 -56
  351. package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +259 -259
  352. package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +200 -200
  353. package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +248 -248
  354. package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +141 -141
  355. package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +410 -410
  356. package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +321 -321
  357. package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +372 -372
  358. package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +453 -453
  359. package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +460 -460
  360. package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +182 -182
  361. package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +266 -266
  362. package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +308 -308
  363. package/lib/assets/docs/article/getting-start-tdd/php/index.md +84 -84
  364. package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +201 -201
  365. package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +247 -247
  366. package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +199 -199
  367. package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +87 -87
  368. package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +274 -274
  369. package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +190 -190
  370. package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +208 -208
  371. package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +172 -172
  372. package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +130 -130
  373. package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +122 -122
  374. package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +116 -116
  375. package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +126 -126
  376. package/lib/assets/docs/article/getting-start-tdd/python/index.md +55 -55
  377. package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +231 -231
  378. package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +238 -238
  379. package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +228 -228
  380. package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +112 -112
  381. package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +287 -287
  382. package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +248 -248
  383. package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +279 -279
  384. package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +329 -329
  385. package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +196 -196
  386. package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +175 -175
  387. package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +237 -237
  388. package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +398 -398
  389. package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +83 -83
  390. package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +211 -211
  391. package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +264 -264
  392. package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +233 -233
  393. package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +92 -92
  394. package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +212 -212
  395. package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +164 -164
  396. package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +142 -142
  397. package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +145 -145
  398. package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +110 -110
  399. package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +94 -94
  400. package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +105 -105
  401. package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +112 -112
  402. package/lib/assets/docs/article/getting-start-tdd/rust/index.md +83 -83
  403. package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +111 -111
  404. package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +107 -107
  405. package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +99 -99
  406. package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +123 -123
  407. package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +196 -196
  408. package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +186 -186
  409. package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +139 -139
  410. package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +106 -106
  411. package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +75 -75
  412. package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +104 -104
  413. package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +94 -94
  414. package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +92 -92
  415. package/lib/assets/docs/article/getting-start-tdd/scala/index.md +65 -65
  416. package/lib/assets/docs/article/grokking-concurrency/all/index.md +404 -404
  417. package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +554 -554
  418. package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +469 -469
  419. package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +520 -520
  420. package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +420 -420
  421. package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +510 -510
  422. package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +435 -435
  423. package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +465 -465
  424. package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +377 -377
  425. package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +116 -116
  426. package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +108 -108
  427. package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +101 -101
  428. package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +122 -122
  429. package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +123 -123
  430. package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +118 -118
  431. package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +89 -89
  432. package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +100 -100
  433. package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +120 -120
  434. package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +101 -101
  435. package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +97 -97
  436. package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +123 -123
  437. package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +101 -101
  438. package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +112 -112
  439. package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +99 -99
  440. package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +61 -61
  441. package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +84 -84
  442. package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +92 -92
  443. package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +65 -65
  444. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +80 -80
  445. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +103 -103
  446. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +94 -94
  447. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +110 -110
  448. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +104 -104
  449. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +93 -93
  450. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +121 -121
  451. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +107 -107
  452. package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +248 -248
  453. package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +96 -96
  454. package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +96 -96
  455. package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +91 -91
  456. package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +106 -106
  457. package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +99 -99
  458. package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +95 -95
  459. package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +111 -111
  460. package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +118 -118
  461. package/lib/assets/docs/article/grokking-concurrency/index.md +66 -66
  462. package/lib/assets/docs/article/grokking-concurrency/java/index.md +102 -102
  463. package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +308 -308
  464. package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +334 -334
  465. package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +221 -221
  466. package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +213 -213
  467. package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +112 -112
  468. package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +69 -69
  469. package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +101 -101
  470. package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +101 -101
  471. package/lib/assets/docs/article/grokking-concurrency/python/index.md +313 -313
  472. package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +239 -239
  473. package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +418 -418
  474. package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +227 -227
  475. package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +299 -299
  476. package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +315 -315
  477. package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +297 -297
  478. package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +314 -314
  479. package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +360 -360
  480. package/lib/assets/docs/article/grokking-concurrency/rust/index.md +270 -270
  481. package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +108 -108
  482. package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +120 -120
  483. package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +126 -126
  484. package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +175 -175
  485. package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +158 -158
  486. package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +94 -94
  487. package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +133 -133
  488. package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +155 -155
  489. package/lib/assets/docs/article/grokking-concurrency/scala/index.md +69 -69
  490. package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +78 -78
  491. package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +112 -112
  492. package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +93 -93
  493. package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +110 -110
  494. package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +119 -119
  495. package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +83 -83
  496. package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +131 -131
  497. package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +129 -129
  498. package/lib/assets/docs/article/grokkingfp/all/index.md +368 -368
  499. package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +530 -530
  500. package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +923 -923
  501. package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +1128 -1128
  502. package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +1104 -1104
  503. package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +1026 -1026
  504. package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +785 -785
  505. package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +871 -871
  506. package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +972 -972
  507. package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +926 -926
  508. package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +870 -870
  509. package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +715 -715
  510. package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +626 -626
  511. package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +712 -712
  512. package/lib/assets/docs/article/grokkingfp/clojure/index.md +276 -276
  513. package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +667 -667
  514. package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +643 -643
  515. package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +620 -620
  516. package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +697 -697
  517. package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +751 -751
  518. package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +721 -721
  519. package/lib/assets/docs/article/grokkingfp/csharp/index.md +246 -246
  520. package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +811 -811
  521. package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +971 -971
  522. package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +981 -981
  523. package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +949 -949
  524. package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +947 -947
  525. package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +739 -739
  526. package/lib/assets/docs/article/grokkingfp/elixir/index.md +203 -203
  527. package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +712 -712
  528. package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +838 -838
  529. package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +985 -985
  530. package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +974 -974
  531. package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +1286 -1286
  532. package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +1049 -1049
  533. package/lib/assets/docs/article/grokkingfp/fsharp/index.md +210 -210
  534. package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +714 -714
  535. package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +961 -961
  536. package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +972 -972
  537. package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +832 -832
  538. package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +911 -911
  539. package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +922 -922
  540. package/lib/assets/docs/article/grokkingfp/haskell/index.md +234 -234
  541. package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +591 -591
  542. package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +866 -866
  543. package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +915 -915
  544. package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +878 -878
  545. package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +845 -845
  546. package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +844 -844
  547. package/lib/assets/docs/article/grokkingfp/index.md +143 -143
  548. package/lib/assets/docs/article/grokkingfp/java/index.md +211 -211
  549. package/lib/assets/docs/article/grokkingfp/java/part-1.md +648 -648
  550. package/lib/assets/docs/article/grokkingfp/java/part-2.md +675 -675
  551. package/lib/assets/docs/article/grokkingfp/java/part-3.md +672 -672
  552. package/lib/assets/docs/article/grokkingfp/java/part-4.md +771 -771
  553. package/lib/assets/docs/article/grokkingfp/java/part-5.md +959 -959
  554. package/lib/assets/docs/article/grokkingfp/java/part-6.md +1328 -1328
  555. package/lib/assets/docs/article/grokkingfp/python/index.md +258 -258
  556. package/lib/assets/docs/article/grokkingfp/python/part-1.md +443 -443
  557. package/lib/assets/docs/article/grokkingfp/python/part-2.md +958 -958
  558. package/lib/assets/docs/article/grokkingfp/python/part-3.md +1004 -1004
  559. package/lib/assets/docs/article/grokkingfp/python/part-4.md +765 -765
  560. package/lib/assets/docs/article/grokkingfp/python/part-5.md +747 -747
  561. package/lib/assets/docs/article/grokkingfp/python/part-6.md +861 -861
  562. package/lib/assets/docs/article/grokkingfp/ruby/index.md +330 -330
  563. package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +755 -755
  564. package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +938 -938
  565. package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +946 -946
  566. package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +921 -921
  567. package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +908 -908
  568. package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +1412 -1412
  569. package/lib/assets/docs/article/grokkingfp/rust/index.md +242 -242
  570. package/lib/assets/docs/article/grokkingfp/rust/part-1.md +634 -634
  571. package/lib/assets/docs/article/grokkingfp/rust/part-2.md +1060 -1060
  572. package/lib/assets/docs/article/grokkingfp/rust/part-3.md +994 -994
  573. package/lib/assets/docs/article/grokkingfp/rust/part-4.md +573 -573
  574. package/lib/assets/docs/article/grokkingfp/rust/part-5.md +705 -705
  575. package/lib/assets/docs/article/grokkingfp/rust/part-6.md +508 -508
  576. package/lib/assets/docs/article/grokkingfp/scala/index.md +171 -171
  577. package/lib/assets/docs/article/grokkingfp/scala/part-1.md +543 -543
  578. package/lib/assets/docs/article/grokkingfp/scala/part-2.md +946 -946
  579. package/lib/assets/docs/article/grokkingfp/scala/part-3.md +919 -919
  580. package/lib/assets/docs/article/grokkingfp/scala/part-4.md +742 -742
  581. package/lib/assets/docs/article/grokkingfp/scala/part-5.md +722 -722
  582. package/lib/assets/docs/article/grokkingfp/scala/part-6.md +867 -867
  583. package/lib/assets/docs/article/grokkingfp/typescript/index.md +273 -273
  584. package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +561 -561
  585. package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +1129 -1129
  586. package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +842 -842
  587. package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +1087 -1087
  588. package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +717 -717
  589. package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +982 -982
  590. package/lib/assets/docs/article/index.md +41 -41
  591. package/lib/assets/docs/article/practical-database-design/index.md +121 -121
  592. package/lib/assets/docs/article/practical-database-design/part1/chapter01.md +288 -288
  593. package/lib/assets/docs/article/practical-database-design/part1/chapter02.md +518 -518
  594. package/lib/assets/docs/article/practical-database-design/part1/chapter03.md +557 -557
  595. package/lib/assets/docs/article/practical-database-design/part2/chapter04.md +924 -924
  596. package/lib/assets/docs/article/practical-database-design/part2/chapter05.md +1627 -1627
  597. package/lib/assets/docs/article/practical-database-design/part2/chapter06.md +2716 -2716
  598. package/lib/assets/docs/article/practical-database-design/part2/chapter07.md +2082 -2082
  599. package/lib/assets/docs/article/practical-database-design/part2/chapter08.md +2105 -2105
  600. package/lib/assets/docs/article/practical-database-design/part2/chapter09.md +2031 -2031
  601. package/lib/assets/docs/article/practical-database-design/part2/chapter10.md +1387 -1387
  602. package/lib/assets/docs/article/practical-database-design/part2/chapter11.md +1677 -1677
  603. package/lib/assets/docs/article/practical-database-design/part2/chapter12.md +1417 -1417
  604. package/lib/assets/docs/article/practical-database-design/part2/chapter13.md +1434 -1434
  605. package/lib/assets/docs/article/practical-database-design/part3/chapter14.md +667 -667
  606. package/lib/assets/docs/article/practical-database-design/part3/chapter15.md +1625 -1625
  607. package/lib/assets/docs/article/practical-database-design/part3/chapter16.md +1915 -1915
  608. package/lib/assets/docs/article/practical-database-design/part3/chapter17.md +1708 -1708
  609. package/lib/assets/docs/article/practical-database-design/part3/chapter18.md +2095 -2095
  610. package/lib/assets/docs/article/practical-database-design/part3/chapter19.md +1123 -1123
  611. package/lib/assets/docs/article/practical-database-design/part3/chapter20.md +1031 -1031
  612. package/lib/assets/docs/article/practical-database-design/part3/chapter21.md +1382 -1382
  613. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter14-orm.md +991 -991
  614. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter15-orm.md +1300 -1300
  615. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter16-orm.md +1166 -1166
  616. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter17-orm.md +1584 -1584
  617. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter18-orm.md +1183 -1183
  618. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter19-orm.md +1016 -1016
  619. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter20-orm.md +1753 -1753
  620. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter21-orm.md +1447 -1447
  621. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter22-orm.md +1878 -1878
  622. package/lib/assets/docs/article/practical-database-design/part4/chapter22.md +965 -965
  623. package/lib/assets/docs/article/practical-database-design/part4/chapter23.md +2069 -2069
  624. package/lib/assets/docs/article/practical-database-design/part4/chapter24.md +2439 -2439
  625. package/lib/assets/docs/article/practical-database-design/part4/chapter25.md +3661 -3661
  626. package/lib/assets/docs/article/practical-database-design/part4/chapter26.md +2916 -2916
  627. package/lib/assets/docs/article/practical-database-design/part4/chapter27.md +3105 -3105
  628. package/lib/assets/docs/article/practical-database-design/part4/chapter28.md +2697 -2697
  629. package/lib/assets/docs/article/practical-database-design/part4/chapter29.md +2544 -2544
  630. package/lib/assets/docs/article/practical-database-design/part4/chapter30.md +2180 -2180
  631. package/lib/assets/docs/article/practical-database-design/part4/chapter31.md +1192 -1192
  632. package/lib/assets/docs/article/practical-database-design/part4/chapter32.md +2101 -2101
  633. package/lib/assets/docs/article/practical-database-design/part5/chapter33.md +1032 -1032
  634. package/lib/assets/docs/article/practical-database-design/part5/chapter34.md +1609 -1609
  635. package/lib/assets/docs/article/practical-database-design/part5/chapter35.md +1453 -1453
  636. package/lib/assets/docs/article/practical-database-design/part5/chapter36.md +1292 -1292
  637. package/lib/assets/docs/article/practical-database-design/part5/chapter37.md +1470 -1470
  638. package/lib/assets/docs/article/practical-database-design/part5/chapter38.md +1698 -1698
  639. package/lib/assets/docs/article/practical-database-design/part5/chapter39.md +2334 -2334
  640. package/lib/assets/docs/article/practical-database-design/study/study2-1.md +1693 -1693
  641. package/lib/assets/docs/article/practical-database-design/study/study2-2.md +1347 -1347
  642. package/lib/assets/docs/article/practical-database-design/study/study2-3.md +2044 -2044
  643. package/lib/assets/docs/article/practical-database-design/study/study2-4.md +2229 -2229
  644. package/lib/assets/docs/article/practical-database-design/study/study2-5.md +2418 -2418
  645. package/lib/assets/docs/article/practical-database-design/study/study3-1.md +2205 -2205
  646. package/lib/assets/docs/article/practical-database-design/study/study3-2.md +2221 -2221
  647. package/lib/assets/docs/article/practical-database-design/study/study3-3.md +2253 -2253
  648. package/lib/assets/docs/article/practical-database-design/study/study3-4.md +2106 -2106
  649. package/lib/assets/docs/article/practical-database-design/study/study3-5.md +2507 -2507
  650. package/lib/assets/docs/article/practical-database-design/study/study4-1.md +2587 -2587
  651. package/lib/assets/docs/article/practical-database-design/study/study4-2.md +2075 -2075
  652. package/lib/assets/docs/article/practical-database-design/study/study4-3.md +1805 -1805
  653. package/lib/assets/docs/article/practical-database-design/study/study4-4.md +1895 -1895
  654. package/lib/assets/docs/article/practical-database-design/study/study4-5.md +2878 -2878
  655. package/lib/assets/docs/assets/css/extra.css +29 -29
  656. package/lib/assets/docs/assets/js/extra.js +44 -44
  657. package/lib/assets/docs/design/index.md +44 -44
  658. package/lib/assets/docs/development/index.md +39 -39
  659. package/lib/assets/docs/index.md +33 -33
  660. package/lib/assets/docs/operation/index.md +27 -27
  661. package/lib/assets/docs/reference/CodexCLIMCP/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/351/226/213/347/231/272/343/203/225/343/203/255/343/203/274.md +546 -546
  662. package/lib/assets/docs/reference/CodexCLIMCP/343/202/265/343/203/274/343/203/220/343/203/274/350/250/255/345/256/232/346/211/213/351/240/206.md +341 -341
  663. package/lib/assets/docs/reference/Java/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +581 -581
  664. package/lib/assets/docs/reference/SonarQube/343/203/255/343/203/274/343/202/253/343/203/253/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +642 -642
  665. package/lib/assets/docs/reference/TypeScript/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +465 -465
  666. package/lib/assets/docs/reference/UI/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +450 -450
  667. package/lib/assets/docs/reference/images/Ansoff.drawio.svg +3 -3
  668. package/lib/assets/docs/reference/images/BMC.drawio.svg +3 -3
  669. package/lib/assets/docs/reference/images/BrandBasicStrategy.drawio.svg +3 -3
  670. package/lib/assets/docs/reference/images/BrandCategorization.drawio.svg +3 -3
  671. package/lib/assets/docs/reference/images/BrandRecurutementStrategy.drawio.svg +3 -3
  672. package/lib/assets/docs/reference/images/BrandValue.drawio.svg +3 -3
  673. package/lib/assets/docs/reference/images/BusinessActivitiy.svg +3 -3
  674. package/lib/assets/docs/reference/images/HRM.drawio.svg +3 -3
  675. package/lib/assets/docs/reference/images/MarketingStructure.drawio.svg +3 -3
  676. package/lib/assets/docs/reference/images/OrganizationElemnts.svg +3 -3
  677. package/lib/assets/docs/reference/images/PPM.drawio.svg +3 -3
  678. package/lib/assets/docs/reference/images/PositioningMap.drawio.svg +3 -3
  679. package/lib/assets/docs/reference/images/ProductLayer.drawio.svg +3 -3
  680. package/lib/assets/docs/reference/images/ProductMix.drawio.svg +3 -3
  681. package/lib/assets/docs/reference/images/SWOT.drawio.svg +3 -3
  682. package/lib/assets/docs/reference/images/TargetMarket.drawio.svg +3 -3
  683. package/lib/assets/docs/reference/images/ThreeGenericStrategies.drawio.svg +3 -3
  684. package/lib/assets/docs/reference/images/VRIO.drawio.svg +3 -3
  685. package/lib/assets/docs/reference/images/ValueChain.drawio.svg +3 -3
  686. package/lib/assets/docs/reference/index.md +53 -53
  687. package/lib/assets/docs/reference//343/202/210/343/201/204/343/202/275/343/203/225/343/203/210/343/202/246/343/202/247/343/202/242/343/201/250/343/201/257.md +250 -250
  688. package/lib/assets/docs/reference//343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +2216 -2216
  689. package/lib/assets/docs/reference//343/202/244/343/203/263/343/203/225/343/203/251/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +1878 -1878
  690. package/lib/assets/docs/reference//343/202/250/343/202/257/343/202/271/343/203/210/343/203/252/343/203/274/343/203/240/343/203/227/343/203/255/343/202/260/343/203/251/343/203/237/343/203/263/343/202/260.md +550 -550
  691. package/lib/assets/docs/reference//343/202/263/343/203/274/343/203/207/343/202/243/343/203/263/343/202/260/343/201/250/343/203/206/343/202/271/343/203/210/343/202/254/343/202/244/343/203/211.md +705 -705
  692. package/lib/assets/docs/reference//343/203/206/343/202/271/343/203/210/346/210/246/347/225/245/343/202/254/343/202/244/343/203/211.md +1313 -1313
  693. package/lib/assets/docs/reference//343/203/207/343/203/274/343/202/277/343/203/242/343/203/207/343/203/253/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +311 -311
  694. package/lib/assets/docs/reference//343/203/211/343/203/241/343/202/244/343/203/263/343/203/242/343/203/207/343/203/253/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +599 -599
  695. package/lib/assets/docs/reference//343/203/223/343/202/270/343/203/215/343/202/271/343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243/345/210/206/346/236/220/343/202/254/343/202/244/343/203/211.md +528 -528
  696. package/lib/assets/docs/reference//343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271/344/275/234/346/210/220/343/202/254/343/202/244/343/203/211.md +689 -689
  697. package/lib/assets/docs/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/202/254/343/202/244/343/203/211.md +461 -461
  698. package/lib/assets/docs/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/203/273/343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/350/250/210/347/224/273/343/202/254/343/202/244/343/203/211.md +580 -580
  699. package/lib/assets/docs/reference//343/203/255/343/202/270/343/202/253/343/203/253/343/202/267/343/203/263/343/202/255/343/203/263/343/202/260.md +1367 -1367
  700. package/lib/assets/docs/reference//344/274/201/346/245/255/347/265/214/345/226/266/350/253/226.md +2637 -2637
  701. package/lib/assets/docs/reference//347/222/260/345/242/203/345/244/211/346/225/260/347/256/241/347/220/206/343/202/254/343/202/244/343/203/211.md +665 -665
  702. package/lib/assets/docs/reference//347/265/214/345/226/266/346/210/246/347/225/245/345/210/206/346/236/220/343/202/254/343/202/244/343/203/211.md +566 -566
  703. package/lib/assets/docs/reference//350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +1248 -1248
  704. package/lib/assets/docs/reference//350/250/200/350/252/236/345/210/245/351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +518 -518
  705. package/lib/assets/docs/reference//351/201/213/345/226/266/347/256/241/347/220/206.md +1482 -1482
  706. package/lib/assets/docs/reference//351/201/213/347/224/250/343/202/271/343/202/257/343/203/252/343/203/227/343/203/210/344/275/234/346/210/220/343/202/254/343/202/244/343/203/211.md +421 -421
  707. package/lib/assets/docs/reference//351/201/213/347/224/250/350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +392 -392
  708. package/lib/assets/docs/reference//351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +305 -305
  709. package/lib/assets/docs/reference//351/235/236/346/251/237/350/203/275/350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +1236 -1236
  710. package/lib/assets/docs/requirements/index.md +17 -17
  711. package/lib/assets/docs/review/index.md +5 -5
  712. package/lib/assets/docs/strategy/index.md +17 -17
  713. package/lib/assets/docs/template/ADR.md +30 -30
  714. package/lib/assets/docs/template/AWS/343/202/271/343/203/206/343/203/274/343/202/270/343/203/263/343/202/260/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +1366 -1366
  715. package/lib/assets/docs/template/AWS/343/203/227/343/203/255/343/203/200/343/202/257/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +634 -634
  716. package/lib/assets/docs/template/README.md +50 -50
  717. package/lib/assets/docs/template/index.md +24 -24
  718. package/lib/assets/docs/template//343/201/276/343/201/232/343/201/223/343/202/214/343/202/222/350/252/255/343/202/202/343/201/206/343/203/252/343/202/271/343/203/210.md +12 -12
  719. package/lib/assets/docs/template//343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/351/226/213/347/231/272/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +547 -547
  720. package/lib/assets/docs/template//343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/345/256/214/344/272/206/345/240/261/345/221/212/346/233/270.md +58 -58
  721. package/lib/assets/docs/template//343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/350/250/210/347/224/273.md +327 -327
  722. package/lib/assets/docs/template//343/202/244/343/203/263/343/202/273/343/203/227/343/202/267/343/203/247/343/203/263/343/203/207/343/203/203/343/202/255.md +13 -13
  723. package/lib/assets/docs/template//343/203/223/343/202/270/343/203/215/343/202/271/343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243.md +379 -379
  724. package/lib/assets/docs/template//343/203/252/343/203/252/343/203/274/343/202/271/345/256/214/344/272/206/345/240/261/345/221/212/346/233/270.md +275 -275
  725. package/lib/assets/docs/template//344/272/213/344/276/213/345/210/206/346/236/220.md +513 -513
  726. package/lib/assets/docs/template//344/274/201/346/245/255/345/210/206/346/236/220.md +573 -573
  727. package/lib/assets/docs/template//345/256/214/345/205/250/345/275/242/345/274/217/343/201/256/343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271.md +69 -69
  728. package/lib/assets/docs/template//350/246/201/344/273/266/345/256/232/347/276/251.md +669 -669
  729. package/lib/assets/docs/template//350/250/255/350/250/210.md +173 -173
  730. package/lib/assets/docs/template//351/226/213/347/231/272/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +688 -688
  731. package/lib/assets/gulpfile.js +25 -25
  732. package/lib/assets/mkdocs.yml +139 -139
  733. package/lib/assets/ops/docker/mkdoc/Dockerfile +19 -19
  734. package/lib/assets/ops/docker/sonarqube-local/docker-compose.yml +57 -57
  735. package/lib/assets/ops/scripts/journal.js +180 -180
  736. package/lib/assets/ops/scripts/mkdocs.js +82 -82
  737. package/lib/assets/ops/scripts/release.js +431 -431
  738. package/lib/assets/ops/scripts/sonar_local.js +726 -726
  739. package/lib/assets/ops/scripts/ssh.js +190 -190
  740. package/lib/assets/ops/scripts/vault.js +299 -299
  741. package/lib/assets/package-lock.json +1653 -1653
  742. package/lib/assets/package.json +40 -40
  743. package/lib/gulpfile.js +37 -37
  744. package/package.json +41 -41
@@ -1,1417 +1,1417 @@
1
- # 第12章:販売管理データ設計(B 社事例)
2
-
3
- 販売管理システムのデータベース設計を、食肉・食肉加工品の製造販売を行う B 社の事例を通じて実践的に学びます。本章では、実際のビジネスに基づいたマスタデータとトランザクションデータの設計・実装方法を解説します。
4
-
5
- ## B 社事例の全体像
6
-
7
- B 社の販売管理システムに必要なデータ構造を、ビジネスモデルから段階的に設計します。
8
-
9
- ```plantuml
10
- @startuml
11
-
12
- title B 社の販売管理データ構造
13
-
14
- rectangle "ビジネス分析" {
15
- card "会社概要" as overview
16
- card "組織構成" as org
17
- card "ビジネスモデル" as model
18
- }
19
-
20
- rectangle "データ設計" {
21
- card "マスタデータ" as master
22
- card "トランザクション" as trans
23
- card "コード体系" as code
24
- }
25
-
26
- rectangle "実装" {
27
- card "Seed データ" as seed
28
- card "整合性検証" as verify
29
- }
30
-
31
- overview --> org
32
- org --> model
33
- model --> master
34
- master --> code
35
- code --> trans
36
- trans --> seed
37
- seed --> verify
38
-
39
- @enduml
40
- ```
41
-
42
- ### 本章の構成
43
-
44
- | セクション | 内容 |
45
- |-----------|------|
46
- | **12.1 B 社の概要** | 会社プロファイル、事業環境、事業特徴 |
47
- | **12.2 組織構成** | 組織図、部門階層、社員配置 |
48
- | **12.3 ビジネスモデル** | ビジネスモデルキャンバス、取引先・商品構成 |
49
- | **12.4 データ構造の設計** | マスタ構成、コード体系、ENUM マッピング |
50
- | **12.5 Seed データの実装** | マスタ・トランザクションの投入実装 |
51
-
52
- ---
53
-
54
- ## 12.1 B 社の概要
55
-
56
- ### 会社プロファイル
57
-
58
- | 項目 | 内容 |
59
- |------|------|
60
- | **社名** | B 社(架空) |
61
- | **業種** | 食肉・食肉加工品の製造・販売業 |
62
- | **資本金** | 3,000 万円 |
63
- | **従業員数** | 45 名(うちパート従業員 21 名) |
64
- | **事業所** | 本社、工場、直営小売店 1 店舗 |
65
- | **年間販売額** | 約 9 億円(2021 年度) |
66
- | **主要取扱商品** | 牛肉、豚肉、鶏肉、食肉加工品 |
67
-
68
- ### 沿革と事業環境
69
-
70
- B 社は X 県の大都市近郊に立地し、高速道路のインターチェンジからも近い車の利便性が良いエリアに位置しています。
71
-
72
- 1955 年に食肉小売店として開業し、当時の食肉消費拡大の波に乗って順調に成長。1960 年代には地域の百貨店や近隣スーパーへの卸売事業を開始しました。
73
-
74
- 百貨店やスーパーとの取引実績から、B 社の商品はクオリティの高さに定評があり、仕入れ元からの信頼も厚く、良質な食肉を安定的に仕入れられる体制が整っています。
75
-
76
- ### 事業の特徴
77
-
78
- ```plantuml
79
- @startuml
80
-
81
- title B 社の5つの事業特徴
82
-
83
- rectangle "事業特徴" {
84
- card "高品質な商品" as quality
85
- card "対面販売" as face
86
- card "多様な販路" as channel
87
- card "自社製造" as factory
88
- card "OEM 対応" as oem
89
- }
90
-
91
- note right of quality
92
- 百貨店向け贈答用を含めた
93
- 最高級品質の食肉・加工品
94
- end note
95
-
96
- note right of face
97
- 直営小売店での
98
- 顧客ニーズに合わせた接客販売
99
- end note
100
-
101
- note right of channel
102
- 百貨店、スーパー、ホテル・旅館
103
- 飲食店、観光施設、EC
104
- end note
105
-
106
- note right of factory
107
- 工場でハム、ソーセージ
108
- ローストビーフ等を製造
109
- end note
110
-
111
- note right of oem
112
- 相手先ブランドでの
113
- 製造も受託
114
- end note
115
-
116
- @enduml
117
- ```
118
-
119
- | 特徴 | 説明 |
120
- |------|------|
121
- | **高品質な商品** | 百貨店向けには贈答用を含めた最高級品質の食肉や食肉加工品 |
122
- | **対面販売** | 直営小売店では顧客ニーズに合わせた接客販売 |
123
- | **多様な販路** | 百貨店、スーパー、ホテル・旅館、飲食店、観光施設、EC |
124
- | **自社製造** | 工場でハム、ソーセージ、ローストビーフ等の加工品を製造 |
125
- | **OEM 対応** | 相手先ブランドでの製造も受託 |
126
-
127
- ---
128
-
129
- ## 12.2 組織構成
130
-
131
- ### 組織図
132
-
133
- ```plantuml
134
- @startwbs
135
- * B社
136
- ** 食肉製造・販売事業
137
- *** 食肉加工部門
138
- **** 牛肉・豚肉・鶏肉課
139
- **** 食肉加工品課 (ハム・ソーセージ・ローストビーフなど)
140
- *** 小売販売部門
141
- **** 直営小売店課
142
- **** 百貨店・スーパー向け販売課
143
- *** 新規取引先開拓部門
144
- **** ホテル・旅館向け課
145
- **** 飲食店向け課
146
- ** 食肉加工品事業
147
- *** 自社ブランド部門
148
- **** 贈答用製品製造課
149
- **** 道の駅・土産物製品販売課
150
- *** 相手先ブランド製造(OEM)部門
151
- **** 客先要望対応課
152
- ** コンサルティング事業
153
- *** 顧客対応部門
154
- **** メニュー提案課
155
- **** 半加工商品提供課
156
- @endwbs
157
- ```
158
-
159
- ### 部門マスタの階層構造
160
-
161
- ```
162
- 本社(000000)
163
- ├── 食肉製造・販売事業(100000)
164
- │ ├── 食肉加工部門(110000)
165
- │ │ ├── 牛肉・豚肉・鶏肉課(111000)
166
- │ │ └── 食肉加工品課(112000)
167
- │ ├── 小売販売部門(120000)
168
- │ │ ├── 直営小売店課(121000)
169
- │ │ └── 百貨店・スーパー向け販売課(122000)
170
- │ └── 新規取引先開拓部門(130000)
171
- │ ├── ホテル・旅館向け課(131000)
172
- │ └── 飲食店向け課(132000)
173
- ├── 食肉加工品事業(200000)
174
- │ ├── 自社ブランド部門(210000)
175
- │ │ ├── 贈答用製品製造課(211000)
176
- │ │ └── 道の駅・土産物製品販売課(212000)
177
- │ └── 相手先ブランド製造(OEM)部門(220000)
178
- │ └── 客先要望対応課(221000)
179
- └── コンサルティング事業(300000)
180
- └── 顧客対応部門(310000)
181
- ├── メニュー提案課(311000)
182
- └── 半加工商品提供課(312000)
183
- ```
184
-
185
- ### 社員の配置
186
-
187
- | 部門 | 正社員 | パート | 計 |
188
- |------|--------|--------|-----|
189
- | 経営層(本社) | 2 名 | - | 2 名 |
190
- | 食肉製造・販売事業 | 8 名 | 7 名 | 15 名 |
191
- | 食肉加工品事業 | 6 名 | 8 名 | 14 名 |
192
- | コンサルティング事業 | 6 名 | 6 名 | 12 名 |
193
- | 経理・総務等 | 2 名 | - | 2 名 |
194
- | **合計** | **24 名** | **21 名** | **45 名** |
195
-
196
- ---
197
-
198
- ## 12.3 ビジネスモデル
199
-
200
- ### ビジネスモデルキャンバス
201
-
202
- ```plantuml
203
- @startmindmap
204
- * ビジネスモデル
205
- ** 内部環境
206
- *** 顧客
207
- **** 顧客セグメント
208
- ***** 百貨店
209
- ***** スーパー
210
- ***** ホテル・旅館
211
- ***** 飲食店
212
- ***** 個人消費者(直営小売店利用)
213
- ***** EC利用顧客
214
- **** 顧客関係
215
- ***** 高品質の食品提供による信頼構築
216
- ***** 小売顧客との対面接客
217
- ***** 顧客ニーズに基づくカスタマイズサービス(飲食店向け)
218
- ***** オンライン顧客とのデジタルサポート
219
- *** 価値
220
- **** 価値提案
221
- ***** 高品質な食肉と加工品
222
- ***** 百貨店・観光向けギフト商品
223
- ***** 健康志向に適応した加工品(低脂肪・低塩分等)
224
- ***** 顧客ニーズにフィットした加工品
225
- ***** 持続可能性を考慮した地域密着型商品
226
- **** チャネル
227
- ***** 直営小売店
228
- ***** 百貨店・スーパー
229
- ***** 観光地の道の駅や土産物店
230
- ***** 配送による顧客への納品
231
- ***** オンライン販売(EC)
232
- *** インフラ
233
- **** 主要活動
234
- ***** 食肉の仕入れ・加工・販売
235
- ***** 新規取引先の開拓
236
- ***** 品質保証と顧客満足の追求
237
- ***** ブランド管理とマーケティング
238
- ***** 環境保全活動(食品ロス削減)
239
- **** 主要リソース
240
- ***** 自社工場
241
- ***** 高度な職人による加工技術
242
- ***** ブランド価値
243
- ***** トレーサビリティとデジタルツール
244
- **** 主要パートナー
245
- ***** 地元農家や畜産業者
246
- ***** 観光業者、地元流通業者
247
- ***** 地域のオンラインプラットフォーム
248
- *** 資金
249
- **** 収益源
250
- ***** 加工品の販売収入
251
- ***** 高品質食肉の販売収入
252
- ***** オンライン販売収入
253
- **** コスト構造
254
- ***** 食肉の仕入れコスト
255
- ***** 工場運営コスト(人件費・設備費)
256
- ***** マーケティング費用
257
- ***** デジタル推進関連費用
258
- left side
259
- ** 外部環境
260
- *** 競争
261
- **** 他の地元業者・大手食肉卸売業者
262
- **** 全国規模スーパーの競争優位性
263
- **** 代替肉や植物由来製品業者
264
- *** 政治・社会・技術
265
- **** 地域食品産業振興政策
266
- **** 健康志向の高まりに基づく食の選択
267
- **** 加工技術や物流の効率化
268
- **** 環境保護と持続可能性の推進
269
- *** マクロ経済
270
- **** 消費者物価の動向(価格競争)
271
- **** 労働力不足による人件費増加
272
- **** 地元経済への還元と連携
273
- *** 市場
274
- **** ローカル市場(地元住民)
275
- **** 観光市場(道の駅利用の観光客)
276
- **** 周辺地域への広域展開可能性
277
- **** 健康志向顧客層へのリーチ
278
- @endmindmap
279
- ```
280
-
281
- ### 得意先の分類
282
-
283
- | グループ | 取引先例 | 特徴 |
284
- |---------|---------|------|
285
- | 百貨店 | 地域百貨店、X 県有名百貨店 | 贈答用高級品、ギフト需要 |
286
- | スーパー | 地域スーパーチェーン、広域スーパーチェーン | 日常使いのカット肉・スライス肉 |
287
- | ホテル・旅館 | シティホテル、温泉旅館 | 宴会・レストラン向け |
288
- | 飲食店 | 焼肉レストラン、イタリアンレストラン | メニュー提案付き販売 |
289
- | 観光施設 | 道の駅、観光センター | 土産物・贈答品 |
290
-
291
- ### 仕入先の分類
292
-
293
- | グループ | 取引先例 | 特徴 |
294
- |---------|---------|------|
295
- | 食肉卸 | 地域食肉卸 A 社、地域食肉卸 B 社 | 牛肉・豚肉・鶏肉の安定供給 |
296
- | 畜産業者 | 地域畜産農家、県内畜産組合 | 高品質な原材料 |
297
-
298
- ### 商品構成
299
-
300
- | 分類 | 商品例 | 特徴 |
301
- |------|--------|------|
302
- | 牛肉 | 黒毛和牛サーロイン、ロース、カルビ、ヒレ、切り落とし | 高級品から日常使いまで |
303
- | 豚肉 | 豚ロース、豚バラ、豚ヒレ、豚コマ、豚肩ロース | 幅広い用途 |
304
- | 鶏肉 | 鶏もも、鶏むね、手羽先、手羽元、鶏ささみ | 健康志向にも対応 |
305
- | 加工品 | ローストビーフ、ハム、ソーセージ、ベーコン、コロッケ | 自社工場製造 |
306
-
307
- ---
308
-
309
- ## 12.4 データ構造の設計
310
-
311
- ### マスタデータの構成
312
-
313
- | データ種別 | 件数 | 内容 |
314
- |-----------|------|------|
315
- | 部門マスタ | 21 件 | 4 階層の組織構造 |
316
- | 社員マスタ | 24 件 | 正社員 24 名 |
317
- | 取引先マスタ | 14 件 | 得意先 10 件、仕入先 4 件 |
318
- | 商品分類マスタ | 4 件 | 牛肉、豚肉、鶏肉、加工品 |
319
- | 商品マスタ | 20 件 | 各分類 5 件ずつ |
320
- | 倉庫マスタ | 3 件 | 本社倉庫、工場倉庫、外部委託倉庫 |
321
-
322
- ### コード体系
323
-
324
- #### 商品コード体系
325
-
326
- | 接頭辞 | 区分 | 例 |
327
- |--------|------|-----|
328
- | BEEF- | 牛肉 | BEEF-001 黒毛和牛サーロイン |
329
- | PORK- | 豚肉 | PORK-001 豚ロース |
330
- | CHKN- | 鶏肉 | CHKN-001 鶏もも |
331
- | PROC- | 加工品 | PROC-001 ローストビーフ |
332
-
333
- #### 取引先コード体系
334
-
335
- | 接頭辞 | 区分 | 例 |
336
- |--------|------|-----|
337
- | CUS- | 得意先 | CUS-001 地域百貨店 |
338
- | SUP- | 仕入先 | SUP-001 地域食肉卸 A 社 |
339
-
340
- #### 部門コード体系
341
-
342
- | コード | 部門名 | 階層 |
343
- |--------|--------|------|
344
- | 000000 | 本社 | 1 |
345
- | 100000 | 食肉製造・販売事業 | 2 |
346
- | 110000 | 食肉加工部門 | 3 |
347
- | 111000 | 牛肉・豚肉・鶏肉課 | 4 |
348
- | 112000 | 食肉加工品課 | 4 |
349
- | 120000 | 小売販売部門 | 3 |
350
- | 121000 | 直営小売店課 | 4 |
351
- | 122000 | 百貨店・スーパー向け販売課 | 4 |
352
- | 200000 | 食肉加工品事業 | 2 |
353
- | 300000 | コンサルティング事業 | 2 |
354
-
355
- ### ENUM の日本語・英語マッピング
356
-
357
- 本システムでは、データベースの ENUM 値は日本語、Java の ENUM は英語で定義し、MyBatis の TypeHandler でマッピングを行います。
358
-
359
- #### 取引先区分(PartnerType)
360
-
361
- | 日本語 DB 値 | 英語 Java 値 |
362
- |-------------|-------------|
363
- | "顧客" | CUSTOMER |
364
- | "仕入先" | SUPPLIER |
365
-
366
- #### 商品区分(ProductType)
367
-
368
- | 日本語 DB 値 | 英語 Java 値 |
369
- |-------------|-------------|
370
- | "商品" | PRODUCT |
371
- | "製品" | MANUFACTURED |
372
- | "サービス" | SERVICE |
373
-
374
- #### 税区分(TaxType)
375
-
376
- | 日本語 DB 値 | 英語 Java 値 |
377
- |-------------|-------------|
378
- | "標準税率" | STANDARD |
379
- | "軽減税率" | REDUCED |
380
- | "非課税" | EXEMPT |
381
-
382
- #### 受注ステータス(OrderStatus)
383
-
384
- | 日本語 DB 値 | 英語 Java 値 |
385
- |-------------|-------------|
386
- | "受付済" | RECEIVED |
387
- | "引当済" | ALLOCATED |
388
- | "出荷指示済" | SHIPMENT_INSTRUCTED |
389
- | "出荷済" | SHIPPED |
390
- | "キャンセル" | CANCELLED |
391
-
392
- #### 出荷ステータス(ShipmentStatus)
393
-
394
- | 日本語 DB 値 | 英語 Java 値 |
395
- |-------------|-------------|
396
- | "未出荷" | PENDING |
397
- | "出荷済" | SHIPPED |
398
- | "配達完了" | DELIVERED |
399
-
400
- #### 発注ステータス(PurchaseStatus)
401
-
402
- | 日本語 DB 値 | 英語 Java 値 |
403
- |-------------|-------------|
404
- | "発注済" | ORDERED |
405
- | "入荷済" | RECEIVED |
406
- | "検収済" | INSPECTED |
407
- | "キャンセル" | CANCELLED |
408
-
409
- #### 倉庫区分(WarehouseType)
410
-
411
- | 日本語 DB 値 | 英語 Java 値 |
412
- |-------------|-------------|
413
- | "自社" | OWN |
414
- | "外部" | EXTERNAL |
415
- | "仮想" | VIRTUAL |
416
-
417
- ### データモデル ER 図
418
-
419
- ```plantuml
420
- @startuml
421
-
422
- title B 社 販売管理データモデル
423
-
424
- ' マスタ系
425
- package "マスタデータ" {
426
- entity "部門マスタ" as dept {
427
- * 部門コード : VARCHAR(6)
428
- * 適用開始日 : DATE
429
- --
430
- 部門名 : VARCHAR(100)
431
- 部門パス : VARCHAR(500)
432
- 階層 : INTEGER
433
- }
434
-
435
- entity "社員マスタ" as emp {
436
- * 社員コード : VARCHAR(10)
437
- * 適用開始日 : DATE
438
- --
439
- 姓 : VARCHAR(50)
440
- 名 : VARCHAR(50)
441
- 部門コード : VARCHAR(6)
442
- 雇用区分 : VARCHAR(20)
443
- }
444
-
445
- entity "取引先グループマスタ" as grp {
446
- * グループコード : VARCHAR(20)
447
- * 適用開始日 : DATE
448
- --
449
- グループ名 : VARCHAR(100)
450
- }
451
-
452
- entity "取引先マスタ" as partner {
453
- * 取引先コード : VARCHAR(20)
454
- * 適用開始日 : DATE
455
- --
456
- 取引先名 : VARCHAR(100)
457
- 取引先区分 : 取引先区分
458
- グループコード : VARCHAR(20)
459
- }
460
-
461
- entity "顧客マスタ" as customer {
462
- * 取引先コード : VARCHAR(20)
463
- * 適用開始日 : DATE
464
- --
465
- 締日 : INTEGER
466
- 回収サイト : INTEGER
467
- 回収日 : INTEGER
468
- 与信限度額 : NUMERIC
469
- }
470
-
471
- entity "仕入先マスタ" as supplier {
472
- * 取引先コード : VARCHAR(20)
473
- * 適用開始日 : DATE
474
- --
475
- 締日 : INTEGER
476
- 支払サイト : INTEGER
477
- 支払日 : INTEGER
478
- リードタイム : INTEGER
479
- }
480
-
481
- entity "商品分類マスタ" as category {
482
- * 分類コード : VARCHAR(20)
483
- * 適用開始日 : DATE
484
- --
485
- 分類名 : VARCHAR(100)
486
- 分類パス : VARCHAR(500)
487
- 階層 : INTEGER
488
- }
489
-
490
- entity "商品マスタ" as product {
491
- * 商品コード : VARCHAR(20)
492
- * 適用開始日 : DATE
493
- --
494
- 商品名 : VARCHAR(200)
495
- 分類コード : VARCHAR(20)
496
- 商品区分 : 商品区分
497
- 税区分 : 税区分
498
- 標準売価 : NUMERIC
499
- 標準原価 : NUMERIC
500
- }
501
-
502
- entity "倉庫マスタ" as warehouse {
503
- * 倉庫コード : VARCHAR(20)
504
- * 適用開始日 : DATE
505
- --
506
- 倉庫名 : VARCHAR(100)
507
- 所在地 : VARCHAR(200)
508
- 倉庫区分 : 倉庫区分
509
- }
510
- }
511
-
512
- ' リレーション
513
- dept ||--o{ emp : 所属
514
- grp ||--o{ partner : 分類
515
- partner ||--o| customer : 拡張
516
- partner ||--o| supplier : 拡張
517
- category ||--o{ product : 分類
518
-
519
- @enduml
520
- ```
521
-
522
- ---
523
-
524
- ## 12.5 Seed データの実装
525
-
526
- ### 実装方針
527
-
528
- Seed データの投入にあたり、以下のポイントを考慮します。
529
-
530
- | ポイント | 説明 |
531
- |---------|------|
532
- | **外部キー制約の考慮** | データ投入順序を依存関係に基づいて設計 |
533
- | **複合キーの扱い** | 適用開始日を含む複合主キーへの対応 |
534
- | **日本語テーブル名・カラム名** | MyBatis の resultMap でマッピング |
535
- | **ヘキサゴナルアーキテクチャ** | Repository(出力ポート)経由でデータ投入 |
536
- | **Spring Profile の活用** | `default` プロファイルでアプリ起動時に自動投入 |
537
-
538
- ### プロジェクト構造
539
-
540
- ```
541
- src/
542
- ├── main/
543
- │ └── java/
544
- │ └── com/example/sms/
545
- │ ├── application/
546
- │ │ └── port/
547
- │ │ └── out/
548
- │ │ └── *Repository.java # 出力ポート
549
- │ ├── domain/
550
- │ │ └── model/
551
- │ │ └── ... # ドメインモデル
552
- │ └── infrastructure/
553
- │ ├── in/
554
- │ │ ├── rest/ # REST API アダプタ
555
- │ │ └── seed/ # Seed データ投入
556
- │ │ ├── SeedDataService.java
557
- │ │ ├── MasterDataSeeder.java
558
- │ │ ├── TransactionDataSeeder.java
559
- │ │ └── SeedRunner.java
560
- │ └── out/
561
- │ └── persistence/
562
- │ ├── mapper/ # MyBatis Mapper
563
- │ └── repository/ # Repository 実装
564
- └── test/
565
- └── java/
566
- └── com/example/sms/
567
- └── infrastructure/
568
- └── in/
569
- └── seed/
570
- └── SeedDataServiceTest.java
571
- ```
572
-
573
- ### SeedDataService の実装
574
-
575
- <details>
576
- <summary>SeedDataService.java</summary>
577
-
578
- ```java
579
- package com.example.sms.infrastructure.in.seed;
580
-
581
- import org.slf4j.Logger;
582
- import org.slf4j.LoggerFactory;
583
- import org.springframework.stereotype.Service;
584
- import org.springframework.transaction.annotation.Transactional;
585
-
586
- import java.time.LocalDate;
587
-
588
- /**
589
- * Seed データ投入サービス.
590
- * B社事例に基づく販売管理システムの初期データを投入する。
591
- */
592
- @Service
593
- public class SeedDataService {
594
-
595
- private static final Logger log = LoggerFactory.getLogger(SeedDataService.class);
596
-
597
- private final MasterDataSeeder masterDataSeeder;
598
- private final TransactionDataSeeder transactionDataSeeder;
599
-
600
- public SeedDataService(
601
- MasterDataSeeder masterDataSeeder,
602
- TransactionDataSeeder transactionDataSeeder) {
603
- this.masterDataSeeder = masterDataSeeder;
604
- this.transactionDataSeeder = transactionDataSeeder;
605
- }
606
-
607
- /**
608
- * すべての Seed データを投入.
609
- */
610
- @Transactional
611
- public void seedAll() {
612
- log.info("========================================");
613
- log.info("販売管理システム Seed データ投入開始");
614
- log.info("========================================");
615
-
616
- LocalDate effectiveDate = LocalDate.of(2025, 1, 1);
617
-
618
- // 既存データの削除
619
- cleanAllData();
620
-
621
- // マスタデータの投入
622
- masterDataSeeder.seedAll(effectiveDate);
623
-
624
- // トランザクションデータの投入
625
- transactionDataSeeder.seedAll(effectiveDate);
626
-
627
- log.info("========================================");
628
- log.info("販売管理システム Seed データ投入完了!");
629
- log.info("========================================");
630
- }
631
-
632
- private void cleanAllData() {
633
- log.info("既存データを削除中...");
634
-
635
- // トランザクションデータから削除(外部キー制約のため逆順)
636
- transactionDataSeeder.cleanAll();
637
-
638
- // マスタデータを削除
639
- masterDataSeeder.cleanAll();
640
-
641
- log.info("既存データ削除完了");
642
- }
643
- }
644
- ```
645
-
646
- </details>
647
-
648
- ### MasterDataSeeder の実装
649
-
650
- <details>
651
- <summary>MasterDataSeeder.java</summary>
652
-
653
- ```java
654
- package com.example.sms.infrastructure.in.seed;
655
-
656
- import com.example.sms.application.port.out.*;
657
- import com.example.sms.domain.model.department.Department;
658
- import com.example.sms.domain.model.employee.Employee;
659
- import com.example.sms.domain.model.inventory.Warehouse;
660
- import com.example.sms.domain.model.inventory.WarehouseType;
661
- import com.example.sms.domain.model.partner.Partner;
662
- import com.example.sms.domain.model.product.*;
663
- import org.slf4j.Logger;
664
- import org.slf4j.LoggerFactory;
665
- import org.springframework.stereotype.Component;
666
-
667
- import java.math.BigDecimal;
668
- import java.time.LocalDate;
669
- import java.util.List;
670
-
671
- /**
672
- * マスタデータ Seeder.
673
- * B社事例に基づくマスタデータを投入する。
674
- */
675
- @Component
676
- public class MasterDataSeeder {
677
-
678
- private static final Logger log = LoggerFactory.getLogger(MasterDataSeeder.class);
679
-
680
- private final DepartmentRepository departmentRepository;
681
- private final EmployeeRepository employeeRepository;
682
- private final PartnerRepository partnerRepository;
683
- private final ProductClassificationRepository productClassificationRepository;
684
- private final ProductRepository productRepository;
685
- private final WarehouseRepository warehouseRepository;
686
-
687
- // コンストラクタ省略
688
-
689
- /**
690
- * すべてのマスタデータを投入.
691
- */
692
- public void seedAll(LocalDate effectiveDate) {
693
- seedDepartments(effectiveDate);
694
- seedWarehouses();
695
- seedProductClassifications();
696
- seedProducts();
697
- seedPartners();
698
- seedEmployees(effectiveDate);
699
- }
700
-
701
- /**
702
- * すべてのマスタデータを削除.
703
- */
704
- public void cleanAll() {
705
- employeeRepository.deleteAll();
706
- productRepository.deleteAll();
707
- productClassificationRepository.deleteAll();
708
- partnerRepository.deleteAll();
709
- warehouseRepository.deleteAll();
710
- departmentRepository.deleteAll();
711
- }
712
-
713
- private void seedDepartments(LocalDate effectiveDate) {
714
- log.info("部門マスタを投入中...");
715
-
716
- List<Department> departments = List.of(
717
- // 本社
718
- Department.builder()
719
- .departmentCode("000000").startDate(effectiveDate)
720
- .departmentName("本社").departmentPath("/000000").hierarchyLevel(1).build(),
721
-
722
- // 食肉製造・販売事業
723
- Department.builder()
724
- .departmentCode("100000").startDate(effectiveDate)
725
- .departmentName("食肉製造・販売事業").departmentPath("/000000/100000").hierarchyLevel(2).build(),
726
- // ... 以下省略
727
- );
728
-
729
- departments.forEach(departmentRepository::save);
730
- log.info("部門マスタ {}件 投入完了", departments.size());
731
- }
732
-
733
- private void seedWarehouses() {
734
- log.info("倉庫マスタを投入中...");
735
-
736
- List<Warehouse> warehouses = List.of(
737
- Warehouse.builder()
738
- .warehouseCode("WH-HQ")
739
- .warehouseName("本社倉庫")
740
- .warehouseType(WarehouseType.OWN)
741
- .address("東京都千代田区1-1-1")
742
- .activeFlag(true)
743
- .build(),
744
- Warehouse.builder()
745
- .warehouseCode("WH-FAC")
746
- .warehouseName("工場倉庫")
747
- .warehouseType(WarehouseType.OWN)
748
- .address("埼玉県さいたま市2-2-2")
749
- .activeFlag(true)
750
- .build(),
751
- Warehouse.builder()
752
- .warehouseCode("WH-EXT")
753
- .warehouseName("外部委託倉庫")
754
- .warehouseType(WarehouseType.EXTERNAL)
755
- .address("神奈川県横浜市3-3-3")
756
- .activeFlag(true)
757
- .build()
758
- );
759
-
760
- warehouses.forEach(warehouseRepository::save);
761
- log.info("倉庫マスタ {}件 投入完了", warehouses.size());
762
- }
763
-
764
- private void seedProductClassifications() {
765
- log.info("商品分類マスタを投入中...");
766
-
767
- List<ProductClassification> categories = List.of(
768
- ProductClassification.builder()
769
- .classificationCode("CAT-BEEF").classificationName("牛肉")
770
- .classificationPath("/CAT-BEEF").hierarchyLevel(1).build(),
771
- ProductClassification.builder()
772
- .classificationCode("CAT-PORK").classificationName("豚肉")
773
- .classificationPath("/CAT-PORK").hierarchyLevel(1).build(),
774
- ProductClassification.builder()
775
- .classificationCode("CAT-CHKN").classificationName("鶏肉")
776
- .classificationPath("/CAT-CHKN").hierarchyLevel(1).build(),
777
- ProductClassification.builder()
778
- .classificationCode("CAT-PROC").classificationName("加工品")
779
- .classificationPath("/CAT-PROC").hierarchyLevel(1).build()
780
- );
781
-
782
- categories.forEach(productClassificationRepository::save);
783
- log.info("商品分類マスタ {}件 投入完了", categories.size());
784
- }
785
-
786
- private void seedProducts() {
787
- log.info("商品マスタを投入中...");
788
-
789
- List<Product> products = List.of(
790
- // 牛肉
791
- createProduct("BEEF-001", "黒毛和牛サーロイン", "CAT-BEEF", 8000, 5000),
792
- createProduct("BEEF-002", "黒毛和牛ロース", "CAT-BEEF", 6000, 3800),
793
- // ... 以下省略(全20件)
794
- );
795
-
796
- products.forEach(productRepository::save);
797
- log.info("商品マスタ {}件 投入完了", products.size());
798
- }
799
-
800
- private Product createProduct(String code, String name, String classificationCode,
801
- int sellingPrice, int purchasePrice) {
802
- return Product.builder()
803
- .productCode(code)
804
- .productName(name)
805
- .productCategory(ProductCategory.PRODUCT)
806
- .taxCategory(TaxCategory.EXCLUSIVE)
807
- .classificationCode(classificationCode)
808
- .sellingPrice(new BigDecimal(sellingPrice))
809
- .purchasePrice(new BigDecimal(purchasePrice))
810
- .isInventoryManaged(true)
811
- .build();
812
- }
813
-
814
- private void seedPartners() {
815
- log.info("取引先マスタを投入中...");
816
-
817
- List<Partner> partners = List.of(
818
- // 得意先(百貨店)
819
- createCustomer("CUS-001", "地域百貨店"),
820
- createCustomer("CUS-002", "X県有名百貨店"),
821
- // ... 以下省略(全14件:得意先10件、仕入先4件)
822
- );
823
-
824
- partners.forEach(partnerRepository::save);
825
- log.info("取引先マスタ {}件 投入完了", partners.size());
826
- }
827
-
828
- private Partner createCustomer(String code, String name) {
829
- return Partner.builder()
830
- .partnerCode(code)
831
- .partnerName(name)
832
- .isCustomer(true)
833
- .isSupplier(false)
834
- .creditLimit(new BigDecimal("10000000"))
835
- .build();
836
- }
837
-
838
- private Partner createSupplier(String code, String name) {
839
- return Partner.builder()
840
- .partnerCode(code)
841
- .partnerName(name)
842
- .isCustomer(false)
843
- .isSupplier(true)
844
- .build();
845
- }
846
-
847
- private void seedEmployees(LocalDate effectiveDate) {
848
- log.info("社員マスタを投入中...");
849
-
850
- List<Employee> employees = List.of(
851
- // 経営層
852
- createEmployee("EMP-001", "山田 太郎", "000000", effectiveDate),
853
- createEmployee("EMP-002", "佐藤 次郎", "000000", effectiveDate),
854
- // ... 以下省略(全24件)
855
- );
856
-
857
- employees.forEach(employeeRepository::save);
858
- log.info("社員マスタ {}件 投入完了", employees.size());
859
- }
860
-
861
- private Employee createEmployee(String code, String name, String departmentCode,
862
- LocalDate departmentStartDate) {
863
- return Employee.builder()
864
- .employeeCode(code)
865
- .employeeName(name)
866
- .departmentCode(departmentCode)
867
- .departmentStartDate(departmentStartDate)
868
- .build();
869
- }
870
- }
871
- ```
872
-
873
- </details>
874
-
875
- ### TransactionDataSeeder の実装
876
-
877
- <details>
878
- <summary>TransactionDataSeeder.java</summary>
879
-
880
- ```java
881
- package com.example.sms.infrastructure.in.seed;
882
-
883
- import com.example.sms.application.port.out.*;
884
- import com.example.sms.domain.model.inventory.Inventory;
885
- import com.example.sms.domain.model.product.TaxCategory;
886
- import com.example.sms.domain.model.sales.OrderStatus;
887
- import com.example.sms.domain.model.sales.SalesOrder;
888
- import com.example.sms.domain.model.sales.SalesOrderDetail;
889
- import org.slf4j.Logger;
890
- import org.slf4j.LoggerFactory;
891
- import org.springframework.stereotype.Component;
892
-
893
- import java.math.BigDecimal;
894
- import java.time.LocalDate;
895
- import java.util.List;
896
-
897
- /**
898
- * トランザクションデータ Seeder.
899
- * B社事例に基づくトランザクションデータを投入する。
900
- */
901
- @Component
902
- public class TransactionDataSeeder {
903
-
904
- private static final Logger log = LoggerFactory.getLogger(TransactionDataSeeder.class);
905
-
906
- private final InventoryRepository inventoryRepository;
907
- private final SalesOrderRepository salesOrderRepository;
908
- private final ShipmentRepository shipmentRepository;
909
- private final SalesRepository salesRepository;
910
-
911
- // コンストラクタ省略
912
-
913
- /**
914
- * すべてのトランザクションデータを投入.
915
- */
916
- public void seedAll(LocalDate effectiveDate) {
917
- seedInventories();
918
- seedOrders(effectiveDate);
919
- }
920
-
921
- /**
922
- * すべてのトランザクションデータを削除.
923
- */
924
- public void cleanAll() {
925
- salesRepository.deleteAll();
926
- shipmentRepository.deleteAll();
927
- salesOrderRepository.deleteAll();
928
- inventoryRepository.deleteAll();
929
- }
930
-
931
- private void seedInventories() {
932
- log.info("在庫情報を投入中...");
933
-
934
- List<Inventory> inventories = List.of(
935
- // 本社倉庫の在庫(牛肉)
936
- createInventory("WH-HQ", "BEEF-001", 50, 10),
937
- createInventory("WH-HQ", "BEEF-002", 80, 15),
938
- createInventory("WH-HQ", "BEEF-003", 100, 20),
939
- createInventory("WH-HQ", "BEEF-004", 30, 5),
940
- createInventory("WH-HQ", "BEEF-005", 150, 30),
941
-
942
- // 本社倉庫の在庫(豚肉)
943
- createInventory("WH-HQ", "PORK-001", 200, 30),
944
- createInventory("WH-HQ", "PORK-002", 250, 40),
945
- createInventory("WH-HQ", "PORK-003", 100, 15),
946
- createInventory("WH-HQ", "PORK-004", 300, 50),
947
- createInventory("WH-HQ", "PORK-005", 180, 25),
948
-
949
- // 本社倉庫の在庫(鶏肉)
950
- createInventory("WH-HQ", "CHKN-001", 300, 50),
951
- createInventory("WH-HQ", "CHKN-002", 350, 60),
952
- createInventory("WH-HQ", "CHKN-003", 200, 30),
953
- createInventory("WH-HQ", "CHKN-004", 180, 25),
954
- createInventory("WH-HQ", "CHKN-005", 150, 20),
955
-
956
- // 工場倉庫の在庫(加工品)
957
- createInventory("WH-FAC", "PROC-001", 100, 20),
958
- createInventory("WH-FAC", "PROC-002", 150, 30),
959
- createInventory("WH-FAC", "PROC-003", 200, 40),
960
- createInventory("WH-FAC", "PROC-004", 180, 35),
961
- createInventory("WH-FAC", "PROC-005", 300, 50)
962
- );
963
-
964
- inventories.forEach(inventoryRepository::save);
965
- log.info("在庫情報 {}件 投入完了", inventories.size());
966
- }
967
-
968
- private Inventory createInventory(String warehouseCode, String productCode,
969
- int quantity, int allocatedQuantity) {
970
- return Inventory.builder()
971
- .warehouseCode(warehouseCode)
972
- .productCode(productCode)
973
- .currentQuantity(new BigDecimal(quantity))
974
- .allocatedQuantity(new BigDecimal(allocatedQuantity))
975
- .orderedQuantity(BigDecimal.ZERO)
976
- .build();
977
- }
978
-
979
- private void seedOrders(LocalDate effectiveDate) {
980
- log.info("受注データを投入中...");
981
-
982
- // 受注1(百貨店向け)- 引当済み
983
- SalesOrder order1 = SalesOrder.builder()
984
- .orderNumber("ORD-2025-001")
985
- .orderDate(LocalDate.of(2025, 1, 10))
986
- .customerCode("CUS-001")
987
- .representativeCode("EMP-009")
988
- .requestedDeliveryDate(LocalDate.of(2025, 1, 15))
989
- .status(OrderStatus.ALLOCATED)
990
- .details(List.of(
991
- createOrderDetail(1, "BEEF-001", "黒毛和牛サーロイン", 10, 8000),
992
- createOrderDetail(2, "PROC-001", "ローストビーフ", 20, 3500)
993
- ))
994
- .build();
995
- salesOrderRepository.save(order1);
996
-
997
- // 受注2(スーパー向け)- 引当済み
998
- SalesOrder order2 = SalesOrder.builder()
999
- .orderNumber("ORD-2025-002")
1000
- .orderDate(LocalDate.of(2025, 1, 12))
1001
- .customerCode("CUS-003")
1002
- .representativeCode("EMP-009")
1003
- .requestedDeliveryDate(LocalDate.of(2025, 1, 18))
1004
- .status(OrderStatus.ALLOCATED)
1005
- .details(List.of(
1006
- createOrderDetail(1, "PORK-001", "豚ロース", 50, 1200),
1007
- createOrderDetail(2, "CHKN-001", "鶏もも", 100, 480)
1008
- ))
1009
- .build();
1010
- salesOrderRepository.save(order2);
1011
-
1012
- // 受注3(ホテル向け)- 出荷済み
1013
- SalesOrder order3 = SalesOrder.builder()
1014
- .orderNumber("ORD-2025-003")
1015
- .orderDate(LocalDate.of(2025, 1, 15))
1016
- .customerCode("CUS-005")
1017
- .representativeCode("EMP-010")
1018
- .requestedDeliveryDate(LocalDate.of(2025, 1, 17))
1019
- .status(OrderStatus.SHIPPED)
1020
- .details(List.of(
1021
- createOrderDetail(1, "BEEF-002", "黒毛和牛ロース", 30, 6000),
1022
- createOrderDetail(2, "BEEF-003", "黒毛和牛カルビ", 25, 5500)
1023
- ))
1024
- .build();
1025
- salesOrderRepository.save(order3);
1026
-
1027
- log.info("受注データ 3件 投入完了");
1028
- }
1029
-
1030
- private SalesOrderDetail createOrderDetail(int lineNumber, String productCode,
1031
- String productName, int quantity, int unitPrice) {
1032
- BigDecimal qty = new BigDecimal(quantity);
1033
- BigDecimal price = new BigDecimal(unitPrice);
1034
- BigDecimal amount = qty.multiply(price);
1035
- BigDecimal taxRate = new BigDecimal("10.00");
1036
- BigDecimal taxAmount = amount.multiply(taxRate).divide(new BigDecimal("100"));
1037
-
1038
- return SalesOrderDetail.builder()
1039
- .lineNumber(lineNumber)
1040
- .productCode(productCode)
1041
- .productName(productName)
1042
- .orderQuantity(qty)
1043
- .unitPrice(price)
1044
- .amount(amount)
1045
- .taxCategory(TaxCategory.EXCLUSIVE)
1046
- .taxRate(taxRate)
1047
- .taxAmount(taxAmount)
1048
- .warehouseCode("WH-HQ")
1049
- .build();
1050
- }
1051
- }
1052
- ```
1053
-
1054
- **注**: 出荷・売上データは受注明細への依存関係が複雑なため、初期シードでは投入しません。これらは別途のユースケースで実装します。
1055
-
1056
- </details>
1057
-
1058
- ### Seed データ実行方法
1059
-
1060
- #### Gradle タスクの設定
1061
-
1062
- ```kotlin
1063
- // build.gradle.kts(default プロファイルで実行)
1064
- tasks.register<JavaExec>("seedData") {
1065
- group = "application"
1066
- description = "Seed データを投入する(default プロファイル)"
1067
- mainClass.set("com.example.sms.Application")
1068
- classpath = sourceSets["main"].runtimeClasspath
1069
- }
1070
- ```
1071
-
1072
- #### 実行コマンド
1073
-
1074
- ```bash
1075
- # Gradle タスクで実行
1076
- ./gradlew seedData
1077
-
1078
- # または直接 Java で実行(default プロファイル)
1079
- java -jar build/libs/sms-backend.jar
1080
- ```
1081
-
1082
- #### 実行結果の例
1083
-
1084
- ```
1085
- ========================================
1086
- 販売管理システム Seed データ投入開始
1087
- ========================================
1088
- 既存データを削除中...
1089
- 既存データ削除完了
1090
- 部門マスタを投入中...
1091
- 部門マスタ 21件 投入完了
1092
- 倉庫マスタを投入中...
1093
- 倉庫マスタ 3件 投入完了
1094
- 商品分類マスタを投入中...
1095
- 商品分類マスタ 4件 投入完了
1096
- 商品マスタを投入中...
1097
- 商品マスタ 20件 投入完了
1098
- 取引先マスタを投入中...
1099
- 取引先マスタ 14件 投入完了
1100
- 社員マスタを投入中...
1101
- 社員マスタ 24件 投入完了
1102
- 在庫情報を投入中...
1103
- 在庫情報 20件 投入完了
1104
- 受注データを投入中...
1105
- 受注データ 3件 投入完了
1106
- ========================================
1107
- 販売管理システム Seed データ投入完了!
1108
- ========================================
1109
- ```
1110
-
1111
- ### データの検証と活用
1112
-
1113
- <details>
1114
- <summary>SeedDataServiceTest.java</summary>
1115
-
1116
- ```java
1117
- package com.example.sms.infrastructure.in.seed;
1118
-
1119
- import com.example.sms.application.port.out.*;
1120
- import com.example.sms.domain.model.department.Department;
1121
- import com.example.sms.domain.model.inventory.Inventory;
1122
- import com.example.sms.domain.model.partner.Partner;
1123
- import com.example.sms.domain.model.product.Product;
1124
- import com.example.sms.domain.model.sales.SalesOrder;
1125
- import com.example.sms.testsetup.BaseIntegrationTest;
1126
- import org.junit.jupiter.api.*;
1127
- import org.springframework.beans.factory.annotation.Autowired;
1128
-
1129
- import java.math.BigDecimal;
1130
- import java.util.List;
1131
-
1132
- import static org.assertj.core.api.Assertions.assertThat;
1133
-
1134
- /**
1135
- * Seed データ投入サービス統合テスト.
1136
- */
1137
- @DisplayName("Seed データ投入サービス")
1138
- class SeedDataServiceTest extends BaseIntegrationTest {
1139
-
1140
- @Autowired
1141
- private SeedDataService seedDataService;
1142
-
1143
- @Autowired
1144
- private DepartmentRepository departmentRepository;
1145
-
1146
- @Autowired
1147
- private PartnerRepository partnerRepository;
1148
-
1149
- @Autowired
1150
- private ProductRepository productRepository;
1151
-
1152
- @Autowired
1153
- private InventoryRepository inventoryRepository;
1154
-
1155
- @Autowired
1156
- private SalesOrderRepository salesOrderRepository;
1157
-
1158
- @BeforeEach
1159
- void setUp() {
1160
- seedDataService.seedAll();
1161
- }
1162
-
1163
- @Nested
1164
- @DisplayName("マスタデータの妥当性検証")
1165
- class MasterDataValidation {
1166
-
1167
- @Test
1168
- @DisplayName("部門マスタが21件投入される")
1169
- void seedsDepartments() {
1170
- List<Department> departments = departmentRepository.findAll();
1171
- assertThat(departments).hasSize(21);
1172
- }
1173
-
1174
- @Test
1175
- @DisplayName("すべての部門が階層構造を持つ")
1176
- void allDepartmentsHaveHierarchy() {
1177
- List<Department> departments = departmentRepository.findAll();
1178
-
1179
- for (Department dept : departments) {
1180
- assertThat(dept.getDepartmentPath()).isNotBlank();
1181
- assertThat(dept.getHierarchyLevel()).isPositive();
1182
- }
1183
- }
1184
-
1185
- @Test
1186
- @DisplayName("商品マスタが20件投入される")
1187
- void seedsProducts() {
1188
- List<Product> products = productRepository.findAll();
1189
- assertThat(products).hasSize(20);
1190
- }
1191
-
1192
- @Test
1193
- @DisplayName("取引先マスタが14件投入される(得意先10件、仕入先4件)")
1194
- void seedsPartners() {
1195
- List<Partner> partners = partnerRepository.findAll();
1196
- assertThat(partners).hasSize(14);
1197
-
1198
- List<Partner> customers = partnerRepository.findCustomers();
1199
- List<Partner> suppliers = partnerRepository.findSuppliers();
1200
-
1201
- assertThat(customers).hasSize(10);
1202
- assertThat(suppliers).hasSize(4);
1203
- }
1204
- }
1205
-
1206
- @Nested
1207
- @DisplayName("在庫データの妥当性検証")
1208
- class InventoryValidation {
1209
-
1210
- @Test
1211
- @DisplayName("在庫データが20件投入される")
1212
- void seedsInventories() {
1213
- List<Inventory> inventories = inventoryRepository.findAll();
1214
- assertThat(inventories).hasSize(20);
1215
- }
1216
-
1217
- @Test
1218
- @DisplayName("在庫数量が0以上である")
1219
- void inventoryQuantityIsNonNegative() {
1220
- List<Inventory> inventories = inventoryRepository.findAll();
1221
-
1222
- for (Inventory inventory : inventories) {
1223
- assertThat(inventory.getCurrentQuantity())
1224
- .isGreaterThanOrEqualTo(BigDecimal.ZERO);
1225
- }
1226
- }
1227
- }
1228
-
1229
- @Nested
1230
- @DisplayName("受注データの妥当性検証")
1231
- class OrderValidation {
1232
-
1233
- @Test
1234
- @DisplayName("受注データが3件投入される")
1235
- void seedsOrders() {
1236
- List<SalesOrder> orders = salesOrderRepository.findAll();
1237
- assertThat(orders).hasSize(3);
1238
- }
1239
-
1240
- @Test
1241
- @DisplayName("受注に対応する顧客が存在する")
1242
- void orderHasValidCustomer() {
1243
- List<SalesOrder> orders = salesOrderRepository.findAll();
1244
-
1245
- for (SalesOrder order : orders) {
1246
- var customer = partnerRepository.findByCode(order.getCustomerCode());
1247
- assertThat(customer).isPresent();
1248
- assertThat(customer.get().isCustomer()).isTrue();
1249
- }
1250
- }
1251
- }
1252
-
1253
- @Nested
1254
- @DisplayName("再投入時の挙動")
1255
- class ReseededBehavior {
1256
-
1257
- @Test
1258
- @DisplayName("seedAll を複数回実行してもデータ件数が一定")
1259
- void seedAllIsIdempotent() {
1260
- // 2回目の投入
1261
- seedDataService.seedAll();
1262
-
1263
- List<Department> departments = departmentRepository.findAll();
1264
- List<Product> products = productRepository.findAll();
1265
- List<Partner> partners = partnerRepository.findAll();
1266
-
1267
- assertThat(departments).hasSize(21);
1268
- assertThat(products).hasSize(20);
1269
- assertThat(partners).hasSize(14);
1270
- }
1271
- }
1272
- }
1273
- ```
1274
-
1275
- </details>
1276
-
1277
- ---
1278
-
1279
- ## 第12章のまとめ
1280
-
1281
- B 社の事例を通じて、販売管理システムのデータ設計と Seed データ実装を行いました。
1282
-
1283
- ### 実装したデータ
1284
-
1285
- | カテゴリ | 内容 |
1286
- |---------|------|
1287
- | **マスタデータ** | 部門 21 件、取引先 14 件、商品 20 件、社員 24 件、倉庫 3 件、商品分類 4 件 |
1288
- | **トランザクション** | 受注 3 件、在庫 20 件 |
1289
- | **備考** | 出荷・売上データは受注明細への依存関係が複雑なため、初期シードでは投入しない |
1290
-
1291
- ### B 社の事業特徴とデータ設計への反映
1292
-
1293
- | 特徴 | データ設計への反映 |
1294
- |------|-------------------|
1295
- | 多様な販路 | 得意先 10 件(百貨店、スーパー、ホテル等)の管理 |
1296
- | 自社製造能力 | 工場倉庫(WH-FAC)と加工品カテゴリの分離 |
1297
- | 高品質へのこだわり | 商品マスタでの標準売価・仕入価格管理 |
1298
- | 地域密着 | 食肉卸・畜産業者の仕入先 4 件 |
1299
-
1300
- ### 技術的なポイント
1301
-
1302
- | ポイント | 内容 |
1303
- |---------|------|
1304
- | **ヘキサゴナルアーキテクチャ** | Repository(出力ポート)経由でデータ投入 |
1305
- | **外部キー制約** | マスタ → トランザクションの順で投入 |
1306
- | **日本語テーブル名** | MyBatis でダブルクォートで囲む |
1307
- | **ENUM マッピング** | 日本語 DB 値 ↔ 英語 Java 値の変換 |
1308
- | **Spring Profile** | `default` プロファイルでアプリ起動時に自動投入 |
1309
- | **Builder パターン** | ドメインモデルの生成に Builder パターンを使用 |
1310
-
1311
- ### ER 図(本章で扱ったテーブル)
1312
-
1313
- ```plantuml
1314
- @startuml
1315
-
1316
- title 第12章 データ構造 ER 図
1317
-
1318
- entity "部門マスタ" as dept {
1319
- * 部門コード
1320
- * 適用開始日
1321
- --
1322
- 部門名
1323
- 部門パス
1324
- 階層
1325
- }
1326
-
1327
- entity "社員マスタ" as emp {
1328
- * 社員コード
1329
- * 適用開始日
1330
- --
1331
- 姓
1332
- 名
1333
- 部門コード
1334
- }
1335
-
1336
- entity "取引先グループマスタ" as grp {
1337
- * グループコード
1338
- * 適用開始日
1339
- --
1340
- グループ名
1341
- }
1342
-
1343
- entity "取引先マスタ" as partner {
1344
- * 取引先コード
1345
- * 適用開始日
1346
- --
1347
- 取引先名
1348
- 取引先区分
1349
- グループコード
1350
- }
1351
-
1352
- entity "商品分類マスタ" as cat {
1353
- * 分類コード
1354
- * 適用開始日
1355
- --
1356
- 分類名
1357
- }
1358
-
1359
- entity "商品マスタ" as prod {
1360
- * 商品コード
1361
- * 適用開始日
1362
- --
1363
- 商品名
1364
- 分類コード
1365
- 標準売価
1366
- 標準原価
1367
- }
1368
-
1369
- entity "倉庫マスタ" as wh {
1370
- * 倉庫コード
1371
- * 適用開始日
1372
- --
1373
- 倉庫名
1374
- 倉庫区分
1375
- }
1376
-
1377
- entity "在庫データ" as inv {
1378
- * 倉庫コード
1379
- * 商品コード
1380
- * 基準日
1381
- --
1382
- 在庫数量
1383
- 引当数量
1384
- }
1385
-
1386
- entity "受注データ" as order {
1387
- * 受注番号
1388
- --
1389
- 受注日
1390
- 顧客コード
1391
- 担当者コード
1392
- 受注ステータス
1393
- }
1394
-
1395
- entity "受注明細データ" as od {
1396
- * 受注番号
1397
- * 明細番号
1398
- --
1399
- 商品コード
1400
- 数量
1401
- 単価
1402
- 金額
1403
- }
1404
-
1405
- dept ||--o{ emp
1406
- grp ||--o{ partner
1407
- cat ||--o{ prod
1408
- wh ||--o{ inv
1409
- prod ||--o{ inv
1410
- partner ||--o{ order
1411
- order ||--|{ od
1412
- prod ||--o{ od
1413
-
1414
- @enduml
1415
- ```
1416
-
1417
- 次の第13章では、このデータモデルを活用した API サービスの実装に進みます。
1
+ # 第12章:販売管理データ設計(B 社事例)
2
+
3
+ 販売管理システムのデータベース設計を、食肉・食肉加工品の製造販売を行う B 社の事例を通じて実践的に学びます。本章では、実際のビジネスに基づいたマスタデータとトランザクションデータの設計・実装方法を解説します。
4
+
5
+ ## B 社事例の全体像
6
+
7
+ B 社の販売管理システムに必要なデータ構造を、ビジネスモデルから段階的に設計します。
8
+
9
+ ```plantuml
10
+ @startuml
11
+
12
+ title B 社の販売管理データ構造
13
+
14
+ rectangle "ビジネス分析" {
15
+ card "会社概要" as overview
16
+ card "組織構成" as org
17
+ card "ビジネスモデル" as model
18
+ }
19
+
20
+ rectangle "データ設計" {
21
+ card "マスタデータ" as master
22
+ card "トランザクション" as trans
23
+ card "コード体系" as code
24
+ }
25
+
26
+ rectangle "実装" {
27
+ card "Seed データ" as seed
28
+ card "整合性検証" as verify
29
+ }
30
+
31
+ overview --> org
32
+ org --> model
33
+ model --> master
34
+ master --> code
35
+ code --> trans
36
+ trans --> seed
37
+ seed --> verify
38
+
39
+ @enduml
40
+ ```
41
+
42
+ ### 本章の構成
43
+
44
+ | セクション | 内容 |
45
+ |-----------|------|
46
+ | **12.1 B 社の概要** | 会社プロファイル、事業環境、事業特徴 |
47
+ | **12.2 組織構成** | 組織図、部門階層、社員配置 |
48
+ | **12.3 ビジネスモデル** | ビジネスモデルキャンバス、取引先・商品構成 |
49
+ | **12.4 データ構造の設計** | マスタ構成、コード体系、ENUM マッピング |
50
+ | **12.5 Seed データの実装** | マスタ・トランザクションの投入実装 |
51
+
52
+ ---
53
+
54
+ ## 12.1 B 社の概要
55
+
56
+ ### 会社プロファイル
57
+
58
+ | 項目 | 内容 |
59
+ |------|------|
60
+ | **社名** | B 社(架空) |
61
+ | **業種** | 食肉・食肉加工品の製造・販売業 |
62
+ | **資本金** | 3,000 万円 |
63
+ | **従業員数** | 45 名(うちパート従業員 21 名) |
64
+ | **事業所** | 本社、工場、直営小売店 1 店舗 |
65
+ | **年間販売額** | 約 9 億円(2021 年度) |
66
+ | **主要取扱商品** | 牛肉、豚肉、鶏肉、食肉加工品 |
67
+
68
+ ### 沿革と事業環境
69
+
70
+ B 社は X 県の大都市近郊に立地し、高速道路のインターチェンジからも近い車の利便性が良いエリアに位置しています。
71
+
72
+ 1955 年に食肉小売店として開業し、当時の食肉消費拡大の波に乗って順調に成長。1960 年代には地域の百貨店や近隣スーパーへの卸売事業を開始しました。
73
+
74
+ 百貨店やスーパーとの取引実績から、B 社の商品はクオリティの高さに定評があり、仕入れ元からの信頼も厚く、良質な食肉を安定的に仕入れられる体制が整っています。
75
+
76
+ ### 事業の特徴
77
+
78
+ ```plantuml
79
+ @startuml
80
+
81
+ title B 社の5つの事業特徴
82
+
83
+ rectangle "事業特徴" {
84
+ card "高品質な商品" as quality
85
+ card "対面販売" as face
86
+ card "多様な販路" as channel
87
+ card "自社製造" as factory
88
+ card "OEM 対応" as oem
89
+ }
90
+
91
+ note right of quality
92
+ 百貨店向け贈答用を含めた
93
+ 最高級品質の食肉・加工品
94
+ end note
95
+
96
+ note right of face
97
+ 直営小売店での
98
+ 顧客ニーズに合わせた接客販売
99
+ end note
100
+
101
+ note right of channel
102
+ 百貨店、スーパー、ホテル・旅館
103
+ 飲食店、観光施設、EC
104
+ end note
105
+
106
+ note right of factory
107
+ 工場でハム、ソーセージ
108
+ ローストビーフ等を製造
109
+ end note
110
+
111
+ note right of oem
112
+ 相手先ブランドでの
113
+ 製造も受託
114
+ end note
115
+
116
+ @enduml
117
+ ```
118
+
119
+ | 特徴 | 説明 |
120
+ |------|------|
121
+ | **高品質な商品** | 百貨店向けには贈答用を含めた最高級品質の食肉や食肉加工品 |
122
+ | **対面販売** | 直営小売店では顧客ニーズに合わせた接客販売 |
123
+ | **多様な販路** | 百貨店、スーパー、ホテル・旅館、飲食店、観光施設、EC |
124
+ | **自社製造** | 工場でハム、ソーセージ、ローストビーフ等の加工品を製造 |
125
+ | **OEM 対応** | 相手先ブランドでの製造も受託 |
126
+
127
+ ---
128
+
129
+ ## 12.2 組織構成
130
+
131
+ ### 組織図
132
+
133
+ ```plantuml
134
+ @startwbs
135
+ * B社
136
+ ** 食肉製造・販売事業
137
+ *** 食肉加工部門
138
+ **** 牛肉・豚肉・鶏肉課
139
+ **** 食肉加工品課 (ハム・ソーセージ・ローストビーフなど)
140
+ *** 小売販売部門
141
+ **** 直営小売店課
142
+ **** 百貨店・スーパー向け販売課
143
+ *** 新規取引先開拓部門
144
+ **** ホテル・旅館向け課
145
+ **** 飲食店向け課
146
+ ** 食肉加工品事業
147
+ *** 自社ブランド部門
148
+ **** 贈答用製品製造課
149
+ **** 道の駅・土産物製品販売課
150
+ *** 相手先ブランド製造(OEM)部門
151
+ **** 客先要望対応課
152
+ ** コンサルティング事業
153
+ *** 顧客対応部門
154
+ **** メニュー提案課
155
+ **** 半加工商品提供課
156
+ @endwbs
157
+ ```
158
+
159
+ ### 部門マスタの階層構造
160
+
161
+ ```
162
+ 本社(000000)
163
+ ├── 食肉製造・販売事業(100000)
164
+ │ ├── 食肉加工部門(110000)
165
+ │ │ ├── 牛肉・豚肉・鶏肉課(111000)
166
+ │ │ └── 食肉加工品課(112000)
167
+ │ ├── 小売販売部門(120000)
168
+ │ │ ├── 直営小売店課(121000)
169
+ │ │ └── 百貨店・スーパー向け販売課(122000)
170
+ │ └── 新規取引先開拓部門(130000)
171
+ │ ├── ホテル・旅館向け課(131000)
172
+ │ └── 飲食店向け課(132000)
173
+ ├── 食肉加工品事業(200000)
174
+ │ ├── 自社ブランド部門(210000)
175
+ │ │ ├── 贈答用製品製造課(211000)
176
+ │ │ └── 道の駅・土産物製品販売課(212000)
177
+ │ └── 相手先ブランド製造(OEM)部門(220000)
178
+ │ └── 客先要望対応課(221000)
179
+ └── コンサルティング事業(300000)
180
+ └── 顧客対応部門(310000)
181
+ ├── メニュー提案課(311000)
182
+ └── 半加工商品提供課(312000)
183
+ ```
184
+
185
+ ### 社員の配置
186
+
187
+ | 部門 | 正社員 | パート | 計 |
188
+ |------|--------|--------|-----|
189
+ | 経営層(本社) | 2 名 | - | 2 名 |
190
+ | 食肉製造・販売事業 | 8 名 | 7 名 | 15 名 |
191
+ | 食肉加工品事業 | 6 名 | 8 名 | 14 名 |
192
+ | コンサルティング事業 | 6 名 | 6 名 | 12 名 |
193
+ | 経理・総務等 | 2 名 | - | 2 名 |
194
+ | **合計** | **24 名** | **21 名** | **45 名** |
195
+
196
+ ---
197
+
198
+ ## 12.3 ビジネスモデル
199
+
200
+ ### ビジネスモデルキャンバス
201
+
202
+ ```plantuml
203
+ @startmindmap
204
+ * ビジネスモデル
205
+ ** 内部環境
206
+ *** 顧客
207
+ **** 顧客セグメント
208
+ ***** 百貨店
209
+ ***** スーパー
210
+ ***** ホテル・旅館
211
+ ***** 飲食店
212
+ ***** 個人消費者(直営小売店利用)
213
+ ***** EC利用顧客
214
+ **** 顧客関係
215
+ ***** 高品質の食品提供による信頼構築
216
+ ***** 小売顧客との対面接客
217
+ ***** 顧客ニーズに基づくカスタマイズサービス(飲食店向け)
218
+ ***** オンライン顧客とのデジタルサポート
219
+ *** 価値
220
+ **** 価値提案
221
+ ***** 高品質な食肉と加工品
222
+ ***** 百貨店・観光向けギフト商品
223
+ ***** 健康志向に適応した加工品(低脂肪・低塩分等)
224
+ ***** 顧客ニーズにフィットした加工品
225
+ ***** 持続可能性を考慮した地域密着型商品
226
+ **** チャネル
227
+ ***** 直営小売店
228
+ ***** 百貨店・スーパー
229
+ ***** 観光地の道の駅や土産物店
230
+ ***** 配送による顧客への納品
231
+ ***** オンライン販売(EC)
232
+ *** インフラ
233
+ **** 主要活動
234
+ ***** 食肉の仕入れ・加工・販売
235
+ ***** 新規取引先の開拓
236
+ ***** 品質保証と顧客満足の追求
237
+ ***** ブランド管理とマーケティング
238
+ ***** 環境保全活動(食品ロス削減)
239
+ **** 主要リソース
240
+ ***** 自社工場
241
+ ***** 高度な職人による加工技術
242
+ ***** ブランド価値
243
+ ***** トレーサビリティとデジタルツール
244
+ **** 主要パートナー
245
+ ***** 地元農家や畜産業者
246
+ ***** 観光業者、地元流通業者
247
+ ***** 地域のオンラインプラットフォーム
248
+ *** 資金
249
+ **** 収益源
250
+ ***** 加工品の販売収入
251
+ ***** 高品質食肉の販売収入
252
+ ***** オンライン販売収入
253
+ **** コスト構造
254
+ ***** 食肉の仕入れコスト
255
+ ***** 工場運営コスト(人件費・設備費)
256
+ ***** マーケティング費用
257
+ ***** デジタル推進関連費用
258
+ left side
259
+ ** 外部環境
260
+ *** 競争
261
+ **** 他の地元業者・大手食肉卸売業者
262
+ **** 全国規模スーパーの競争優位性
263
+ **** 代替肉や植物由来製品業者
264
+ *** 政治・社会・技術
265
+ **** 地域食品産業振興政策
266
+ **** 健康志向の高まりに基づく食の選択
267
+ **** 加工技術や物流の効率化
268
+ **** 環境保護と持続可能性の推進
269
+ *** マクロ経済
270
+ **** 消費者物価の動向(価格競争)
271
+ **** 労働力不足による人件費増加
272
+ **** 地元経済への還元と連携
273
+ *** 市場
274
+ **** ローカル市場(地元住民)
275
+ **** 観光市場(道の駅利用の観光客)
276
+ **** 周辺地域への広域展開可能性
277
+ **** 健康志向顧客層へのリーチ
278
+ @endmindmap
279
+ ```
280
+
281
+ ### 得意先の分類
282
+
283
+ | グループ | 取引先例 | 特徴 |
284
+ |---------|---------|------|
285
+ | 百貨店 | 地域百貨店、X 県有名百貨店 | 贈答用高級品、ギフト需要 |
286
+ | スーパー | 地域スーパーチェーン、広域スーパーチェーン | 日常使いのカット肉・スライス肉 |
287
+ | ホテル・旅館 | シティホテル、温泉旅館 | 宴会・レストラン向け |
288
+ | 飲食店 | 焼肉レストラン、イタリアンレストラン | メニュー提案付き販売 |
289
+ | 観光施設 | 道の駅、観光センター | 土産物・贈答品 |
290
+
291
+ ### 仕入先の分類
292
+
293
+ | グループ | 取引先例 | 特徴 |
294
+ |---------|---------|------|
295
+ | 食肉卸 | 地域食肉卸 A 社、地域食肉卸 B 社 | 牛肉・豚肉・鶏肉の安定供給 |
296
+ | 畜産業者 | 地域畜産農家、県内畜産組合 | 高品質な原材料 |
297
+
298
+ ### 商品構成
299
+
300
+ | 分類 | 商品例 | 特徴 |
301
+ |------|--------|------|
302
+ | 牛肉 | 黒毛和牛サーロイン、ロース、カルビ、ヒレ、切り落とし | 高級品から日常使いまで |
303
+ | 豚肉 | 豚ロース、豚バラ、豚ヒレ、豚コマ、豚肩ロース | 幅広い用途 |
304
+ | 鶏肉 | 鶏もも、鶏むね、手羽先、手羽元、鶏ささみ | 健康志向にも対応 |
305
+ | 加工品 | ローストビーフ、ハム、ソーセージ、ベーコン、コロッケ | 自社工場製造 |
306
+
307
+ ---
308
+
309
+ ## 12.4 データ構造の設計
310
+
311
+ ### マスタデータの構成
312
+
313
+ | データ種別 | 件数 | 内容 |
314
+ |-----------|------|------|
315
+ | 部門マスタ | 21 件 | 4 階層の組織構造 |
316
+ | 社員マスタ | 24 件 | 正社員 24 名 |
317
+ | 取引先マスタ | 14 件 | 得意先 10 件、仕入先 4 件 |
318
+ | 商品分類マスタ | 4 件 | 牛肉、豚肉、鶏肉、加工品 |
319
+ | 商品マスタ | 20 件 | 各分類 5 件ずつ |
320
+ | 倉庫マスタ | 3 件 | 本社倉庫、工場倉庫、外部委託倉庫 |
321
+
322
+ ### コード体系
323
+
324
+ #### 商品コード体系
325
+
326
+ | 接頭辞 | 区分 | 例 |
327
+ |--------|------|-----|
328
+ | BEEF- | 牛肉 | BEEF-001 黒毛和牛サーロイン |
329
+ | PORK- | 豚肉 | PORK-001 豚ロース |
330
+ | CHKN- | 鶏肉 | CHKN-001 鶏もも |
331
+ | PROC- | 加工品 | PROC-001 ローストビーフ |
332
+
333
+ #### 取引先コード体系
334
+
335
+ | 接頭辞 | 区分 | 例 |
336
+ |--------|------|-----|
337
+ | CUS- | 得意先 | CUS-001 地域百貨店 |
338
+ | SUP- | 仕入先 | SUP-001 地域食肉卸 A 社 |
339
+
340
+ #### 部門コード体系
341
+
342
+ | コード | 部門名 | 階層 |
343
+ |--------|--------|------|
344
+ | 000000 | 本社 | 1 |
345
+ | 100000 | 食肉製造・販売事業 | 2 |
346
+ | 110000 | 食肉加工部門 | 3 |
347
+ | 111000 | 牛肉・豚肉・鶏肉課 | 4 |
348
+ | 112000 | 食肉加工品課 | 4 |
349
+ | 120000 | 小売販売部門 | 3 |
350
+ | 121000 | 直営小売店課 | 4 |
351
+ | 122000 | 百貨店・スーパー向け販売課 | 4 |
352
+ | 200000 | 食肉加工品事業 | 2 |
353
+ | 300000 | コンサルティング事業 | 2 |
354
+
355
+ ### ENUM の日本語・英語マッピング
356
+
357
+ 本システムでは、データベースの ENUM 値は日本語、Java の ENUM は英語で定義し、MyBatis の TypeHandler でマッピングを行います。
358
+
359
+ #### 取引先区分(PartnerType)
360
+
361
+ | 日本語 DB 値 | 英語 Java 値 |
362
+ |-------------|-------------|
363
+ | "顧客" | CUSTOMER |
364
+ | "仕入先" | SUPPLIER |
365
+
366
+ #### 商品区分(ProductType)
367
+
368
+ | 日本語 DB 値 | 英語 Java 値 |
369
+ |-------------|-------------|
370
+ | "商品" | PRODUCT |
371
+ | "製品" | MANUFACTURED |
372
+ | "サービス" | SERVICE |
373
+
374
+ #### 税区分(TaxType)
375
+
376
+ | 日本語 DB 値 | 英語 Java 値 |
377
+ |-------------|-------------|
378
+ | "標準税率" | STANDARD |
379
+ | "軽減税率" | REDUCED |
380
+ | "非課税" | EXEMPT |
381
+
382
+ #### 受注ステータス(OrderStatus)
383
+
384
+ | 日本語 DB 値 | 英語 Java 値 |
385
+ |-------------|-------------|
386
+ | "受付済" | RECEIVED |
387
+ | "引当済" | ALLOCATED |
388
+ | "出荷指示済" | SHIPMENT_INSTRUCTED |
389
+ | "出荷済" | SHIPPED |
390
+ | "キャンセル" | CANCELLED |
391
+
392
+ #### 出荷ステータス(ShipmentStatus)
393
+
394
+ | 日本語 DB 値 | 英語 Java 値 |
395
+ |-------------|-------------|
396
+ | "未出荷" | PENDING |
397
+ | "出荷済" | SHIPPED |
398
+ | "配達完了" | DELIVERED |
399
+
400
+ #### 発注ステータス(PurchaseStatus)
401
+
402
+ | 日本語 DB 値 | 英語 Java 値 |
403
+ |-------------|-------------|
404
+ | "発注済" | ORDERED |
405
+ | "入荷済" | RECEIVED |
406
+ | "検収済" | INSPECTED |
407
+ | "キャンセル" | CANCELLED |
408
+
409
+ #### 倉庫区分(WarehouseType)
410
+
411
+ | 日本語 DB 値 | 英語 Java 値 |
412
+ |-------------|-------------|
413
+ | "自社" | OWN |
414
+ | "外部" | EXTERNAL |
415
+ | "仮想" | VIRTUAL |
416
+
417
+ ### データモデル ER 図
418
+
419
+ ```plantuml
420
+ @startuml
421
+
422
+ title B 社 販売管理データモデル
423
+
424
+ ' マスタ系
425
+ package "マスタデータ" {
426
+ entity "部門マスタ" as dept {
427
+ * 部門コード : VARCHAR(6)
428
+ * 適用開始日 : DATE
429
+ --
430
+ 部門名 : VARCHAR(100)
431
+ 部門パス : VARCHAR(500)
432
+ 階層 : INTEGER
433
+ }
434
+
435
+ entity "社員マスタ" as emp {
436
+ * 社員コード : VARCHAR(10)
437
+ * 適用開始日 : DATE
438
+ --
439
+ 姓 : VARCHAR(50)
440
+ 名 : VARCHAR(50)
441
+ 部門コード : VARCHAR(6)
442
+ 雇用区分 : VARCHAR(20)
443
+ }
444
+
445
+ entity "取引先グループマスタ" as grp {
446
+ * グループコード : VARCHAR(20)
447
+ * 適用開始日 : DATE
448
+ --
449
+ グループ名 : VARCHAR(100)
450
+ }
451
+
452
+ entity "取引先マスタ" as partner {
453
+ * 取引先コード : VARCHAR(20)
454
+ * 適用開始日 : DATE
455
+ --
456
+ 取引先名 : VARCHAR(100)
457
+ 取引先区分 : 取引先区分
458
+ グループコード : VARCHAR(20)
459
+ }
460
+
461
+ entity "顧客マスタ" as customer {
462
+ * 取引先コード : VARCHAR(20)
463
+ * 適用開始日 : DATE
464
+ --
465
+ 締日 : INTEGER
466
+ 回収サイト : INTEGER
467
+ 回収日 : INTEGER
468
+ 与信限度額 : NUMERIC
469
+ }
470
+
471
+ entity "仕入先マスタ" as supplier {
472
+ * 取引先コード : VARCHAR(20)
473
+ * 適用開始日 : DATE
474
+ --
475
+ 締日 : INTEGER
476
+ 支払サイト : INTEGER
477
+ 支払日 : INTEGER
478
+ リードタイム : INTEGER
479
+ }
480
+
481
+ entity "商品分類マスタ" as category {
482
+ * 分類コード : VARCHAR(20)
483
+ * 適用開始日 : DATE
484
+ --
485
+ 分類名 : VARCHAR(100)
486
+ 分類パス : VARCHAR(500)
487
+ 階層 : INTEGER
488
+ }
489
+
490
+ entity "商品マスタ" as product {
491
+ * 商品コード : VARCHAR(20)
492
+ * 適用開始日 : DATE
493
+ --
494
+ 商品名 : VARCHAR(200)
495
+ 分類コード : VARCHAR(20)
496
+ 商品区分 : 商品区分
497
+ 税区分 : 税区分
498
+ 標準売価 : NUMERIC
499
+ 標準原価 : NUMERIC
500
+ }
501
+
502
+ entity "倉庫マスタ" as warehouse {
503
+ * 倉庫コード : VARCHAR(20)
504
+ * 適用開始日 : DATE
505
+ --
506
+ 倉庫名 : VARCHAR(100)
507
+ 所在地 : VARCHAR(200)
508
+ 倉庫区分 : 倉庫区分
509
+ }
510
+ }
511
+
512
+ ' リレーション
513
+ dept ||--o{ emp : 所属
514
+ grp ||--o{ partner : 分類
515
+ partner ||--o| customer : 拡張
516
+ partner ||--o| supplier : 拡張
517
+ category ||--o{ product : 分類
518
+
519
+ @enduml
520
+ ```
521
+
522
+ ---
523
+
524
+ ## 12.5 Seed データの実装
525
+
526
+ ### 実装方針
527
+
528
+ Seed データの投入にあたり、以下のポイントを考慮します。
529
+
530
+ | ポイント | 説明 |
531
+ |---------|------|
532
+ | **外部キー制約の考慮** | データ投入順序を依存関係に基づいて設計 |
533
+ | **複合キーの扱い** | 適用開始日を含む複合主キーへの対応 |
534
+ | **日本語テーブル名・カラム名** | MyBatis の resultMap でマッピング |
535
+ | **ヘキサゴナルアーキテクチャ** | Repository(出力ポート)経由でデータ投入 |
536
+ | **Spring Profile の活用** | `default` プロファイルでアプリ起動時に自動投入 |
537
+
538
+ ### プロジェクト構造
539
+
540
+ ```
541
+ src/
542
+ ├── main/
543
+ │ └── java/
544
+ │ └── com/example/sms/
545
+ │ ├── application/
546
+ │ │ └── port/
547
+ │ │ └── out/
548
+ │ │ └── *Repository.java # 出力ポート
549
+ │ ├── domain/
550
+ │ │ └── model/
551
+ │ │ └── ... # ドメインモデル
552
+ │ └── infrastructure/
553
+ │ ├── in/
554
+ │ │ ├── rest/ # REST API アダプタ
555
+ │ │ └── seed/ # Seed データ投入
556
+ │ │ ├── SeedDataService.java
557
+ │ │ ├── MasterDataSeeder.java
558
+ │ │ ├── TransactionDataSeeder.java
559
+ │ │ └── SeedRunner.java
560
+ │ └── out/
561
+ │ └── persistence/
562
+ │ ├── mapper/ # MyBatis Mapper
563
+ │ └── repository/ # Repository 実装
564
+ └── test/
565
+ └── java/
566
+ └── com/example/sms/
567
+ └── infrastructure/
568
+ └── in/
569
+ └── seed/
570
+ └── SeedDataServiceTest.java
571
+ ```
572
+
573
+ ### SeedDataService の実装
574
+
575
+ <details>
576
+ <summary>SeedDataService.java</summary>
577
+
578
+ ```java
579
+ package com.example.sms.infrastructure.in.seed;
580
+
581
+ import org.slf4j.Logger;
582
+ import org.slf4j.LoggerFactory;
583
+ import org.springframework.stereotype.Service;
584
+ import org.springframework.transaction.annotation.Transactional;
585
+
586
+ import java.time.LocalDate;
587
+
588
+ /**
589
+ * Seed データ投入サービス.
590
+ * B社事例に基づく販売管理システムの初期データを投入する。
591
+ */
592
+ @Service
593
+ public class SeedDataService {
594
+
595
+ private static final Logger log = LoggerFactory.getLogger(SeedDataService.class);
596
+
597
+ private final MasterDataSeeder masterDataSeeder;
598
+ private final TransactionDataSeeder transactionDataSeeder;
599
+
600
+ public SeedDataService(
601
+ MasterDataSeeder masterDataSeeder,
602
+ TransactionDataSeeder transactionDataSeeder) {
603
+ this.masterDataSeeder = masterDataSeeder;
604
+ this.transactionDataSeeder = transactionDataSeeder;
605
+ }
606
+
607
+ /**
608
+ * すべての Seed データを投入.
609
+ */
610
+ @Transactional
611
+ public void seedAll() {
612
+ log.info("========================================");
613
+ log.info("販売管理システム Seed データ投入開始");
614
+ log.info("========================================");
615
+
616
+ LocalDate effectiveDate = LocalDate.of(2025, 1, 1);
617
+
618
+ // 既存データの削除
619
+ cleanAllData();
620
+
621
+ // マスタデータの投入
622
+ masterDataSeeder.seedAll(effectiveDate);
623
+
624
+ // トランザクションデータの投入
625
+ transactionDataSeeder.seedAll(effectiveDate);
626
+
627
+ log.info("========================================");
628
+ log.info("販売管理システム Seed データ投入完了!");
629
+ log.info("========================================");
630
+ }
631
+
632
+ private void cleanAllData() {
633
+ log.info("既存データを削除中...");
634
+
635
+ // トランザクションデータから削除(外部キー制約のため逆順)
636
+ transactionDataSeeder.cleanAll();
637
+
638
+ // マスタデータを削除
639
+ masterDataSeeder.cleanAll();
640
+
641
+ log.info("既存データ削除完了");
642
+ }
643
+ }
644
+ ```
645
+
646
+ </details>
647
+
648
+ ### MasterDataSeeder の実装
649
+
650
+ <details>
651
+ <summary>MasterDataSeeder.java</summary>
652
+
653
+ ```java
654
+ package com.example.sms.infrastructure.in.seed;
655
+
656
+ import com.example.sms.application.port.out.*;
657
+ import com.example.sms.domain.model.department.Department;
658
+ import com.example.sms.domain.model.employee.Employee;
659
+ import com.example.sms.domain.model.inventory.Warehouse;
660
+ import com.example.sms.domain.model.inventory.WarehouseType;
661
+ import com.example.sms.domain.model.partner.Partner;
662
+ import com.example.sms.domain.model.product.*;
663
+ import org.slf4j.Logger;
664
+ import org.slf4j.LoggerFactory;
665
+ import org.springframework.stereotype.Component;
666
+
667
+ import java.math.BigDecimal;
668
+ import java.time.LocalDate;
669
+ import java.util.List;
670
+
671
+ /**
672
+ * マスタデータ Seeder.
673
+ * B社事例に基づくマスタデータを投入する。
674
+ */
675
+ @Component
676
+ public class MasterDataSeeder {
677
+
678
+ private static final Logger log = LoggerFactory.getLogger(MasterDataSeeder.class);
679
+
680
+ private final DepartmentRepository departmentRepository;
681
+ private final EmployeeRepository employeeRepository;
682
+ private final PartnerRepository partnerRepository;
683
+ private final ProductClassificationRepository productClassificationRepository;
684
+ private final ProductRepository productRepository;
685
+ private final WarehouseRepository warehouseRepository;
686
+
687
+ // コンストラクタ省略
688
+
689
+ /**
690
+ * すべてのマスタデータを投入.
691
+ */
692
+ public void seedAll(LocalDate effectiveDate) {
693
+ seedDepartments(effectiveDate);
694
+ seedWarehouses();
695
+ seedProductClassifications();
696
+ seedProducts();
697
+ seedPartners();
698
+ seedEmployees(effectiveDate);
699
+ }
700
+
701
+ /**
702
+ * すべてのマスタデータを削除.
703
+ */
704
+ public void cleanAll() {
705
+ employeeRepository.deleteAll();
706
+ productRepository.deleteAll();
707
+ productClassificationRepository.deleteAll();
708
+ partnerRepository.deleteAll();
709
+ warehouseRepository.deleteAll();
710
+ departmentRepository.deleteAll();
711
+ }
712
+
713
+ private void seedDepartments(LocalDate effectiveDate) {
714
+ log.info("部門マスタを投入中...");
715
+
716
+ List<Department> departments = List.of(
717
+ // 本社
718
+ Department.builder()
719
+ .departmentCode("000000").startDate(effectiveDate)
720
+ .departmentName("本社").departmentPath("/000000").hierarchyLevel(1).build(),
721
+
722
+ // 食肉製造・販売事業
723
+ Department.builder()
724
+ .departmentCode("100000").startDate(effectiveDate)
725
+ .departmentName("食肉製造・販売事業").departmentPath("/000000/100000").hierarchyLevel(2).build(),
726
+ // ... 以下省略
727
+ );
728
+
729
+ departments.forEach(departmentRepository::save);
730
+ log.info("部門マスタ {}件 投入完了", departments.size());
731
+ }
732
+
733
+ private void seedWarehouses() {
734
+ log.info("倉庫マスタを投入中...");
735
+
736
+ List<Warehouse> warehouses = List.of(
737
+ Warehouse.builder()
738
+ .warehouseCode("WH-HQ")
739
+ .warehouseName("本社倉庫")
740
+ .warehouseType(WarehouseType.OWN)
741
+ .address("東京都千代田区1-1-1")
742
+ .activeFlag(true)
743
+ .build(),
744
+ Warehouse.builder()
745
+ .warehouseCode("WH-FAC")
746
+ .warehouseName("工場倉庫")
747
+ .warehouseType(WarehouseType.OWN)
748
+ .address("埼玉県さいたま市2-2-2")
749
+ .activeFlag(true)
750
+ .build(),
751
+ Warehouse.builder()
752
+ .warehouseCode("WH-EXT")
753
+ .warehouseName("外部委託倉庫")
754
+ .warehouseType(WarehouseType.EXTERNAL)
755
+ .address("神奈川県横浜市3-3-3")
756
+ .activeFlag(true)
757
+ .build()
758
+ );
759
+
760
+ warehouses.forEach(warehouseRepository::save);
761
+ log.info("倉庫マスタ {}件 投入完了", warehouses.size());
762
+ }
763
+
764
+ private void seedProductClassifications() {
765
+ log.info("商品分類マスタを投入中...");
766
+
767
+ List<ProductClassification> categories = List.of(
768
+ ProductClassification.builder()
769
+ .classificationCode("CAT-BEEF").classificationName("牛肉")
770
+ .classificationPath("/CAT-BEEF").hierarchyLevel(1).build(),
771
+ ProductClassification.builder()
772
+ .classificationCode("CAT-PORK").classificationName("豚肉")
773
+ .classificationPath("/CAT-PORK").hierarchyLevel(1).build(),
774
+ ProductClassification.builder()
775
+ .classificationCode("CAT-CHKN").classificationName("鶏肉")
776
+ .classificationPath("/CAT-CHKN").hierarchyLevel(1).build(),
777
+ ProductClassification.builder()
778
+ .classificationCode("CAT-PROC").classificationName("加工品")
779
+ .classificationPath("/CAT-PROC").hierarchyLevel(1).build()
780
+ );
781
+
782
+ categories.forEach(productClassificationRepository::save);
783
+ log.info("商品分類マスタ {}件 投入完了", categories.size());
784
+ }
785
+
786
+ private void seedProducts() {
787
+ log.info("商品マスタを投入中...");
788
+
789
+ List<Product> products = List.of(
790
+ // 牛肉
791
+ createProduct("BEEF-001", "黒毛和牛サーロイン", "CAT-BEEF", 8000, 5000),
792
+ createProduct("BEEF-002", "黒毛和牛ロース", "CAT-BEEF", 6000, 3800),
793
+ // ... 以下省略(全20件)
794
+ );
795
+
796
+ products.forEach(productRepository::save);
797
+ log.info("商品マスタ {}件 投入完了", products.size());
798
+ }
799
+
800
+ private Product createProduct(String code, String name, String classificationCode,
801
+ int sellingPrice, int purchasePrice) {
802
+ return Product.builder()
803
+ .productCode(code)
804
+ .productName(name)
805
+ .productCategory(ProductCategory.PRODUCT)
806
+ .taxCategory(TaxCategory.EXCLUSIVE)
807
+ .classificationCode(classificationCode)
808
+ .sellingPrice(new BigDecimal(sellingPrice))
809
+ .purchasePrice(new BigDecimal(purchasePrice))
810
+ .isInventoryManaged(true)
811
+ .build();
812
+ }
813
+
814
+ private void seedPartners() {
815
+ log.info("取引先マスタを投入中...");
816
+
817
+ List<Partner> partners = List.of(
818
+ // 得意先(百貨店)
819
+ createCustomer("CUS-001", "地域百貨店"),
820
+ createCustomer("CUS-002", "X県有名百貨店"),
821
+ // ... 以下省略(全14件:得意先10件、仕入先4件)
822
+ );
823
+
824
+ partners.forEach(partnerRepository::save);
825
+ log.info("取引先マスタ {}件 投入完了", partners.size());
826
+ }
827
+
828
+ private Partner createCustomer(String code, String name) {
829
+ return Partner.builder()
830
+ .partnerCode(code)
831
+ .partnerName(name)
832
+ .isCustomer(true)
833
+ .isSupplier(false)
834
+ .creditLimit(new BigDecimal("10000000"))
835
+ .build();
836
+ }
837
+
838
+ private Partner createSupplier(String code, String name) {
839
+ return Partner.builder()
840
+ .partnerCode(code)
841
+ .partnerName(name)
842
+ .isCustomer(false)
843
+ .isSupplier(true)
844
+ .build();
845
+ }
846
+
847
+ private void seedEmployees(LocalDate effectiveDate) {
848
+ log.info("社員マスタを投入中...");
849
+
850
+ List<Employee> employees = List.of(
851
+ // 経営層
852
+ createEmployee("EMP-001", "山田 太郎", "000000", effectiveDate),
853
+ createEmployee("EMP-002", "佐藤 次郎", "000000", effectiveDate),
854
+ // ... 以下省略(全24件)
855
+ );
856
+
857
+ employees.forEach(employeeRepository::save);
858
+ log.info("社員マスタ {}件 投入完了", employees.size());
859
+ }
860
+
861
+ private Employee createEmployee(String code, String name, String departmentCode,
862
+ LocalDate departmentStartDate) {
863
+ return Employee.builder()
864
+ .employeeCode(code)
865
+ .employeeName(name)
866
+ .departmentCode(departmentCode)
867
+ .departmentStartDate(departmentStartDate)
868
+ .build();
869
+ }
870
+ }
871
+ ```
872
+
873
+ </details>
874
+
875
+ ### TransactionDataSeeder の実装
876
+
877
+ <details>
878
+ <summary>TransactionDataSeeder.java</summary>
879
+
880
+ ```java
881
+ package com.example.sms.infrastructure.in.seed;
882
+
883
+ import com.example.sms.application.port.out.*;
884
+ import com.example.sms.domain.model.inventory.Inventory;
885
+ import com.example.sms.domain.model.product.TaxCategory;
886
+ import com.example.sms.domain.model.sales.OrderStatus;
887
+ import com.example.sms.domain.model.sales.SalesOrder;
888
+ import com.example.sms.domain.model.sales.SalesOrderDetail;
889
+ import org.slf4j.Logger;
890
+ import org.slf4j.LoggerFactory;
891
+ import org.springframework.stereotype.Component;
892
+
893
+ import java.math.BigDecimal;
894
+ import java.time.LocalDate;
895
+ import java.util.List;
896
+
897
+ /**
898
+ * トランザクションデータ Seeder.
899
+ * B社事例に基づくトランザクションデータを投入する。
900
+ */
901
+ @Component
902
+ public class TransactionDataSeeder {
903
+
904
+ private static final Logger log = LoggerFactory.getLogger(TransactionDataSeeder.class);
905
+
906
+ private final InventoryRepository inventoryRepository;
907
+ private final SalesOrderRepository salesOrderRepository;
908
+ private final ShipmentRepository shipmentRepository;
909
+ private final SalesRepository salesRepository;
910
+
911
+ // コンストラクタ省略
912
+
913
+ /**
914
+ * すべてのトランザクションデータを投入.
915
+ */
916
+ public void seedAll(LocalDate effectiveDate) {
917
+ seedInventories();
918
+ seedOrders(effectiveDate);
919
+ }
920
+
921
+ /**
922
+ * すべてのトランザクションデータを削除.
923
+ */
924
+ public void cleanAll() {
925
+ salesRepository.deleteAll();
926
+ shipmentRepository.deleteAll();
927
+ salesOrderRepository.deleteAll();
928
+ inventoryRepository.deleteAll();
929
+ }
930
+
931
+ private void seedInventories() {
932
+ log.info("在庫情報を投入中...");
933
+
934
+ List<Inventory> inventories = List.of(
935
+ // 本社倉庫の在庫(牛肉)
936
+ createInventory("WH-HQ", "BEEF-001", 50, 10),
937
+ createInventory("WH-HQ", "BEEF-002", 80, 15),
938
+ createInventory("WH-HQ", "BEEF-003", 100, 20),
939
+ createInventory("WH-HQ", "BEEF-004", 30, 5),
940
+ createInventory("WH-HQ", "BEEF-005", 150, 30),
941
+
942
+ // 本社倉庫の在庫(豚肉)
943
+ createInventory("WH-HQ", "PORK-001", 200, 30),
944
+ createInventory("WH-HQ", "PORK-002", 250, 40),
945
+ createInventory("WH-HQ", "PORK-003", 100, 15),
946
+ createInventory("WH-HQ", "PORK-004", 300, 50),
947
+ createInventory("WH-HQ", "PORK-005", 180, 25),
948
+
949
+ // 本社倉庫の在庫(鶏肉)
950
+ createInventory("WH-HQ", "CHKN-001", 300, 50),
951
+ createInventory("WH-HQ", "CHKN-002", 350, 60),
952
+ createInventory("WH-HQ", "CHKN-003", 200, 30),
953
+ createInventory("WH-HQ", "CHKN-004", 180, 25),
954
+ createInventory("WH-HQ", "CHKN-005", 150, 20),
955
+
956
+ // 工場倉庫の在庫(加工品)
957
+ createInventory("WH-FAC", "PROC-001", 100, 20),
958
+ createInventory("WH-FAC", "PROC-002", 150, 30),
959
+ createInventory("WH-FAC", "PROC-003", 200, 40),
960
+ createInventory("WH-FAC", "PROC-004", 180, 35),
961
+ createInventory("WH-FAC", "PROC-005", 300, 50)
962
+ );
963
+
964
+ inventories.forEach(inventoryRepository::save);
965
+ log.info("在庫情報 {}件 投入完了", inventories.size());
966
+ }
967
+
968
+ private Inventory createInventory(String warehouseCode, String productCode,
969
+ int quantity, int allocatedQuantity) {
970
+ return Inventory.builder()
971
+ .warehouseCode(warehouseCode)
972
+ .productCode(productCode)
973
+ .currentQuantity(new BigDecimal(quantity))
974
+ .allocatedQuantity(new BigDecimal(allocatedQuantity))
975
+ .orderedQuantity(BigDecimal.ZERO)
976
+ .build();
977
+ }
978
+
979
+ private void seedOrders(LocalDate effectiveDate) {
980
+ log.info("受注データを投入中...");
981
+
982
+ // 受注1(百貨店向け)- 引当済み
983
+ SalesOrder order1 = SalesOrder.builder()
984
+ .orderNumber("ORD-2025-001")
985
+ .orderDate(LocalDate.of(2025, 1, 10))
986
+ .customerCode("CUS-001")
987
+ .representativeCode("EMP-009")
988
+ .requestedDeliveryDate(LocalDate.of(2025, 1, 15))
989
+ .status(OrderStatus.ALLOCATED)
990
+ .details(List.of(
991
+ createOrderDetail(1, "BEEF-001", "黒毛和牛サーロイン", 10, 8000),
992
+ createOrderDetail(2, "PROC-001", "ローストビーフ", 20, 3500)
993
+ ))
994
+ .build();
995
+ salesOrderRepository.save(order1);
996
+
997
+ // 受注2(スーパー向け)- 引当済み
998
+ SalesOrder order2 = SalesOrder.builder()
999
+ .orderNumber("ORD-2025-002")
1000
+ .orderDate(LocalDate.of(2025, 1, 12))
1001
+ .customerCode("CUS-003")
1002
+ .representativeCode("EMP-009")
1003
+ .requestedDeliveryDate(LocalDate.of(2025, 1, 18))
1004
+ .status(OrderStatus.ALLOCATED)
1005
+ .details(List.of(
1006
+ createOrderDetail(1, "PORK-001", "豚ロース", 50, 1200),
1007
+ createOrderDetail(2, "CHKN-001", "鶏もも", 100, 480)
1008
+ ))
1009
+ .build();
1010
+ salesOrderRepository.save(order2);
1011
+
1012
+ // 受注3(ホテル向け)- 出荷済み
1013
+ SalesOrder order3 = SalesOrder.builder()
1014
+ .orderNumber("ORD-2025-003")
1015
+ .orderDate(LocalDate.of(2025, 1, 15))
1016
+ .customerCode("CUS-005")
1017
+ .representativeCode("EMP-010")
1018
+ .requestedDeliveryDate(LocalDate.of(2025, 1, 17))
1019
+ .status(OrderStatus.SHIPPED)
1020
+ .details(List.of(
1021
+ createOrderDetail(1, "BEEF-002", "黒毛和牛ロース", 30, 6000),
1022
+ createOrderDetail(2, "BEEF-003", "黒毛和牛カルビ", 25, 5500)
1023
+ ))
1024
+ .build();
1025
+ salesOrderRepository.save(order3);
1026
+
1027
+ log.info("受注データ 3件 投入完了");
1028
+ }
1029
+
1030
+ private SalesOrderDetail createOrderDetail(int lineNumber, String productCode,
1031
+ String productName, int quantity, int unitPrice) {
1032
+ BigDecimal qty = new BigDecimal(quantity);
1033
+ BigDecimal price = new BigDecimal(unitPrice);
1034
+ BigDecimal amount = qty.multiply(price);
1035
+ BigDecimal taxRate = new BigDecimal("10.00");
1036
+ BigDecimal taxAmount = amount.multiply(taxRate).divide(new BigDecimal("100"));
1037
+
1038
+ return SalesOrderDetail.builder()
1039
+ .lineNumber(lineNumber)
1040
+ .productCode(productCode)
1041
+ .productName(productName)
1042
+ .orderQuantity(qty)
1043
+ .unitPrice(price)
1044
+ .amount(amount)
1045
+ .taxCategory(TaxCategory.EXCLUSIVE)
1046
+ .taxRate(taxRate)
1047
+ .taxAmount(taxAmount)
1048
+ .warehouseCode("WH-HQ")
1049
+ .build();
1050
+ }
1051
+ }
1052
+ ```
1053
+
1054
+ **注**: 出荷・売上データは受注明細への依存関係が複雑なため、初期シードでは投入しません。これらは別途のユースケースで実装します。
1055
+
1056
+ </details>
1057
+
1058
+ ### Seed データ実行方法
1059
+
1060
+ #### Gradle タスクの設定
1061
+
1062
+ ```kotlin
1063
+ // build.gradle.kts(default プロファイルで実行)
1064
+ tasks.register<JavaExec>("seedData") {
1065
+ group = "application"
1066
+ description = "Seed データを投入する(default プロファイル)"
1067
+ mainClass.set("com.example.sms.Application")
1068
+ classpath = sourceSets["main"].runtimeClasspath
1069
+ }
1070
+ ```
1071
+
1072
+ #### 実行コマンド
1073
+
1074
+ ```bash
1075
+ # Gradle タスクで実行
1076
+ ./gradlew seedData
1077
+
1078
+ # または直接 Java で実行(default プロファイル)
1079
+ java -jar build/libs/sms-backend.jar
1080
+ ```
1081
+
1082
+ #### 実行結果の例
1083
+
1084
+ ```
1085
+ ========================================
1086
+ 販売管理システム Seed データ投入開始
1087
+ ========================================
1088
+ 既存データを削除中...
1089
+ 既存データ削除完了
1090
+ 部門マスタを投入中...
1091
+ 部門マスタ 21件 投入完了
1092
+ 倉庫マスタを投入中...
1093
+ 倉庫マスタ 3件 投入完了
1094
+ 商品分類マスタを投入中...
1095
+ 商品分類マスタ 4件 投入完了
1096
+ 商品マスタを投入中...
1097
+ 商品マスタ 20件 投入完了
1098
+ 取引先マスタを投入中...
1099
+ 取引先マスタ 14件 投入完了
1100
+ 社員マスタを投入中...
1101
+ 社員マスタ 24件 投入完了
1102
+ 在庫情報を投入中...
1103
+ 在庫情報 20件 投入完了
1104
+ 受注データを投入中...
1105
+ 受注データ 3件 投入完了
1106
+ ========================================
1107
+ 販売管理システム Seed データ投入完了!
1108
+ ========================================
1109
+ ```
1110
+
1111
+ ### データの検証と活用
1112
+
1113
+ <details>
1114
+ <summary>SeedDataServiceTest.java</summary>
1115
+
1116
+ ```java
1117
+ package com.example.sms.infrastructure.in.seed;
1118
+
1119
+ import com.example.sms.application.port.out.*;
1120
+ import com.example.sms.domain.model.department.Department;
1121
+ import com.example.sms.domain.model.inventory.Inventory;
1122
+ import com.example.sms.domain.model.partner.Partner;
1123
+ import com.example.sms.domain.model.product.Product;
1124
+ import com.example.sms.domain.model.sales.SalesOrder;
1125
+ import com.example.sms.testsetup.BaseIntegrationTest;
1126
+ import org.junit.jupiter.api.*;
1127
+ import org.springframework.beans.factory.annotation.Autowired;
1128
+
1129
+ import java.math.BigDecimal;
1130
+ import java.util.List;
1131
+
1132
+ import static org.assertj.core.api.Assertions.assertThat;
1133
+
1134
+ /**
1135
+ * Seed データ投入サービス統合テスト.
1136
+ */
1137
+ @DisplayName("Seed データ投入サービス")
1138
+ class SeedDataServiceTest extends BaseIntegrationTest {
1139
+
1140
+ @Autowired
1141
+ private SeedDataService seedDataService;
1142
+
1143
+ @Autowired
1144
+ private DepartmentRepository departmentRepository;
1145
+
1146
+ @Autowired
1147
+ private PartnerRepository partnerRepository;
1148
+
1149
+ @Autowired
1150
+ private ProductRepository productRepository;
1151
+
1152
+ @Autowired
1153
+ private InventoryRepository inventoryRepository;
1154
+
1155
+ @Autowired
1156
+ private SalesOrderRepository salesOrderRepository;
1157
+
1158
+ @BeforeEach
1159
+ void setUp() {
1160
+ seedDataService.seedAll();
1161
+ }
1162
+
1163
+ @Nested
1164
+ @DisplayName("マスタデータの妥当性検証")
1165
+ class MasterDataValidation {
1166
+
1167
+ @Test
1168
+ @DisplayName("部門マスタが21件投入される")
1169
+ void seedsDepartments() {
1170
+ List<Department> departments = departmentRepository.findAll();
1171
+ assertThat(departments).hasSize(21);
1172
+ }
1173
+
1174
+ @Test
1175
+ @DisplayName("すべての部門が階層構造を持つ")
1176
+ void allDepartmentsHaveHierarchy() {
1177
+ List<Department> departments = departmentRepository.findAll();
1178
+
1179
+ for (Department dept : departments) {
1180
+ assertThat(dept.getDepartmentPath()).isNotBlank();
1181
+ assertThat(dept.getHierarchyLevel()).isPositive();
1182
+ }
1183
+ }
1184
+
1185
+ @Test
1186
+ @DisplayName("商品マスタが20件投入される")
1187
+ void seedsProducts() {
1188
+ List<Product> products = productRepository.findAll();
1189
+ assertThat(products).hasSize(20);
1190
+ }
1191
+
1192
+ @Test
1193
+ @DisplayName("取引先マスタが14件投入される(得意先10件、仕入先4件)")
1194
+ void seedsPartners() {
1195
+ List<Partner> partners = partnerRepository.findAll();
1196
+ assertThat(partners).hasSize(14);
1197
+
1198
+ List<Partner> customers = partnerRepository.findCustomers();
1199
+ List<Partner> suppliers = partnerRepository.findSuppliers();
1200
+
1201
+ assertThat(customers).hasSize(10);
1202
+ assertThat(suppliers).hasSize(4);
1203
+ }
1204
+ }
1205
+
1206
+ @Nested
1207
+ @DisplayName("在庫データの妥当性検証")
1208
+ class InventoryValidation {
1209
+
1210
+ @Test
1211
+ @DisplayName("在庫データが20件投入される")
1212
+ void seedsInventories() {
1213
+ List<Inventory> inventories = inventoryRepository.findAll();
1214
+ assertThat(inventories).hasSize(20);
1215
+ }
1216
+
1217
+ @Test
1218
+ @DisplayName("在庫数量が0以上である")
1219
+ void inventoryQuantityIsNonNegative() {
1220
+ List<Inventory> inventories = inventoryRepository.findAll();
1221
+
1222
+ for (Inventory inventory : inventories) {
1223
+ assertThat(inventory.getCurrentQuantity())
1224
+ .isGreaterThanOrEqualTo(BigDecimal.ZERO);
1225
+ }
1226
+ }
1227
+ }
1228
+
1229
+ @Nested
1230
+ @DisplayName("受注データの妥当性検証")
1231
+ class OrderValidation {
1232
+
1233
+ @Test
1234
+ @DisplayName("受注データが3件投入される")
1235
+ void seedsOrders() {
1236
+ List<SalesOrder> orders = salesOrderRepository.findAll();
1237
+ assertThat(orders).hasSize(3);
1238
+ }
1239
+
1240
+ @Test
1241
+ @DisplayName("受注に対応する顧客が存在する")
1242
+ void orderHasValidCustomer() {
1243
+ List<SalesOrder> orders = salesOrderRepository.findAll();
1244
+
1245
+ for (SalesOrder order : orders) {
1246
+ var customer = partnerRepository.findByCode(order.getCustomerCode());
1247
+ assertThat(customer).isPresent();
1248
+ assertThat(customer.get().isCustomer()).isTrue();
1249
+ }
1250
+ }
1251
+ }
1252
+
1253
+ @Nested
1254
+ @DisplayName("再投入時の挙動")
1255
+ class ReseededBehavior {
1256
+
1257
+ @Test
1258
+ @DisplayName("seedAll を複数回実行してもデータ件数が一定")
1259
+ void seedAllIsIdempotent() {
1260
+ // 2回目の投入
1261
+ seedDataService.seedAll();
1262
+
1263
+ List<Department> departments = departmentRepository.findAll();
1264
+ List<Product> products = productRepository.findAll();
1265
+ List<Partner> partners = partnerRepository.findAll();
1266
+
1267
+ assertThat(departments).hasSize(21);
1268
+ assertThat(products).hasSize(20);
1269
+ assertThat(partners).hasSize(14);
1270
+ }
1271
+ }
1272
+ }
1273
+ ```
1274
+
1275
+ </details>
1276
+
1277
+ ---
1278
+
1279
+ ## 第12章のまとめ
1280
+
1281
+ B 社の事例を通じて、販売管理システムのデータ設計と Seed データ実装を行いました。
1282
+
1283
+ ### 実装したデータ
1284
+
1285
+ | カテゴリ | 内容 |
1286
+ |---------|------|
1287
+ | **マスタデータ** | 部門 21 件、取引先 14 件、商品 20 件、社員 24 件、倉庫 3 件、商品分類 4 件 |
1288
+ | **トランザクション** | 受注 3 件、在庫 20 件 |
1289
+ | **備考** | 出荷・売上データは受注明細への依存関係が複雑なため、初期シードでは投入しない |
1290
+
1291
+ ### B 社の事業特徴とデータ設計への反映
1292
+
1293
+ | 特徴 | データ設計への反映 |
1294
+ |------|-------------------|
1295
+ | 多様な販路 | 得意先 10 件(百貨店、スーパー、ホテル等)の管理 |
1296
+ | 自社製造能力 | 工場倉庫(WH-FAC)と加工品カテゴリの分離 |
1297
+ | 高品質へのこだわり | 商品マスタでの標準売価・仕入価格管理 |
1298
+ | 地域密着 | 食肉卸・畜産業者の仕入先 4 件 |
1299
+
1300
+ ### 技術的なポイント
1301
+
1302
+ | ポイント | 内容 |
1303
+ |---------|------|
1304
+ | **ヘキサゴナルアーキテクチャ** | Repository(出力ポート)経由でデータ投入 |
1305
+ | **外部キー制約** | マスタ → トランザクションの順で投入 |
1306
+ | **日本語テーブル名** | MyBatis でダブルクォートで囲む |
1307
+ | **ENUM マッピング** | 日本語 DB 値 ↔ 英語 Java 値の変換 |
1308
+ | **Spring Profile** | `default` プロファイルでアプリ起動時に自動投入 |
1309
+ | **Builder パターン** | ドメインモデルの生成に Builder パターンを使用 |
1310
+
1311
+ ### ER 図(本章で扱ったテーブル)
1312
+
1313
+ ```plantuml
1314
+ @startuml
1315
+
1316
+ title 第12章 データ構造 ER 図
1317
+
1318
+ entity "部門マスタ" as dept {
1319
+ * 部門コード
1320
+ * 適用開始日
1321
+ --
1322
+ 部門名
1323
+ 部門パス
1324
+ 階層
1325
+ }
1326
+
1327
+ entity "社員マスタ" as emp {
1328
+ * 社員コード
1329
+ * 適用開始日
1330
+ --
1331
+ 姓
1332
+ 名
1333
+ 部門コード
1334
+ }
1335
+
1336
+ entity "取引先グループマスタ" as grp {
1337
+ * グループコード
1338
+ * 適用開始日
1339
+ --
1340
+ グループ名
1341
+ }
1342
+
1343
+ entity "取引先マスタ" as partner {
1344
+ * 取引先コード
1345
+ * 適用開始日
1346
+ --
1347
+ 取引先名
1348
+ 取引先区分
1349
+ グループコード
1350
+ }
1351
+
1352
+ entity "商品分類マスタ" as cat {
1353
+ * 分類コード
1354
+ * 適用開始日
1355
+ --
1356
+ 分類名
1357
+ }
1358
+
1359
+ entity "商品マスタ" as prod {
1360
+ * 商品コード
1361
+ * 適用開始日
1362
+ --
1363
+ 商品名
1364
+ 分類コード
1365
+ 標準売価
1366
+ 標準原価
1367
+ }
1368
+
1369
+ entity "倉庫マスタ" as wh {
1370
+ * 倉庫コード
1371
+ * 適用開始日
1372
+ --
1373
+ 倉庫名
1374
+ 倉庫区分
1375
+ }
1376
+
1377
+ entity "在庫データ" as inv {
1378
+ * 倉庫コード
1379
+ * 商品コード
1380
+ * 基準日
1381
+ --
1382
+ 在庫数量
1383
+ 引当数量
1384
+ }
1385
+
1386
+ entity "受注データ" as order {
1387
+ * 受注番号
1388
+ --
1389
+ 受注日
1390
+ 顧客コード
1391
+ 担当者コード
1392
+ 受注ステータス
1393
+ }
1394
+
1395
+ entity "受注明細データ" as od {
1396
+ * 受注番号
1397
+ * 明細番号
1398
+ --
1399
+ 商品コード
1400
+ 数量
1401
+ 単価
1402
+ 金額
1403
+ }
1404
+
1405
+ dept ||--o{ emp
1406
+ grp ||--o{ partner
1407
+ cat ||--o{ prod
1408
+ wh ||--o{ inv
1409
+ prod ||--o{ inv
1410
+ partner ||--o{ order
1411
+ order ||--|{ od
1412
+ prod ||--o{ od
1413
+
1414
+ @enduml
1415
+ ```
1416
+
1417
+ 次の第13章では、このデータモデルを活用した API サービスの実装に進みます。