@novha/calc-engines 6.3.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 (391) 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/canada/CanadaCapitalGainsServiceImpl.js +29 -17
  6. package/dist/capital-gains/index.js +17 -2
  7. package/dist/capital-gains/india/IndiaCapitalGainsService.js +3 -0
  8. package/dist/capital-gains/india/IndiaCapitalGainsServiceImpl.js +58 -0
  9. package/dist/capital-gains/india/domain/types.js +3 -0
  10. package/dist/capital-gains/israel/IsraelCapitalGainsService.js +3 -0
  11. package/dist/capital-gains/israel/IsraelCapitalGainsServiceImpl.js +56 -0
  12. package/dist/capital-gains/israel/domain/types.js +3 -0
  13. package/dist/capital-gains/japan/JapanCapitalGainsService.js +3 -0
  14. package/dist/capital-gains/japan/JapanCapitalGainsServiceImpl.js +41 -0
  15. package/dist/capital-gains/japan/domain/types.js +3 -0
  16. package/dist/capital-gains/spain/SpainCapitalGainsService.js +3 -0
  17. package/dist/capital-gains/spain/SpainCapitalGainsServiceImpl.js +56 -0
  18. package/dist/capital-gains/spain/domain/types.js +3 -0
  19. package/dist/corporate/brazil/BrazilCorporateTaxService.js +3 -0
  20. package/dist/corporate/brazil/BrazilCorporateTaxServiceImpl.js +33 -0
  21. package/dist/corporate/brazil/domain/types.js +3 -0
  22. package/dist/corporate/index.js +19 -2
  23. package/dist/corporate/india/IndiaCorporateTaxService.js +3 -0
  24. package/dist/corporate/india/IndiaCorporateTaxServiceImpl.js +29 -0
  25. package/dist/corporate/india/domain/types.js +3 -0
  26. package/dist/corporate/israel/IsraelCorporateTaxService.js +3 -0
  27. package/dist/corporate/israel/IsraelCorporateTaxServiceImpl.js +29 -0
  28. package/dist/corporate/israel/domain/types.js +3 -0
  29. package/dist/corporate/japan/JapanCorporateTaxService.js +3 -0
  30. package/dist/corporate/japan/JapanCorporateTaxServiceImpl.js +29 -0
  31. package/dist/corporate/japan/domain/types.js +3 -0
  32. package/dist/corporate/netherlands/NetherlandsCorporateTaxService.js +3 -0
  33. package/dist/corporate/netherlands/NetherlandsCorporateTaxServiceImpl.js +40 -0
  34. package/dist/corporate/netherlands/domain/types.js +3 -0
  35. package/dist/corporate/spain/SpainCorporateTaxService.js +3 -0
  36. package/dist/corporate/spain/SpainCorporateTaxServiceImpl.js +29 -0
  37. package/dist/corporate/spain/domain/types.js +3 -0
  38. package/dist/corporate/switzerland/SwitzerlandCorporateTaxService.js +3 -0
  39. package/dist/corporate/switzerland/SwitzerlandCorporateTaxServiceImpl.js +29 -0
  40. package/dist/corporate/switzerland/domain/types.js +3 -0
  41. package/dist/income-tax/brazil/BrazilIncomeTaxService.js +3 -0
  42. package/dist/income-tax/brazil/BrazilIncomeTaxServiceImpl.js +78 -0
  43. package/dist/income-tax/brazil/domain/types.js +3 -0
  44. package/dist/income-tax/index.js +23 -2
  45. package/dist/income-tax/india/IndiaIncomeTaxService.js +3 -0
  46. package/dist/income-tax/india/IndiaIncomeTaxServiceImpl.js +75 -0
  47. package/dist/income-tax/india/domain/types.js +3 -0
  48. package/dist/income-tax/israel/IsraelIncomeTaxService.js +3 -0
  49. package/dist/income-tax/israel/IsraelIncomeTaxServiceImpl.js +62 -0
  50. package/dist/income-tax/israel/domain/types.js +3 -0
  51. package/dist/income-tax/japan/JapanIncomeTaxService.js +3 -0
  52. package/dist/income-tax/japan/JapanIncomeTaxServiceImpl.js +75 -0
  53. package/dist/income-tax/japan/domain/types.js +3 -0
  54. package/dist/income-tax/netherlands/NetherlandsIncomeTaxService.js +3 -0
  55. package/dist/income-tax/netherlands/NetherlandsIncomeTaxServiceImpl.js +62 -0
  56. package/dist/income-tax/netherlands/domain/types.js +3 -0
  57. package/dist/income-tax/spain/SpainIncomeTaxService.js +3 -0
  58. package/dist/income-tax/spain/SpainIncomeTaxServiceImpl.js +62 -0
  59. package/dist/income-tax/spain/domain/types.js +3 -0
  60. package/dist/income-tax/switzerland/SwitzerlandIncomeTaxService.js +3 -0
  61. package/dist/income-tax/switzerland/SwitzerlandIncomeTaxServiceImpl.js +62 -0
  62. package/dist/income-tax/switzerland/domain/types.js +3 -0
  63. package/dist/index.js +3 -2
  64. package/dist/inheritance-tax/australia/AustraliaInheritanceTaxService.js +3 -0
  65. package/dist/inheritance-tax/australia/AustraliaInheritanceTaxServiceImpl.js +19 -0
  66. package/dist/inheritance-tax/australia/domain/types.js +3 -0
  67. package/dist/inheritance-tax/canada/CanadaInheritanceTaxService.js +3 -0
  68. package/dist/inheritance-tax/canada/CanadaInheritanceTaxServiceImpl.js +51 -0
  69. package/dist/inheritance-tax/canada/domain/types.js +3 -0
  70. package/dist/inheritance-tax/domain/types.js +3 -0
  71. package/dist/inheritance-tax/france/FranceInheritanceTaxService.js +3 -0
  72. package/dist/inheritance-tax/france/FranceInheritanceTaxServiceImpl.js +52 -0
  73. package/dist/inheritance-tax/france/domain/types.js +3 -0
  74. package/dist/inheritance-tax/germany/GermanyInheritanceTaxService.js +3 -0
  75. package/dist/inheritance-tax/germany/GermanyInheritanceTaxServiceImpl.js +52 -0
  76. package/dist/inheritance-tax/germany/domain/types.js +3 -0
  77. package/dist/inheritance-tax/index.js +34 -0
  78. package/dist/inheritance-tax/japan/JapanInheritanceTaxService.js +3 -0
  79. package/dist/inheritance-tax/japan/JapanInheritanceTaxServiceImpl.js +53 -0
  80. package/dist/inheritance-tax/japan/domain/types.js +3 -0
  81. package/dist/inheritance-tax/netherlands/NetherlandsInheritanceTaxService.js +3 -0
  82. package/dist/inheritance-tax/netherlands/NetherlandsInheritanceTaxServiceImpl.js +52 -0
  83. package/dist/inheritance-tax/netherlands/domain/types.js +3 -0
  84. package/dist/inheritance-tax/south-africa/SouthAfricaInheritanceTaxService.js +3 -0
  85. package/dist/inheritance-tax/south-africa/SouthAfricaInheritanceTaxServiceImpl.js +52 -0
  86. package/dist/inheritance-tax/south-africa/domain/types.js +3 -0
  87. package/dist/inheritance-tax/spain/SpainInheritanceTaxService.js +3 -0
  88. package/dist/inheritance-tax/spain/SpainInheritanceTaxServiceImpl.js +51 -0
  89. package/dist/inheritance-tax/spain/domain/types.js +3 -0
  90. package/dist/inheritance-tax/uk/UKInheritanceTaxService.js +3 -0
  91. package/dist/inheritance-tax/uk/UKInheritanceTaxServiceImpl.js +39 -0
  92. package/dist/inheritance-tax/uk/domain/types.js +3 -0
  93. package/dist/inheritance-tax/usa/USAInheritanceTaxService.js +3 -0
  94. package/dist/inheritance-tax/usa/USAInheritanceTaxServiceImpl.js +51 -0
  95. package/dist/inheritance-tax/usa/domain/types.js +3 -0
  96. package/dist/mortgage/brazil/BrazilMortgageService.js +3 -0
  97. package/dist/mortgage/brazil/BrazilMortgageServiceImpl.js +76 -0
  98. package/dist/mortgage/brazil/domain/types.js +3 -0
  99. package/dist/mortgage/index.js +23 -2
  100. package/dist/mortgage/india/IndiaMortgageService.js +3 -0
  101. package/dist/mortgage/india/IndiaMortgageServiceImpl.js +76 -0
  102. package/dist/mortgage/india/domain/types.js +3 -0
  103. package/dist/mortgage/israel/IsraelMortgageService.js +3 -0
  104. package/dist/mortgage/israel/IsraelMortgageServiceImpl.js +100 -0
  105. package/dist/mortgage/israel/domain/types.js +3 -0
  106. package/dist/mortgage/japan/JapanMortgageService.js +3 -0
  107. package/dist/mortgage/japan/JapanMortgageServiceImpl.js +76 -0
  108. package/dist/mortgage/japan/domain/types.js +3 -0
  109. package/dist/mortgage/netherlands/NetherlandsMortgageService.js +3 -0
  110. package/dist/mortgage/netherlands/NetherlandsMortgageServiceImpl.js +83 -0
  111. package/dist/mortgage/netherlands/domain/types.js +3 -0
  112. package/dist/mortgage/spain/SpainMortgageService.js +3 -0
  113. package/dist/mortgage/spain/SpainMortgageServiceImpl.js +96 -0
  114. package/dist/mortgage/spain/domain/types.js +3 -0
  115. package/dist/mortgage/switzerland/SwitzerlandMortgageService.js +3 -0
  116. package/dist/mortgage/switzerland/SwitzerlandMortgageServiceImpl.js +80 -0
  117. package/dist/mortgage/switzerland/domain/types.js +3 -0
  118. package/dist/shared/domain/types.js +2 -1
  119. package/dist/types/capital-gains/brazil/BrazilCapitalGainsService.d.ts +4 -0
  120. package/dist/types/capital-gains/brazil/BrazilCapitalGainsServiceImpl.d.ts +10 -0
  121. package/dist/types/capital-gains/brazil/domain/types.d.ts +11 -0
  122. package/dist/types/capital-gains/canada/CanadaCapitalGainsServiceImpl.d.ts +1 -1
  123. package/dist/types/capital-gains/index.d.ts +11 -1
  124. package/dist/types/capital-gains/india/IndiaCapitalGainsService.d.ts +4 -0
  125. package/dist/types/capital-gains/india/IndiaCapitalGainsServiceImpl.d.ts +9 -0
  126. package/dist/types/capital-gains/india/domain/types.d.ts +9 -0
  127. package/dist/types/capital-gains/israel/IsraelCapitalGainsService.d.ts +4 -0
  128. package/dist/types/capital-gains/israel/IsraelCapitalGainsServiceImpl.d.ts +10 -0
  129. package/dist/types/capital-gains/israel/domain/types.d.ts +11 -0
  130. package/dist/types/capital-gains/japan/JapanCapitalGainsService.d.ts +4 -0
  131. package/dist/types/capital-gains/japan/JapanCapitalGainsServiceImpl.d.ts +9 -0
  132. package/dist/types/capital-gains/japan/domain/types.d.ts +6 -0
  133. package/dist/types/capital-gains/spain/SpainCapitalGainsService.d.ts +4 -0
  134. package/dist/types/capital-gains/spain/SpainCapitalGainsServiceImpl.d.ts +10 -0
  135. package/dist/types/capital-gains/spain/domain/types.d.ts +11 -0
  136. package/dist/types/corporate/brazil/BrazilCorporateTaxService.d.ts +4 -0
  137. package/dist/types/corporate/brazil/BrazilCorporateTaxServiceImpl.d.ts +8 -0
  138. package/dist/types/corporate/brazil/domain/types.d.ts +19 -0
  139. package/dist/types/corporate/index.d.ts +15 -1
  140. package/dist/types/corporate/india/IndiaCorporateTaxService.d.ts +4 -0
  141. package/dist/types/corporate/india/IndiaCorporateTaxServiceImpl.d.ts +8 -0
  142. package/dist/types/corporate/india/domain/types.d.ts +15 -0
  143. package/dist/types/corporate/israel/IsraelCorporateTaxService.d.ts +4 -0
  144. package/dist/types/corporate/israel/IsraelCorporateTaxServiceImpl.d.ts +8 -0
  145. package/dist/types/corporate/israel/domain/types.d.ts +15 -0
  146. package/dist/types/corporate/japan/JapanCorporateTaxService.d.ts +4 -0
  147. package/dist/types/corporate/japan/JapanCorporateTaxServiceImpl.d.ts +8 -0
  148. package/dist/types/corporate/japan/domain/types.d.ts +15 -0
  149. package/dist/types/corporate/netherlands/NetherlandsCorporateTaxService.d.ts +4 -0
  150. package/dist/types/corporate/netherlands/NetherlandsCorporateTaxServiceImpl.d.ts +8 -0
  151. package/dist/types/corporate/netherlands/domain/types.d.ts +17 -0
  152. package/dist/types/corporate/spain/SpainCorporateTaxService.d.ts +4 -0
  153. package/dist/types/corporate/spain/SpainCorporateTaxServiceImpl.d.ts +8 -0
  154. package/dist/types/corporate/spain/domain/types.d.ts +15 -0
  155. package/dist/types/corporate/switzerland/SwitzerlandCorporateTaxService.d.ts +4 -0
  156. package/dist/types/corporate/switzerland/SwitzerlandCorporateTaxServiceImpl.d.ts +8 -0
  157. package/dist/types/corporate/switzerland/domain/types.d.ts +15 -0
  158. package/dist/types/income-tax/brazil/BrazilIncomeTaxService.d.ts +4 -0
  159. package/dist/types/income-tax/brazil/BrazilIncomeTaxServiceImpl.d.ts +11 -0
  160. package/dist/types/income-tax/brazil/domain/types.d.ts +18 -0
  161. package/dist/types/income-tax/index.d.ts +15 -1
  162. package/dist/types/income-tax/india/IndiaIncomeTaxService.d.ts +4 -0
  163. package/dist/types/income-tax/india/IndiaIncomeTaxServiceImpl.d.ts +10 -0
  164. package/dist/types/income-tax/india/domain/types.d.ts +16 -0
  165. package/dist/types/income-tax/israel/IsraelIncomeTaxService.d.ts +4 -0
  166. package/dist/types/income-tax/israel/IsraelIncomeTaxServiceImpl.d.ts +10 -0
  167. package/dist/types/income-tax/israel/domain/types.d.ts +16 -0
  168. package/dist/types/income-tax/japan/JapanIncomeTaxService.d.ts +4 -0
  169. package/dist/types/income-tax/japan/JapanIncomeTaxServiceImpl.d.ts +10 -0
  170. package/dist/types/income-tax/japan/domain/types.d.ts +16 -0
  171. package/dist/types/income-tax/netherlands/NetherlandsIncomeTaxService.d.ts +4 -0
  172. package/dist/types/income-tax/netherlands/NetherlandsIncomeTaxServiceImpl.d.ts +10 -0
  173. package/dist/types/income-tax/netherlands/domain/types.d.ts +16 -0
  174. package/dist/types/income-tax/spain/SpainIncomeTaxService.d.ts +4 -0
  175. package/dist/types/income-tax/spain/SpainIncomeTaxServiceImpl.d.ts +10 -0
  176. package/dist/types/income-tax/spain/domain/types.d.ts +16 -0
  177. package/dist/types/income-tax/switzerland/SwitzerlandIncomeTaxService.d.ts +4 -0
  178. package/dist/types/income-tax/switzerland/SwitzerlandIncomeTaxServiceImpl.d.ts +10 -0
  179. package/dist/types/income-tax/switzerland/domain/types.d.ts +16 -0
  180. package/dist/types/index.d.ts +1 -0
  181. package/dist/types/inheritance-tax/australia/AustraliaInheritanceTaxService.d.ts +4 -0
  182. package/dist/types/inheritance-tax/australia/AustraliaInheritanceTaxServiceImpl.d.ts +8 -0
  183. package/dist/types/inheritance-tax/australia/domain/types.d.ts +13 -0
  184. package/dist/types/inheritance-tax/canada/CanadaInheritanceTaxService.d.ts +4 -0
  185. package/dist/types/inheritance-tax/canada/CanadaInheritanceTaxServiceImpl.d.ts +9 -0
  186. package/dist/types/inheritance-tax/canada/domain/types.d.ts +20 -0
  187. package/dist/types/inheritance-tax/domain/types.d.ts +17 -0
  188. package/dist/types/inheritance-tax/france/FranceInheritanceTaxService.d.ts +4 -0
  189. package/dist/types/inheritance-tax/france/FranceInheritanceTaxServiceImpl.d.ts +9 -0
  190. package/dist/types/inheritance-tax/france/domain/types.d.ts +29 -0
  191. package/dist/types/inheritance-tax/germany/GermanyInheritanceTaxService.d.ts +4 -0
  192. package/dist/types/inheritance-tax/germany/GermanyInheritanceTaxServiceImpl.d.ts +9 -0
  193. package/dist/types/inheritance-tax/germany/domain/types.d.ts +28 -0
  194. package/dist/types/inheritance-tax/index.d.ts +21 -0
  195. package/dist/types/inheritance-tax/japan/JapanInheritanceTaxService.d.ts +4 -0
  196. package/dist/types/inheritance-tax/japan/JapanInheritanceTaxServiceImpl.d.ts +9 -0
  197. package/dist/types/inheritance-tax/japan/domain/types.d.ts +21 -0
  198. package/dist/types/inheritance-tax/netherlands/NetherlandsInheritanceTaxService.d.ts +4 -0
  199. package/dist/types/inheritance-tax/netherlands/NetherlandsInheritanceTaxServiceImpl.d.ts +9 -0
  200. package/dist/types/inheritance-tax/netherlands/domain/types.d.ts +28 -0
  201. package/dist/types/inheritance-tax/south-africa/SouthAfricaInheritanceTaxService.d.ts +4 -0
  202. package/dist/types/inheritance-tax/south-africa/SouthAfricaInheritanceTaxServiceImpl.d.ts +9 -0
  203. package/dist/types/inheritance-tax/south-africa/domain/types.d.ts +20 -0
  204. package/dist/types/inheritance-tax/spain/SpainInheritanceTaxService.d.ts +4 -0
  205. package/dist/types/inheritance-tax/spain/SpainInheritanceTaxServiceImpl.d.ts +9 -0
  206. package/dist/types/inheritance-tax/spain/domain/types.d.ts +19 -0
  207. package/dist/types/inheritance-tax/uk/UKInheritanceTaxService.d.ts +4 -0
  208. package/dist/types/inheritance-tax/uk/UKInheritanceTaxServiceImpl.d.ts +8 -0
  209. package/dist/types/inheritance-tax/uk/domain/types.d.ts +17 -0
  210. package/dist/types/inheritance-tax/usa/USAInheritanceTaxService.d.ts +4 -0
  211. package/dist/types/inheritance-tax/usa/USAInheritanceTaxServiceImpl.d.ts +9 -0
  212. package/dist/types/inheritance-tax/usa/domain/types.d.ts +19 -0
  213. package/dist/types/mortgage/brazil/BrazilMortgageService.d.ts +4 -0
  214. package/dist/types/mortgage/brazil/BrazilMortgageServiceImpl.d.ts +7 -0
  215. package/dist/types/mortgage/brazil/domain/types.d.ts +39 -0
  216. package/dist/types/mortgage/index.d.ts +15 -1
  217. package/dist/types/mortgage/india/IndiaMortgageService.d.ts +4 -0
  218. package/dist/types/mortgage/india/IndiaMortgageServiceImpl.d.ts +7 -0
  219. package/dist/types/mortgage/india/domain/types.d.ts +39 -0
  220. package/dist/types/mortgage/israel/IsraelMortgageService.d.ts +4 -0
  221. package/dist/types/mortgage/israel/IsraelMortgageServiceImpl.d.ts +8 -0
  222. package/dist/types/mortgage/israel/domain/types.d.ts +43 -0
  223. package/dist/types/mortgage/japan/JapanMortgageService.d.ts +4 -0
  224. package/dist/types/mortgage/japan/JapanMortgageServiceImpl.d.ts +7 -0
  225. package/dist/types/mortgage/japan/domain/types.d.ts +39 -0
  226. package/dist/types/mortgage/netherlands/NetherlandsMortgageService.d.ts +4 -0
  227. package/dist/types/mortgage/netherlands/NetherlandsMortgageServiceImpl.d.ts +7 -0
  228. package/dist/types/mortgage/netherlands/domain/types.d.ts +41 -0
  229. package/dist/types/mortgage/spain/SpainMortgageService.d.ts +4 -0
  230. package/dist/types/mortgage/spain/SpainMortgageServiceImpl.d.ts +8 -0
  231. package/dist/types/mortgage/spain/domain/types.d.ts +44 -0
  232. package/dist/types/mortgage/switzerland/SwitzerlandMortgageService.d.ts +4 -0
  233. package/dist/types/mortgage/switzerland/SwitzerlandMortgageServiceImpl.d.ts +7 -0
  234. package/dist/types/mortgage/switzerland/domain/types.d.ts +37 -0
  235. package/dist/types/shared/domain/types.d.ts +2 -1
  236. package/package.json +1 -1
  237. package/src/capital-gains/brazil/BrazilCapitalGainsService.ts +5 -0
  238. package/src/capital-gains/brazil/BrazilCapitalGainsServiceImpl.ts +69 -0
  239. package/src/capital-gains/brazil/domain/types.ts +15 -0
  240. package/src/capital-gains/canada/CanadaCapitalGainsServiceImpl.ts +34 -21
  241. package/src/capital-gains/index.ts +50 -0
  242. package/src/capital-gains/india/IndiaCapitalGainsService.ts +5 -0
  243. package/src/capital-gains/india/IndiaCapitalGainsServiceImpl.ts +64 -0
  244. package/src/capital-gains/india/domain/types.ts +12 -0
  245. package/src/capital-gains/israel/IsraelCapitalGainsService.ts +5 -0
  246. package/src/capital-gains/israel/IsraelCapitalGainsServiceImpl.ts +69 -0
  247. package/src/capital-gains/israel/domain/types.ts +15 -0
  248. package/src/capital-gains/japan/JapanCapitalGainsService.ts +5 -0
  249. package/src/capital-gains/japan/JapanCapitalGainsServiceImpl.ts +47 -0
  250. package/src/capital-gains/japan/domain/types.ts +9 -0
  251. package/src/capital-gains/spain/SpainCapitalGainsService.ts +5 -0
  252. package/src/capital-gains/spain/SpainCapitalGainsServiceImpl.ts +69 -0
  253. package/src/capital-gains/spain/domain/types.ts +15 -0
  254. package/src/corporate/brazil/BrazilCorporateTaxService.ts +5 -0
  255. package/src/corporate/brazil/BrazilCorporateTaxServiceImpl.ts +40 -0
  256. package/src/corporate/brazil/domain/types.ts +16 -0
  257. package/src/corporate/index.ts +81 -1
  258. package/src/corporate/india/IndiaCorporateTaxService.ts +5 -0
  259. package/src/corporate/india/IndiaCorporateTaxServiceImpl.ts +35 -0
  260. package/src/corporate/india/domain/types.ts +15 -0
  261. package/src/corporate/israel/IsraelCorporateTaxService.ts +5 -0
  262. package/src/corporate/israel/IsraelCorporateTaxServiceImpl.ts +35 -0
  263. package/src/corporate/israel/domain/types.ts +15 -0
  264. package/src/corporate/japan/JapanCorporateTaxService.ts +5 -0
  265. package/src/corporate/japan/JapanCorporateTaxServiceImpl.ts +35 -0
  266. package/src/corporate/japan/domain/types.ts +15 -0
  267. package/src/corporate/netherlands/NetherlandsCorporateTaxService.ts +5 -0
  268. package/src/corporate/netherlands/NetherlandsCorporateTaxServiceImpl.ts +48 -0
  269. package/src/corporate/netherlands/domain/types.ts +21 -0
  270. package/src/corporate/spain/SpainCorporateTaxService.ts +5 -0
  271. package/src/corporate/spain/SpainCorporateTaxServiceImpl.ts +35 -0
  272. package/src/corporate/spain/domain/types.ts +15 -0
  273. package/src/corporate/switzerland/SwitzerlandCorporateTaxService.ts +5 -0
  274. package/src/corporate/switzerland/SwitzerlandCorporateTaxServiceImpl.ts +35 -0
  275. package/src/corporate/switzerland/domain/types.ts +15 -0
  276. package/src/income-tax/brazil/BrazilIncomeTaxService.ts +5 -0
  277. package/src/income-tax/brazil/BrazilIncomeTaxServiceImpl.ts +91 -0
  278. package/src/income-tax/brazil/domain/types.ts +21 -0
  279. package/src/income-tax/index.ts +70 -0
  280. package/src/income-tax/india/IndiaIncomeTaxService.ts +5 -0
  281. package/src/income-tax/india/IndiaIncomeTaxServiceImpl.ts +87 -0
  282. package/src/income-tax/india/domain/types.ts +16 -0
  283. package/src/income-tax/israel/IsraelIncomeTaxService.ts +5 -0
  284. package/src/income-tax/israel/IsraelIncomeTaxServiceImpl.ts +75 -0
  285. package/src/income-tax/israel/domain/types.ts +16 -0
  286. package/src/income-tax/japan/JapanIncomeTaxService.ts +5 -0
  287. package/src/income-tax/japan/JapanIncomeTaxServiceImpl.ts +87 -0
  288. package/src/income-tax/japan/domain/types.ts +16 -0
  289. package/src/income-tax/netherlands/NetherlandsIncomeTaxService.ts +5 -0
  290. package/src/income-tax/netherlands/NetherlandsIncomeTaxServiceImpl.ts +75 -0
  291. package/src/income-tax/netherlands/domain/types.ts +16 -0
  292. package/src/income-tax/spain/SpainIncomeTaxService.ts +5 -0
  293. package/src/income-tax/spain/SpainIncomeTaxServiceImpl.ts +75 -0
  294. package/src/income-tax/spain/domain/types.ts +16 -0
  295. package/src/income-tax/switzerland/SwitzerlandIncomeTaxService.ts +5 -0
  296. package/src/income-tax/switzerland/SwitzerlandIncomeTaxServiceImpl.ts +75 -0
  297. package/src/income-tax/switzerland/domain/types.ts +16 -0
  298. package/src/index.ts +1 -0
  299. package/src/inheritance-tax/australia/AustraliaInheritanceTaxService.ts +5 -0
  300. package/src/inheritance-tax/australia/AustraliaInheritanceTaxServiceImpl.ts +21 -0
  301. package/src/inheritance-tax/australia/domain/types.ts +16 -0
  302. package/src/inheritance-tax/canada/CanadaInheritanceTaxService.ts +5 -0
  303. package/src/inheritance-tax/canada/CanadaInheritanceTaxServiceImpl.ts +65 -0
  304. package/src/inheritance-tax/canada/domain/types.ts +24 -0
  305. package/src/inheritance-tax/domain/types.ts +19 -0
  306. package/src/inheritance-tax/france/FranceInheritanceTaxService.ts +5 -0
  307. package/src/inheritance-tax/france/FranceInheritanceTaxServiceImpl.ts +66 -0
  308. package/src/inheritance-tax/france/domain/types.ts +35 -0
  309. package/src/inheritance-tax/germany/GermanyInheritanceTaxService.ts +5 -0
  310. package/src/inheritance-tax/germany/GermanyInheritanceTaxServiceImpl.ts +66 -0
  311. package/src/inheritance-tax/germany/domain/types.ts +34 -0
  312. package/src/inheritance-tax/index.ts +122 -0
  313. package/src/inheritance-tax/japan/JapanInheritanceTaxService.ts +5 -0
  314. package/src/inheritance-tax/japan/JapanInheritanceTaxServiceImpl.ts +67 -0
  315. package/src/inheritance-tax/japan/domain/types.ts +25 -0
  316. package/src/inheritance-tax/netherlands/NetherlandsInheritanceTaxService.ts +5 -0
  317. package/src/inheritance-tax/netherlands/NetherlandsInheritanceTaxServiceImpl.ts +66 -0
  318. package/src/inheritance-tax/netherlands/domain/types.ts +34 -0
  319. package/src/inheritance-tax/south-africa/SouthAfricaInheritanceTaxService.ts +5 -0
  320. package/src/inheritance-tax/south-africa/SouthAfricaInheritanceTaxServiceImpl.ts +66 -0
  321. package/src/inheritance-tax/south-africa/domain/types.ts +24 -0
  322. package/src/inheritance-tax/spain/SpainInheritanceTaxService.ts +5 -0
  323. package/src/inheritance-tax/spain/SpainInheritanceTaxServiceImpl.ts +65 -0
  324. package/src/inheritance-tax/spain/domain/types.ts +23 -0
  325. package/src/inheritance-tax/uk/UKInheritanceTaxService.ts +5 -0
  326. package/src/inheritance-tax/uk/UKInheritanceTaxServiceImpl.ts +46 -0
  327. package/src/inheritance-tax/uk/domain/types.ts +20 -0
  328. package/src/inheritance-tax/usa/USAInheritanceTaxService.ts +5 -0
  329. package/src/inheritance-tax/usa/USAInheritanceTaxServiceImpl.ts +65 -0
  330. package/src/inheritance-tax/usa/domain/types.ts +23 -0
  331. package/src/mortgage/brazil/BrazilMortgageService.ts +5 -0
  332. package/src/mortgage/brazil/BrazilMortgageServiceImpl.ts +101 -0
  333. package/src/mortgage/brazil/domain/types.ts +46 -0
  334. package/src/mortgage/index.ts +85 -1
  335. package/src/mortgage/india/IndiaMortgageService.ts +5 -0
  336. package/src/mortgage/india/IndiaMortgageServiceImpl.ts +101 -0
  337. package/src/mortgage/india/domain/types.ts +46 -0
  338. package/src/mortgage/israel/IsraelMortgageService.ts +5 -0
  339. package/src/mortgage/israel/IsraelMortgageServiceImpl.ts +132 -0
  340. package/src/mortgage/israel/domain/types.ts +41 -0
  341. package/src/mortgage/japan/JapanMortgageService.ts +5 -0
  342. package/src/mortgage/japan/JapanMortgageServiceImpl.ts +101 -0
  343. package/src/mortgage/japan/domain/types.ts +46 -0
  344. package/src/mortgage/netherlands/NetherlandsMortgageService.ts +5 -0
  345. package/src/mortgage/netherlands/NetherlandsMortgageServiceImpl.ts +109 -0
  346. package/src/mortgage/netherlands/domain/types.ts +37 -0
  347. package/src/mortgage/spain/SpainMortgageService.ts +5 -0
  348. package/src/mortgage/spain/SpainMortgageServiceImpl.ts +130 -0
  349. package/src/mortgage/spain/domain/types.ts +52 -0
  350. package/src/mortgage/switzerland/SwitzerlandMortgageService.ts +5 -0
  351. package/src/mortgage/switzerland/SwitzerlandMortgageServiceImpl.ts +106 -0
  352. package/src/mortgage/switzerland/domain/types.ts +36 -0
  353. package/src/shared/domain/types.ts +1 -0
  354. package/test/australia-inheritance-tax.test.ts +35 -0
  355. package/test/brazil-capital-gains.test.ts +65 -0
  356. package/test/brazil-corporate-tax.test.ts +63 -0
  357. package/test/brazil-income-tax.test.ts +85 -0
  358. package/test/brazil-mortgage.test.ts +70 -0
  359. package/test/canada-inheritance-tax.test.ts +62 -0
  360. package/test/france-inheritance-tax.test.ts +101 -0
  361. package/test/germany-inheritance-tax.test.ts +100 -0
  362. package/test/india-capital-gains.test.ts +71 -0
  363. package/test/india-corporate-tax.test.ts +54 -0
  364. package/test/india-income-tax.test.ts +78 -0
  365. package/test/india-mortgage.test.ts +70 -0
  366. package/test/israel-capital-gains.test.ts +45 -0
  367. package/test/israel-corporate-tax.test.ts +49 -0
  368. package/test/israel-income-tax.test.ts +76 -0
  369. package/test/israel-mortgage.test.ts +80 -0
  370. package/test/japan-capital-gains.test.ts +55 -0
  371. package/test/japan-corporate-tax.test.ts +54 -0
  372. package/test/japan-income-tax.test.ts +76 -0
  373. package/test/japan-inheritance-tax.test.ts +74 -0
  374. package/test/japan-mortgage.test.ts +69 -0
  375. package/test/netherlands-corporate-tax.test.ts +54 -0
  376. package/test/netherlands-income-tax.test.ts +54 -0
  377. package/test/netherlands-inheritance-tax.test.ts +79 -0
  378. package/test/netherlands-mortgage.test.ts +79 -0
  379. package/test/south-africa-inheritance-tax.test.ts +81 -0
  380. package/test/spain-capital-gains.test.ts +66 -0
  381. package/test/spain-corporate-tax.test.ts +54 -0
  382. package/test/spain-income-tax.test.ts +84 -0
  383. package/test/spain-inheritance-tax.test.ts +78 -0
  384. package/test/spain-mortgage.test.ts +70 -0
  385. package/test/switzerland-corporate-tax.test.ts +39 -0
  386. package/test/switzerland-income-tax.test.ts +66 -0
  387. package/test/switzerland-mortgage.test.ts +70 -0
  388. package/test/uk-inheritance-tax.test.ts +72 -0
  389. package/test/usa-inheritance-tax.test.ts +90 -0
  390. package/dist/domain/types.js +0 -10
  391. package/dist/types/domain/types.d.ts +0 -41
