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