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