@novha/calc-engines 7.0.0 → 7.0.1

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 (309) hide show
  1. package/all-commits.bundle +0 -0
  2. package/dist/capital-gains/brazil/BrazilCapitalGainsService.js +3 -0
  3. package/dist/capital-gains/brazil/BrazilCapitalGainsServiceImpl.js +56 -0
  4. package/dist/capital-gains/brazil/domain/types.js +3 -0
  5. package/dist/capital-gains/index.js +17 -2
  6. package/dist/capital-gains/india/IndiaCapitalGainsService.js +3 -0
  7. package/dist/capital-gains/india/IndiaCapitalGainsServiceImpl.js +58 -0
  8. package/dist/capital-gains/india/domain/types.js +3 -0
  9. package/dist/capital-gains/israel/IsraelCapitalGainsService.js +3 -0
  10. package/dist/capital-gains/israel/IsraelCapitalGainsServiceImpl.js +56 -0
  11. package/dist/capital-gains/israel/domain/types.js +3 -0
  12. package/dist/capital-gains/japan/JapanCapitalGainsService.js +3 -0
  13. package/dist/capital-gains/japan/JapanCapitalGainsServiceImpl.js +41 -0
  14. package/dist/capital-gains/japan/domain/types.js +3 -0
  15. package/dist/capital-gains/spain/SpainCapitalGainsService.js +3 -0
  16. package/dist/capital-gains/spain/SpainCapitalGainsServiceImpl.js +56 -0
  17. package/dist/capital-gains/spain/domain/types.js +3 -0
  18. package/dist/corporate/brazil/BrazilCorporateTaxService.js +3 -0
  19. package/dist/corporate/brazil/BrazilCorporateTaxServiceImpl.js +33 -0
  20. package/dist/corporate/brazil/domain/types.js +3 -0
  21. package/dist/corporate/index.js +19 -2
  22. package/dist/corporate/india/IndiaCorporateTaxService.js +3 -0
  23. package/dist/corporate/india/IndiaCorporateTaxServiceImpl.js +29 -0
  24. package/dist/corporate/india/domain/types.js +3 -0
  25. package/dist/corporate/israel/IsraelCorporateTaxService.js +3 -0
  26. package/dist/corporate/israel/IsraelCorporateTaxServiceImpl.js +29 -0
  27. package/dist/corporate/israel/domain/types.js +3 -0
  28. package/dist/corporate/japan/JapanCorporateTaxService.js +3 -0
  29. package/dist/corporate/japan/JapanCorporateTaxServiceImpl.js +29 -0
  30. package/dist/corporate/japan/domain/types.js +3 -0
  31. package/dist/corporate/netherlands/NetherlandsCorporateTaxService.js +3 -0
  32. package/dist/corporate/netherlands/NetherlandsCorporateTaxServiceImpl.js +40 -0
  33. package/dist/corporate/netherlands/domain/types.js +3 -0
  34. package/dist/corporate/spain/SpainCorporateTaxService.js +3 -0
  35. package/dist/corporate/spain/SpainCorporateTaxServiceImpl.js +29 -0
  36. package/dist/corporate/spain/domain/types.js +3 -0
  37. package/dist/corporate/switzerland/SwitzerlandCorporateTaxService.js +3 -0
  38. package/dist/corporate/switzerland/SwitzerlandCorporateTaxServiceImpl.js +29 -0
  39. package/dist/corporate/switzerland/domain/types.js +3 -0
  40. package/dist/income-tax/brazil/BrazilIncomeTaxService.js +3 -0
  41. package/dist/income-tax/brazil/BrazilIncomeTaxServiceImpl.js +78 -0
  42. package/dist/income-tax/brazil/domain/types.js +3 -0
  43. package/dist/income-tax/index.js +23 -2
  44. package/dist/income-tax/india/IndiaIncomeTaxService.js +3 -0
  45. package/dist/income-tax/india/IndiaIncomeTaxServiceImpl.js +75 -0
  46. package/dist/income-tax/india/domain/types.js +3 -0
  47. package/dist/income-tax/israel/IsraelIncomeTaxService.js +3 -0
  48. package/dist/income-tax/israel/IsraelIncomeTaxServiceImpl.js +62 -0
  49. package/dist/income-tax/israel/domain/types.js +3 -0
  50. package/dist/income-tax/japan/JapanIncomeTaxService.js +3 -0
  51. package/dist/income-tax/japan/JapanIncomeTaxServiceImpl.js +75 -0
  52. package/dist/income-tax/japan/domain/types.js +3 -0
  53. package/dist/income-tax/netherlands/NetherlandsIncomeTaxService.js +3 -0
  54. package/dist/income-tax/netherlands/NetherlandsIncomeTaxServiceImpl.js +62 -0
  55. package/dist/income-tax/netherlands/domain/types.js +3 -0
  56. package/dist/income-tax/spain/SpainIncomeTaxService.js +3 -0
  57. package/dist/income-tax/spain/SpainIncomeTaxServiceImpl.js +62 -0
  58. package/dist/income-tax/spain/domain/types.js +3 -0
  59. package/dist/income-tax/switzerland/SwitzerlandIncomeTaxService.js +3 -0
  60. package/dist/income-tax/switzerland/SwitzerlandIncomeTaxServiceImpl.js +62 -0
  61. package/dist/income-tax/switzerland/domain/types.js +3 -0
  62. package/dist/inheritance-tax/index.js +11 -2
  63. package/dist/inheritance-tax/japan/JapanInheritanceTaxService.js +3 -0
  64. package/dist/inheritance-tax/japan/JapanInheritanceTaxServiceImpl.js +53 -0
  65. package/dist/inheritance-tax/japan/domain/types.js +3 -0
  66. package/dist/inheritance-tax/netherlands/NetherlandsInheritanceTaxService.js +3 -0
  67. package/dist/inheritance-tax/netherlands/NetherlandsInheritanceTaxServiceImpl.js +52 -0
  68. package/dist/inheritance-tax/netherlands/domain/types.js +3 -0
  69. package/dist/inheritance-tax/spain/SpainInheritanceTaxService.js +3 -0
  70. package/dist/inheritance-tax/spain/SpainInheritanceTaxServiceImpl.js +51 -0
  71. package/dist/inheritance-tax/spain/domain/types.js +3 -0
  72. package/dist/mortgage/brazil/BrazilMortgageService.js +3 -0
  73. package/dist/mortgage/brazil/BrazilMortgageServiceImpl.js +76 -0
  74. package/dist/mortgage/brazil/domain/types.js +3 -0
  75. package/dist/mortgage/index.js +23 -2
  76. package/dist/mortgage/india/IndiaMortgageService.js +3 -0
  77. package/dist/mortgage/india/IndiaMortgageServiceImpl.js +76 -0
  78. package/dist/mortgage/india/domain/types.js +3 -0
  79. package/dist/mortgage/israel/IsraelMortgageService.js +3 -0
  80. package/dist/mortgage/israel/IsraelMortgageServiceImpl.js +100 -0
  81. package/dist/mortgage/israel/domain/types.js +3 -0
  82. package/dist/mortgage/japan/JapanMortgageService.js +3 -0
  83. package/dist/mortgage/japan/JapanMortgageServiceImpl.js +76 -0
  84. package/dist/mortgage/japan/domain/types.js +3 -0
  85. package/dist/mortgage/netherlands/NetherlandsMortgageService.js +3 -0
  86. package/dist/mortgage/netherlands/NetherlandsMortgageServiceImpl.js +83 -0
  87. package/dist/mortgage/netherlands/domain/types.js +3 -0
  88. package/dist/mortgage/spain/SpainMortgageService.js +3 -0
  89. package/dist/mortgage/spain/SpainMortgageServiceImpl.js +96 -0
  90. package/dist/mortgage/spain/domain/types.js +3 -0
  91. package/dist/mortgage/switzerland/SwitzerlandMortgageService.js +3 -0
  92. package/dist/mortgage/switzerland/SwitzerlandMortgageServiceImpl.js +80 -0
  93. package/dist/mortgage/switzerland/domain/types.js +3 -0
  94. package/dist/types/capital-gains/brazil/BrazilCapitalGainsService.d.ts +4 -0
  95. package/dist/types/capital-gains/brazil/BrazilCapitalGainsServiceImpl.d.ts +10 -0
  96. package/dist/types/capital-gains/brazil/domain/types.d.ts +11 -0
  97. package/dist/types/capital-gains/index.d.ts +11 -1
  98. package/dist/types/capital-gains/india/IndiaCapitalGainsService.d.ts +4 -0
  99. package/dist/types/capital-gains/india/IndiaCapitalGainsServiceImpl.d.ts +9 -0
  100. package/dist/types/capital-gains/india/domain/types.d.ts +9 -0
  101. package/dist/types/capital-gains/israel/IsraelCapitalGainsService.d.ts +4 -0
  102. package/dist/types/capital-gains/israel/IsraelCapitalGainsServiceImpl.d.ts +10 -0
  103. package/dist/types/capital-gains/israel/domain/types.d.ts +11 -0
  104. package/dist/types/capital-gains/japan/JapanCapitalGainsService.d.ts +4 -0
  105. package/dist/types/capital-gains/japan/JapanCapitalGainsServiceImpl.d.ts +9 -0
  106. package/dist/types/capital-gains/japan/domain/types.d.ts +6 -0
  107. package/dist/types/capital-gains/spain/SpainCapitalGainsService.d.ts +4 -0
  108. package/dist/types/capital-gains/spain/SpainCapitalGainsServiceImpl.d.ts +10 -0
  109. package/dist/types/capital-gains/spain/domain/types.d.ts +11 -0
  110. package/dist/types/corporate/brazil/BrazilCorporateTaxService.d.ts +4 -0
  111. package/dist/types/corporate/brazil/BrazilCorporateTaxServiceImpl.d.ts +8 -0
  112. package/dist/types/corporate/brazil/domain/types.d.ts +19 -0
  113. package/dist/types/corporate/index.d.ts +15 -1
  114. package/dist/types/corporate/india/IndiaCorporateTaxService.d.ts +4 -0
  115. package/dist/types/corporate/india/IndiaCorporateTaxServiceImpl.d.ts +8 -0
  116. package/dist/types/corporate/india/domain/types.d.ts +15 -0
  117. package/dist/types/corporate/israel/IsraelCorporateTaxService.d.ts +4 -0
  118. package/dist/types/corporate/israel/IsraelCorporateTaxServiceImpl.d.ts +8 -0
  119. package/dist/types/corporate/israel/domain/types.d.ts +15 -0
  120. package/dist/types/corporate/japan/JapanCorporateTaxService.d.ts +4 -0
  121. package/dist/types/corporate/japan/JapanCorporateTaxServiceImpl.d.ts +8 -0
  122. package/dist/types/corporate/japan/domain/types.d.ts +15 -0
  123. package/dist/types/corporate/netherlands/NetherlandsCorporateTaxService.d.ts +4 -0
  124. package/dist/types/corporate/netherlands/NetherlandsCorporateTaxServiceImpl.d.ts +8 -0
  125. package/dist/types/corporate/netherlands/domain/types.d.ts +17 -0
  126. package/dist/types/corporate/spain/SpainCorporateTaxService.d.ts +4 -0
  127. package/dist/types/corporate/spain/SpainCorporateTaxServiceImpl.d.ts +8 -0
  128. package/dist/types/corporate/spain/domain/types.d.ts +15 -0
  129. package/dist/types/corporate/switzerland/SwitzerlandCorporateTaxService.d.ts +4 -0
  130. package/dist/types/corporate/switzerland/SwitzerlandCorporateTaxServiceImpl.d.ts +8 -0
  131. package/dist/types/corporate/switzerland/domain/types.d.ts +15 -0
  132. package/dist/types/income-tax/brazil/BrazilIncomeTaxService.d.ts +4 -0
  133. package/dist/types/income-tax/brazil/BrazilIncomeTaxServiceImpl.d.ts +11 -0
  134. package/dist/types/income-tax/brazil/domain/types.d.ts +18 -0
  135. package/dist/types/income-tax/index.d.ts +15 -1
  136. package/dist/types/income-tax/india/IndiaIncomeTaxService.d.ts +4 -0
  137. package/dist/types/income-tax/india/IndiaIncomeTaxServiceImpl.d.ts +10 -0
  138. package/dist/types/income-tax/india/domain/types.d.ts +16 -0
  139. package/dist/types/income-tax/israel/IsraelIncomeTaxService.d.ts +4 -0
  140. package/dist/types/income-tax/israel/IsraelIncomeTaxServiceImpl.d.ts +10 -0
  141. package/dist/types/income-tax/israel/domain/types.d.ts +16 -0
  142. package/dist/types/income-tax/japan/JapanIncomeTaxService.d.ts +4 -0
  143. package/dist/types/income-tax/japan/JapanIncomeTaxServiceImpl.d.ts +10 -0
  144. package/dist/types/income-tax/japan/domain/types.d.ts +16 -0
  145. package/dist/types/income-tax/netherlands/NetherlandsIncomeTaxService.d.ts +4 -0
  146. package/dist/types/income-tax/netherlands/NetherlandsIncomeTaxServiceImpl.d.ts +10 -0
  147. package/dist/types/income-tax/netherlands/domain/types.d.ts +16 -0
  148. package/dist/types/income-tax/spain/SpainIncomeTaxService.d.ts +4 -0
  149. package/dist/types/income-tax/spain/SpainIncomeTaxServiceImpl.d.ts +10 -0
  150. package/dist/types/income-tax/spain/domain/types.d.ts +16 -0
  151. package/dist/types/income-tax/switzerland/SwitzerlandIncomeTaxService.d.ts +4 -0
  152. package/dist/types/income-tax/switzerland/SwitzerlandIncomeTaxServiceImpl.d.ts +10 -0
  153. package/dist/types/income-tax/switzerland/domain/types.d.ts +16 -0
  154. package/dist/types/inheritance-tax/index.d.ts +7 -1
  155. package/dist/types/inheritance-tax/japan/JapanInheritanceTaxService.d.ts +4 -0
  156. package/dist/types/inheritance-tax/japan/JapanInheritanceTaxServiceImpl.d.ts +9 -0
  157. package/dist/types/inheritance-tax/japan/domain/types.d.ts +21 -0
  158. package/dist/types/inheritance-tax/netherlands/NetherlandsInheritanceTaxService.d.ts +4 -0
  159. package/dist/types/inheritance-tax/netherlands/NetherlandsInheritanceTaxServiceImpl.d.ts +9 -0
  160. package/dist/types/inheritance-tax/netherlands/domain/types.d.ts +28 -0
  161. package/dist/types/inheritance-tax/spain/SpainInheritanceTaxService.d.ts +4 -0
  162. package/dist/types/inheritance-tax/spain/SpainInheritanceTaxServiceImpl.d.ts +9 -0
  163. package/dist/types/inheritance-tax/spain/domain/types.d.ts +19 -0
  164. package/dist/types/mortgage/brazil/BrazilMortgageService.d.ts +4 -0
  165. package/dist/types/mortgage/brazil/BrazilMortgageServiceImpl.d.ts +7 -0
  166. package/dist/types/mortgage/brazil/domain/types.d.ts +39 -0
  167. package/dist/types/mortgage/index.d.ts +15 -1
  168. package/dist/types/mortgage/india/IndiaMortgageService.d.ts +4 -0
  169. package/dist/types/mortgage/india/IndiaMortgageServiceImpl.d.ts +7 -0
  170. package/dist/types/mortgage/india/domain/types.d.ts +39 -0
  171. package/dist/types/mortgage/israel/IsraelMortgageService.d.ts +4 -0
  172. package/dist/types/mortgage/israel/IsraelMortgageServiceImpl.d.ts +8 -0
  173. package/dist/types/mortgage/israel/domain/types.d.ts +43 -0
  174. package/dist/types/mortgage/japan/JapanMortgageService.d.ts +4 -0
  175. package/dist/types/mortgage/japan/JapanMortgageServiceImpl.d.ts +7 -0
  176. package/dist/types/mortgage/japan/domain/types.d.ts +39 -0
  177. package/dist/types/mortgage/netherlands/NetherlandsMortgageService.d.ts +4 -0
  178. package/dist/types/mortgage/netherlands/NetherlandsMortgageServiceImpl.d.ts +7 -0
  179. package/dist/types/mortgage/netherlands/domain/types.d.ts +41 -0
  180. package/dist/types/mortgage/spain/SpainMortgageService.d.ts +4 -0
  181. package/dist/types/mortgage/spain/SpainMortgageServiceImpl.d.ts +8 -0
  182. package/dist/types/mortgage/spain/domain/types.d.ts +44 -0
  183. package/dist/types/mortgage/switzerland/SwitzerlandMortgageService.d.ts +4 -0
  184. package/dist/types/mortgage/switzerland/SwitzerlandMortgageServiceImpl.d.ts +7 -0
  185. package/dist/types/mortgage/switzerland/domain/types.d.ts +37 -0
  186. package/package.json +1 -1
  187. package/src/capital-gains/brazil/BrazilCapitalGainsService.ts +5 -0
  188. package/src/capital-gains/brazil/BrazilCapitalGainsServiceImpl.ts +69 -0
  189. package/src/capital-gains/brazil/domain/types.ts +15 -0
  190. package/src/capital-gains/index.ts +50 -0
  191. package/src/capital-gains/india/IndiaCapitalGainsService.ts +5 -0
  192. package/src/capital-gains/india/IndiaCapitalGainsServiceImpl.ts +64 -0
  193. package/src/capital-gains/india/domain/types.ts +12 -0
  194. package/src/capital-gains/israel/IsraelCapitalGainsService.ts +5 -0
  195. package/src/capital-gains/israel/IsraelCapitalGainsServiceImpl.ts +69 -0
  196. package/src/capital-gains/israel/domain/types.ts +15 -0
  197. package/src/capital-gains/japan/JapanCapitalGainsService.ts +5 -0
  198. package/src/capital-gains/japan/JapanCapitalGainsServiceImpl.ts +47 -0
  199. package/src/capital-gains/japan/domain/types.ts +9 -0
  200. package/src/capital-gains/spain/SpainCapitalGainsService.ts +5 -0
  201. package/src/capital-gains/spain/SpainCapitalGainsServiceImpl.ts +69 -0
  202. package/src/capital-gains/spain/domain/types.ts +15 -0
  203. package/src/corporate/brazil/BrazilCorporateTaxService.ts +5 -0
  204. package/src/corporate/brazil/BrazilCorporateTaxServiceImpl.ts +40 -0
  205. package/src/corporate/brazil/domain/types.ts +16 -0
  206. package/src/corporate/index.ts +81 -1
  207. package/src/corporate/india/IndiaCorporateTaxService.ts +5 -0
  208. package/src/corporate/india/IndiaCorporateTaxServiceImpl.ts +35 -0
  209. package/src/corporate/india/domain/types.ts +15 -0
  210. package/src/corporate/israel/IsraelCorporateTaxService.ts +5 -0
  211. package/src/corporate/israel/IsraelCorporateTaxServiceImpl.ts +35 -0
  212. package/src/corporate/israel/domain/types.ts +15 -0
  213. package/src/corporate/japan/JapanCorporateTaxService.ts +5 -0
  214. package/src/corporate/japan/JapanCorporateTaxServiceImpl.ts +35 -0
  215. package/src/corporate/japan/domain/types.ts +15 -0
  216. package/src/corporate/netherlands/NetherlandsCorporateTaxService.ts +5 -0
  217. package/src/corporate/netherlands/NetherlandsCorporateTaxServiceImpl.ts +48 -0
  218. package/src/corporate/netherlands/domain/types.ts +21 -0
  219. package/src/corporate/spain/SpainCorporateTaxService.ts +5 -0
  220. package/src/corporate/spain/SpainCorporateTaxServiceImpl.ts +35 -0
  221. package/src/corporate/spain/domain/types.ts +15 -0
  222. package/src/corporate/switzerland/SwitzerlandCorporateTaxService.ts +5 -0
  223. package/src/corporate/switzerland/SwitzerlandCorporateTaxServiceImpl.ts +35 -0
  224. package/src/corporate/switzerland/domain/types.ts +15 -0
  225. package/src/income-tax/brazil/BrazilIncomeTaxService.ts +5 -0
  226. package/src/income-tax/brazil/BrazilIncomeTaxServiceImpl.ts +91 -0
  227. package/src/income-tax/brazil/domain/types.ts +21 -0
  228. package/src/income-tax/index.ts +70 -0
  229. package/src/income-tax/india/IndiaIncomeTaxService.ts +5 -0
  230. package/src/income-tax/india/IndiaIncomeTaxServiceImpl.ts +87 -0
  231. package/src/income-tax/india/domain/types.ts +16 -0
  232. package/src/income-tax/israel/IsraelIncomeTaxService.ts +5 -0
  233. package/src/income-tax/israel/IsraelIncomeTaxServiceImpl.ts +75 -0
  234. package/src/income-tax/israel/domain/types.ts +16 -0
  235. package/src/income-tax/japan/JapanIncomeTaxService.ts +5 -0
  236. package/src/income-tax/japan/JapanIncomeTaxServiceImpl.ts +87 -0
  237. package/src/income-tax/japan/domain/types.ts +16 -0
  238. package/src/income-tax/netherlands/NetherlandsIncomeTaxService.ts +5 -0
  239. package/src/income-tax/netherlands/NetherlandsIncomeTaxServiceImpl.ts +75 -0
  240. package/src/income-tax/netherlands/domain/types.ts +16 -0
  241. package/src/income-tax/spain/SpainIncomeTaxService.ts +5 -0
  242. package/src/income-tax/spain/SpainIncomeTaxServiceImpl.ts +75 -0
  243. package/src/income-tax/spain/domain/types.ts +16 -0
  244. package/src/income-tax/switzerland/SwitzerlandIncomeTaxService.ts +5 -0
  245. package/src/income-tax/switzerland/SwitzerlandIncomeTaxServiceImpl.ts +75 -0
  246. package/src/income-tax/switzerland/domain/types.ts +16 -0
  247. package/src/inheritance-tax/index.ts +36 -0
  248. package/src/inheritance-tax/japan/JapanInheritanceTaxService.ts +5 -0
  249. package/src/inheritance-tax/japan/JapanInheritanceTaxServiceImpl.ts +67 -0
  250. package/src/inheritance-tax/japan/domain/types.ts +25 -0
  251. package/src/inheritance-tax/netherlands/NetherlandsInheritanceTaxService.ts +5 -0
  252. package/src/inheritance-tax/netherlands/NetherlandsInheritanceTaxServiceImpl.ts +66 -0
  253. package/src/inheritance-tax/netherlands/domain/types.ts +34 -0
  254. package/src/inheritance-tax/spain/SpainInheritanceTaxService.ts +5 -0
  255. package/src/inheritance-tax/spain/SpainInheritanceTaxServiceImpl.ts +65 -0
  256. package/src/inheritance-tax/spain/domain/types.ts +23 -0
  257. package/src/mortgage/brazil/BrazilMortgageService.ts +5 -0
  258. package/src/mortgage/brazil/BrazilMortgageServiceImpl.ts +101 -0
  259. package/src/mortgage/brazil/domain/types.ts +46 -0
  260. package/src/mortgage/index.ts +85 -1
  261. package/src/mortgage/india/IndiaMortgageService.ts +5 -0
  262. package/src/mortgage/india/IndiaMortgageServiceImpl.ts +101 -0
  263. package/src/mortgage/india/domain/types.ts +46 -0
  264. package/src/mortgage/israel/IsraelMortgageService.ts +5 -0
  265. package/src/mortgage/israel/IsraelMortgageServiceImpl.ts +132 -0
  266. package/src/mortgage/israel/domain/types.ts +41 -0
  267. package/src/mortgage/japan/JapanMortgageService.ts +5 -0
  268. package/src/mortgage/japan/JapanMortgageServiceImpl.ts +101 -0
  269. package/src/mortgage/japan/domain/types.ts +46 -0
  270. package/src/mortgage/netherlands/NetherlandsMortgageService.ts +5 -0
  271. package/src/mortgage/netherlands/NetherlandsMortgageServiceImpl.ts +109 -0
  272. package/src/mortgage/netherlands/domain/types.ts +37 -0
  273. package/src/mortgage/spain/SpainMortgageService.ts +5 -0
  274. package/src/mortgage/spain/SpainMortgageServiceImpl.ts +130 -0
  275. package/src/mortgage/spain/domain/types.ts +52 -0
  276. package/src/mortgage/switzerland/SwitzerlandMortgageService.ts +5 -0
  277. package/src/mortgage/switzerland/SwitzerlandMortgageServiceImpl.ts +106 -0
  278. package/src/mortgage/switzerland/domain/types.ts +36 -0
  279. package/test/brazil-capital-gains.test.ts +65 -0
  280. package/test/brazil-corporate-tax.test.ts +63 -0
  281. package/test/brazil-income-tax.test.ts +85 -0
  282. package/test/brazil-mortgage.test.ts +70 -0
  283. package/test/india-capital-gains.test.ts +71 -0
  284. package/test/india-corporate-tax.test.ts +54 -0
  285. package/test/india-income-tax.test.ts +78 -0
  286. package/test/india-mortgage.test.ts +70 -0
  287. package/test/israel-capital-gains.test.ts +45 -0
  288. package/test/israel-corporate-tax.test.ts +49 -0
  289. package/test/israel-income-tax.test.ts +76 -0
  290. package/test/israel-mortgage.test.ts +80 -0
  291. package/test/japan-capital-gains.test.ts +55 -0
  292. package/test/japan-corporate-tax.test.ts +54 -0
  293. package/test/japan-income-tax.test.ts +76 -0
  294. package/test/japan-inheritance-tax.test.ts +74 -0
  295. package/test/japan-mortgage.test.ts +69 -0
  296. package/test/netherlands-corporate-tax.test.ts +54 -0
  297. package/test/netherlands-income-tax.test.ts +54 -0
  298. package/test/netherlands-inheritance-tax.test.ts +79 -0
  299. package/test/netherlands-mortgage.test.ts +79 -0
  300. package/test/spain-capital-gains.test.ts +66 -0
  301. package/test/spain-corporate-tax.test.ts +54 -0
  302. package/test/spain-income-tax.test.ts +84 -0
  303. package/test/spain-inheritance-tax.test.ts +78 -0
  304. package/test/spain-mortgage.test.ts +70 -0
  305. package/test/switzerland-corporate-tax.test.ts +39 -0
  306. package/test/switzerland-income-tax.test.ts +66 -0
  307. package/test/switzerland-mortgage.test.ts +70 -0
  308. package/dist/domain/types.js +0 -10
  309. package/dist/types/domain/types.d.ts +0 -41
