@k2works/claude-code-booster 6.2.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 (618) 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/index.md +1 -1
  4. package/lib/assets/mkdocs.yml +0 -6
  5. package/package.json +1 -1
  6. package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +0 -484
  7. package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +0 -528
  8. package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +0 -546
  9. package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +0 -309
  10. package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +0 -329
  11. package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +0 -507
  12. package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +0 -307
  13. package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +0 -300
  14. package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +0 -345
  15. package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +0 -312
  16. package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +0 -295
  17. package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +0 -331
  18. package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +0 -328
  19. package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +0 -374
  20. package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +0 -165
  21. package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +0 -187
  22. package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +0 -321
  23. package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +0 -296
  24. package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +0 -295
  25. package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +0 -283
  26. package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +0 -303
  27. package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +0 -346
  28. package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +0 -388
  29. package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +0 -282
  30. package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +0 -389
  31. package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +0 -393
  32. package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +0 -359
  33. package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +0 -361
  34. package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +0 -392
  35. package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +0 -538
  36. package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +0 -404
  37. package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +0 -408
  38. package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +0 -494
  39. package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +0 -575
  40. package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +0 -576
  41. package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +0 -484
  42. package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +0 -471
  43. package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +0 -334
  44. package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +0 -410
  45. package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +0 -459
  46. package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +0 -484
  47. package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +0 -748
  48. package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +0 -576
  49. package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +0 -527
  50. package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +0 -541
  51. package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +0 -241
  52. package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +0 -392
  53. package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +0 -383
  54. package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +0 -384
  55. package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +0 -204
  56. package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +0 -277
  57. package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +0 -303
  58. package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +0 -173
  59. package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +0 -177
  60. package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +0 -263
  61. package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +0 -278
  62. package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +0 -157
  63. package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +0 -185
  64. package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +0 -613
  65. package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +0 -738
  66. package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +0 -300
  67. package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +0 -429
  68. package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +0 -328
  69. package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +0 -475
  70. package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +0 -532
  71. package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +0 -296
  72. package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +0 -349
  73. package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +0 -404
  74. package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +0 -248
  75. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +0 -393
  76. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +0 -461
  77. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +0 -504
  78. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +0 -425
  79. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +0 -391
  80. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +0 -696
  81. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +0 -451
  82. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +0 -488
  83. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +0 -488
  84. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +0 -436
  85. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +0 -437
  86. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +0 -348
  87. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +0 -318
  88. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +0 -605
  89. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +0 -364
  90. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +0 -359
  91. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +0 -423
  92. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +0 -376
  93. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +0 -412
  94. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +0 -300
  95. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +0 -333
  96. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +0 -341
  97. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +0 -274
  98. package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +0 -307
  99. package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +0 -313
  100. package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +0 -371
  101. package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +0 -266
  102. package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +0 -263
  103. package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +0 -292
  104. package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +0 -404
  105. package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +0 -328
  106. package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +0 -391
  107. package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +0 -296
  108. package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +0 -312
  109. package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +0 -335
  110. package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +0 -341
  111. package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +0 -388
  112. package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +0 -186
  113. package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +0 -228
  114. package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +0 -253
  115. package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +0 -372
  116. package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +0 -447
  117. package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +0 -334
  118. package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +0 -412
  119. package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +0 -478
  120. package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +0 -174
  121. package/lib/assets/docs/article/functional-desgin-ppp/index.md +0 -90
  122. package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +0 -459
  123. package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +0 -472
  124. package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +0 -434
  125. package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +0 -282
  126. package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +0 -256
  127. package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +0 -850
  128. package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +0 -393
  129. package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +0 -392
  130. package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +0 -348
  131. package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +0 -340
  132. package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +0 -365
  133. package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +0 -388
  134. package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +0 -370
  135. package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +0 -401
  136. package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +0 -309
  137. package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +0 -306
  138. package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +0 -313
  139. package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +0 -324
  140. package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +0 -320
  141. package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +0 -313
  142. package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +0 -345
  143. package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +0 -358
  144. package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +0 -243
  145. package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +0 -337
  146. package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +0 -357
  147. package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +0 -366
  148. package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +0 -373
  149. package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +0 -524
  150. package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +0 -566
  151. package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +0 -372
  152. package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +0 -336
  153. package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +0 -526
  154. package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +0 -450
  155. package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +0 -416
  156. package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +0 -388
  157. package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +0 -407
  158. package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +0 -485
  159. package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +0 -400
  160. package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +0 -351
  161. package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +0 -333
  162. package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +0 -739
  163. package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +0 -633
  164. package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +0 -521
  165. package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +0 -442
  166. package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +0 -697
  167. package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +0 -243
  168. package/lib/assets/docs/article/getting-start-docker-kubernetes/01-container-and-docker-basics.md +0 -341
  169. package/lib/assets/docs/article/getting-start-docker-kubernetes/02-container-deployment.md +0 -785
  170. package/lib/assets/docs/article/getting-start-docker-kubernetes/03-practical-container-build-deploy.md +0 -466
  171. package/lib/assets/docs/article/getting-start-docker-kubernetes/04-multi-container-application.md +0 -878
  172. package/lib/assets/docs/article/getting-start-docker-kubernetes/05-kubernetes-introduction.md +0 -585
  173. package/lib/assets/docs/article/getting-start-docker-kubernetes/06-kubernetes-deploy-cluster.md +0 -620
  174. package/lib/assets/docs/article/getting-start-docker-kubernetes/07-kubernetes-advanced.md +0 -621
  175. package/lib/assets/docs/article/getting-start-docker-kubernetes/08-kubernetes-packaging.md +0 -518
  176. package/lib/assets/docs/article/getting-start-docker-kubernetes/09-container-operations.md +0 -546
  177. package/lib/assets/docs/article/getting-start-docker-kubernetes/10-optimal-container-image.md +0 -640
  178. package/lib/assets/docs/article/getting-start-docker-kubernetes/11-continuous-delivery.md +0 -607
  179. package/lib/assets/docs/article/getting-start-docker-kubernetes/12-container-use-cases.md +0 -463
  180. package/lib/assets/docs/article/getting-start-docker-kubernetes/13-case-monolith-compose-vs-kustomize.md +0 -346
  181. package/lib/assets/docs/article/getting-start-docker-kubernetes/14-case-event-driven-kustomize-vs-helm.md +0 -324
  182. package/lib/assets/docs/article/getting-start-docker-kubernetes/15-case-escqrs-axon-kustomize-vs-helm.md +0 -297
  183. package/lib/assets/docs/article/getting-start-docker-kubernetes/16-case-escqrs-kafka-kustomize-vs-helm.md +0 -256
  184. package/lib/assets/docs/article/getting-start-docker-kubernetes/17-case-comparison-summary.md +0 -141
  185. package/lib/assets/docs/article/getting-start-docker-kubernetes/18-case-load-testing.md +0 -303
  186. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-a-dev-tools-setup.md +0 -274
  187. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-b-orchestration-environments.md +0 -530
  188. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-c-tips.md +0 -519
  189. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-01-comic.png +0 -0
  190. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-02-comic.png +0 -0
  191. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-03-comic.png +0 -0
  192. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-04-comic.png +0 -0
  193. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-05-comic.png +0 -0
  194. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-06-comic.png +0 -0
  195. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-07-comic.png +0 -0
  196. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-08-comic.png +0 -0
  197. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-09-comic.png +0 -0
  198. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-10-comic.png +0 -0
  199. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-11-comic.png +0 -0
  200. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-12-comic.png +0 -0
  201. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/overview-comic.png +0 -0
  202. package/lib/assets/docs/article/getting-start-docker-kubernetes/index.md +0 -82
  203. package/lib/assets/docs/article/getting-start-docker-kubernetes/outline.md +0 -220
  204. package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +0 -175
  205. package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +0 -171
  206. package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +0 -144
  207. package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +0 -97
  208. package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +0 -308
  209. package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +0 -250
  210. package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +0 -140
  211. package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +0 -139
  212. package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +0 -136
  213. package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +0 -123
  214. package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +0 -147
  215. package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +0 -170
  216. package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +0 -65
  217. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +0 -241
  218. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +0 -253
  219. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +0 -211
  220. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +0 -101
  221. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +0 -265
  222. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +0 -204
  223. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +0 -223
  224. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +0 -258
  225. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +0 -183
  226. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +0 -175
  227. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +0 -201
  228. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +0 -220
  229. package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +0 -83
  230. package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +0 -96
  231. package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +0 -104
  232. package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +0 -118
  233. package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +0 -105
  234. package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +0 -97
  235. package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +0 -80
  236. package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +0 -119
  237. package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +0 -117
  238. package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +0 -113
  239. package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +0 -187
  240. package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +0 -151
  241. package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +0 -154
  242. package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +0 -35
  243. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +0 -211
  244. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +0 -255
  245. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +0 -227
  246. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +0 -188
  247. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +0 -276
  248. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +0 -199
  249. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +0 -170
  250. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +0 -184
  251. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +0 -231
  252. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +0 -198
  253. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +0 -221
  254. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +0 -224
  255. package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +0 -71
  256. package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +0 -222
  257. package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +0 -311
  258. package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +0 -348
  259. package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +0 -121
  260. package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +0 -281
  261. package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +0 -242
  262. package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +0 -402
  263. package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +0 -430
  264. package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +0 -408
  265. package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +0 -234
  266. package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +0 -304
  267. package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +0 -419
  268. package/lib/assets/docs/article/getting-start-tdd/go/index.md +0 -83
  269. package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +0 -288
  270. package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +0 -346
  271. package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +0 -266
  272. package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +0 -191
  273. package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +0 -322
  274. package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +0 -318
  275. package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +0 -421
  276. package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +0 -399
  277. package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +0 -470
  278. package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +0 -443
  279. package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +0 -401
  280. package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +0 -640
  281. package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +0 -49
  282. package/lib/assets/docs/article/getting-start-tdd/index.md +0 -93
  283. package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +0 -384
  284. package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +0 -358
  285. package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +0 -454
  286. package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +0 -418
  287. package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +0 -339
  288. package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +0 -299
  289. package/lib/assets/docs/article/getting-start-tdd/integration/index.md +0 -69
  290. package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +0 -243
  291. package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +0 -270
  292. package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +0 -194
  293. package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +0 -124
  294. package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +0 -391
  295. package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +0 -281
  296. package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +0 -635
  297. package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +0 -402
  298. package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +0 -319
  299. package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +0 -197
  300. package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +0 -176
  301. package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +0 -214
  302. package/lib/assets/docs/article/getting-start-tdd/java/index.md +0 -61
  303. package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +0 -253
  304. package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +0 -271
  305. package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +0 -178
  306. package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +0 -121
  307. package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +0 -323
  308. package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +0 -244
  309. package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +0 -336
  310. package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +0 -331
  311. package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +0 -294
  312. package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +0 -208
  313. package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +0 -216
  314. package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +0 -304
  315. package/lib/assets/docs/article/getting-start-tdd/node/index.md +0 -56
  316. package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +0 -268
  317. package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +0 -209
  318. package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +0 -257
  319. package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +0 -150
  320. package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +0 -419
  321. package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +0 -330
  322. package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +0 -380
  323. package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +0 -461
  324. package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +0 -468
  325. package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +0 -190
  326. package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +0 -274
  327. package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +0 -316
  328. package/lib/assets/docs/article/getting-start-tdd/php/index.md +0 -84
  329. package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +0 -210
  330. package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +0 -256
  331. package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +0 -208
  332. package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +0 -96
  333. package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +0 -283
  334. package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +0 -199
  335. package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +0 -217
  336. package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +0 -181
  337. package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +0 -139
  338. package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +0 -131
  339. package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +0 -125
  340. package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +0 -135
  341. package/lib/assets/docs/article/getting-start-tdd/python/index.md +0 -55
  342. package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +0 -240
  343. package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +0 -247
  344. package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +0 -237
  345. package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +0 -121
  346. package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +0 -296
  347. package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +0 -257
  348. package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +0 -288
  349. package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +0 -338
  350. package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +0 -205
  351. package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +0 -184
  352. package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +0 -246
  353. package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +0 -407
  354. package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +0 -83
  355. package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +0 -220
  356. package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +0 -273
  357. package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +0 -242
  358. package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +0 -101
  359. package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +0 -221
  360. package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +0 -173
  361. package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +0 -151
  362. package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +0 -154
  363. package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +0 -119
  364. package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +0 -103
  365. package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +0 -114
  366. package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +0 -121
  367. package/lib/assets/docs/article/getting-start-tdd/rust/index.md +0 -83
  368. package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +0 -120
  369. package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +0 -116
  370. package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +0 -108
  371. package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +0 -132
  372. package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +0 -205
  373. package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +0 -195
  374. package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +0 -148
  375. package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +0 -115
  376. package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +0 -84
  377. package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +0 -113
  378. package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +0 -103
  379. package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +0 -101
  380. package/lib/assets/docs/article/getting-start-tdd/scala/index.md +0 -65
  381. package/lib/assets/docs/article/grokking-concurrency/all/index.md +0 -403
  382. package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +0 -563
  383. package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +0 -478
  384. package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +0 -529
  385. package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +0 -429
  386. package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +0 -519
  387. package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +0 -444
  388. package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +0 -474
  389. package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +0 -386
  390. package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +0 -106
  391. package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +0 -107
  392. package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +0 -100
  393. package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +0 -121
  394. package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +0 -122
  395. package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +0 -117
  396. package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +0 -88
  397. package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +0 -99
  398. package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +0 -119
  399. package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +0 -91
  400. package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +0 -96
  401. package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +0 -122
  402. package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +0 -100
  403. package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +0 -111
  404. package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +0 -98
  405. package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +0 -60
  406. package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +0 -83
  407. package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +0 -91
  408. package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +0 -55
  409. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +0 -79
  410. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +0 -102
  411. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +0 -93
  412. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +0 -109
  413. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +0 -103
  414. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +0 -92
  415. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +0 -120
  416. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +0 -106
  417. package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +0 -238
  418. package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +0 -95
  419. package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +0 -95
  420. package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +0 -90
  421. package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +0 -105
  422. package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +0 -98
  423. package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +0 -94
  424. package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +0 -110
  425. package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +0 -117
  426. package/lib/assets/docs/article/grokking-concurrency/index.md +0 -66
  427. package/lib/assets/docs/article/grokking-concurrency/java/index.md +0 -92
  428. package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +0 -307
  429. package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +0 -333
  430. package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +0 -220
  431. package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +0 -212
  432. package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +0 -111
  433. package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +0 -68
  434. package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +0 -100
  435. package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +0 -100
  436. package/lib/assets/docs/article/grokking-concurrency/python/index.md +0 -303
  437. package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +0 -238
  438. package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +0 -417
  439. package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +0 -226
  440. package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +0 -298
  441. package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +0 -314
  442. package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +0 -296
  443. package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +0 -313
  444. package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +0 -359
  445. package/lib/assets/docs/article/grokking-concurrency/rust/index.md +0 -260
  446. package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +0 -107
  447. package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +0 -119
  448. package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +0 -125
  449. package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +0 -174
  450. package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +0 -157
  451. package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +0 -93
  452. package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +0 -132
  453. package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +0 -154
  454. package/lib/assets/docs/article/grokking-concurrency/scala/index.md +0 -59
  455. package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +0 -77
  456. package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +0 -111
  457. package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +0 -92
  458. package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +0 -109
  459. package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +0 -118
  460. package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +0 -82
  461. package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +0 -130
  462. package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +0 -128
  463. package/lib/assets/docs/article/grokkingfp/all/index.md +0 -368
  464. package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +0 -539
  465. package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +0 -932
  466. package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +0 -1137
  467. package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +0 -1113
  468. package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +0 -1035
  469. package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +0 -794
  470. package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +0 -880
  471. package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +0 -981
  472. package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +0 -935
  473. package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +0 -879
  474. package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +0 -724
  475. package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +0 -635
  476. package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +0 -721
  477. package/lib/assets/docs/article/grokkingfp/clojure/index.md +0 -276
  478. package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +0 -676
  479. package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +0 -652
  480. package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +0 -629
  481. package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +0 -706
  482. package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +0 -760
  483. package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +0 -730
  484. package/lib/assets/docs/article/grokkingfp/csharp/index.md +0 -246
  485. package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +0 -820
  486. package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +0 -980
  487. package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +0 -990
  488. package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +0 -958
  489. package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +0 -956
  490. package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +0 -748
  491. package/lib/assets/docs/article/grokkingfp/elixir/index.md +0 -203
  492. package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +0 -721
  493. package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +0 -847
  494. package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +0 -994
  495. package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +0 -983
  496. package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +0 -1295
  497. package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +0 -1058
  498. package/lib/assets/docs/article/grokkingfp/fsharp/index.md +0 -210
  499. package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +0 -723
  500. package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +0 -970
  501. package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +0 -981
  502. package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +0 -841
  503. package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +0 -920
  504. package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +0 -931
  505. package/lib/assets/docs/article/grokkingfp/haskell/index.md +0 -234
  506. package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +0 -600
  507. package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +0 -875
  508. package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +0 -924
  509. package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +0 -887
  510. package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +0 -854
  511. package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +0 -853
  512. package/lib/assets/docs/article/grokkingfp/index.md +0 -143
  513. package/lib/assets/docs/article/grokkingfp/java/index.md +0 -211
  514. package/lib/assets/docs/article/grokkingfp/java/part-1.md +0 -657
  515. package/lib/assets/docs/article/grokkingfp/java/part-2.md +0 -684
  516. package/lib/assets/docs/article/grokkingfp/java/part-3.md +0 -681
  517. package/lib/assets/docs/article/grokkingfp/java/part-4.md +0 -780
  518. package/lib/assets/docs/article/grokkingfp/java/part-5.md +0 -968
  519. package/lib/assets/docs/article/grokkingfp/java/part-6.md +0 -1337
  520. package/lib/assets/docs/article/grokkingfp/python/index.md +0 -258
  521. package/lib/assets/docs/article/grokkingfp/python/part-1.md +0 -452
  522. package/lib/assets/docs/article/grokkingfp/python/part-2.md +0 -967
  523. package/lib/assets/docs/article/grokkingfp/python/part-3.md +0 -1013
  524. package/lib/assets/docs/article/grokkingfp/python/part-4.md +0 -774
  525. package/lib/assets/docs/article/grokkingfp/python/part-5.md +0 -756
  526. package/lib/assets/docs/article/grokkingfp/python/part-6.md +0 -870
  527. package/lib/assets/docs/article/grokkingfp/ruby/index.md +0 -330
  528. package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +0 -764
  529. package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +0 -947
  530. package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +0 -955
  531. package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +0 -930
  532. package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +0 -917
  533. package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +0 -1421
  534. package/lib/assets/docs/article/grokkingfp/rust/index.md +0 -242
  535. package/lib/assets/docs/article/grokkingfp/rust/part-1.md +0 -643
  536. package/lib/assets/docs/article/grokkingfp/rust/part-2.md +0 -1069
  537. package/lib/assets/docs/article/grokkingfp/rust/part-3.md +0 -1003
  538. package/lib/assets/docs/article/grokkingfp/rust/part-4.md +0 -582
  539. package/lib/assets/docs/article/grokkingfp/rust/part-5.md +0 -714
  540. package/lib/assets/docs/article/grokkingfp/rust/part-6.md +0 -517
  541. package/lib/assets/docs/article/grokkingfp/scala/index.md +0 -171
  542. package/lib/assets/docs/article/grokkingfp/scala/part-1.md +0 -552
  543. package/lib/assets/docs/article/grokkingfp/scala/part-2.md +0 -955
  544. package/lib/assets/docs/article/grokkingfp/scala/part-3.md +0 -928
  545. package/lib/assets/docs/article/grokkingfp/scala/part-4.md +0 -751
  546. package/lib/assets/docs/article/grokkingfp/scala/part-5.md +0 -731
  547. package/lib/assets/docs/article/grokkingfp/scala/part-6.md +0 -876
  548. package/lib/assets/docs/article/grokkingfp/typescript/index.md +0 -273
  549. package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +0 -570
  550. package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +0 -1138
  551. package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +0 -851
  552. package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +0 -1096
  553. package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +0 -726
  554. package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +0 -991
  555. package/lib/assets/docs/article/practical-database-design/index.md +0 -121
  556. package/lib/assets/docs/article/practical-database-design/part1/chapter01.md +0 -297
  557. package/lib/assets/docs/article/practical-database-design/part1/chapter02.md +0 -527
  558. package/lib/assets/docs/article/practical-database-design/part1/chapter03.md +0 -566
  559. package/lib/assets/docs/article/practical-database-design/part2/chapter04.md +0 -933
  560. package/lib/assets/docs/article/practical-database-design/part2/chapter05.md +0 -1636
  561. package/lib/assets/docs/article/practical-database-design/part2/chapter06.md +0 -2725
  562. package/lib/assets/docs/article/practical-database-design/part2/chapter07.md +0 -2091
  563. package/lib/assets/docs/article/practical-database-design/part2/chapter08.md +0 -2114
  564. package/lib/assets/docs/article/practical-database-design/part2/chapter09.md +0 -2040
  565. package/lib/assets/docs/article/practical-database-design/part2/chapter10.md +0 -1396
  566. package/lib/assets/docs/article/practical-database-design/part2/chapter11.md +0 -1686
  567. package/lib/assets/docs/article/practical-database-design/part2/chapter12.md +0 -1426
  568. package/lib/assets/docs/article/practical-database-design/part2/chapter13.md +0 -1443
  569. package/lib/assets/docs/article/practical-database-design/part3/chapter14.md +0 -676
  570. package/lib/assets/docs/article/practical-database-design/part3/chapter15.md +0 -1634
  571. package/lib/assets/docs/article/practical-database-design/part3/chapter16.md +0 -1924
  572. package/lib/assets/docs/article/practical-database-design/part3/chapter17.md +0 -1717
  573. package/lib/assets/docs/article/practical-database-design/part3/chapter18.md +0 -2104
  574. package/lib/assets/docs/article/practical-database-design/part3/chapter19.md +0 -1132
  575. package/lib/assets/docs/article/practical-database-design/part3/chapter20.md +0 -1040
  576. package/lib/assets/docs/article/practical-database-design/part3/chapter21.md +0 -1391
  577. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter14-orm.md +0 -1000
  578. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter15-orm.md +0 -1309
  579. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter16-orm.md +0 -1175
  580. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter17-orm.md +0 -1593
  581. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter18-orm.md +0 -1192
  582. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter19-orm.md +0 -1025
  583. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter20-orm.md +0 -1762
  584. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter21-orm.md +0 -1456
  585. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter22-orm.md +0 -1887
  586. package/lib/assets/docs/article/practical-database-design/part4/chapter22.md +0 -974
  587. package/lib/assets/docs/article/practical-database-design/part4/chapter23.md +0 -2078
  588. package/lib/assets/docs/article/practical-database-design/part4/chapter24.md +0 -2448
  589. package/lib/assets/docs/article/practical-database-design/part4/chapter25.md +0 -3670
  590. package/lib/assets/docs/article/practical-database-design/part4/chapter26.md +0 -2925
  591. package/lib/assets/docs/article/practical-database-design/part4/chapter27.md +0 -3114
  592. package/lib/assets/docs/article/practical-database-design/part4/chapter28.md +0 -2706
  593. package/lib/assets/docs/article/practical-database-design/part4/chapter29.md +0 -2552
  594. package/lib/assets/docs/article/practical-database-design/part4/chapter30.md +0 -2188
  595. package/lib/assets/docs/article/practical-database-design/part4/chapter31.md +0 -1200
  596. package/lib/assets/docs/article/practical-database-design/part4/chapter32.md +0 -2109
  597. package/lib/assets/docs/article/practical-database-design/part5/chapter33.md +0 -1041
  598. package/lib/assets/docs/article/practical-database-design/part5/chapter34.md +0 -1618
  599. package/lib/assets/docs/article/practical-database-design/part5/chapter35.md +0 -1462
  600. package/lib/assets/docs/article/practical-database-design/part5/chapter36.md +0 -1301
  601. package/lib/assets/docs/article/practical-database-design/part5/chapter37.md +0 -1479
  602. package/lib/assets/docs/article/practical-database-design/part5/chapter38.md +0 -1707
  603. package/lib/assets/docs/article/practical-database-design/part5/chapter39.md +0 -2343
  604. package/lib/assets/docs/article/practical-database-design/study/study2-1.md +0 -1702
  605. package/lib/assets/docs/article/practical-database-design/study/study2-2.md +0 -1356
  606. package/lib/assets/docs/article/practical-database-design/study/study2-3.md +0 -2053
  607. package/lib/assets/docs/article/practical-database-design/study/study2-4.md +0 -2238
  608. package/lib/assets/docs/article/practical-database-design/study/study2-5.md +0 -2427
  609. package/lib/assets/docs/article/practical-database-design/study/study3-1.md +0 -2214
  610. package/lib/assets/docs/article/practical-database-design/study/study3-2.md +0 -2230
  611. package/lib/assets/docs/article/practical-database-design/study/study3-3.md +0 -2262
  612. package/lib/assets/docs/article/practical-database-design/study/study3-4.md +0 -2115
  613. package/lib/assets/docs/article/practical-database-design/study/study3-5.md +0 -2516
  614. package/lib/assets/docs/article/practical-database-design/study/study4-1.md +0 -2596
  615. package/lib/assets/docs/article/practical-database-design/study/study4-2.md +0 -2084
  616. package/lib/assets/docs/article/practical-database-design/study/study4-3.md +0 -1814
  617. package/lib/assets/docs/article/practical-database-design/study/study4-4.md +0 -1904
  618. 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 サービスの実装に進みます。