Налоговая декларация
Mar 19, 2016 · CommentsКосмосНалогиПрограммирование
В Штатах, и особенно в южной Калифорнии, о наступлении весны напоминает процесс заполнения налоговой декларации. Сначала, еще в январе, начинают приходить имейлы: “Ваша форма W-2/1098/1099-B/DIV/MISC будет готова к концу января. Потерпите”. Ближе к февралю начитают приходить обещанные налоговые формы. Потом активизируется TurboTax: “Спешите отправить Tax Return сейчас, пока мы еще добрые и даем скидку”. К апрелю активность TurboTax достигает максимума: “Скидку вы, конечно, профукали, но можно подать на продление и отложить час расплаты на полгода.”
В этот раз, копаясь в куче форм и пересчитывая налоги за прошлый год вручную (TurboTax, конечно, отличная вещь, но всякие нетривиальные ситуации он, зараза, не поддерживает), пришла в голову мысль, что инструкции к налоговым формам похожи на документацию к управляющим алгоритмам в ракете. Учитывая, что ошибки в подобных алгоритмах часто заканчиваются красивым фейерверком, эти алгоритмы описываются очень подробно. Описывается не только предназначение и основные формулы. Перечисляются все переменные, их имена, размерность. Указывается точная последовательность вычислений и т.д.
Теперь посмотрите как выглядит “Qualified Dividends and Capital Gain Tax Worksheet” из инструкции по заполнению налововой декларации (страница 44):
Before you begin:
- See the earlier instructions for line 44 to see if you can use this worksheet to figure your tax.
- Before completing this worksheet, complete Form 1040 through line 43.
- If you do not have to file Schedule D and you received capital gain distributions, be sure you checked the box on line 13 of Form 1040.
- Enter the amount from Form 1040, line 43. However, if you are filing Form 2555 or 2555-EZ (relating to foreign earned income), enter the amount from line 3 of the Foreign Earned Income Tax Worksheet
- Enter the amount from Form 1040, line 9b
- Are you filing Schedule D?
* Yes. Enter the smaller of line 15 or 16 of Schedule D. If either line 15 or line 16 is blank or a loss, enter -0-
* No. Enter the amount from Form 1040, line 13
- Add lines 2 and 3
- If filing Form 4952 (used to figure investment interest expense deduction), enter any amount from line 4g of that form. Otherwise, enter -0-
- Subtract line 5 from line 4. If zero or less, enter -0-
- Subtract line 6 from line 1. If zero or less, enter -0-
- Enter:
* $37,450 if single or married filing separately
* $74,900 if married filing jointly or qualifying widow(er)
* $50,200 if head of household.
- Enter the smaller of line 1 or line 8
- Enter the smaller of line 7 or line 9
- Subtract line 10 from line 9. This amount is taxed at 0%
- Enter the smaller of line 1 or line 6
- Enter the amount from line 11
- Subtract line 13 from line 12
- …
… и так далее. Это все переписывается в код один к одному:
const double taxable_income = form1040.line43;
const double qualified_dividends = form1040.line9b;
double capital_gain = 0.0;
if (schedule_d) {
capital_gain = std::max(0.0, std::min(schedule_d.line15,
schedule_d.line16));
} else {
capital_gain = form1040.line13
}
const double line4 = qualified_dividends + capital_gain;
double line5 = 0.0;
if (form4952) {
line5 = form4952.line4g;
}
const double line6 = std::max(line4 - line5, 0.0);
const double line7 = std::max(taxable_income - line6, 0.0);
double credit = 0.0;
switch (filing_status) {
case single:
case married_filing_separately:
credit = 37450.0;
break;
case married_filing_jointly:
case widower:
credit = 74900.0;
break;
case head_of_household:
credit = 50200.0;
break;
}
const double line9 = std::min(taxable_income, credit);
const double line10 = std::min(line7, line9);
const double line11 = line9 - line10;
const double line12 = std::min(taxable_income, line6);
const double line14 = line12 - line11;
...
Снабдить этот код комментариями, разобраться что именно означают переменные вида lineX, обложить со всех сторон юнит тестами, да протестировать в симуляторе и готово - можно отправлять ракету в космос.
Замечу, что подобным занимается наверное пол страны и каждый год. Не удивительно, что в США так много программистов. :-)