@k2works/claude-code-booster 4.6.0 → 4.7.0

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