-use Test::More;
+use strict;
+use Test::More tests => 197;
use strict;
my ($transdate1, $transdate2, $transdate3, $transdate4, $currency, $exchangerate, $exchangerate2, $exchangerate3, $exchangerate4);
my ($ar_chart,$bank,$ar_amount_chart, $ap_chart, $ap_amount_chart, $fxloss_chart, $fxgain_chart);
-my $ALWAYS_RESET = 1;
-
-my $reset_state_counter = 0;
-
my $purchase_invoice_counter = 0; # used for generating purchase invnumber
Support::TestSetup::login();
+init_state();
+
# test cases: without_skonto
test_default_invoice_one_item_19_without_skonto();
test_default_invoice_two_items_19_7_tax_with_skonto();
test_ap_currency_tax_not_included_and_payment_2(); # two exchangerates, with fx_gain_loss
test_ap_currency_tax_not_included_and_payment_2_credit_note(); # two exchangerates, with fx_gain_loss
-{ local $TODO = "currently this test fails because the code writing the invoice is buggy, the calculation of skonto is correct";
- my ($acc_trans_sum) = selectfirst_array_query($::form, $currency->db->dbh, 'SELECT SUM(amount) FROM acc_trans'); is($acc_trans_sum, '0.00000', "sum of all acc_trans is 0");
+is(SL::DB::Manager::Invoice->get_all_count(), 21, "number of invoices at end of tests ok");
+TODO: {
+ local $TODO = "currently this test fails because the code writing the invoice is buggy, the calculation of skonto is correct";
+ my ($acc_trans_sum) = selectfirst_array_query($::form, $currency->db->dbh, 'SELECT SUM(amount) FROM acc_trans');
+ is($acc_trans_sum, '0.00000', "sum of all acc_trans at end of all tests is 0");
}
# remove all created data at end of test
-# clear_up();
+clear_up();
done_testing();
SL::DB::Manager::Currency->delete_all(where => [ name => 'CUR' ]);
};
-sub reset_state {
+sub init_state {
my %params = @_;
- return if $reset_state_counter;
-
- $params{$_} ||= {} for qw(buchungsgruppe unit customer part tax vendor);
-
clear_up();
$transdate1 = DateTime->today;
$transdate3 = DateTime->today->add(days => 2);
$transdate4 = DateTime->today->add(days => 3);
- $buchungsgruppe = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 19%', %{ $params{buchungsgruppe} }) || croak "No accounting group";
- $buchungsgruppe7 = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 7%') || croak "No accounting group for 7\%";
- $unit = SL::DB::Manager::Unit->find_by(name => 'kg', %{ $params{unit} }) || croak "No unit";
- $employee = SL::DB::Manager::Employee->current || croak "No employee";
- $tax = SL::DB::Manager::Tax->find_by(taxkey => 3, rate => 0.19, %{ $params{tax} }) || croak "No tax";
- $tax7 = SL::DB::Manager::Tax->find_by(taxkey => 2, rate => 0.07) || croak "No tax for 7\%";
- $taxzone = SL::DB::Manager::TaxZone->find_by( description => 'Inland') || croak "No taxzone";
- $tax_9 = SL::DB::Manager::Tax->find_by(taxkey => 9, rate => 0.19, %{ $params{tax} }) || croak "No tax";
- # $tax7 = SL::DB::Manager::Tax->find_by(taxkey => 2, rate => 0.07) || croak "No tax for 7\%";
+ $buchungsgruppe = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 19%') || croak "No accounting group";
+ $buchungsgruppe7 = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 7%') || croak "No accounting group for 7\%";
+ $unit = SL::DB::Manager::Unit->find_by(name => 'kg') || croak "No unit";
+ $employee = SL::DB::Manager::Employee->current || croak "No employee";
+ $tax = SL::DB::Manager::Tax->find_by(taxkey => 3, rate => 0.19) || croak "No tax";
+ $tax7 = SL::DB::Manager::Tax->find_by(taxkey => 2, rate => 0.07) || croak "No tax for 7\%";
+ $taxzone = SL::DB::Manager::TaxZone->find_by( description => 'Inland') || croak "No taxzone";
+ $tax_9 = SL::DB::Manager::Tax->find_by(taxkey => 9, rate => 0.19) || croak "No tax";
+ # $tax7 = SL::DB::Manager::Tax->find_by(taxkey => 2, rate => 0.07) || croak "No tax for 7\%";
$currency_id = $::instance_conf->get_currency_id;
$bank = SL::DB::Manager::Chart->find_by( accno => '1200' ); # Bank
$ar_amount_chart = SL::DB::Manager::Chart->find_by( accno => '8400' ); # Erlöse
$ap_amount_chart = SL::DB::Manager::Chart->find_by( accno => '3400' ); # Wareneingang 19%
-
- $reset_state_counter++;
}
sub new_purchase_invoice {
# test 1
sub test_default_invoice_one_item_19_without_skonto() {
- reset_state() if $ALWAYS_RESET;
-
+ my $title = 'default invoice, one item, 19% tax, without_skonto';
my $item = create_invoice_item(part => $parts[0], qty => 2.5);
my $invoice = create_sales_invoice(
taxincluded => 0,
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, one item, 19% tax, without_skonto';
-
is($invoice->netamount, 5.85, "${title}: netamount");
is($invoice->amount, 6.96, "${title}: amount");
is($paid_amount, -6.96, "${title}: paid amount");
}
sub test_default_invoice_one_item_19_without_skonto_overpaid() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, one item, 19% tax, without_skonto';
my $item = create_invoice_item(part => $parts[0], qty => 2.5);
my $invoice = create_sales_invoice(
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, one item, 19% tax, without_skonto';
-
is($invoice->netamount, 5.85, "${title}: netamount");
is($invoice->amount, 6.96, "${title}: amount");
is($paid_amount, -6.96, "${title}: paid amount");
# test 2
sub test_default_invoice_two_items_19_7_tax_with_skonto() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, two items, 19/7% tax with_skonto_pt';
my $item1 = create_invoice_item(part => $parts[0], qty => 2.5);
my $item2 = create_invoice_item(part => $parts[1], qty => 1.2);
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, two items, 19/7% tax with_skonto_pt';
-
is($invoice->netamount, 5.85 + 11.66, "${title}: netamount");
is($invoice->amount, 6.96 + 12.48, "${title}: amount");
is($paid_amount, -19.44, "${title}: paid amount");
}
sub test_default_invoice_two_items_19_7_tax_with_skonto_tax_included() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, two items, 19/7% tax with_skonto_pt';
my $item1 = create_invoice_item(part => $parts[0], qty => 2.5);
my $item2 = create_invoice_item(part => $parts[1], qty => 1.2);
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, two items, 19/7% tax with_skonto_pt';
-
is($invoice->netamount, 15.82, "${title}: netamount");
is($invoice->amount, 17.51, "${title}: amount");
is($paid_amount, -17.51, "${title}: paid amount");
is($invoice->paid, 17.51, "${title}: paid");
is($number_of_payments, 3, "${title}: 3 AR_paid bookings");
- { local $TODO = "currently this test fails because the code writing the invoice is buggy, the calculation of skonto is correct";
+
+TODO: {
+ local $TODO = "currently this test fails because the code writing the invoice is buggy, the calculation of skonto is correct";
is($total, 0, "${title}: even balance");
}
}
# test 3 : two items, without skonto
sub test_default_invoice_two_items_19_7_without_skonto() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, two items, 19/7% tax without skonto';
my $item1 = create_invoice_item(part => $parts[0], qty => 2.5);
my $item2 = create_invoice_item(part => $parts[1], qty => 1.2);
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, two items, 19/7% tax without skonto';
-
is($invoice->netamount, 5.85 + 11.66, "${title}: netamount");
is($invoice->amount, 6.96 + 12.48, "${title}: amount");
is($paid_amount, -19.44, "${title}: paid amount");
# test 4
sub test_default_invoice_two_items_19_7_without_skonto_incomplete_payment() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, two items, 19/7% tax without skonto incomplete payment';
my $item1 = create_invoice_item(part => $parts[0], qty => 2.5);
my $item2 = create_invoice_item(part => $parts[1], qty => 1.2);
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, two items, 19/7% tax without skonto incomplete payment';
-
is($invoice->netamount, 5.85 + 11.66, "${title}: netamount");
is($invoice->amount, 6.96 + 12.48, "${title}: amount");
is($paid_amount, -9.44, "${title}: paid amount");
# test 5
sub test_default_invoice_two_items_19_7_tax_without_skonto_multiple_payments() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, two items, 19/7% tax not included';
my $item1 = create_invoice_item(part => $parts[0], qty => 2.5);
my $item2 = create_invoice_item(part => $parts[1], qty => 1.2);
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, two items, 19/7% tax not included';
-
is($invoice->netamount, 5.85 + 11.66, "${title}: netamount");
is($invoice->amount, 6.96 + 12.48, "${title}: amount");
is($paid_amount, -19.44, "${title}: paid amount");
# test 6
sub test_default_invoice_two_items_19_7_tax_without_skonto_multiple_payments_final_difference_as_skonto() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, two items, 19/7% tax not included';
my $item1 = create_invoice_item(part => $parts[0], qty => 2.5);
my $item2 = create_invoice_item(part => $parts[1], qty => 1.2);
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, two items, 19/7% tax not included';
-
is($invoice->netamount, 5.85 + 11.66, "${title}: netamount");
is($invoice->amount, 6.96 + 12.48, "${title}: amount");
is($paid_amount, -19.44, "${title}: paid amount");
}
sub test_default_invoice_two_items_19_7_tax_without_skonto_multiple_payments_final_difference_as_skonto_1cent() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, two items, 19/7% tax not included';
# if there is only one cent left there can only be one skonto booking, the
# error handling should choose the highest amount, which is the 7% account
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, two items, 19/7% tax not included';
-
is($invoice->netamount, 5.85 + 11.66, "${title}: netamount");
is($invoice->amount, 6.96 + 12.48, "${title}: amount");
is($paid_amount, -19.44, "${title}: paid amount");
}
sub test_default_invoice_two_items_19_7_tax_without_skonto_multiple_payments_final_difference_as_skonto_2cent() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, two items, 19/7% tax not included';
# if there are two cents left there will be two skonto bookings, 1 cent each
my $item1 = create_invoice_item(part => $parts[0], qty => 2.5);
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, two items, 19/7% tax not included';
-
is($invoice->netamount, 5.85 + 11.66, "${title}: netamount");
is($invoice->amount, 6.96 + 12.48, "${title}: amount");
is($paid_amount, -19.44, "${title}: paid amount");
}
sub test_default_invoice_one_item_19_multiple_payment_final_difference_as_skonto() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, one item, 19% tax, without_skonto';
my $item = create_invoice_item(part => $parts[0], qty => 2.5);
my $invoice = create_sales_invoice(
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, one item, 19% tax, without_skonto';
-
is($invoice->netamount, 5.85, "${title}: netamount");
is($invoice->amount, 6.96, "${title}: amount");
is($paid_amount, -6.96, "${title}: paid amount");
}
sub test_default_invoice_one_item_19_multiple_payment_final_difference_as_skonto_1cent() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, one item, 19% tax, without_skonto';
my $item = create_invoice_item(part => $parts[0], qty => 2.5);
my $invoice = create_sales_invoice(
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, one item, 19% tax, without_skonto';
-
is($invoice->netamount, 5.85, "${title}: netamount");
is($invoice->amount, 6.96, "${title}: amount");
is($paid_amount, -6.96, "${title}: paid amount");
# test 3 : two items, without skonto
sub test_default_purchase_invoice_two_charts_19_7_without_skonto() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, two items, 19/7% tax without skonto';
my $purchase_invoice = new_purchase_invoice();
my ($number_of_payments, $paid_amount) = number_of_payments($purchase_invoice);
my $total = total_amount($purchase_invoice);
- my $title = 'default invoice, two items, 19/7% tax without skonto';
-
is($paid_amount, 226, "${title}: paid amount");
is($number_of_payments, 1, "${title}: 1 AP_paid bookings");
is($total, 0, "${title}: even balance");
}
sub test_default_purchase_invoice_two_charts_19_7_with_skonto() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, two items, 19/7% tax without skonto';
my $purchase_invoice = new_purchase_invoice();
my ($number_of_payments, $paid_amount) = number_of_payments($purchase_invoice);
my $total = total_amount($purchase_invoice);
- my $title = 'default invoice, two items, 19/7% tax without skonto';
-
is($paid_amount, 226, "${title}: paid amount");
is($number_of_payments, 3, "${title}: 1 AP_paid bookings");
is($total, 0, "${title}: even balance");
}
sub test_default_purchase_invoice_two_charts_19_7_tax_partial_unrounded_payment_without_skonto() {
+ my $title = 'default purchase_invoice, two charts, 19/7% tax multiple payments with final difference as skonto';
+
# check whether unrounded amounts passed via $params{amount} are rounded for without_skonto case
- reset_state() if $ALWAYS_RESET;
my $purchase_invoice = new_purchase_invoice();
$purchase_invoice->pay_invoice(
amount => ( $purchase_invoice->amount / 3 * 2),
my ($number_of_payments, $paid_amount) = number_of_payments($purchase_invoice);
my $total = total_amount($purchase_invoice);
- my $title = 'default purchase_invoice, two charts, 19/7% tax multiple payments with final difference as skonto';
-
is($paid_amount, 150.67, "${title}: paid amount");
is($number_of_payments, 1, "${title}: 1 AP_paid bookings");
is($total, 0, "${title}: even balance");
sub test_default_purchase_invoice_two_charts_19_7_tax_without_skonto_multiple_payments_final_difference_as_skonto() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default purchase_invoice, two charts, 19/7% tax multiple payments with final difference as skonto';
my $purchase_invoice = new_purchase_invoice();
my ($number_of_payments, $paid_amount) = number_of_payments($purchase_invoice);
my $total = total_amount($purchase_invoice);
- my $title = 'default purchase_invoice, two charts, 19/7% tax multiple payments with final difference as skonto';
-
is($paid_amount, 226, "${title}: paid amount");
is($number_of_payments, 4, "${title}: 1 AP_paid bookings");
is($total, 0, "${title}: even balance");
# test
sub test_default_invoice_two_items_19_7_tax_with_skonto_50_50() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, two items, 19/7% tax with_skonto_pt 50/50';
my $item1 = create_invoice_item(part => $parts[2], qty => 1);
my $item2 = create_invoice_item(part => $parts[3], qty => 1);
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, two items, 19/7% tax with_skonto_pt 50/50';
-
is($invoice->netamount, 100, "${title}: netamount");
is($invoice->amount, 113, "${title}: amount");
is($paid_amount, -113, "${title}: paid amount");
# test
sub test_default_invoice_four_items_19_7_tax_with_skonto_4x_25() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, four items, 19/7% tax with_skonto_pt 4x25';
my $item1 = create_invoice_item(part => $parts[2], qty => 0.5);
my $item2 = create_invoice_item(part => $parts[3], qty => 0.5);
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, four items, 19/7% tax with_skonto_pt 4x25';
-
is($invoice->netamount , 100 , "${title}: netamount");
is($invoice->amount , 113 , "${title}: amount");
is($paid_amount , -113 , "${title}: paid amount");
}
sub test_default_invoice_four_items_19_7_tax_with_skonto_4x_25_tax_included() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, four items, 19/7% tax with_skonto_pt 4x25';
my $item1 = create_invoice_item(part => $parts[2], qty => 0.5);
my $item2 = create_invoice_item(part => $parts[3], qty => 0.5);
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, four items, 19/7% tax with_skonto_pt 4x25';
-
is($invoice->netamount, 88.75, "${title}: netamount");
is($invoice->amount, 100, "${title}: amount");
is($paid_amount, -100, "${title}: paid amount");
is($invoice->paid, 100, "${title}: paid");
is($number_of_payments, 3, "${title}: 3 AR_paid bookings");
- { local $TODO = "currently this test fails because the code writing the invoice is buggy, the calculation of skonto is correct";
+TODO: {
+ local $TODO = "currently this test fails because the code writing the invoice is buggy, the calculation of skonto is correct";
is($total, 0, "${title}: even balance");
}
}
sub test_default_invoice_four_items_19_7_tax_with_skonto_4x_25_multiple() {
- reset_state() if $ALWAYS_RESET;
+ my $title = 'default invoice, four items, 19/7% tax with_skonto_pt 4x25';
my $item1 = create_invoice_item(part => $parts[2], qty => 0.5);
my $item2 = create_invoice_item(part => $parts[3], qty => 0.5);
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'default invoice, four items, 19/7% tax with_skonto_pt 4x25';
-
is($invoice->netamount, 100, "${title}: netamount");
is($invoice->amount, 113, "${title}: amount");
is($paid_amount, -113, "${title}: paid amount");
}
sub test_ar_currency_tax_not_included_and_payment {
+ my $title = 'test_ar_currency_tax_not_included_and_payment_2';
+
my $netamount = $::form->round_amount(75 * $exchangerate->sell,2); # 75 in CUR, 100.00 in EUR
my $amount = $::form->round_amount($netamount * 1.19,2); # 100 in CUR, 119.00 in EUR
my $invoice = SL::DB::Invoice->new(
};
sub test_ar_currency_tax_included {
+ my $title = 'test_ar_currency_tax_included';
+
# we want the acc_trans amount to be 100
my $amount = $::form->round_amount(75 * $exchangerate->sell * 1.19);
my $netamount = $::form->round_amount($amount / 1.19,2);
};
sub test_ap_currency_tax_not_included_and_payment {
+ my $title = 'test_ap_currency_tax_not_included_and_payment';
+
my $netamount = $::form->round_amount(75 * $exchangerate->buy,2); # 75 in CUR, 100.00 in EUR
my $amount = $::form->round_amount($netamount * 1.19,2); # 100 in CUR, 119.00 in EUR
my $invoice = SL::DB::PurchaseInvoice->new(
};
sub test_ap_currency_tax_included {
+ my $title = 'test_ap_currency_tax_included';
+
# we want the acc_trans amount to be 100
my $amount = $::form->round_amount(75 * $exchangerate->buy * 1.19);
my $netamount = $::form->round_amount($amount / 1.19,2);
sub test_ar_currency_tax_not_included_and_payment_2 {
my $title = 'test_ar_currency_tax_not_included_and_payment_2';
+
my $netamount = $::form->round_amount(125 * $exchangerate2->sell,2); # 125.00 in CUR, 100.00 in EUR
my $amount = $::form->round_amount($netamount * 1.19,2); # 148.75 in CUR, 119.00 in EUR
my $invoice = SL::DB::Invoice->new(
};
sub test_ar_currency_tax_not_included_and_payment_2_credit_note {
+ my $title = 'test_ar_currency_tax_not_included_and_payment_2_credit_note';
+
my $netamount = $::form->round_amount(-125 * $exchangerate2->sell,2); # 125.00 in CUR, 100.00 in EUR
my $amount = $::form->round_amount($netamount * 1.19,2); # 148.75 in CUR, 119.00 in EUR
my $invoice = SL::DB::Invoice->new(
sub test_ap_currency_tax_not_included_and_payment_2 {
my $title = 'test_ap_currency_tax_not_included_and_payment_2';
+
my $netamount = $::form->round_amount(125 * $exchangerate2->sell,2); # 125.00 in CUR, 100.00 in EUR
my $amount = $::form->round_amount($netamount * 1.19,2); # 148.75 in CUR, 119.00 in EUR
my $invoice = SL::DB::PurchaseInvoice->new(
sub test_ap_currency_tax_not_included_and_payment_2_credit_note {
my $title = 'test_ap_currency_tax_not_included_and_payment_2_credit_note';
+
my $netamount = $::form->round_amount(-125 * $exchangerate2->sell,2); # 125.00 in CUR, 100.00 in EUR
my $amount = $::form->round_amount($netamount * 1.19,2); # 148.75 in CUR, 119.00 in EUR
my $invoice = SL::DB::PurchaseInvoice->new(
is(total_amount($invoice), 0, "$title: even balance");
};
-sub test_credit_note_two_items_19_7_tax_tax_not_included() {
- reset_state() if $ALWAYS_RESET;
+sub test_credit_note_two_items_19_7_tax_tax_not_included {
+ my $title = 'test_credit_note_two_items_19_7_tax_tax_not_included';
my $item1 = create_invoice_item(part => $parts[0], qty => 5);
my $item2 = create_invoice_item(part => $parts[1], qty => 3);
my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
my $total = total_amount($invoice);
- my $title = 'credit_note, two items, 19/7%, tax not included';
-
is($invoice->netamount, -40.84, "${title}: netamount");
is($invoice->amount, -45.10, "${title}: amount");
is($paid_amount, 45.10, "${title}: paid amount according to acc_trans is positive (Haben)");