@k2works/claude-code-booster 4.11.0 → 4.13.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 (749) 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 +283 -279
  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/closing-iteration/SKILL.md +146 -0
  33. package/lib/assets/.claude/skills/creating-adr/SKILL.md +113 -113
  34. package/lib/assets/.claude/skills/creating-development-strategy/SKILL.md +127 -101
  35. package/lib/assets/.claude/skills/creating-iteration-report/SKILL.md +210 -210
  36. package/lib/assets/.claude/skills/creating-journal/SKILL.md +129 -129
  37. package/lib/assets/.claude/skills/creating-release-report/SKILL.md +161 -161
  38. package/lib/assets/.claude/skills/creating-slides/SKILL.md +86 -86
  39. package/lib/assets/.claude/skills/creating-slides/agents/openai.yaml +4 -4
  40. package/lib/assets/.claude/skills/creating-slides/references/manga-css.md +45 -45
  41. package/lib/assets/.claude/skills/creating-slides/scripts/slide_tools.py +239 -239
  42. package/lib/assets/.claude/skills/developing-backend/SKILL.md +100 -100
  43. package/lib/assets/.claude/skills/developing-frontend/SKILL.md +93 -93
  44. package/lib/assets/.claude/skills/developing-release/SKILL.md +120 -120
  45. package/lib/assets/.claude/skills/developing-review/SKILL.md +175 -175
  46. package/lib/assets/.claude/skills/developing-uiux-review/SKILL.md +207 -207
  47. package/lib/assets/.claude/skills/generating-bmc/SKILL.md +123 -123
  48. package/lib/assets/.claude/skills/generating-slides/SKILL.md +94 -94
  49. package/lib/assets/.claude/skills/git-commit/SKILL.md +81 -81
  50. package/lib/assets/.claude/skills/killing-processes/SKILL.md +44 -44
  51. package/lib/assets/.claude/skills/opening-iteration/SKILL.md +105 -0
  52. package/lib/assets/.claude/skills/operating-backup/SKILL.md +59 -59
  53. package/lib/assets/.claude/skills/operating-cicd/SKILL.md +54 -54
  54. package/lib/assets/.claude/skills/operating-deploy/SKILL.md +67 -67
  55. package/lib/assets/.claude/skills/operating-docs/SKILL.md +219 -219
  56. package/lib/assets/.claude/skills/operating-provision/SKILL.md +77 -77
  57. package/lib/assets/.claude/skills/operating-qt/SKILL.md +147 -147
  58. package/lib/assets/.claude/skills/operating-review/SKILL.md +171 -171
  59. package/lib/assets/.claude/skills/operating-script/SKILL.md +145 -145
  60. package/lib/assets/.claude/skills/operating-setup/SKILL.md +63 -63
  61. package/lib/assets/.claude/skills/orchestrating-analysis/SKILL.md +104 -104
  62. package/lib/assets/.claude/skills/orchestrating-development/SKILL.md +168 -168
  63. package/lib/assets/.claude/skills/orchestrating-operation/SKILL.md +158 -158
  64. package/lib/assets/.claude/skills/orchestrating-project/SKILL.md +144 -144
  65. package/lib/assets/.claude/skills/planning-releases/SKILL.md +119 -119
  66. package/lib/assets/.claude/skills/practicing-getting-start-tdd/SKILL.md +266 -266
  67. package/lib/assets/.claude/skills/syncing-github-project/SKILL.md +151 -151
  68. package/lib/assets/.claude/skills/tracking-progress/SKILL.md +91 -91
  69. package/lib/assets/.claude/skills/validating-design/SKILL.md +130 -130
  70. package/lib/assets/.claude/skills/validating-iteration-plan/SKILL.md +238 -238
  71. package/lib/assets/.claude/skills/validating-operating-setup/SKILL.md +118 -118
  72. package/lib/assets/.devcontainer/devcontainer.json +37 -37
  73. package/lib/assets/.env.example +17 -17
  74. package/lib/assets/.gitattributes +4 -4
  75. package/lib/assets/.github/workflows/docker-publish.yml +77 -77
  76. package/lib/assets/.github/workflows/mkdocs.yml +39 -39
  77. package/lib/assets/AGENTS.md +94 -94
  78. package/lib/assets/CLAUDE.md +197 -195
  79. package/lib/assets/README.md +291 -291
  80. package/lib/assets/docker-compose.yml +33 -33
  81. package/lib/assets/docs/adr/index.md +10 -10
  82. package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +475 -475
  83. package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +519 -519
  84. package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +537 -537
  85. package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +300 -300
  86. package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +320 -320
  87. package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +498 -498
  88. package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +298 -298
  89. package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +291 -291
  90. package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +336 -336
  91. package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +303 -303
  92. package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +286 -286
  93. package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +322 -322
  94. package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +319 -319
  95. package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +365 -365
  96. package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +156 -156
  97. package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +178 -178
  98. package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +312 -312
  99. package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +287 -287
  100. package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +286 -286
  101. package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +274 -274
  102. package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +294 -294
  103. package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +337 -337
  104. package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +388 -388
  105. package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +273 -273
  106. package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +380 -380
  107. package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +384 -384
  108. package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +350 -350
  109. package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +352 -352
  110. package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +383 -383
  111. package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +529 -529
  112. package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +395 -395
  113. package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +399 -399
  114. package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +485 -485
  115. package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +566 -566
  116. package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +567 -567
  117. package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +475 -475
  118. package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +462 -462
  119. package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +325 -325
  120. package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +401 -401
  121. package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +450 -450
  122. package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +475 -475
  123. package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +739 -739
  124. package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +567 -567
  125. package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +518 -518
  126. package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +532 -532
  127. package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +241 -241
  128. package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +383 -383
  129. package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +374 -374
  130. package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +375 -375
  131. package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +195 -195
  132. package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +268 -268
  133. package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +294 -294
  134. package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +164 -164
  135. package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +168 -168
  136. package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +254 -254
  137. package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +269 -269
  138. package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +148 -148
  139. package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +176 -176
  140. package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +604 -604
  141. package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +729 -729
  142. package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +291 -291
  143. package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +420 -420
  144. package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +319 -319
  145. package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +466 -466
  146. package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +523 -523
  147. package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +287 -287
  148. package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +340 -340
  149. package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +395 -395
  150. package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +248 -248
  151. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +384 -384
  152. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +452 -452
  153. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +495 -495
  154. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +416 -416
  155. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +382 -382
  156. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +687 -687
  157. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +442 -442
  158. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +479 -479
  159. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +479 -479
  160. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +427 -427
  161. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +428 -428
  162. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +339 -339
  163. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +309 -309
  164. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +596 -596
  165. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +355 -355
  166. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +350 -350
  167. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +414 -414
  168. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +367 -367
  169. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +403 -403
  170. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +291 -291
  171. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +324 -324
  172. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +332 -332
  173. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +274 -274
  174. package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +298 -298
  175. package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +304 -304
  176. package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +362 -362
  177. package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +257 -257
  178. package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +254 -254
  179. package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +283 -283
  180. package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +395 -395
  181. package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +319 -319
  182. package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +382 -382
  183. package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +287 -287
  184. package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +303 -303
  185. package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +326 -326
  186. package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +332 -332
  187. package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +379 -379
  188. package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +177 -177
  189. package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +219 -219
  190. package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +244 -244
  191. package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +363 -363
  192. package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +438 -438
  193. package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +325 -325
  194. package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +403 -403
  195. package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +469 -469
  196. package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +174 -174
  197. package/lib/assets/docs/article/functional-desgin-ppp/index.md +90 -90
  198. package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +450 -450
  199. package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +463 -463
  200. package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +425 -425
  201. package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +273 -273
  202. package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +247 -247
  203. package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +841 -841
  204. package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +384 -384
  205. package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +383 -383
  206. package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +339 -339
  207. package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +331 -331
  208. package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +356 -356
  209. package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +379 -379
  210. package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +361 -361
  211. package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +392 -392
  212. package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +300 -300
  213. package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +297 -297
  214. package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +304 -304
  215. package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +315 -315
  216. package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +311 -311
  217. package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +304 -304
  218. package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +336 -336
  219. package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +349 -349
  220. package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +243 -243
  221. package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +328 -328
  222. package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +348 -348
  223. package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +357 -357
  224. package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +364 -364
  225. package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +515 -515
  226. package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +557 -557
  227. package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +363 -363
  228. package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +327 -327
  229. package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +517 -517
  230. package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +441 -441
  231. package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +407 -407
  232. package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +379 -379
  233. package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +398 -398
  234. package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +476 -476
  235. package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +391 -391
  236. package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +342 -342
  237. package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +324 -324
  238. package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +730 -730
  239. package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +624 -624
  240. package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +512 -512
  241. package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +433 -433
  242. package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +688 -688
  243. package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +243 -243
  244. package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +166 -166
  245. package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +162 -162
  246. package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +135 -135
  247. package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +88 -88
  248. package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +299 -299
  249. package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +241 -241
  250. package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +131 -131
  251. package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +130 -130
  252. package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +127 -127
  253. package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +114 -114
  254. package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +138 -138
  255. package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +161 -161
  256. package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +65 -65
  257. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +232 -232
  258. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +244 -244
  259. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +202 -202
  260. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +92 -92
  261. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +256 -256
  262. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +195 -195
  263. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +214 -214
  264. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +249 -249
  265. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +174 -174
  266. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +166 -166
  267. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +192 -192
  268. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +211 -211
  269. package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +83 -83
  270. package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +87 -87
  271. package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +95 -95
  272. package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +109 -109
  273. package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +96 -96
  274. package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +88 -88
  275. package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +71 -71
  276. package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +110 -110
  277. package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +108 -108
  278. package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +104 -104
  279. package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +178 -178
  280. package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +142 -142
  281. package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +145 -145
  282. package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +35 -35
  283. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +202 -202
  284. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +246 -246
  285. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +218 -218
  286. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +179 -179
  287. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +267 -267
  288. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +190 -190
  289. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +161 -161
  290. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +175 -175
  291. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +222 -222
  292. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +189 -189
  293. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +212 -212
  294. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +215 -215
  295. package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +71 -71
  296. package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +213 -213
  297. package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +302 -302
  298. package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +339 -339
  299. package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +112 -112
  300. package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +272 -272
  301. package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +233 -233
  302. package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +394 -394
  303. package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +422 -422
  304. package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +400 -400
  305. package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +226 -226
  306. package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +296 -296
  307. package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +411 -411
  308. package/lib/assets/docs/article/getting-start-tdd/go/index.md +83 -83
  309. package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +279 -279
  310. package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +337 -337
  311. package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +257 -257
  312. package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +182 -182
  313. package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +313 -313
  314. package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +309 -309
  315. package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +412 -412
  316. package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +390 -390
  317. package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +461 -461
  318. package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +434 -434
  319. package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +392 -392
  320. package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +631 -631
  321. package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +49 -49
  322. package/lib/assets/docs/article/getting-start-tdd/index.md +93 -93
  323. package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +375 -375
  324. package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +349 -349
  325. package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +445 -445
  326. package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +409 -409
  327. package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +330 -330
  328. package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +290 -290
  329. package/lib/assets/docs/article/getting-start-tdd/integration/index.md +69 -69
  330. package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +234 -234
  331. package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +261 -261
  332. package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +185 -185
  333. package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +115 -115
  334. package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +382 -382
  335. package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +272 -272
  336. package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +626 -626
  337. package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +393 -393
  338. package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +310 -310
  339. package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +188 -188
  340. package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +167 -167
  341. package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +205 -205
  342. package/lib/assets/docs/article/getting-start-tdd/java/index.md +61 -61
  343. package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +244 -244
  344. package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +262 -262
  345. package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +169 -169
  346. package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +112 -112
  347. package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +314 -314
  348. package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +235 -235
  349. package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +327 -327
  350. package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +322 -322
  351. package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +285 -285
  352. package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +199 -199
  353. package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +207 -207
  354. package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +295 -295
  355. package/lib/assets/docs/article/getting-start-tdd/node/index.md +56 -56
  356. package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +259 -259
  357. package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +200 -200
  358. package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +248 -248
  359. package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +141 -141
  360. package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +410 -410
  361. package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +321 -321
  362. package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +372 -372
  363. package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +453 -453
  364. package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +460 -460
  365. package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +182 -182
  366. package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +266 -266
  367. package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +308 -308
  368. package/lib/assets/docs/article/getting-start-tdd/php/index.md +84 -84
  369. package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +201 -201
  370. package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +247 -247
  371. package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +199 -199
  372. package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +87 -87
  373. package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +274 -274
  374. package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +190 -190
  375. package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +208 -208
  376. package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +172 -172
  377. package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +130 -130
  378. package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +122 -122
  379. package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +116 -116
  380. package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +126 -126
  381. package/lib/assets/docs/article/getting-start-tdd/python/index.md +55 -55
  382. package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +231 -231
  383. package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +238 -238
  384. package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +228 -228
  385. package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +112 -112
  386. package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +287 -287
  387. package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +248 -248
  388. package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +279 -279
  389. package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +329 -329
  390. package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +196 -196
  391. package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +175 -175
  392. package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +237 -237
  393. package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +398 -398
  394. package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +83 -83
  395. package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +211 -211
  396. package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +264 -264
  397. package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +233 -233
  398. package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +92 -92
  399. package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +212 -212
  400. package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +164 -164
  401. package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +142 -142
  402. package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +145 -145
  403. package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +110 -110
  404. package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +94 -94
  405. package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +105 -105
  406. package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +112 -112
  407. package/lib/assets/docs/article/getting-start-tdd/rust/index.md +83 -83
  408. package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +111 -111
  409. package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +107 -107
  410. package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +99 -99
  411. package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +123 -123
  412. package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +196 -196
  413. package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +186 -186
  414. package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +139 -139
  415. package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +106 -106
  416. package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +75 -75
  417. package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +104 -104
  418. package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +94 -94
  419. package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +92 -92
  420. package/lib/assets/docs/article/getting-start-tdd/scala/index.md +65 -65
  421. package/lib/assets/docs/article/grokking-concurrency/all/index.md +404 -404
  422. package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +554 -554
  423. package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +469 -469
  424. package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +520 -520
  425. package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +420 -420
  426. package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +510 -510
  427. package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +435 -435
  428. package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +465 -465
  429. package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +377 -377
  430. package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +116 -116
  431. package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +108 -108
  432. package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +101 -101
  433. package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +122 -122
  434. package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +123 -123
  435. package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +118 -118
  436. package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +89 -89
  437. package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +100 -100
  438. package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +120 -120
  439. package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +101 -101
  440. package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +97 -97
  441. package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +123 -123
  442. package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +101 -101
  443. package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +112 -112
  444. package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +99 -99
  445. package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +61 -61
  446. package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +84 -84
  447. package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +92 -92
  448. package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +65 -65
  449. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +80 -80
  450. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +103 -103
  451. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +94 -94
  452. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +110 -110
  453. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +104 -104
  454. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +93 -93
  455. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +121 -121
  456. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +107 -107
  457. package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +248 -248
  458. package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +96 -96
  459. package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +96 -96
  460. package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +91 -91
  461. package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +106 -106
  462. package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +99 -99
  463. package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +95 -95
  464. package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +111 -111
  465. package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +118 -118
  466. package/lib/assets/docs/article/grokking-concurrency/index.md +66 -66
  467. package/lib/assets/docs/article/grokking-concurrency/java/index.md +102 -102
  468. package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +308 -308
  469. package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +334 -334
  470. package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +221 -221
  471. package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +213 -213
  472. package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +112 -112
  473. package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +69 -69
  474. package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +101 -101
  475. package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +101 -101
  476. package/lib/assets/docs/article/grokking-concurrency/python/index.md +313 -313
  477. package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +239 -239
  478. package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +418 -418
  479. package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +227 -227
  480. package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +299 -299
  481. package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +315 -315
  482. package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +297 -297
  483. package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +314 -314
  484. package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +360 -360
  485. package/lib/assets/docs/article/grokking-concurrency/rust/index.md +270 -270
  486. package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +108 -108
  487. package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +120 -120
  488. package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +126 -126
  489. package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +175 -175
  490. package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +158 -158
  491. package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +94 -94
  492. package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +133 -133
  493. package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +155 -155
  494. package/lib/assets/docs/article/grokking-concurrency/scala/index.md +69 -69
  495. package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +78 -78
  496. package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +112 -112
  497. package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +93 -93
  498. package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +110 -110
  499. package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +119 -119
  500. package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +83 -83
  501. package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +131 -131
  502. package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +129 -129
  503. package/lib/assets/docs/article/grokkingfp/all/index.md +368 -368
  504. package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +530 -530
  505. package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +923 -923
  506. package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +1128 -1128
  507. package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +1104 -1104
  508. package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +1026 -1026
  509. package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +785 -785
  510. package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +871 -871
  511. package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +972 -972
  512. package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +926 -926
  513. package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +870 -870
  514. package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +715 -715
  515. package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +626 -626
  516. package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +712 -712
  517. package/lib/assets/docs/article/grokkingfp/clojure/index.md +276 -276
  518. package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +667 -667
  519. package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +643 -643
  520. package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +620 -620
  521. package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +697 -697
  522. package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +751 -751
  523. package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +721 -721
  524. package/lib/assets/docs/article/grokkingfp/csharp/index.md +246 -246
  525. package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +811 -811
  526. package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +971 -971
  527. package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +981 -981
  528. package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +949 -949
  529. package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +947 -947
  530. package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +739 -739
  531. package/lib/assets/docs/article/grokkingfp/elixir/index.md +203 -203
  532. package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +712 -712
  533. package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +838 -838
  534. package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +985 -985
  535. package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +974 -974
  536. package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +1286 -1286
  537. package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +1049 -1049
  538. package/lib/assets/docs/article/grokkingfp/fsharp/index.md +210 -210
  539. package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +714 -714
  540. package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +961 -961
  541. package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +972 -972
  542. package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +832 -832
  543. package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +911 -911
  544. package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +922 -922
  545. package/lib/assets/docs/article/grokkingfp/haskell/index.md +234 -234
  546. package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +591 -591
  547. package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +866 -866
  548. package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +915 -915
  549. package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +878 -878
  550. package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +845 -845
  551. package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +844 -844
  552. package/lib/assets/docs/article/grokkingfp/index.md +143 -143
  553. package/lib/assets/docs/article/grokkingfp/java/index.md +211 -211
  554. package/lib/assets/docs/article/grokkingfp/java/part-1.md +648 -648
  555. package/lib/assets/docs/article/grokkingfp/java/part-2.md +675 -675
  556. package/lib/assets/docs/article/grokkingfp/java/part-3.md +672 -672
  557. package/lib/assets/docs/article/grokkingfp/java/part-4.md +771 -771
  558. package/lib/assets/docs/article/grokkingfp/java/part-5.md +959 -959
  559. package/lib/assets/docs/article/grokkingfp/java/part-6.md +1328 -1328
  560. package/lib/assets/docs/article/grokkingfp/python/index.md +258 -258
  561. package/lib/assets/docs/article/grokkingfp/python/part-1.md +443 -443
  562. package/lib/assets/docs/article/grokkingfp/python/part-2.md +958 -958
  563. package/lib/assets/docs/article/grokkingfp/python/part-3.md +1004 -1004
  564. package/lib/assets/docs/article/grokkingfp/python/part-4.md +765 -765
  565. package/lib/assets/docs/article/grokkingfp/python/part-5.md +747 -747
  566. package/lib/assets/docs/article/grokkingfp/python/part-6.md +861 -861
  567. package/lib/assets/docs/article/grokkingfp/ruby/index.md +330 -330
  568. package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +755 -755
  569. package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +938 -938
  570. package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +946 -946
  571. package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +921 -921
  572. package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +908 -908
  573. package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +1412 -1412
  574. package/lib/assets/docs/article/grokkingfp/rust/index.md +242 -242
  575. package/lib/assets/docs/article/grokkingfp/rust/part-1.md +634 -634
  576. package/lib/assets/docs/article/grokkingfp/rust/part-2.md +1060 -1060
  577. package/lib/assets/docs/article/grokkingfp/rust/part-3.md +994 -994
  578. package/lib/assets/docs/article/grokkingfp/rust/part-4.md +573 -573
  579. package/lib/assets/docs/article/grokkingfp/rust/part-5.md +705 -705
  580. package/lib/assets/docs/article/grokkingfp/rust/part-6.md +508 -508
  581. package/lib/assets/docs/article/grokkingfp/scala/index.md +171 -171
  582. package/lib/assets/docs/article/grokkingfp/scala/part-1.md +543 -543
  583. package/lib/assets/docs/article/grokkingfp/scala/part-2.md +946 -946
  584. package/lib/assets/docs/article/grokkingfp/scala/part-3.md +919 -919
  585. package/lib/assets/docs/article/grokkingfp/scala/part-4.md +742 -742
  586. package/lib/assets/docs/article/grokkingfp/scala/part-5.md +722 -722
  587. package/lib/assets/docs/article/grokkingfp/scala/part-6.md +867 -867
  588. package/lib/assets/docs/article/grokkingfp/typescript/index.md +273 -273
  589. package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +561 -561
  590. package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +1129 -1129
  591. package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +842 -842
  592. package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +1087 -1087
  593. package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +717 -717
  594. package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +982 -982
  595. package/lib/assets/docs/article/index.md +41 -41
  596. package/lib/assets/docs/article/practical-database-design/index.md +121 -121
  597. package/lib/assets/docs/article/practical-database-design/part1/chapter01.md +288 -288
  598. package/lib/assets/docs/article/practical-database-design/part1/chapter02.md +518 -518
  599. package/lib/assets/docs/article/practical-database-design/part1/chapter03.md +557 -557
  600. package/lib/assets/docs/article/practical-database-design/part2/chapter04.md +924 -924
  601. package/lib/assets/docs/article/practical-database-design/part2/chapter05.md +1627 -1627
  602. package/lib/assets/docs/article/practical-database-design/part2/chapter06.md +2716 -2716
  603. package/lib/assets/docs/article/practical-database-design/part2/chapter07.md +2082 -2082
  604. package/lib/assets/docs/article/practical-database-design/part2/chapter08.md +2105 -2105
  605. package/lib/assets/docs/article/practical-database-design/part2/chapter09.md +2031 -2031
  606. package/lib/assets/docs/article/practical-database-design/part2/chapter10.md +1387 -1387
  607. package/lib/assets/docs/article/practical-database-design/part2/chapter11.md +1677 -1677
  608. package/lib/assets/docs/article/practical-database-design/part2/chapter12.md +1417 -1417
  609. package/lib/assets/docs/article/practical-database-design/part2/chapter13.md +1434 -1434
  610. package/lib/assets/docs/article/practical-database-design/part3/chapter14.md +667 -667
  611. package/lib/assets/docs/article/practical-database-design/part3/chapter15.md +1625 -1625
  612. package/lib/assets/docs/article/practical-database-design/part3/chapter16.md +1915 -1915
  613. package/lib/assets/docs/article/practical-database-design/part3/chapter17.md +1708 -1708
  614. package/lib/assets/docs/article/practical-database-design/part3/chapter18.md +2095 -2095
  615. package/lib/assets/docs/article/practical-database-design/part3/chapter19.md +1123 -1123
  616. package/lib/assets/docs/article/practical-database-design/part3/chapter20.md +1031 -1031
  617. package/lib/assets/docs/article/practical-database-design/part3/chapter21.md +1382 -1382
  618. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter14-orm.md +991 -991
  619. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter15-orm.md +1300 -1300
  620. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter16-orm.md +1166 -1166
  621. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter17-orm.md +1584 -1584
  622. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter18-orm.md +1183 -1183
  623. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter19-orm.md +1016 -1016
  624. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter20-orm.md +1753 -1753
  625. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter21-orm.md +1447 -1447
  626. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter22-orm.md +1878 -1878
  627. package/lib/assets/docs/article/practical-database-design/part4/chapter22.md +965 -965
  628. package/lib/assets/docs/article/practical-database-design/part4/chapter23.md +2069 -2069
  629. package/lib/assets/docs/article/practical-database-design/part4/chapter24.md +2439 -2439
  630. package/lib/assets/docs/article/practical-database-design/part4/chapter25.md +3661 -3661
  631. package/lib/assets/docs/article/practical-database-design/part4/chapter26.md +2916 -2916
  632. package/lib/assets/docs/article/practical-database-design/part4/chapter27.md +3105 -3105
  633. package/lib/assets/docs/article/practical-database-design/part4/chapter28.md +2697 -2697
  634. package/lib/assets/docs/article/practical-database-design/part4/chapter29.md +2544 -2544
  635. package/lib/assets/docs/article/practical-database-design/part4/chapter30.md +2180 -2180
  636. package/lib/assets/docs/article/practical-database-design/part4/chapter31.md +1192 -1192
  637. package/lib/assets/docs/article/practical-database-design/part4/chapter32.md +2101 -2101
  638. package/lib/assets/docs/article/practical-database-design/part5/chapter33.md +1032 -1032
  639. package/lib/assets/docs/article/practical-database-design/part5/chapter34.md +1609 -1609
  640. package/lib/assets/docs/article/practical-database-design/part5/chapter35.md +1453 -1453
  641. package/lib/assets/docs/article/practical-database-design/part5/chapter36.md +1292 -1292
  642. package/lib/assets/docs/article/practical-database-design/part5/chapter37.md +1470 -1470
  643. package/lib/assets/docs/article/practical-database-design/part5/chapter38.md +1698 -1698
  644. package/lib/assets/docs/article/practical-database-design/part5/chapter39.md +2334 -2334
  645. package/lib/assets/docs/article/practical-database-design/study/study2-1.md +1693 -1693
  646. package/lib/assets/docs/article/practical-database-design/study/study2-2.md +1347 -1347
  647. package/lib/assets/docs/article/practical-database-design/study/study2-3.md +2044 -2044
  648. package/lib/assets/docs/article/practical-database-design/study/study2-4.md +2229 -2229
  649. package/lib/assets/docs/article/practical-database-design/study/study2-5.md +2418 -2418
  650. package/lib/assets/docs/article/practical-database-design/study/study3-1.md +2205 -2205
  651. package/lib/assets/docs/article/practical-database-design/study/study3-2.md +2221 -2221
  652. package/lib/assets/docs/article/practical-database-design/study/study3-3.md +2253 -2253
  653. package/lib/assets/docs/article/practical-database-design/study/study3-4.md +2106 -2106
  654. package/lib/assets/docs/article/practical-database-design/study/study3-5.md +2507 -2507
  655. package/lib/assets/docs/article/practical-database-design/study/study4-1.md +2587 -2587
  656. package/lib/assets/docs/article/practical-database-design/study/study4-2.md +2075 -2075
  657. package/lib/assets/docs/article/practical-database-design/study/study4-3.md +1805 -1805
  658. package/lib/assets/docs/article/practical-database-design/study/study4-4.md +1895 -1895
  659. package/lib/assets/docs/article/practical-database-design/study/study4-5.md +2878 -2878
  660. package/lib/assets/docs/assets/css/extra.css +29 -29
  661. package/lib/assets/docs/assets/js/extra.js +44 -44
  662. package/lib/assets/docs/design/index.md +44 -44
  663. package/lib/assets/docs/development/index.md +39 -39
  664. package/lib/assets/docs/index.md +33 -33
  665. package/lib/assets/docs/operation/index.md +27 -27
  666. 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
  667. 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
  668. 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
  669. 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
  670. 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
  671. package/lib/assets/docs/reference/UI/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +450 -450
  672. package/lib/assets/docs/reference/images/Ansoff.drawio.svg +3 -3
  673. package/lib/assets/docs/reference/images/BMC.drawio.svg +3 -3
  674. package/lib/assets/docs/reference/images/BrandBasicStrategy.drawio.svg +3 -3
  675. package/lib/assets/docs/reference/images/BrandCategorization.drawio.svg +3 -3
  676. package/lib/assets/docs/reference/images/BrandRecurutementStrategy.drawio.svg +3 -3
  677. package/lib/assets/docs/reference/images/BrandValue.drawio.svg +3 -3
  678. package/lib/assets/docs/reference/images/BusinessActivitiy.svg +3 -3
  679. package/lib/assets/docs/reference/images/HRM.drawio.svg +3 -3
  680. package/lib/assets/docs/reference/images/MarketingStructure.drawio.svg +3 -3
  681. package/lib/assets/docs/reference/images/OrganizationElemnts.svg +3 -3
  682. package/lib/assets/docs/reference/images/PPM.drawio.svg +3 -3
  683. package/lib/assets/docs/reference/images/PositioningMap.drawio.svg +3 -3
  684. package/lib/assets/docs/reference/images/ProductLayer.drawio.svg +3 -3
  685. package/lib/assets/docs/reference/images/ProductMix.drawio.svg +3 -3
  686. package/lib/assets/docs/reference/images/SWOT.drawio.svg +3 -3
  687. package/lib/assets/docs/reference/images/TargetMarket.drawio.svg +3 -3
  688. package/lib/assets/docs/reference/images/ThreeGenericStrategies.drawio.svg +3 -3
  689. package/lib/assets/docs/reference/images/VRIO.drawio.svg +3 -3
  690. package/lib/assets/docs/reference/images/ValueChain.drawio.svg +3 -3
  691. package/lib/assets/docs/reference/index.md +53 -53
  692. 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
  693. 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
  694. 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
  695. 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
  696. 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
  697. 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
  698. 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
  699. 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
  700. 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
  701. 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
  702. 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
  703. 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
  704. 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
  705. package/lib/assets/docs/reference//344/274/201/346/245/255/347/265/214/345/226/266/350/253/226.md +2637 -2637
  706. 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
  707. 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
  708. 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
  709. 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
  710. package/lib/assets/docs/reference//351/201/213/345/226/266/347/256/241/347/220/206.md +1482 -1482
  711. 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
  712. 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
  713. package/lib/assets/docs/reference//351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +305 -305
  714. 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
  715. package/lib/assets/docs/requirements/index.md +17 -17
  716. package/lib/assets/docs/review/index.md +5 -5
  717. package/lib/assets/docs/strategy/index.md +17 -17
  718. package/lib/assets/docs/template/ADR.md +30 -30
  719. 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
  720. 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
  721. package/lib/assets/docs/template/README.md +50 -50
  722. package/lib/assets/docs/template/index.md +24 -24
  723. 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
  724. 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
  725. 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
  726. 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
  727. 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
  728. 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
  729. 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
  730. package/lib/assets/docs/template//344/272/213/344/276/213/345/210/206/346/236/220.md +513 -513
  731. package/lib/assets/docs/template//344/274/201/346/245/255/345/210/206/346/236/220.md +573 -573
  732. 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
  733. package/lib/assets/docs/template//350/246/201/344/273/266/345/256/232/347/276/251.md +669 -669
  734. package/lib/assets/docs/template//350/250/255/350/250/210.md +173 -173
  735. 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
  736. package/lib/assets/gulpfile.js +25 -25
  737. package/lib/assets/mkdocs.yml +139 -139
  738. package/lib/assets/ops/docker/mkdoc/Dockerfile +19 -19
  739. package/lib/assets/ops/docker/sonarqube-local/docker-compose.yml +57 -57
  740. package/lib/assets/ops/scripts/journal.js +180 -180
  741. package/lib/assets/ops/scripts/mkdocs.js +82 -82
  742. package/lib/assets/ops/scripts/release.js +431 -431
  743. package/lib/assets/ops/scripts/sonar_local.js +726 -726
  744. package/lib/assets/ops/scripts/ssh.js +190 -190
  745. package/lib/assets/ops/scripts/vault.js +299 -299
  746. package/lib/assets/package-lock.json +1653 -1653
  747. package/lib/assets/package.json +40 -40
  748. package/lib/gulpfile.js +37 -37
  749. 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 サービスの実装に進みます。