Налоговая декларация

В Штатах, и особенно в южной Калифорнии, о наступлении весны напоминает процесс заполнения налоговой декларации. Сначала, еще в январе, начинают приходить имейлы: “Ваша форма 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.

  1. 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

  2. Enter the amount from Form 1040, line 9b

  3. 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

  4. Add lines 2 and 3

  5. If filing Form 4952 (used to figure investment interest expense deduction), enter any amount from line 4g of that form. Otherwise, enter -0-

  6. Subtract line 5 from line 4. If zero or less, enter -0-

  7. Subtract line 6 from line 1. If zero or less, enter -0-

  8. 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.

  9. Enter the smaller of line 1 or line 8

  10. Enter the smaller of line 7 or line 9

  11. Subtract line 10 from line 9. This amount is taxed at 0%

  12. Enter the smaller of line 1 or line 6

  13. Enter the amount from line 11

  14. 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, обложить со всех сторон юнит тестами, да протестировать в симуляторе и готово - можно отправлять ракету в космос.

Замечу, что подобным занимается наверное пол страны и каждый год. Не удивительно, что в США так много программистов. :-)

comments powered by Disqus