1 use Test::More tests => 38;
 
   8 use Support::TestSetup;
 
  12 use Support::TestSetup;
 
  14 use List::Util qw(max);
 
  16 use SL::DB::Buchungsgruppe;
 
  22 use SL::DB::DeliveryOrder;
 
  27 my ($customer, $currency_id, $buchungsgruppe, $employee, $vendor, $taxzone, $buchungsgruppe7, $tax, $tax7,
 
  30 my $VISUAL_TEST = 0;  # just a sleep to click around
 
  33   foreach (qw(DeliveryOrderItem DeliveryOrder InvoiceItem Invoice Part Customer Vendor Department PaymentTerm)) {
 
  34     "SL::DB::Manager::${_}"->delete_all(all => 1);
 
  36   SL::DB::Manager::Employee->delete_all(where => [ id => 31915 ]);
 
  44   $buchungsgruppe   = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 19%', %{ $params{buchungsgruppe} }) || croak "No accounting group 19\%";
 
  45   $buchungsgruppe7  = SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 7%', %{ $params{buchungsgruppe} })  || croak "No accounting group 7\%";
 
  46   $taxzone          = SL::DB::Manager::TaxZone->find_by( description => 'Inland')                                           || croak "No taxzone";
 
  47   $tax              = SL::DB::Manager::Tax->find_by(taxkey => 3, rate => 0.19, %{ $params{tax} })                           || croak "No tax for 19\%";
 
  48   $tax7             = SL::DB::Manager::Tax->find_by(taxkey => 2, rate => 0.07)                                              || croak "No tax for 7\%";
 
  49   $unit             = SL::DB::Manager::Unit->find_by(name => 'kg', %{ $params{unit} })                                      || croak "No unit";
 
  50   $currency_id     = $::instance_conf->get_currency_id;
 
  52   $customer     = SL::DB::Customer->new(
 
  53     name        => '520484567dfaedc9e60fc',
 
  54     currency_id => $currency_id,
 
  55     taxzone_id  => $taxzone->id,
 
  56     %{ $params{customer} }
 
  59   # some od.rnr real anonym data
 
  60   my $employee_bk = SL::DB::Employee->new(
 
  62                 'login' => 'barbuschka.kappes',
 
  63                 'name' => 'Barbuschka Kappes',
 
  66   my $department_do = SL::DB::Department->new(
 
  67                  'description' => 'Maisenhaus-Versand',
 
  73   my $payment_do = SL::DB::PaymentTerm->new(
 
  74                  'description' => '14Tage 2%Skonto, 30Tage netto',
 
  75                  'description_long' => "Innerhalb von 14 Tagen abzüglich 2 % Skonto, innerhalb von 30 Tagen rein netto.|Bei einer Zahlung bis zum <%skonto_date%> gewähren wir 2 % Skonto (EUR <%skonto_amount%>) entspricht EUR <%total_wo_skonto%>.Bei einer Zahlung bis zum <%netto_date%> ist der fällige Betrag in Höhe von <%total%> <%currency%> zu überweisen.",
 
  79                  'percent_skonto' => '0.02',
 
  83                  'auto_calculation' => undef,
 
  89   push @parts, SL::DB::Part->new(
 
  92                  'lastcost' => '49.95000',
 
  93                  'listprice' => '0.00000',
 
  94                  'onhand' => '5.00000',
 
  95                  'partnumber' => 'v-519160549',
 
  96                  #'partsgroup_id' => 111645,
 
  98                  'sellprice' => '242.20000',
 
  99                  #'warehouse_id' => 64702,
 
 101                  description        => "Nussbaum, Gr.5, Unterfilz weinrot, genietet[[Aufschnittbreite: 11,0, Kernform: US]]\"" ,
 
 102                  buchungsgruppen_id => $buchungsgruppe->id,
 
 107   push @parts, SL::DB::Part->new(
 
 108                  'description' => "[[0640]]Flügel Hammerstiele bestehend aus:
 
 109 70 Stielen Standard in Weißbuche und
 
 110 20 Stielen Diskant abgekehlt in Weißbuche
 
 111 mit Röllchen aus Synthetikleder,
 
 112 Kapseln mit Yamaha Profil, Kerbenabstand 3,6 mm mit eingedrehten Abnickschrauben",
 
 114                  'lastcost' => '153.00000',
 
 115                  'listprice' => '0.00000',
 
 116                  'onhand' => '9.00000',
 
 117                  'partnumber' => 'v-120160086',
 
 118                  # 'partsgroup_id' => 111639,
 
 120                  'sellprice' => '344.30000',
 
 122                   buchungsgruppen_id => $buchungsgruppe->id,
 
 127 sub new_delivery_order {
 
 130   return SL::DB::DeliveryOrder->new(
 
 131    currency_id => $currency_id,
 
 132    taxzone_id  => $taxzone->id,
 
 137 Support::TestSetup::login();
 
 141 # we create L20199 with two items
 
 142 my $do1 = new_delivery_order('department_id'    => 32149,
 
 143                              'donumber'         => 'L20199',
 
 144                              'employee_id'      => 31915,
 
 145                              'intnotes'         => 'Achtung: Neue Lieferadresse ab 16.02.2015 in der Carl-von-Ossietzky-Str.32!   13.02.2015/MH
 
 147                                             Steinway-Produkte (201...) immer plus 25% dazu rechnen / BK 13.02.2014',
 
 148                               'ordnumber'       => 'A16399',
 
 149                               'payment_id'      => 11276,
 
 150                               'salesman_id'     => 31915,
 
 151                               'shippingpoint'   => 'Maisenhaus',
 
 152                               # 'shipto_id'     => 451463,
 
 153                               'is_sales'        => 'true',
 
 154                               'shipvia'         => 'DHL, Versand am 06.03.2015, 1 Paket  17,00 kg',
 
 157                               # 'currency_id'   => 1,
 
 158                               'cusordnumber'    => 'b84da',
 
 159                               'customer_id'     => $customer->id,
 
 163 my $do1_item1 = SL::DB::DeliveryOrderItem->new('delivery_order_id' => 464003,
 
 164                                                'description' => "Flügel Hammerkopf bestehend aus:
 
 165                                                                  Bass/Diskant 26/65 Stück, Gesamtlänge 80/72, Bohrlänge 56/48
 
 166                                                                  Nussbaum, Gr.5, Unterfilz weinrot, genietet[[Aufschnittbreite: 11,0, Kernform: US]]",
 
 167                                                'discount' => '0.25',
 
 169                                                'lastcost' => '49.95000',
 
 170                                                'longdescription' => '',
 
 171                                                'marge_price_factor' => 1,
 
 173                                                'ordnumber' => 'A16399',
 
 178                                                'sellprice' => '242.20000',
 
 179                                                'transdate' => '06.03.2015',
 
 180                                                'unit' => 'kg')->save;
 
 182 my $do1_item2 = SL::DB::DeliveryOrderItem->new('delivery_order_id' => 464003,
 
 183                  'description' => "[[0640]]Flügel Hammerstiele bestehend aus:
 
 184 70 Stielen Standard in Weißbuche und
 
 185 20 Stielen Diskant abgekehlt in Weißbuche
 
 186 mit Röllchen aus Synthetikleder,
 
 187 Kapseln mit Yamaha Profil, Kerbenabstand 3,6 mm mit eingedrehten Abnickschrauben",
 
 188                  'discount' => '0.25',
 
 191                  'lastcost' => '153.00000',
 
 192                  'longdescription' => '',
 
 193                  'marge_price_factor' => 1,
 
 195                  'ordnumber' => 'A16399',
 
 199                  'price_factor_id' => undef,
 
 200                  'pricegroup_id' => undef,
 
 201                  'project_id' => undef,
 
 204                  'sellprice' => '344.30000',
 
 205                  'serialnumber' => '',
 
 206                  'transdate' => '06.03.2015',
 
 207                  'unit' => 'kg')->save;
 
 212 # test delivery order before any conversion
 
 213 ok($do1->donumber eq "L20199", 'Delivery Order Number created');
 
 214 ok((not $do1->closed) , 'Delivery Order is not closed');
 
 215 ok($do1_item1->parts_id eq '26321', 'doi linked with part');
 
 216 ok($do1_item1->qty == 2, 'qty check doi');
 
 217 ok($do1_item2->position == 2, 'doi2 position check');
 
 218 ok(2 ==  scalar@{ SL::DB::Manager::DeliveryOrderItem->get_all(where => [ delivery_order_id => $do1->id ]) }, 'two doi linked');
 
 221 # convert this do to invoice
 
 222 my $invoice = $do1->convert_to_invoice();
 
 224 sleep (300) if $VISUAL_TEST; # we can do a real visual test via gui login
 
 225 # test invoice afterwards
 
 227 ok ($invoice->shipvia eq "DHL, Versand am 06.03.2015, 1 Paket  17,00 kg", "ship via check");
 
 228 ok ($invoice->shippingpoint eq "Maisenhaus", "shipping point check");
 
 229 ok ($invoice->ordnumber eq "A16399", "ordnumber check");
 
 230 ok ($invoice->donumber eq "L20199", "donumber check");
 
 231 ok(($do1->closed) , 'Delivery Order is closed after conversion');
 
 232 ok (SL::DB::PaymentTerm->new(id => $invoice->{payment_id})->load->description eq "14Tage 2%Skonto, 30Tage netto", 'payment term description check');
 
 234 # some test data from original client invoice console (!)
 
 235 # my $invoice3 = SL::DB::Manager::Invoice->find_by( ordnumber => 'A16399' );
 
 236 # which will fail due to PTC Calculation differs from GUI-Calculation, see issue: http://redmine.kivitendo-premium.de/issues/82
 
 238 # values from gui should be:
 
 239 #ok($invoice->amount == 1354.20000, 'amount check');
 
 240 #ok($invoice->marge_percent == 50.88666, 'marge percent check');
 
 241 #ok($invoice->marge_total == 579.08000, 'marge total check');
 
 242 #ok($invoice->netamount == 1137.98000, 'netamount check');
 
 245 # the values change if one reloads the object
 
 246 # without reloading we get this failures
 
 247 #not ok 17 - amount check
 
 248 #   Failed test 'amount check'
 
 249 #   at t/db_helper/convert_invoice.t line 272.
 
 251 #     expected: '1354.17000'
 
 252 #not ok 18 - marge percent check
 
 253 #   Failed test 'marge percent check'
 
 254 #   at t/db_helper/convert_invoice.t line 273.
 
 255 #          got: '50.8857956342929'
 
 256 #     expected: '50.88580'
 
 257 #not ok 19 - marge total check
 
 258 #   Failed test 'marge total check'
 
 259 #   at t/db_helper/convert_invoice.t line 274.
 
 261 #     expected: '579.06000'
 
 262 #not ok 20 - netamount check
 
 263 #   Failed test 'netamount check'
 
 264 #   at t/db_helper/convert_invoice.t line 275.
 
 266 #     expected: '1137.96000'
 
 270 ok($invoice->currency_id eq '1', 'currency_id');
 
 271 ok($invoice->cusordnumber eq 'b84da', 'cusordnumber check');
 
 272 ok(SL::DB::Department->new(id => $invoice->{department_id})->load->description eq "Maisenhaus-Versand", 'department description');
 
 273 is($invoice->amount, '1354.17000', 'amount check');
 
 274 is($invoice->marge_percent, '50.88580', 'marge percent check');
 
 275 is($invoice->marge_total, '579.06000', 'marge total check');
 
 276 is($invoice->netamount, '1137.96000', 'netamount check');
 
 279 ok(@ {$invoice->items_sorted}[0]->parts_id eq '26321', 'invoiceitem 1 linked with part');
 
 280 ok(2 ==  scalar@{ $invoice->invoiceitems }, 'two invoice items linked with invoice');
 
 281 is(@ {$invoice->items_sorted}[0]->position, 1, "position 1 order correct");
 
 282 is(@ {$invoice->items_sorted}[1]->position, 2, "position 2 order correct");
 
 283 is(@ {$invoice->items_sorted}[0]->part->partnumber, 'v-519160549', "partnumber 1 correct");
 
 284 is(@ {$invoice->items_sorted}[1]->part->partnumber, 'v-120160086', "partnumber 2 correct");
 
 285 is(@ {$invoice->items_sorted}[0]->qty, '2.00000', "pos 1 qty");
 
 286 is(@ {$invoice->items_sorted}[1]->qty, '3.00000', "pos 2 qty");
 
 287 is(@ {$invoice->items_sorted}[0]->discount, 0.25, "pos 1 discount");
 
 288 is(@ {$invoice->items_sorted}[1]->discount, 0.25, "pos 2 discount");
 
 290 # more ideas: check onhand, lastcost (parsed lastcost)
 
 294 # check linked records AND linked items
 
 296 # we expect something like this in record links:
 
 297 # delivery_order_items |  144736 | invoice  |     9 | 2015-09-02 16:29:32.362562 |  5
 
 298 # delivery_order_items |  144737 | invoice  |    10 | 2015-09-02 16:29:32.362562 |  6
 
 299 # delivery_orders      |  464003 | ar       |     5 | 2015-09-02 16:29:32.362562 |  7
 
 301 # verkn�pfter beleg$VAR1 = {
 
 302 #           'from_id' => 464003,
 
 303 #           'from_table' => 'delivery_orders',
 
 307 # verkn�pfte positionen$VAR1 = {
 
 308 #           'from_id' => 144737,
 
 309 #           'from_table' => 'delivery_order_items',
 
 311 #           'to_table' => 'invoice'
 
 314 #           'from_id' => 144736,
 
 315 #           'from_table' => 'delivery_order_items',
 
 317 #           'to_table' => 'invoice'
 
 322 my @links_record    = RecordLinks->get_links('from_table' => 'delivery_orders',
 
 324                                              'from_id'      => 464003);
 
 325 is($links_record[0]->{from_id}, '464003', "record from id check");
 
 326 is($links_record[0]->{from_table}, 'delivery_orders', "record from table check");
 
 327 is($links_record[0]->{to_table}, 'ar', "record to table check");
 
 329 foreach (qw(144736 144737)) {
 
 330   my @links_record_item1 = RecordLinks->get_links('from_table' => 'delivery_order_items',
 
 331                                                  'to_table'   => 'invoice',
 
 333   is($links_record_item1[0]->{from_id}, $_, "record from id check $_");
 
 334   is($links_record_item1[0]->{from_table}, 'delivery_order_items', "record from table check $_");
 
 335   is($links_record_item1[0]->{to_table}, 'invoice', "record to table check $_");