@@ -0,0 +1,65 @@
1
+ import { BrazilCapitalGainsServiceImpl } from '../src/capital-gains/brazil/BrazilCapitalGainsServiceImpl';
2
+ import { Input, Rules } from '../src/capital-gains/brazil/domain/types';
3
+
4
+ const brazilRules: Rules = {
5
+ brackets: [
6
+ { from: 0, to: 5000000, rate: 0.15 },
7
+ { from: 5000000, to: 10000000, rate: 0.175 },
8
+ { from: 10000000, to: 30000000, rate: 0.20 },
9
+ { from: 30000000, to: null, rate: 0.225 },
10
+ ],
11
+ };
12
+
13
+ describe('BrazilCapitalGainsServiceImpl', () => {
14
+ it('returns zero tax for zero gain', () => {
15
+ const input: Input = { capitalGain: 0 };
16
+ const service = new BrazilCapitalGainsServiceImpl(input, brazilRules);
17
+ const result = service.calculate();
18
+
19
+ expect(result.taxableGain).toBe(0);
20
+ expect(result.capitalGainTax).toBe(0);
21
+ expect(result.totalTax).toBe(0);
22
+ expect(result.effectiveRate).toBe(0);
23
+ expect(result.breakdowns).toHaveLength(0);
24
+ });
25
+
26
+ it('correctly calculates tax for gain in first bracket', () => {
27
+ const input: Input = { capitalGain: 1000000 };
28
+ const service = new BrazilCapitalGainsServiceImpl(input, brazilRules);
29
+ const result = service.calculate();
30
+
31
+ // 0-1000000: 1000000 * 0.15 = 150000
32
+ expect(result.capitalGainTax).toBe(150000);
33
+ expect(result.totalTax).toBe(150000);
34
+ expect(result.effectiveRate).toBeCloseTo(15, 2);
35
+ });
36
+
37
+ it('correctly calculates tax spanning multiple brackets', () => {
38
+ const input: Input = { capitalGain: 7000000 };
39
+ const service = new BrazilCapitalGainsServiceImpl(input, brazilRules);
40
+ const result = service.calculate();
41
+
42
+ // 0-5000000: 5000000 * 0.15 = 750000
43
+ // 5000000-7000000: 2000000 * 0.175 = 350000
44
+ // Total = 1100000
45
+ expect(result.capitalGainTax).toBeCloseTo(1100000, 2);
46
+ expect(result.totalTax).toBeCloseTo(1100000, 2);
47
+ expect(result.effectiveRate).toBeCloseTo((1100000 / 7000000) * 100, 2);
48
+ });
49
+
50
+ it('taxable gain equals input capital gain', () => {
51
+ const input: Input = { capitalGain: 3000000 };
52
+ const service = new BrazilCapitalGainsServiceImpl(input, brazilRules);
53
+ const result = service.calculate();
54
+
55
+ expect(result.taxableGain).toBe(3000000);
56
+ });
57
+
58
+ it('returns correct number of breakdown entries', () => {
59
+ const input: Input = { capitalGain: 7000000 };
60
+ const service = new BrazilCapitalGainsServiceImpl(input, brazilRules);
61
+ const result = service.calculate();
62
+
63
+ expect(result.breakdowns).toHaveLength(2);
64
+ });
65
+ });
@@ -0,0 +1,63 @@
1
+ import { BrazilCorporateTaxServiceImpl } from '../src/corporate/brazil/BrazilCorporateTaxServiceImpl';
2
+ import { Input, Rules } from '../src/corporate/brazil/domain/types';
3
+
4
+ const brazilRules: Rules = {
5
+ irpj: { baseRate: 0.15, surchargeRate: 0.10, surchargeThreshold: 240000 },
6
+ csll: { rate: 0.09 },
7
+ };
8
+
9
+ describe('BrazilCorporateTaxServiceImpl', () => {
10
+ it('returns zero tax for zero income', () => {
11
+ const input: Input = { taxableIncome: 0 };
12
+ const service = new BrazilCorporateTaxServiceImpl(input, brazilRules);
13
+ const result = service.calculate();
14
+
15
+ expect(result.corporateTax).toBe(0);
16
+ expect(result.effectiveTaxRate).toBe(0);
17
+ expect(result.breakdowns).toHaveLength(0);
18
+ });
19
+
20
+ it('correctly calculates tax for income below the surcharge threshold', () => {
21
+ const input: Input = { taxableIncome: 200000 };
22
+ const service = new BrazilCorporateTaxServiceImpl(input, brazilRules);
23
+ const result = service.calculate();
24
+
25
+ // IRPJ base: 200000 * 0.15 = 30000
26
+ // Surcharge: 0 (200000 <= 240000)
27
+ // CSLL: 200000 * 0.09 = 18000
28
+ // Total = 48000
29
+ expect(result.corporateTax).toBeCloseTo(48000, 2);
30
+ expect(result.effectiveTaxRate).toBeCloseTo(24, 2);
31
+ });
32
+
33
+ it('correctly calculates tax for income above the surcharge threshold', () => {
34
+ const input: Input = { taxableIncome: 400000 };
35
+ const service = new BrazilCorporateTaxServiceImpl(input, brazilRules);
36
+ const result = service.calculate();
37
+
38
+ // IRPJ base: 400000 * 0.15 = 60000
39
+ // Surcharge: (400000 - 240000) * 0.10 = 16000
40
+ // CSLL: 400000 * 0.09 = 36000
41
+ // Total = 112000
42
+ expect(result.corporateTax).toBeCloseTo(112000, 2);
43
+ expect(result.effectiveTaxRate).toBeCloseTo(28, 2);
44
+ });
45
+
46
+ it('returns three breakdown entries when surcharge applies', () => {
47
+ const input: Input = { taxableIncome: 400000 };
48
+ const service = new BrazilCorporateTaxServiceImpl(input, brazilRules);
49
+ const result = service.calculate();
50
+
51
+ expect(result.breakdowns).toHaveLength(3);
52
+ });
53
+
54
+ it('effective tax rate is higher when income exceeds surcharge threshold', () => {
55
+ const inputBelow: Input = { taxableIncome: 200000 };
56
+ const inputAbove: Input = { taxableIncome: 400000 };
57
+
58
+ const rateBelow = new BrazilCorporateTaxServiceImpl(inputBelow, brazilRules).calculate().effectiveTaxRate;
59
+ const rateAbove = new BrazilCorporateTaxServiceImpl(inputAbove, brazilRules).calculate().effectiveTaxRate;
60
+
61
+ expect(rateAbove).toBeGreaterThan(rateBelow);
62
+ });
63
+ });
@@ -0,0 +1,85 @@
1
+ import { BrazilIncomeTaxServiceImpl } from '../src/income-tax/brazil/BrazilIncomeTaxServiceImpl';
2
+ import { IncomeTaxRules } from '../src/income-tax/brazil/domain/types';
3
+
4
+ const brazilRules: IncomeTaxRules = {
5
+ taxBrackets: [
6
+ { from: 0, to: 27110.40, rate: 0 },
7
+ { from: 27110.40, to: 33919.80, rate: 0.075 },
8
+ { from: 33919.80, to: 45012.60, rate: 0.15 },
9
+ { from: 45012.60, to: 55976.16, rate: 0.225 },
10
+ { from: 55976.16, to: null, rate: 0.275 },
11
+ ],
12
+ inss: { rate: 0.11, cap: 87600 },
13
+ };
14
+
15
+ describe('BrazilIncomeTaxServiceImpl', () => {
16
+ it('returns zero tax for zero income', () => {
17
+ const service = new BrazilIncomeTaxServiceImpl(0, brazilRules);
18
+ const result = service.calculateNetIncome();
19
+
20
+ expect(result.incomeTax).toBe(0);
21
+ expect(result.inss).toBe(0);
22
+ expect(result.totalDeductions).toBe(0);
23
+ expect(result.effectiveTaxRate).toBe(0);
24
+ });
25
+
26
+ it('returns zero income tax for income in first bracket (below 27110.40)', () => {
27
+ const service = new BrazilIncomeTaxServiceImpl(20000, brazilRules);
28
+ const result = service.calculateNetIncome();
29
+
30
+ expect(result.incomeTax).toBe(0);
31
+ expect(result.grossIncome).toBe(20000);
32
+ // INSS = 20000 * 0.11 = 2200
33
+ expect(result.inss).toBeCloseTo(2200, 2);
34
+ expect(result.effectiveTaxRate).toBe(0);
35
+ });
36
+
37
+ it('correctly calculates income tax for income spanning multiple brackets', () => {
38
+ const service = new BrazilIncomeTaxServiceImpl(50000, brazilRules);
39
+ const result = service.calculateNetIncome();
40
+
41
+ // 0-27110.40: 0 tax
42
+ // 27110.40-33919.80: 6809.40 * 0.075 = 510.705
43
+ // 33919.80-45012.60: 11092.80 * 0.15 = 1663.92
44
+ // 45012.60-50000: 4987.40 * 0.225 = 1122.165
45
+ // Total ≈ 3296.79
46
+ expect(result.incomeTax).toBeCloseTo(3296.79, 1);
47
+ expect(result.grossIncome).toBe(50000);
48
+ });
49
+
50
+ it('correctly computes INSS and caps it at the cap amount', () => {
51
+ const service = new BrazilIncomeTaxServiceImpl(100000, brazilRules);
52
+ const result = service.calculateNetIncome();
53
+
54
+ // INSS is capped at 87600: 87600 * 0.11 = 9636
55
+ expect(result.inss).toBeCloseTo(9636, 2);
56
+ });
57
+
58
+ it('calculates effective tax rate as income tax divided by gross income', () => {
59
+ const service = new BrazilIncomeTaxServiceImpl(50000, brazilRules);
60
+ const result = service.calculateNetIncome();
61
+
62
+ expect(result.effectiveTaxRate).toBeCloseTo(result.incomeTax / result.grossIncome, 4);
63
+ });
64
+
65
+ it('net income equals gross income minus total deductions', () => {
66
+ const service = new BrazilIncomeTaxServiceImpl(50000, brazilRules);
67
+ const result = service.calculateNetIncome();
68
+
69
+ expect(result.netIncome).toBeCloseTo(result.grossIncome - result.totalDeductions, 2);
70
+ });
71
+
72
+ it('total deductions equals income tax plus INSS', () => {
73
+ const service = new BrazilIncomeTaxServiceImpl(50000, brazilRules);
74
+ const result = service.calculateNetIncome();
75
+
76
+ expect(result.totalDeductions).toBeCloseTo(result.incomeTax + result.inss, 2);
77
+ });
78
+
79
+ it('returns bracket breakdown entries for multi-bracket income', () => {
80
+ const service = new BrazilIncomeTaxServiceImpl(60000, brazilRules);
81
+ const result = service.calculateNetIncome();
82
+
83
+ expect(result.taxBracketBreakdown.length).toBeGreaterThan(0);
84
+ });
85
+ });
@@ -0,0 +1,70 @@
1
+ import { BrazilMortgageServiceImpl } from '../src/mortgage/brazil/BrazilMortgageServiceImpl';
2
+ import { MortgageInput, MortgageRules } from '../src/mortgage/brazil/domain/types';
3
+
4
+ const brazilRules: MortgageRules = {
5
+ loanConstraints: { maxLtvPercent: 0.80, maxAmortizationYears: 35 },
6
+ interest: { compounding: 'MONTHLY' },
7
+ itbi: { rate: 0.02 },
8
+ };
9
+
10
+ const input: MortgageInput = {
11
+ propertyPrice: 500000,
12
+ downPayment: 100000,
13
+ annualInterestRate: 10,
14
+ amortizationYears: 30,
15
+ isFirstTimeBuyer: false,
16
+ };
17
+
18
+ describe('BrazilMortgageServiceImpl', () => {
19
+ it('correctly calculates the loan amount', () => {
20
+ const service = new BrazilMortgageServiceImpl();
21
+ const result = service.calculate(input, brazilRules);
22
+
23
+ // loanAmount = 500000 - 100000 = 400000
24
+ expect(result.loanAmount).toBe(400000);
25
+ });
26
+
27
+ it('correctly calculates ITBI', () => {
28
+ const service = new BrazilMortgageServiceImpl();
29
+ const result = service.calculate(input, brazilRules);
30
+
31
+ // ITBI = 500000 * 0.02 = 10000
32
+ expect(result.itbi).toBe(10000);
33
+ });
34
+
35
+ it('calculates a positive monthly payment', () => {
36
+ const service = new BrazilMortgageServiceImpl();
37
+ const result = service.calculate(input, brazilRules);
38
+
39
+ expect(result.monthlyPayment).toBeGreaterThan(0);
40
+ });
41
+
42
+ it('total paid is greater than the loan amount', () => {
43
+ const service = new BrazilMortgageServiceImpl();
44
+ const result = service.calculate(input, brazilRules);
45
+
46
+ expect(result.totalPaid).toBeGreaterThan(result.loanAmount);
47
+ });
48
+
49
+ it('amortization schedule has the correct number of years', () => {
50
+ const service = new BrazilMortgageServiceImpl();
51
+ const result = service.calculate(input, brazilRules);
52
+
53
+ expect(result.amortizationSchedule).toHaveLength(30);
54
+ });
55
+
56
+ it('total paid equals monthly payment multiplied by total payments', () => {
57
+ const service = new BrazilMortgageServiceImpl();
58
+ const result = service.calculate(input, brazilRules);
59
+
60
+ const expectedTotal = result.monthlyPayment * (input.amortizationYears * 12);
61
+ expect(result.totalPaid).toBeCloseTo(expectedTotal, 2);
62
+ });
63
+
64
+ it('throws an error when down payment equals or exceeds property price', () => {
65
+ const service = new BrazilMortgageServiceImpl();
66
+ const badInput: MortgageInput = { ...input, downPayment: 500000 };
67
+
68
+ expect(() => service.calculate(badInput, brazilRules)).toThrow();
69
+ });
70
+ });
@@ -0,0 +1,62 @@
1
+ import { CanadaInheritanceTaxServiceImpl } from '../src/inheritance-tax/canada/CanadaInheritanceTaxServiceImpl';
2
+ import { Input, Rules } from '../src/inheritance-tax/canada/domain/types';
3
+
4
+ const canadaRules: Rules = {
5
+ inclusionRate: 0.50,
6
+ taxBrackets: [
7
+ { from: 0, to: 55867, rate: 0.15 },
8
+ { from: 55867, to: 111733, rate: 0.205 },
9
+ { from: 111733, to: 154906, rate: 0.26 },
10
+ { from: 154906, to: 220000, rate: 0.29 },
11
+ { from: 220000, to: null, rate: 0.33 },
12
+ ],
13
+ };
14
+
15
+ describe('CanadaInheritanceTaxServiceImpl', () => {
16
+ it('returns zero tax when no capital gain (estate = cost base)', () => {
17
+ const input: Input = { estateValue: 500000, adjustedCostBase: 500000 };
18
+ const service = new CanadaInheritanceTaxServiceImpl(input, canadaRules);
19
+ const result = service.calculate();
20
+
21
+ expect(result.inheritanceTax).toBe(0);
22
+ expect(result.taxableEstate).toBe(0);
23
+ });
24
+
25
+ it('returns zero tax when estate is below cost base', () => {
26
+ const input: Input = { estateValue: 300000, adjustedCostBase: 500000 };
27
+ const service = new CanadaInheritanceTaxServiceImpl(input, canadaRules);
28
+ const result = service.calculate();
29
+
30
+ expect(result.inheritanceTax).toBe(0);
31
+ });
32
+
33
+ it('correctly calculates tax on capital gain at death', () => {
34
+ const input: Input = { estateValue: 600000, adjustedCostBase: 400000 };
35
+ const service = new CanadaInheritanceTaxServiceImpl(input, canadaRules);
36
+ const result = service.calculate();
37
+
38
+ // Gain = 200000, taxable gain = 200000 * 0.5 = 100000
39
+ // 55867 * 0.15 = 8380.05
40
+ // (100000 - 55867) * 0.205 = 44133 * 0.205 = 9047.265
41
+ // Total ≈ 17427.315
42
+ expect(result.taxableEstate).toBe(100000);
43
+ expect(result.inheritanceTax).toBeCloseTo(17427.315, 2);
44
+ });
45
+
46
+ it('returns zero for zero estate', () => {
47
+ const input: Input = { estateValue: 0, adjustedCostBase: 0 };
48
+ const service = new CanadaInheritanceTaxServiceImpl(input, canadaRules);
49
+ const result = service.calculate();
50
+
51
+ expect(result.inheritanceTax).toBe(0);
52
+ });
53
+
54
+ it('calculates effective rate based on total gain', () => {
55
+ const input: Input = { estateValue: 600000, adjustedCostBase: 400000 };
56
+ const service = new CanadaInheritanceTaxServiceImpl(input, canadaRules);
57
+ const result = service.calculate();
58
+
59
+ // Effective rate is relative to the gain (200000), not the included portion
60
+ expect(result.effectiveRate).toBeCloseTo((result.inheritanceTax / 200000) * 100, 2);
61
+ });
62
+ });
@@ -0,0 +1,101 @@
1
+ import { FranceInheritanceTaxServiceImpl } from '../src/inheritance-tax/france/FranceInheritanceTaxServiceImpl';
2
+ import { Input, Rules } from '../src/inheritance-tax/france/domain/types';
3
+
4
+ const franceRules: Rules = {
5
+ relationships: {
6
+ spouse: {
7
+ exemption: Infinity,
8
+ brackets: [],
9
+ },
10
+ child: {
11
+ exemption: 100000,
12
+ brackets: [
13
+ { from: 0, to: 8072, rate: 0.05 },
14
+ { from: 8072, to: 12109, rate: 0.10 },
15
+ { from: 12109, to: 15932, rate: 0.15 },
16
+ { from: 15932, to: 552324, rate: 0.20 },
17
+ { from: 552324, to: 902838, rate: 0.30 },
18
+ { from: 902838, to: 1805677, rate: 0.40 },
19
+ { from: 1805677, to: null, rate: 0.45 },
20
+ ],
21
+ },
22
+ sibling: {
23
+ exemption: 15932,
24
+ brackets: [
25
+ { from: 0, to: 24430, rate: 0.35 },
26
+ { from: 24430, to: null, rate: 0.45 },
27
+ ],
28
+ },
29
+ other: {
30
+ exemption: 1594,
31
+ brackets: [
32
+ { from: 0, to: null, rate: 0.60 },
33
+ ],
34
+ },
35
+ },
36
+ };
37
+
38
+ describe('FranceInheritanceTaxServiceImpl', () => {
39
+ it('returns zero tax for spouse inheritance', () => {
40
+ const input: Input = { estateValue: 5000000, relationship: 'spouse' };
41
+ const service = new FranceInheritanceTaxServiceImpl(input, franceRules);
42
+ const result = service.calculate();
43
+
44
+ expect(result.inheritanceTax).toBe(0);
45
+ expect(result.taxableEstate).toBe(0);
46
+ });
47
+
48
+ it('returns zero tax for child inheritance below exemption', () => {
49
+ const input: Input = { estateValue: 80000, relationship: 'child' };
50
+ const service = new FranceInheritanceTaxServiceImpl(input, franceRules);
51
+ const result = service.calculate();
52
+
53
+ expect(result.inheritanceTax).toBe(0);
54
+ });
55
+
56
+ it('correctly calculates child inheritance tax above exemption', () => {
57
+ const input: Input = { estateValue: 108072, relationship: 'child' }; // 8072 above exemption
58
+ const service = new FranceInheritanceTaxServiceImpl(input, franceRules);
59
+ const result = service.calculate();
60
+
61
+ // 8072 * 0.05 = 403.60
62
+ expect(result.taxableEstate).toBe(8072);
63
+ expect(result.inheritanceTax).toBeCloseTo(403.60, 2);
64
+ });
65
+
66
+ it('applies higher rates for sibling inheritance', () => {
67
+ const input: Input = { estateValue: 40362, relationship: 'sibling' }; // 24430 above exemption
68
+ const service = new FranceInheritanceTaxServiceImpl(input, franceRules);
69
+ const result = service.calculate();
70
+
71
+ // 24430 * 0.35 = 8550.50
72
+ expect(result.taxableEstate).toBe(24430);
73
+ expect(result.inheritanceTax).toBeCloseTo(8550.50, 2);
74
+ });
75
+
76
+ it('applies 60% flat rate for unrelated persons', () => {
77
+ const input: Input = { estateValue: 101594, relationship: 'other' }; // 100000 above exemption
78
+ const service = new FranceInheritanceTaxServiceImpl(input, franceRules);
79
+ const result = service.calculate();
80
+
81
+ // 100000 * 0.60 = 60000
82
+ expect(result.taxableEstate).toBe(100000);
83
+ expect(result.inheritanceTax).toBe(60000);
84
+ });
85
+
86
+ it('returns zero for zero estate', () => {
87
+ const input: Input = { estateValue: 0, relationship: 'child' };
88
+ const service = new FranceInheritanceTaxServiceImpl(input, franceRules);
89
+ const result = service.calculate();
90
+
91
+ expect(result.inheritanceTax).toBe(0);
92
+ });
93
+
94
+ it('calculates effective rate correctly', () => {
95
+ const input: Input = { estateValue: 200000, relationship: 'child' };
96
+ const service = new FranceInheritanceTaxServiceImpl(input, franceRules);
97
+ const result = service.calculate();
98
+
99
+ expect(result.effectiveRate).toBe((result.inheritanceTax / 200000) * 100);
100
+ });
101
+ });
@@ -0,0 +1,100 @@
1
+ import { GermanyInheritanceTaxServiceImpl } from '../src/inheritance-tax/germany/GermanyInheritanceTaxServiceImpl';
2
+ import { Input, Rules } from '../src/inheritance-tax/germany/domain/types';
3
+
4
+ const germanyRules: Rules = {
5
+ taxClasses: {
6
+ I: {
7
+ exemption: 500000,
8
+ brackets: [
9
+ { from: 0, to: 75000, rate: 0.07 },
10
+ { from: 75000, to: 300000, rate: 0.11 },
11
+ { from: 300000, to: 600000, rate: 0.15 },
12
+ { from: 600000, to: 6000000, rate: 0.19 },
13
+ { from: 6000000, to: 13000000, rate: 0.23 },
14
+ { from: 13000000, to: 26000000, rate: 0.27 },
15
+ { from: 26000000, to: null, rate: 0.30 },
16
+ ],
17
+ },
18
+ II: {
19
+ exemption: 20000,
20
+ brackets: [
21
+ { from: 0, to: 75000, rate: 0.15 },
22
+ { from: 75000, to: 300000, rate: 0.20 },
23
+ { from: 300000, to: 600000, rate: 0.25 },
24
+ { from: 600000, to: 6000000, rate: 0.30 },
25
+ { from: 6000000, to: 13000000, rate: 0.35 },
26
+ { from: 13000000, to: 26000000, rate: 0.40 },
27
+ { from: 26000000, to: null, rate: 0.43 },
28
+ ],
29
+ },
30
+ III: {
31
+ exemption: 20000,
32
+ brackets: [
33
+ { from: 0, to: 75000, rate: 0.30 },
34
+ { from: 75000, to: 300000, rate: 0.30 },
35
+ { from: 300000, to: 600000, rate: 0.30 },
36
+ { from: 600000, to: 6000000, rate: 0.30 },
37
+ { from: 6000000, to: 13000000, rate: 0.50 },
38
+ { from: 13000000, to: 26000000, rate: 0.50 },
39
+ { from: 26000000, to: null, rate: 0.50 },
40
+ ],
41
+ },
42
+ },
43
+ };
44
+
45
+ describe('GermanyInheritanceTaxServiceImpl', () => {
46
+ it('returns zero tax for Class I estate below exemption', () => {
47
+ const input: Input = { estateValue: 400000, taxClass: 'I' };
48
+ const service = new GermanyInheritanceTaxServiceImpl(input, germanyRules);
49
+ const result = service.calculate();
50
+
51
+ expect(result.inheritanceTax).toBe(0);
52
+ expect(result.taxableEstate).toBe(0);
53
+ });
54
+
55
+ it('correctly calculates Class I tax for estate above exemption', () => {
56
+ const input: Input = { estateValue: 575000, taxClass: 'I' }; // 75000 above exemption
57
+ const service = new GermanyInheritanceTaxServiceImpl(input, germanyRules);
58
+ const result = service.calculate();
59
+
60
+ // 75000 * 0.07 = 5250
61
+ expect(result.taxableEstate).toBe(75000);
62
+ expect(result.inheritanceTax).toBeCloseTo(5250, 2);
63
+ });
64
+
65
+ it('correctly calculates Class II tax with lower exemption', () => {
66
+ const input: Input = { estateValue: 95000, taxClass: 'II' }; // 75000 above exemption
67
+ const service = new GermanyInheritanceTaxServiceImpl(input, germanyRules);
68
+ const result = service.calculate();
69
+
70
+ // 75000 * 0.15 = 11250
71
+ expect(result.taxableEstate).toBe(75000);
72
+ expect(result.inheritanceTax).toBe(11250);
73
+ });
74
+
75
+ it('correctly calculates Class III tax with higher rates', () => {
76
+ const input: Input = { estateValue: 95000, taxClass: 'III' }; // 75000 above exemption
77
+ const service = new GermanyInheritanceTaxServiceImpl(input, germanyRules);
78
+ const result = service.calculate();
79
+
80
+ // 75000 * 0.30 = 22500
81
+ expect(result.taxableEstate).toBe(75000);
82
+ expect(result.inheritanceTax).toBe(22500);
83
+ });
84
+
85
+ it('returns zero for zero estate', () => {
86
+ const input: Input = { estateValue: 0, taxClass: 'I' };
87
+ const service = new GermanyInheritanceTaxServiceImpl(input, germanyRules);
88
+ const result = service.calculate();
89
+
90
+ expect(result.inheritanceTax).toBe(0);
91
+ });
92
+
93
+ it('calculates effective rate correctly', () => {
94
+ const input: Input = { estateValue: 1000000, taxClass: 'I' };
95
+ const service = new GermanyInheritanceTaxServiceImpl(input, germanyRules);
96
+ const result = service.calculate();
97
+
98
+ expect(result.effectiveRate).toBe((result.inheritanceTax / 1000000) * 100);
99
+ });
100
+ });
@@ -0,0 +1,71 @@
1
+ import { IndiaCapitalGainsServiceImpl } from '../src/capital-gains/india/IndiaCapitalGainsServiceImpl';
2
+ import { Input, Rules } from '../src/capital-gains/india/domain/types';
3
+
4
+ const indiaRules: Rules = {
5
+ shortTermRate: 0.20,
6
+ longTermRate: 0.125,
7
+ longTermExemption: 125000,
8
+ };
9
+
10
+ describe('IndiaCapitalGainsServiceImpl', () => {
11
+ it('returns zero tax for zero gain', () => {
12
+ const input: Input = { capitalGain: 0, holdingPeriodMonths: 6 };
13
+ const service = new IndiaCapitalGainsServiceImpl(input, indiaRules);
14
+ const result = service.calculate();
15
+
16
+ expect(result.taxableGain).toBe(0);
17
+ expect(result.capitalGainTax).toBe(0);
18
+ expect(result.totalTax).toBe(0);
19
+ expect(result.effectiveRate).toBe(0);
20
+ });
21
+
22
+ it('correctly calculates short-term capital gains tax', () => {
23
+ const input: Input = { capitalGain: 500000, holdingPeriodMonths: 6 };
24
+ const service = new IndiaCapitalGainsServiceImpl(input, indiaRules);
25
+ const result = service.calculate();
26
+
27
+ // Short-term: 500000 * 0.20 = 100000
28
+ expect(result.capitalGainTax).toBe(100000);
29
+ expect(result.totalTax).toBe(100000);
30
+ expect(result.effectiveRate).toBeCloseTo(20, 2);
31
+ });
32
+
33
+ it('returns zero tax for long-term gain fully within the exemption', () => {
34
+ const input: Input = { capitalGain: 100000, holdingPeriodMonths: 24 };
35
+ const service = new IndiaCapitalGainsServiceImpl(input, indiaRules);
36
+ const result = service.calculate();
37
+
38
+ // Long-term: max(0, 100000 - 125000) = 0 taxable
39
+ expect(result.capitalGainTax).toBe(0);
40
+ expect(result.totalTax).toBe(0);
41
+ });
42
+
43
+ it('correctly calculates long-term capital gains above the exemption', () => {
44
+ const input: Input = { capitalGain: 500000, holdingPeriodMonths: 24 };
45
+ const service = new IndiaCapitalGainsServiceImpl(input, indiaRules);
46
+ const result = service.calculate();
47
+
48
+ // Long-term: max(0, 500000 - 125000) = 375000 * 0.125 = 46875
49
+ expect(result.capitalGainTax).toBe(46875);
50
+ expect(result.totalTax).toBe(46875);
51
+ });
52
+
53
+ it('long-term rate is lower than short-term rate for the same gain', () => {
54
+ const longTermInput: Input = { capitalGain: 500000, holdingPeriodMonths: 24 };
55
+ const shortTermInput: Input = { capitalGain: 500000, holdingPeriodMonths: 6 };
56
+
57
+ const longTermTax = new IndiaCapitalGainsServiceImpl(longTermInput, indiaRules).calculate().capitalGainTax;
58
+ const shortTermTax = new IndiaCapitalGainsServiceImpl(shortTermInput, indiaRules).calculate().capitalGainTax;
59
+
60
+ expect(longTermTax).toBeLessThan(shortTermTax);
61
+ });
62
+
63
+ it('holding period of exactly 12 months is treated as long-term', () => {
64
+ const input: Input = { capitalGain: 500000, holdingPeriodMonths: 12 };
65
+ const service = new IndiaCapitalGainsServiceImpl(input, indiaRules);
66
+ const result = service.calculate();
67
+
68
+ // Long-term: max(0, 500000 - 125000) = 375000 * 0.125 = 46875
69
+ expect(result.capitalGainTax).toBe(46875);
70
+ });
71
+ });
@@ -0,0 +1,54 @@
1
+ import { IndiaCorporateTaxServiceImpl } from '../src/corporate/india/IndiaCorporateTaxServiceImpl';
2
+ import { Input, Rules } from '../src/corporate/india/domain/types';
3
+
4
+ const indiaRules: Rules = {
5
+ regime: { type: 'flat', rate: 0.22 },
6
+ };
7
+
8
+ describe('IndiaCorporateTaxServiceImpl', () => {
9
+ it('returns zero tax for zero income', () => {
10
+ const input: Input = { taxableIncome: 0 };
11
+ const service = new IndiaCorporateTaxServiceImpl(input, indiaRules);
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 22% rate', () => {
20
+ const input: Input = { taxableIncome: 1000000 };
21
+ const service = new IndiaCorporateTaxServiceImpl(input, indiaRules);
22
+ const result = service.calculate();
23
+
24
+ // 1000000 * 0.22 = 220000
25
+ expect(result.corporateTax).toBe(220000);
26
+ });
27
+
28
+ it('calculates effective tax rate as percentage', () => {
29
+ const input: Input = { taxableIncome: 1000000 };
30
+ const service = new IndiaCorporateTaxServiceImpl(input, indiaRules);
31
+ const result = service.calculate();
32
+
33
+ expect(result.effectiveTaxRate).toBe(22);
34
+ });
35
+
36
+ it('returns one breakdown entry for flat rate calculation', () => {
37
+ const input: Input = { taxableIncome: 1000000 };
38
+ const service = new IndiaCorporateTaxServiceImpl(input, indiaRules);
39
+ const result = service.calculate();
40
+
41
+ expect(result.breakdowns).toHaveLength(1);
42
+ expect(result.breakdowns[0].rate).toBe(0.22);
43
+ expect(result.breakdowns[0].amount).toBe(220000);
44
+ });
45
+
46
+ it('scales linearly with taxable income', () => {
47
+ const input: Input = { taxableIncome: 5000000 };
48
+ const service = new IndiaCorporateTaxServiceImpl(input, indiaRules);
49
+ const result = service.calculate();
50
+
51
+ expect(result.corporateTax).toBe(1100000);
52
+ expect(result.effectiveTaxRate).toBe(22);
53
+ });
54
+ });