TEST _nl_tax_1a(void) { administration::create_default(test_file_path); administration::company_info_set(_create_nl_business()); add_default_nl_tax_rates(); invoice inv = _create_nl_b2b_inv_outgoing(); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 20.0f, "NL/21")); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 30.0f, "NL/21")); ASSERT_EQ(administration::invoice_add(&inv), A_ERR_SUCCESS); tax_statement statement; administration::create_tax_statement(&statement); ASSERT_EQ(statement.report_count, 1); tax_line* tl = administration::get_tax_line_from_report(&statement.reports[0], "NL/1a"); ASSERT_EQ(tl->total_net, 50.0f); ASSERT_EQ(tl->total_tax, 50.0f * 0.21f); tax_line* tl2 = administration::get_tax_line_from_report(&statement.reports[0], "NL/5a"); ASSERT_EQ(tl2->total_tax, 50.0f * 0.21f); PASS(); } TEST _nl_tax_1b(void) { administration::create_default(test_file_path); administration::company_info_set(_create_nl_business()); add_default_nl_tax_rates(); invoice inv = _create_nl_b2b_inv_outgoing(); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 10.0f, "NL/9")); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 15.0f, "NL/9")); ASSERT_EQ(administration::invoice_add(&inv), A_ERR_SUCCESS); tax_statement statement; administration::create_tax_statement(&statement); ASSERT_EQ(statement.report_count, 1); tax_line* tl = administration::get_tax_line_from_report(&statement.reports[0], "NL/1b"); ASSERT_EQ(tl->total_net, 25.0f); ASSERT_EQ(tl->total_tax, 25.0f * 0.09f); tax_line* tl2 = administration::get_tax_line_from_report(&statement.reports[0], "NL/5a"); ASSERT_EQ(tl2->total_tax, 25.0f * 0.09f); PASS(); } TEST _nl_tax_1e(void) { administration::create_default(test_file_path); administration::company_info_set(_create_nl_business()); add_default_nl_tax_rates(); invoice inv = _create_nl_b2b_inv_outgoing(); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 30.0f, "NL/0")); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 50.0f, "NL/0")); ASSERT_EQ(administration::invoice_add(&inv), A_ERR_SUCCESS); tax_statement statement; administration::create_tax_statement(&statement); ASSERT_EQ(statement.report_count, 1); tax_line* tl = administration::get_tax_line_from_report(&statement.reports[0], "NL/1e"); ASSERT_EQ(tl->total_net, 80.0f); ASSERT_EQ(tl->total_tax, 0.0f); tax_line* tl2 = administration::get_tax_line_from_report(&statement.reports[0], "NL/5a"); ASSERT_EQ(tl2->total_tax, 0.0f); PASS(); } TEST _nl_tax_2currency(void) { administration::create_default(test_file_path); administration::company_info_set(_create_nl_business()); add_default_nl_tax_rates(); invoice inv = _create_nl_b2b_inv_outgoing(); administration::invoice_set_currency(&inv, "USD"); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 20.0f, "NL/21")); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 30.0f, "NL/21")); float eur_usd_exchange_rate = 1.2f; inv.net = 50.0f / eur_usd_exchange_rate; inv.tax = inv.net * 0.21f; inv.allowance = 0.0f; inv.total = inv.net + inv.tax; ASSERT_EQ(administration::invoice_add(&inv), A_ERR_SUCCESS); tax_statement statement; administration::create_tax_statement(&statement); ASSERT_EQ(statement.report_count, 1); tax_line* tl = administration::get_tax_line_from_report(&statement.reports[0], "NL/1a"); GREATEST_ASSERT_FEQ(tl->total_net, inv.net); GREATEST_ASSERT_FEQ(tl->total_tax, inv.tax); tax_line* tl2 = administration::get_tax_line_from_report(&statement.reports[0], "NL/5a"); GREATEST_ASSERT_FEQ(tl2->total_tax, inv.tax); PASS(); } TEST _nl_tax_2a(void) { administration::create_default(test_file_path); administration::company_info_set(_create_nl_business()); add_default_nl_tax_rates(); invoice inv = _create_nl_b2b_inv_incomming(); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 30.0f, "NL_IN/BV/21")); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 50.0f, "NL_IN/BV/9")); ASSERT_EQ(administration::invoice_add(&inv), A_ERR_SUCCESS); tax_statement statement; administration::create_tax_statement(&statement); ASSERT_EQ(statement.report_count, 1); tax_line* tl = administration::get_tax_line_from_report(&statement.reports[0], "NL/2a"); GREATEST_ASSERT_FEQ(tl->total_net, inv.net); GREATEST_ASSERT_FEQ(tl->total_tax, inv.tax); tax_line* tl2 = administration::get_tax_line_from_report(&statement.reports[0], "NL/5a"); GREATEST_ASSERT_FEQ(tl2->total_tax, inv.tax); tax_line* tl3 = administration::get_tax_line_from_report(&statement.reports[0], "NL/5b"); GREATEST_ASSERT_FEQ(tl3->total_tax, inv.tax); PASS(); } TEST _nl_tax_4a(void) { administration::create_default(test_file_path); administration::company_info_set(_create_nl_business()); add_default_nl_tax_rates(); invoice inv = _create_nl_b2b_inv_incomming(); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 30.0f, "NL_IN/BEUV/21")); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 50.0f, "NL_IN/BEUV/9")); ASSERT_EQ(administration::invoice_add(&inv), A_ERR_SUCCESS); tax_statement statement; administration::create_tax_statement(&statement); ASSERT_EQ(statement.report_count, 1); tax_line* tl = administration::get_tax_line_from_report(&statement.reports[0], "NL/4a"); GREATEST_ASSERT_FEQ(tl->total_net, inv.net); GREATEST_ASSERT_FEQ(tl->total_tax, inv.tax); tax_line* tl2 = administration::get_tax_line_from_report(&statement.reports[0], "NL/5a"); GREATEST_ASSERT_FEQ(tl2->total_tax, inv.tax); tax_line* tl3 = administration::get_tax_line_from_report(&statement.reports[0], "NL/5b"); GREATEST_ASSERT_FEQ(tl3->total_tax, inv.tax); PASS(); } TEST _nl_tax_4b(void) { administration::create_default(test_file_path); administration::company_info_set(_create_nl_business()); add_default_nl_tax_rates(); invoice inv = _create_nl_b2b_inv_incomming(); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 30.0f, "NL_IN/IEUV/21")); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 50.0f, "NL_IN/IEUV/9")); ASSERT_EQ(administration::invoice_add(&inv), A_ERR_SUCCESS); tax_statement statement; administration::create_tax_statement(&statement); ASSERT_EQ(statement.report_count, 1); tax_line* tl = administration::get_tax_line_from_report(&statement.reports[0], "NL/4b"); GREATEST_ASSERT_FEQ(tl->total_net, inv.net); GREATEST_ASSERT_FEQ(tl->total_tax, inv.tax); tax_line* tl2 = administration::get_tax_line_from_report(&statement.reports[0], "NL/5a"); GREATEST_ASSERT_FEQ(tl2->total_tax, inv.tax); tax_line* tl3 = administration::get_tax_line_from_report(&statement.reports[0], "NL/5b"); GREATEST_ASSERT_FEQ(tl3->total_tax, inv.tax); PASS(); } TEST _nl_tax_5a(void) { administration::create_default(test_file_path); administration::company_info_set(_create_nl_business()); add_default_nl_tax_rates(); invoice inv = _create_nl_b2b_inv_outgoing(); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 20.0f, "NL/21")); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 30.0f, "NL/9")); ASSERT_EQ(administration::invoice_add(&inv), A_ERR_SUCCESS); tax_statement statement; administration::create_tax_statement(&statement); ASSERT_EQ(statement.report_count, 1); tax_line* tl2 = administration::get_tax_line_from_report(&statement.reports[0], "NL/5a"); ASSERT_EQ(tl2->total_tax, inv.tax); PASS(); } TEST _nl_tax_5b(void) { administration::create_default(test_file_path); administration::company_info_set(_create_nl_business()); add_default_nl_tax_rates(); invoice inv = _create_nl_b2b_inv_incomming(); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 30.0f, "NL_IN/21/5B")); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 50.0f, "NL_IN/9/5B")); ASSERT_EQ(administration::invoice_add(&inv), A_ERR_SUCCESS); tax_statement statement; administration::create_tax_statement(&statement); ASSERT_EQ(statement.report_count, 1); tax_line* tl3 = administration::get_tax_line_from_report(&statement.reports[0], "NL/5b"); GREATEST_ASSERT_FEQ(tl3->total_tax, inv.tax); PASS(); } TEST _nl_tax_5c(void) { administration::create_default(test_file_path); administration::company_info_set(_create_nl_business()); add_default_nl_tax_rates(); invoice inv = _create_nl_b2b_inv_outgoing(); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 20.0f, "NL/21")); administration::billing_item_add_to_invoice(&inv, _create_bi(1, 30.0f, "NL/9")); ASSERT_EQ(administration::invoice_add(&inv), A_ERR_SUCCESS); invoice inv2 = _create_nl_b2b_inv_incomming(); administration::billing_item_add_to_invoice(&inv2, _create_bi(1, 30.0f, "NL_IN/21/5B")); administration::billing_item_add_to_invoice(&inv2, _create_bi(1, 50.0f, "NL_IN/9/5B")); ASSERT_EQ(administration::invoice_add(&inv2), A_ERR_SUCCESS); tax_statement statement; administration::create_tax_statement(&statement); ASSERT_EQ(statement.report_count, 1); float total = inv.tax - inv2.tax; if (total < 0.0f) total = (float)ceil(total); else total = (float)floor(total); tax_line* tl3 = administration::get_tax_line_from_report(&statement.reports[0], "NL/5c"); GREATEST_ASSERT_FEQ(tl3->total_tax, total); PASS(); } SUITE(nl_tax_statement) { RUN_TEST(_nl_tax_1a); RUN_TEST(_nl_tax_1b); RUN_TEST(_nl_tax_1e); RUN_TEST(_nl_tax_2currency); RUN_TEST(_nl_tax_2a); RUN_TEST(_nl_tax_4a); RUN_TEST(_nl_tax_4b); RUN_TEST(_nl_tax_5a); RUN_TEST(_nl_tax_5b); RUN_TEST(_nl_tax_5c); }