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