expect('getOne', 'SELECT jbprc_price FROM jobprice WHERE jb_id = 123 AND mt_sort = 13', $selfDiscount); $result = new FixtureRows($rows); $GLOBALS['db']->expect('query', "SELECT trs_discount, trs_price, trs_srv_name FROM tourservice WHERE jb_id = '123'", $result); if ($original !== null) { $GLOBALS['db']->expect('getOne', 'SELECT jbprc_remark FROM jobprice WHERE jb_id = 123 AND mt_sort = 13', $original); } return $result; } private function row(string $name, float $price, float $discount = 0): array { return ['trs_srv_name' => $name, 'trs_price' => $price, 'trs_discount' => $discount]; } private function item(int $index): array { [$table, $row] = FixtureState::$writes[$index]; self::assertSame('phoenix_log.b2b_objects', $table); $fields = []; for ($i = 0; $i < count($row); $i += 2) { $fields[$row[$i]] = $row[$i + 1]; } self::assertSame(300, $fields['bo_type']); self::assertSame(123, $fields['bo_ext_id0']); self::assertSame(7, $fields['bo_ext_id1']); return json_decode($fields['bo_obj_data'], true, 512, JSON_THROW_ON_ERROR); } public function testNoDiscountProducesNoTextOrBiItems(): void { $rows = $this->rows([$this->row('Fixpreis', 100)]); self::assertSame('', checkDiscountStr(123, 0, 100, 0)); self::assertSame([], FixtureState::$writes); self::assertTrue($rows->freed); } public function testDiscountTextAndBiItemUseSameAmounts(): void { FixtureState::$parameters[7]['INV_PRINT_DISCOUNT'] = '1'; $this->rows([$this->row('Fixpreis', 90, 10)]); self::assertSame("\nRabatt 10,00% auf 90,00 EUR = -9,00 EUR", checkDiscountStr(123, 0, 90, 0)); self::assertCount(1, FixtureState::$writes); self::assertSame(['c', '0.1', 's', 'Rabatt', 'p', '90', 't', '-9'], $this->item(0)); } public function testHiddenDiscountDoesNotCreateBiItem(): void { FixtureState::$parameters[7]['INV_PRINT_DISCOUNT'] = '0'; $this->rows([$this->row('Fixpreis', 90, 10)]); self::assertSame('', checkDiscountStr(123, 0, 90, 0)); self::assertSame([], FixtureState::$writes); } public function testFuelMarkupExcludesServicePrice(): void { FixtureState::$parameters[7]['MASK_MARKUP_MODE'] = '1'; $this->rows([$this->row('Fixpreis', 110), $this->row('Servicepreis', 12)]); self::assertSame("\nTreibstoffzuschlag 10,00% auf 100,00 EUR = 10,00 EUR", checkDiscountStr(123, 10, 110, 12)); self::assertCount(1, FixtureState::$writes); self::assertSame(['c', '0.1', 's', 'Treibstoffzuschlag', 'p', '100', 't', '10'], $this->item(0)); } public function testSelfEntryDiscountUsesStoredOriginalAmount(): void { $this->rows([$this->row('Fixpreis', 90), $this->row('Servicepreis', 12)], 10, 100); self::assertSame("\nSelbsterfasserrabatt 10,00% auf 100,00 EUR = -10,00 EUR", checkDiscountStr(123, 0, 90, 12)); self::assertCount(1, FixtureState::$writes); self::assertSame(['c', '0.1', 's', 'Selbsterfasserrabatt', 'p', '100', 't', '-10'], $this->item(0)); } public function testMarkupThenSelfEntryDiscountKeepTextAndBiOrder(): void { FixtureState::$parameters[7]['MASK_MARKUP_MODE'] = '1'; $this->rows([$this->row('Fixpreis', 99)], 10, 110); self::assertSame("\nTreibstoffzuschlag 10,00% auf 100,00 EUR = 10,00 EUR\nSelbsterfasserrabatt 10,00% auf 110,00 EUR = -11,00 EUR", checkDiscountStr(123, 10, 99, 0)); self::assertCount(2, FixtureState::$writes); self::assertSame(['c', '0.1', 's', 'Treibstoffzuschlag', 'p', '100', 't', '10'], $this->item(0)); self::assertSame(['c', '0.1', 's', 'Selbsterfasserrabatt', 'p', '110', 't', '-11'], $this->item(1)); } public function testLegacyEuroByteIsPreserved(): void { FixtureState::$parameters[7] = ['MASK_MARKUP_MODE' => '1', 'INV_USE_EURO_SIGN' => '1']; $this->rows([$this->row('Fixpreis', 110)]); self::assertSame("\nTreibstoffzuschlag 10,00% auf 100,00 " . chr(128) . ' = 10,00 ' . chr(128), checkDiscountStr(123, 10, 110, 0)); } }