@@ -0,0 +1,80 @@
1
+ import { IsraelMortgageServiceImpl } from '../src/mortgage/israel/IsraelMortgageServiceImpl';
2
+ import { MortgageInput, MortgageRules } from '../src/mortgage/israel/domain/types';
3
+
4
+ const israelRules: MortgageRules = {
5
+ loanConstraints: { maxLtvPercent: 0.75, maxAmortizationYears: 30 },
6
+ interest: { compounding: 'MONTHLY' },
7
+ purchaseTax: {
8
+ brackets: [
9
+ { upTo: 1978745, rate: 0 },
10
+ { upTo: 5872725, rate: 0.035 },
11
+ { upTo: 16140600, rate: 0.05 },
12
+ { upTo: 21520800, rate: 0.08 },
13
+ { above: 21520800, rate: 0.10 },
14
+ ],
15
+ },
16
+ landRegistrationFeeRate: 0.0025,
17
+ };
18
+
19
+ const input: MortgageInput = {
20
+ propertyPrice: 2000000,
21
+ downPayment: 500000,
22
+ annualInterestRate: 4.5,
23
+ amortizationYears: 25,
24
+ isFirstTimeBuyer: true,
25
+ };
26
+
27
+ describe('IsraelMortgageServiceImpl', () => {
28
+ it('correctly calculates the loan amount', () => {
29
+ const service = new IsraelMortgageServiceImpl();
30
+ const result = service.calculate(input, israelRules);
31
+ expect(result.loanAmount).toBe(1500000);
32
+ });
33
+
34
+ it('correctly calculates purchase tax for first-time buyer', () => {
35
+ const service = new IsraelMortgageServiceImpl();
36
+ const result = service.calculate(input, israelRules);
37
+ // 0-1978745: 0% tax = 0
38
+ // 1978745-2000000: 21255 * 0.035 = 743.925
39
+ expect(result.purchaseTax).toBeCloseTo(743.93, 1);
40
+ });
41
+
42
+ it('correctly calculates land registration fee', () => {
43
+ const service = new IsraelMortgageServiceImpl();
44
+ const result = service.calculate(input, israelRules);
45
+ // 2000000 * 0.0025 = 5000
46
+ expect(result.landRegistrationFee).toBeCloseTo(5000, 2);
47
+ });
48
+
49
+ it('calculates a positive monthly payment', () => {
50
+ const service = new IsraelMortgageServiceImpl();
51
+ const result = service.calculate(input, israelRules);
52
+ expect(result.monthlyPayment).toBeGreaterThan(0);
53
+ });
54
+
55
+ it('total paid is greater than the loan amount', () => {
56
+ const service = new IsraelMortgageServiceImpl();
57
+ const result = service.calculate(input, israelRules);
58
+ expect(result.totalPaid).toBeGreaterThan(result.loanAmount);
59
+ });
60
+
61
+ it('amortization schedule has the correct number of years', () => {
62
+ const service = new IsraelMortgageServiceImpl();
63
+ const result = service.calculate(input, israelRules);
64
+ expect(result.amortizationSchedule).toHaveLength(25);
65
+ });
66
+
67
+ it('throws an error when down payment equals or exceeds property price', () => {
68
+ const service = new IsraelMortgageServiceImpl();
69
+ const badInput: MortgageInput = { ...input, downPayment: 2000000 };
70
+ expect(() => service.calculate(badInput, israelRules)).toThrow();
71
+ });
72
+
73
+ it('non-first-time buyer pays flat 8% purchase tax', () => {
74
+ const service = new IsraelMortgageServiceImpl();
75
+ const nonFtbInput: MortgageInput = { ...input, isFirstTimeBuyer: false };
76
+ const result = service.calculate(nonFtbInput, israelRules);
77
+ // 2000000 * 0.08 = 160000
78
+ expect(result.purchaseTax).toBeCloseTo(160000, 2);
79
+ });
80
+ });
@@ -0,0 +1,55 @@
1
+ import { JapanCapitalGainsServiceImpl } from '../src/capital-gains/japan/JapanCapitalGainsServiceImpl';
2
+ import { Input, Rules } from '../src/capital-gains/japan/domain/types';
3
+
4
+ const japanRules: Rules = {
5
+ flatRate: 0.20315,
6
+ };
7
+
8
+ describe('JapanCapitalGainsServiceImpl', () => {
9
+ it('returns zero tax for zero gain', () => {
10
+ const input: Input = { capitalGain: 0 };
11
+ const service = new JapanCapitalGainsServiceImpl(input, japanRules);
12
+ const result = service.calculate();
13
+
14
+ expect(result.taxableGain).toBe(0);
15
+ expect(result.capitalGainTax).toBe(0);
16
+ expect(result.totalTax).toBe(0);
17
+ expect(result.effectiveRate).toBe(0);
18
+ expect(result.breakdowns).toHaveLength(0);
19
+ });
20
+
21
+ it('correctly applies the flat 20.315% rate', () => {
22
+ const input: Input = { capitalGain: 1000000 };
23
+ const service = new JapanCapitalGainsServiceImpl(input, japanRules);
24
+ const result = service.calculate();
25
+
26
+ // 1000000 * 0.20315 = 203150
27
+ expect(result.capitalGainTax).toBeCloseTo(203150, 2);
28
+ expect(result.totalTax).toBeCloseTo(203150, 2);
29
+ });
30
+
31
+ it('effective rate equals the flat rate as a percentage', () => {
32
+ const input: Input = { capitalGain: 1000000 };
33
+ const service = new JapanCapitalGainsServiceImpl(input, japanRules);
34
+ const result = service.calculate();
35
+
36
+ expect(result.effectiveRate).toBeCloseTo(20.315, 3);
37
+ });
38
+
39
+ it('returns one breakdown entry for flat rate calculation', () => {
40
+ const input: Input = { capitalGain: 1000000 };
41
+ const service = new JapanCapitalGainsServiceImpl(input, japanRules);
42
+ const result = service.calculate();
43
+
44
+ expect(result.breakdowns).toHaveLength(1);
45
+ expect(result.breakdowns[0].rate).toBe(0.20315);
46
+ });
47
+
48
+ it('scales linearly with capital gain', () => {
49
+ const input: Input = { capitalGain: 5000000 };
50
+ const service = new JapanCapitalGainsServiceImpl(input, japanRules);
51
+ const result = service.calculate();
52
+
53
+ expect(result.capitalGainTax).toBeCloseTo(5000000 * 0.20315, 2);
54
+ });
55
+ });
@@ -0,0 +1,54 @@
1
+ import { JapanCorporateTaxServiceImpl } from '../src/corporate/japan/JapanCorporateTaxServiceImpl';
2
+ import { Input, Rules } from '../src/corporate/japan/domain/types';
3
+
4
+ const japanRules: Rules = {
5
+ regime: { type: 'flat', rate: 0.335 },
6
+ };
7
+
8
+ describe('JapanCorporateTaxServiceImpl', () => {
9
+ it('returns zero tax for zero income', () => {
10
+ const input: Input = { taxableIncome: 0 };
11
+ const service = new JapanCorporateTaxServiceImpl(input, japanRules);
12
+ const result = service.calculate();
13
+
14
+ expect(result.corporateTax).toBe(0);
15
+ expect(result.effectiveTaxRate).toBe(0);
16
+ expect(result.breakdowns).toHaveLength(0);
17
+ });
18
+
19
+ it('correctly applies the flat 33.5% rate', () => {
20
+ const input: Input = { taxableIncome: 10000000 };
21
+ const service = new JapanCorporateTaxServiceImpl(input, japanRules);
22
+ const result = service.calculate();
23
+
24
+ // 10000000 * 0.335 = 3350000
25
+ expect(result.corporateTax).toBe(3350000);
26
+ });
27
+
28
+ it('calculates effective tax rate as percentage', () => {
29
+ const input: Input = { taxableIncome: 10000000 };
30
+ const service = new JapanCorporateTaxServiceImpl(input, japanRules);
31
+ const result = service.calculate();
32
+
33
+ expect(result.effectiveTaxRate).toBe(33.5);
34
+ });
35
+
36
+ it('returns one breakdown entry for flat rate calculation', () => {
37
+ const input: Input = { taxableIncome: 10000000 };
38
+ const service = new JapanCorporateTaxServiceImpl(input, japanRules);
39
+ const result = service.calculate();
40
+
41
+ expect(result.breakdowns).toHaveLength(1);
42
+ expect(result.breakdowns[0].rate).toBe(0.335);
43
+ expect(result.breakdowns[0].amount).toBe(3350000);
44
+ });
45
+
46
+ it('scales linearly with taxable income', () => {
47
+ const input: Input = { taxableIncome: 1000000 };
48
+ const service = new JapanCorporateTaxServiceImpl(input, japanRules);
49
+ const result = service.calculate();
50
+
51
+ expect(result.corporateTax).toBe(335000);
52
+ expect(result.effectiveTaxRate).toBe(33.5);
53
+ });
54
+ });
@@ -0,0 +1,76 @@
1
+ import { JapanIncomeTaxServiceImpl } from '../src/income-tax/japan/JapanIncomeTaxServiceImpl';
2
+ import { IncomeTaxRules } from '../src/income-tax/japan/domain/types';
3
+
4
+ const japanRules: IncomeTaxRules = {
5
+ taxBrackets: [
6
+ { from: 0, to: 1950000, rate: 0.05 },
7
+ { from: 1950000, to: 3300000, rate: 0.10 },
8
+ { from: 3300000, to: 6950000, rate: 0.20 },
9
+ { from: 6950000, to: 9000000, rate: 0.23 },
10
+ { from: 9000000, to: 18000000, rate: 0.33 },
11
+ { from: 18000000, to: 40000000, rate: 0.40 },
12
+ { from: 40000000, to: null, rate: 0.45 },
13
+ ],
14
+ inhabitantTax: { rate: 0.10 },
15
+ };
16
+
17
+ describe('JapanIncomeTaxServiceImpl', () => {
18
+ it('returns zero tax for zero income', () => {
19
+ const service = new JapanIncomeTaxServiceImpl(0, japanRules);
20
+ const result = service.calculateNetIncome();
21
+
22
+ expect(result.nationalIncomeTax).toBe(0);
23
+ expect(result.inhabitantTax).toBe(0);
24
+ expect(result.totalDeductions).toBe(0);
25
+ expect(result.effectiveTaxRate).toBe(0);
26
+ });
27
+
28
+ it('correctly calculates national income tax for income in first bracket', () => {
29
+ const service = new JapanIncomeTaxServiceImpl(1000000, japanRules);
30
+ const result = service.calculateNetIncome();
31
+
32
+ // 0-1000000: 1000000 * 0.05 = 50000
33
+ expect(result.nationalIncomeTax).toBeCloseTo(50000, 2);
34
+ expect(result.grossIncome).toBe(1000000);
35
+ });
36
+
37
+ it('correctly calculates inhabitant tax as a flat rate on gross income', () => {
38
+ const service = new JapanIncomeTaxServiceImpl(1000000, japanRules);
39
+ const result = service.calculateNetIncome();
40
+
41
+ // inhabitantTax = 1000000 * 0.10 = 100000
42
+ expect(result.inhabitantTax).toBeCloseTo(100000, 2);
43
+ });
44
+
45
+ it('correctly calculates income spanning multiple brackets', () => {
46
+ const service = new JapanIncomeTaxServiceImpl(5000000, japanRules);
47
+ const result = service.calculateNetIncome();
48
+
49
+ // 0-1950000: 1950000 * 0.05 = 97500
50
+ // 1950000-3300000: 1350000 * 0.10 = 135000
51
+ // 3300000-5000000: 1700000 * 0.20 = 340000
52
+ // Total = 572500
53
+ expect(result.nationalIncomeTax).toBeCloseTo(572500, 2);
54
+ });
55
+
56
+ it('net income equals gross income minus total deductions', () => {
57
+ const service = new JapanIncomeTaxServiceImpl(5000000, japanRules);
58
+ const result = service.calculateNetIncome();
59
+
60
+ expect(result.netIncome).toBeCloseTo(result.grossIncome - result.totalDeductions, 2);
61
+ });
62
+
63
+ it('total deductions equals national income tax plus inhabitant tax', () => {
64
+ const service = new JapanIncomeTaxServiceImpl(5000000, japanRules);
65
+ const result = service.calculateNetIncome();
66
+
67
+ expect(result.totalDeductions).toBeCloseTo(result.nationalIncomeTax + result.inhabitantTax, 2);
68
+ });
69
+
70
+ it('calculates effective tax rate as national income tax divided by gross income', () => {
71
+ const service = new JapanIncomeTaxServiceImpl(5000000, japanRules);
72
+ const result = service.calculateNetIncome();
73
+
74
+ expect(result.effectiveTaxRate).toBeCloseTo(result.nationalIncomeTax / result.grossIncome, 4);
75
+ });
76
+ });
@@ -0,0 +1,74 @@
1
+ import { JapanInheritanceTaxServiceImpl } from '../src/inheritance-tax/japan/JapanInheritanceTaxServiceImpl';
2
+ import { Input, Rules } from '../src/inheritance-tax/japan/domain/types';
3
+
4
+ const japanRules: Rules = {
5
+ baseExemption: 30000000,
6
+ perHeirExemption: 6000000,
7
+ taxBrackets: [
8
+ { from: 0, to: 10000000, rate: 0.10 },
9
+ { from: 10000000, to: 30000000, rate: 0.15 },
10
+ { from: 30000000, to: 50000000, rate: 0.20 },
11
+ { from: 50000000, to: 100000000, rate: 0.30 },
12
+ { from: 100000000, to: 200000000, rate: 0.40 },
13
+ { from: 200000000, to: 300000000, rate: 0.45 },
14
+ { from: 300000000, to: 600000000, rate: 0.50 },
15
+ { from: 600000000, to: null, rate: 0.55 },
16
+ ],
17
+ };
18
+
19
+ describe('JapanInheritanceTaxServiceImpl', () => {
20
+ it('returns zero tax for zero estate', () => {
21
+ const input: Input = { estateValue: 0, numberOfStatutoryHeirs: 1 };
22
+ const service = new JapanInheritanceTaxServiceImpl(input, japanRules);
23
+ const result = service.calculate();
24
+
25
+ expect(result.inheritanceTax).toBe(0);
26
+ expect(result.taxableEstate).toBe(0);
27
+ expect(result.effectiveRate).toBe(0);
28
+ });
29
+
30
+ it('returns zero tax when estate is below the total exemption (1 heir)', () => {
31
+ // 1 heir: exemption = 30000000 + 6000000 * 1 = 36000000
32
+ // estate = 35000000 < 36000000 → no tax
33
+ const input: Input = { estateValue: 35000000, numberOfStatutoryHeirs: 1 };
34
+ const service = new JapanInheritanceTaxServiceImpl(input, japanRules);
35
+ const result = service.calculate();
36
+
37
+ expect(result.inheritanceTax).toBe(0);
38
+ expect(result.taxableEstate).toBe(0);
39
+ });
40
+
41
+ it('correctly calculates tax for estate above the exemption (2 heirs)', () => {
42
+ // 2 heirs: exemption = 30000000 + 6000000 * 2 = 42000000
43
+ // taxable = 100000000 - 42000000 = 58000000
44
+ // 0-10000000: 10000000 * 0.10 = 1000000
45
+ // 10000000-30000000: 20000000 * 0.15 = 3000000
46
+ // 30000000-50000000: 20000000 * 0.20 = 4000000
47
+ // 50000000-58000000: 8000000 * 0.30 = 2400000
48
+ // Total = 10400000
49
+ const input: Input = { estateValue: 100000000, numberOfStatutoryHeirs: 2 };
50
+ const service = new JapanInheritanceTaxServiceImpl(input, japanRules);
51
+ const result = service.calculate();
52
+
53
+ expect(result.taxableEstate).toBe(58000000);
54
+ expect(result.inheritanceTax).toBeCloseTo(10400000, 2);
55
+ });
56
+
57
+ it('effective rate equals inheritance tax divided by estate times 100', () => {
58
+ const input: Input = { estateValue: 100000000, numberOfStatutoryHeirs: 2 };
59
+ const service = new JapanInheritanceTaxServiceImpl(input, japanRules);
60
+ const result = service.calculate();
61
+
62
+ expect(result.effectiveRate).toBeCloseTo((result.inheritanceTax / 100000000) * 100, 2);
63
+ });
64
+
65
+ it('more heirs increases the exemption and reduces taxable estate', () => {
66
+ const input1: Input = { estateValue: 100000000, numberOfStatutoryHeirs: 1 };
67
+ const input3: Input = { estateValue: 100000000, numberOfStatutoryHeirs: 3 };
68
+
69
+ const tax1 = new JapanInheritanceTaxServiceImpl(input1, japanRules).calculate().inheritanceTax;
70
+ const tax3 = new JapanInheritanceTaxServiceImpl(input3, japanRules).calculate().inheritanceTax;
71
+
72
+ expect(tax3).toBeLessThan(tax1);
73
+ });
74
+ });
@@ -0,0 +1,69 @@
1
+ import { JapanMortgageServiceImpl } from '../src/mortgage/japan/JapanMortgageServiceImpl';
2
+ import { MortgageInput, MortgageRules } from '../src/mortgage/japan/domain/types';
3
+
4
+ const japanRules: MortgageRules = {
5
+ loanConstraints: { maxLtvPercent: 0.80, maxAmortizationYears: 35 },
6
+ interest: { compounding: 'MONTHLY' },
7
+ acquisitionTax: { rate: 0.03 },
8
+ };
9
+
10
+ const input: MortgageInput = {
11
+ propertyPrice: 50000000,
12
+ downPayment: 10000000,
13
+ annualInterestRate: 1.5,
14
+ amortizationYears: 30,
15
+ isFirstTimeBuyer: false,
16
+ };
17
+
18
+ describe('JapanMortgageServiceImpl', () => {
19
+ it('correctly calculates the loan amount', () => {
20
+ const service = new JapanMortgageServiceImpl();
21
+ const result = service.calculate(input, japanRules);
22
+
23
+ // loanAmount = 50000000 - 10000000 = 40000000
24
+ expect(result.loanAmount).toBe(40000000);
25
+ });
26
+
27
+ it('correctly calculates acquisition tax', () => {
28
+ const service = new JapanMortgageServiceImpl();
29
+ const result = service.calculate(input, japanRules);
30
+
31
+ // acquisitionTax = 50000000 * 0.03 = 1500000
32
+ expect(result.acquisitionTax).toBe(1500000);
33
+ });
34
+
35
+ it('calculates a positive monthly payment', () => {
36
+ const service = new JapanMortgageServiceImpl();
37
+ const result = service.calculate(input, japanRules);
38
+
39
+ expect(result.monthlyPayment).toBeGreaterThan(0);
40
+ });
41
+
42
+ it('total paid is greater than the loan amount', () => {
43
+ const service = new JapanMortgageServiceImpl();
44
+ const result = service.calculate(input, japanRules);
45
+
46
+ expect(result.totalPaid).toBeGreaterThan(result.loanAmount);
47
+ });
48
+
49
+ it('total interest paid equals total paid minus loan amount', () => {
50
+ const service = new JapanMortgageServiceImpl();
51
+ const result = service.calculate(input, japanRules);
52
+
53
+ expect(result.totalInterestPaid).toBeCloseTo(result.totalPaid - result.loanAmount, 2);
54
+ });
55
+
56
+ it('amortization schedule has the correct number of years', () => {
57
+ const service = new JapanMortgageServiceImpl();
58
+ const result = service.calculate(input, japanRules);
59
+
60
+ expect(result.amortizationSchedule).toHaveLength(30);
61
+ });
62
+
63
+ it('throws an error when down payment equals or exceeds property price', () => {
64
+ const service = new JapanMortgageServiceImpl();
65
+ const badInput: MortgageInput = { ...input, downPayment: 50000000 };
66
+
67
+ expect(() => service.calculate(badInput, japanRules)).toThrow();
68
+ });
69
+ });
@@ -0,0 +1,54 @@
1
+ import { NetherlandsCorporateTaxServiceImpl } from '../src/corporate/netherlands/NetherlandsCorporateTaxServiceImpl';
2
+ import { Input, Rules } from '../src/corporate/netherlands/domain/types';
3
+
4
+ const netherlandsRules: Rules = {
5
+ tiers: [
6
+ { from: 0, to: 200000, rate: 0.19 },
7
+ { from: 200000, to: null, rate: 0.258 },
8
+ ],
9
+ };
10
+
11
+ describe('NetherlandsCorporateTaxServiceImpl', () => {
12
+ it('returns zero tax for zero income', () => {
13
+ const input: Input = { taxableIncome: 0 };
14
+ const service = new NetherlandsCorporateTaxServiceImpl(input, netherlandsRules);
15
+ const result = service.calculate();
16
+ expect(result.corporateTax).toBe(0);
17
+ expect(result.effectiveTaxRate).toBe(0);
18
+ expect(result.breakdowns).toHaveLength(0);
19
+ });
20
+
21
+ it('correctly calculates tax for income within first tier (19%)', () => {
22
+ const input: Input = { taxableIncome: 100000 };
23
+ const service = new NetherlandsCorporateTaxServiceImpl(input, netherlandsRules);
24
+ const result = service.calculate();
25
+ // 100000 * 0.19 = 19000
26
+ expect(result.corporateTax).toBe(19000);
27
+ expect(result.effectiveTaxRate).toBe(19);
28
+ });
29
+
30
+ it('correctly calculates tax spanning both tiers', () => {
31
+ const input: Input = { taxableIncome: 300000 };
32
+ const service = new NetherlandsCorporateTaxServiceImpl(input, netherlandsRules);
33
+ const result = service.calculate();
34
+ // 0-200000: 200000 * 0.19 = 38000
35
+ // 200000-300000: 100000 * 0.258 = 25800
36
+ // Total = 63800
37
+ expect(result.corporateTax).toBe(63800);
38
+ });
39
+
40
+ it('returns two breakdown entries when spanning both tiers', () => {
41
+ const input: Input = { taxableIncome: 300000 };
42
+ const service = new NetherlandsCorporateTaxServiceImpl(input, netherlandsRules);
43
+ const result = service.calculate();
44
+ expect(result.breakdowns).toHaveLength(2);
45
+ });
46
+
47
+ it('effective tax rate is less than top rate for income spanning tiers', () => {
48
+ const input: Input = { taxableIncome: 300000 };
49
+ const service = new NetherlandsCorporateTaxServiceImpl(input, netherlandsRules);
50
+ const result = service.calculate();
51
+ expect(result.effectiveTaxRate).toBeLessThan(25.8);
52
+ expect(result.effectiveTaxRate).toBeGreaterThan(19);
53
+ });
54
+ });
@@ -0,0 +1,54 @@
1
+ import { NetherlandsIncomeTaxServiceImpl } from '../src/income-tax/netherlands/NetherlandsIncomeTaxServiceImpl';
2
+ import { IncomeTaxRules } from '../src/income-tax/netherlands/domain/types';
3
+
4
+ const netherlandsRules: IncomeTaxRules = {
5
+ taxBrackets: [
6
+ { from: 0, to: 75624, rate: 0.3697 },
7
+ { from: 75624, to: null, rate: 0.495 },
8
+ ],
9
+ socialContributions: { rate: 0 },
10
+ };
11
+
12
+ describe('NetherlandsIncomeTaxServiceImpl', () => {
13
+ it('returns zero tax for zero income', () => {
14
+ const service = new NetherlandsIncomeTaxServiceImpl(0, netherlandsRules);
15
+ const result = service.calculateNetIncome();
16
+ expect(result.incomeTax).toBe(0);
17
+ expect(result.socialContributions).toBe(0);
18
+ expect(result.effectiveTaxRate).toBe(0);
19
+ });
20
+
21
+ it('correctly calculates income tax in first bracket', () => {
22
+ const service = new NetherlandsIncomeTaxServiceImpl(50000, netherlandsRules);
23
+ const result = service.calculateNetIncome();
24
+ // 50000 * 0.3697 = 18485
25
+ expect(result.incomeTax).toBeCloseTo(18485, 2);
26
+ });
27
+
28
+ it('correctly calculates income tax spanning both brackets', () => {
29
+ const service = new NetherlandsIncomeTaxServiceImpl(100000, netherlandsRules);
30
+ const result = service.calculateNetIncome();
31
+ // 0-75624: 75624 * 0.3697 = 27958.19
32
+ // 75624-100000: 24376 * 0.495 = 12066.12
33
+ // Total ≈ 40024.31
34
+ expect(result.incomeTax).toBeCloseTo(40024.31, 1);
35
+ });
36
+
37
+ it('social contributions are zero (included in brackets)', () => {
38
+ const service = new NetherlandsIncomeTaxServiceImpl(50000, netherlandsRules);
39
+ const result = service.calculateNetIncome();
40
+ expect(result.socialContributions).toBe(0);
41
+ });
42
+
43
+ it('net income equals gross income minus income tax', () => {
44
+ const service = new NetherlandsIncomeTaxServiceImpl(50000, netherlandsRules);
45
+ const result = service.calculateNetIncome();
46
+ expect(result.netIncome).toBeCloseTo(result.grossIncome - result.totalDeductions, 2);
47
+ });
48
+
49
+ it('effective tax rate calculation is correct', () => {
50
+ const service = new NetherlandsIncomeTaxServiceImpl(50000, netherlandsRules);
51
+ const result = service.calculateNetIncome();
52
+ expect(result.effectiveTaxRate).toBeCloseTo(result.incomeTax / result.grossIncome, 4);
53
+ });
54
+ });
@@ -0,0 +1,79 @@
1
+ import { NetherlandsInheritanceTaxServiceImpl } from '../src/inheritance-tax/netherlands/NetherlandsInheritanceTaxServiceImpl';
2
+ import { Input, Rules } from '../src/inheritance-tax/netherlands/domain/types';
3
+
4
+ const netherlandsRules: Rules = {
5
+ taxClasses: {
6
+ Partner: {
7
+ exemption: 795156,
8
+ brackets: [
9
+ { from: 0, to: 138642, rate: 0.10 },
10
+ { from: 138642, to: null, rate: 0.20 },
11
+ ],
12
+ },
13
+ Child: {
14
+ exemption: 25187,
15
+ brackets: [
16
+ { from: 0, to: 138642, rate: 0.10 },
17
+ { from: 138642, to: null, rate: 0.20 },
18
+ ],
19
+ },
20
+ Other: {
21
+ exemption: 2658,
22
+ brackets: [
23
+ { from: 0, to: 138642, rate: 0.30 },
24
+ { from: 138642, to: null, rate: 0.40 },
25
+ ],
26
+ },
27
+ },
28
+ };
29
+
30
+ describe('NetherlandsInheritanceTaxServiceImpl', () => {
31
+ it('returns zero tax for Partner estate below exemption', () => {
32
+ const input: Input = { estateValue: 500000, taxClass: 'Partner' };
33
+ const service = new NetherlandsInheritanceTaxServiceImpl(input, netherlandsRules);
34
+ const result = service.calculate();
35
+ expect(result.inheritanceTax).toBe(0);
36
+ expect(result.taxableEstate).toBe(0);
37
+ });
38
+
39
+ it('correctly calculates Partner tax for estate above exemption', () => {
40
+ const input: Input = { estateValue: 933798, taxClass: 'Partner' }; // 138642 above exemption
41
+ const service = new NetherlandsInheritanceTaxServiceImpl(input, netherlandsRules);
42
+ const result = service.calculate();
43
+ // 138642 * 0.10 = 13864.2
44
+ expect(result.taxableEstate).toBe(138642);
45
+ expect(result.inheritanceTax).toBeCloseTo(13864.2, 2);
46
+ });
47
+
48
+ it('correctly calculates Child tax with lower exemption', () => {
49
+ const input: Input = { estateValue: 125187, taxClass: 'Child' }; // 100000 above exemption
50
+ const service = new NetherlandsInheritanceTaxServiceImpl(input, netherlandsRules);
51
+ const result = service.calculate();
52
+ // 100000 * 0.10 = 10000
53
+ expect(result.taxableEstate).toBe(100000);
54
+ expect(result.inheritanceTax).toBe(10000);
55
+ });
56
+
57
+ it('correctly calculates Other class with higher rates', () => {
58
+ const input: Input = { estateValue: 102658, taxClass: 'Other' }; // 100000 above exemption
59
+ const service = new NetherlandsInheritanceTaxServiceImpl(input, netherlandsRules);
60
+ const result = service.calculate();
61
+ // 100000 * 0.30 = 30000
62
+ expect(result.taxableEstate).toBe(100000);
63
+ expect(result.inheritanceTax).toBe(30000);
64
+ });
65
+
66
+ it('returns zero for zero estate', () => {
67
+ const input: Input = { estateValue: 0, taxClass: 'Child' };
68
+ const service = new NetherlandsInheritanceTaxServiceImpl(input, netherlandsRules);
69
+ const result = service.calculate();
70
+ expect(result.inheritanceTax).toBe(0);
71
+ });
72
+
73
+ it('calculates effective rate correctly', () => {
74
+ const input: Input = { estateValue: 1000000, taxClass: 'Child' };
75
+ const service = new NetherlandsInheritanceTaxServiceImpl(input, netherlandsRules);
76
+ const result = service.calculate();
77
+ expect(result.effectiveRate).toBe((result.inheritanceTax / 1000000) * 100);
78
+ });
79
+ });
@@ -0,0 +1,79 @@
1
+ import { NetherlandsMortgageServiceImpl } from '../src/mortgage/netherlands/NetherlandsMortgageServiceImpl';
2
+ import { MortgageInput, MortgageRules } from '../src/mortgage/netherlands/domain/types';
3
+
4
+ const netherlandsRules: MortgageRules = {
5
+ loanConstraints: { maxLtvPercent: 1.0, maxAmortizationYears: 30 },
6
+ interest: { compounding: 'MONTHLY' },
7
+ transferTax: { primaryResidenceRate: 0.02, otherRate: 0.104 },
8
+ notaryFeeRate: 0.004,
9
+ landRegistryFeeRate: 0.001,
10
+ };
11
+
12
+ const input: MortgageInput = {
13
+ propertyPrice: 400000,
14
+ downPayment: 40000,
15
+ annualInterestRate: 3.0,
16
+ amortizationYears: 30,
17
+ isPrimaryResidence: true,
18
+ };
19
+
20
+ describe('NetherlandsMortgageServiceImpl', () => {
21
+ it('correctly calculates the loan amount', () => {
22
+ const service = new NetherlandsMortgageServiceImpl();
23
+ const result = service.calculate(input, netherlandsRules);
24
+ expect(result.loanAmount).toBe(360000);
25
+ });
26
+
27
+ it('correctly calculates transfer tax for primary residence', () => {
28
+ const service = new NetherlandsMortgageServiceImpl();
29
+ const result = service.calculate(input, netherlandsRules);
30
+ // 400000 * 0.02 = 8000
31
+ expect(result.transferTax).toBeCloseTo(8000, 2);
32
+ });
33
+
34
+ it('correctly calculates transfer tax for non-primary residence', () => {
35
+ const service = new NetherlandsMortgageServiceImpl();
36
+ const nonPrimaryInput: MortgageInput = { ...input, isPrimaryResidence: false };
37
+ const result = service.calculate(nonPrimaryInput, netherlandsRules);
38
+ // 400000 * 0.104 = 41600
39
+ expect(result.transferTax).toBeCloseTo(41600, 2);
40
+ });
41
+
42
+ it('correctly calculates notary fees', () => {
43
+ const service = new NetherlandsMortgageServiceImpl();
44
+ const result = service.calculate(input, netherlandsRules);
45
+ // 400000 * 0.004 = 1600
46
+ expect(result.notaryFees).toBeCloseTo(1600, 2);
47
+ });
48
+
49
+ it('correctly calculates land registry fee', () => {
50
+ const service = new NetherlandsMortgageServiceImpl();
51
+ const result = service.calculate(input, netherlandsRules);
52
+ // 400000 * 0.001 = 400
53
+ expect(result.landRegistryFee).toBeCloseTo(400, 2);
54
+ });
55
+
56
+ it('calculates a positive monthly payment', () => {
57
+ const service = new NetherlandsMortgageServiceImpl();
58
+ const result = service.calculate(input, netherlandsRules);
59
+ expect(result.monthlyPayment).toBeGreaterThan(0);
60
+ });
61
+
62
+ it('total paid is greater than the loan amount', () => {
63
+ const service = new NetherlandsMortgageServiceImpl();
64
+ const result = service.calculate(input, netherlandsRules);
65
+ expect(result.totalPaid).toBeGreaterThan(result.loanAmount);
66
+ });
67
+
68
+ it('amortization schedule has the correct number of years', () => {
69
+ const service = new NetherlandsMortgageServiceImpl();
70
+ const result = service.calculate(input, netherlandsRules);
71
+ expect(result.amortizationSchedule).toHaveLength(30);
72
+ });
73
+
74
+ it('throws an error when down payment equals or exceeds property price', () => {
75
+ const service = new NetherlandsMortgageServiceImpl();
76
+ const badInput: MortgageInput = { ...input, downPayment: 400000 };
77
+ expect(() => service.calculate(badInput, netherlandsRules)).toThrow();
78
+ });
79
+ });