setName('test:generateinvoice') ->setDescription('Test invoice manager service.') ->setHelp('Test invoice manager service.'); } public function __construct(InvoiceManager $inv_manager, EntityManagerInterface $em) { $this->em = $em; $this->inv_manager = $inv_manager; parent::__construct(); } protected function execute(InputInterface $input, OutputInterface $output) { // battery sales $this->testBatterySalesNoTradeInNoDiscount(); $this->testBatterySalesQuantityNoTradeInNoDiscount(); // battery sales with trade in $this->testBatterySalesTradeInSameBatteryPremiumNoDiscount(); $this->testBatterySalesTradeInSameBatteryMotoliteNoDiscount(); $this->testBatterySalesTradeInSameBatteryOtherNoDiscount(); $this->testBatterySalesTradeInDifferentBatteryPremiumNoDiscount(); $this->testBatterySalesTradeInDifferentBatteryMotoliteNoDiscount(); $this->testBatterySalesTradeInDifferentBatteryOtherNoDiscount(); $this->testBatterySalesTradeInQuantityNoDiscount(); // battery sales with discount // battery replacement warranty $this->testBatteryReplacementWarranty(); // fuel $this->testFuelGasWithServiceFee(); $this->testFuelDieselWithServiceFee(); $this->testFuelGasWithNoServiceFee(); $this->testFuelDieselWithNoServiceFee(); // jumpstart $this->testJumpstart(); // jumpstart warranty $this->testJumpstartWarranty(); // overheat $this->testOverheatAssistanceWithCoolant(); $this->testOverheatAssistanceWithoutCoolant(); // post-recharged $this->testPostRecharged(); // post replacement $this->testPostReplacement(); // tire repair $this->testTireRepairWithServiceFee(); $this->testTireRepairWithoutServiceFee(); // TEST SCENARIO: new battery with discount // TEST SCENARIO: new battery with discount and trade-in return 0; } protected function testBatterySalesNoTradeInNoDiscount() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: new battery, no trade-in, no discount $criteria->setServiceType(ServiceType::BATTERY_REPLACEMENT_NEW); $battery_id = 1038; $battery = $this->em->getRepository(Battery::class)->find($battery_id); $criteria->addEntry($battery, null, 1); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); // error_log(print_r(json_encode($invoice_data), true)); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::BATTERY_REPLACEMENT_NEW) . ' NO TRADE IN NO DISCOUNT ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testBatterySalesQuantityNoTradeInNoDiscount() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: new battery, more than 1, no trade-in, no discount $criteria->setServiceType(ServiceType::BATTERY_REPLACEMENT_NEW); $battery_id = 1038; $battery = $this->em->getRepository(Battery::class)->find($battery_id); $criteria->addEntry($battery, null, 2); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); // error_log(print_r(json_encode($invoice_data), true)); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::BATTERY_REPLACEMENT_NEW) . ' QUANTITY NO TRADE IN NO DISCOUNT ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testBatterySalesTradeInSameBatteryPremiumNoDiscount() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: new battery, trade-in same battery, premium, no discount $criteria->setServiceType(ServiceType::BATTERY_REPLACEMENT_NEW); $battery_id = 1038; $battery = $this->em->getRepository(Battery::class)->find($battery_id); // add battery $criteria->addEntry($battery, null, 1); // add battery for trade in $criteria->addEntry($battery, 'premium', 1); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::BATTERY_REPLACEMENT_NEW) . ' PREMIUM TRADE IN SAME BATTERY NO DISCOUNT ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testBatterySalesTradeInSameBatteryMotoliteNoDiscount() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: new battery, trade-in same battery, motolite, no discount $criteria->setServiceType(ServiceType::BATTERY_REPLACEMENT_NEW); $battery_id = 1038; $battery = $this->em->getRepository(Battery::class)->find($battery_id); // add battery $criteria->addEntry($battery, null, 1); // add battery for trade in $criteria->addEntry($battery, 'motolite', 1); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::BATTERY_REPLACEMENT_NEW) . ' MOTOLITE TRADE IN SAME BATTERY NO DISCOUNT ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testBatterySalesTradeInSameBatteryOtherNoDiscount() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: new battery, trade-in same battery, other, no discount $criteria->setServiceType(ServiceType::BATTERY_REPLACEMENT_NEW); $battery_id = 1038; $battery = $this->em->getRepository(Battery::class)->find($battery_id); // add battery $criteria->addEntry($battery, null, 1); // add battery for trade in $criteria->addEntry($battery, 'other', 1); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::BATTERY_REPLACEMENT_NEW) . ' OTHER TRADE IN SAME BATTERY NO DISCOUNT ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testBatterySalesTradeInDifferentBatteryPremiumNoDiscount() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: new battery, trade-in different battery, premium, no discount $criteria->setServiceType(ServiceType::BATTERY_REPLACEMENT_NEW); $battery_id = 1038; $battery = $this->em->getRepository(Battery::class)->find($battery_id); // add battery $criteria->addEntry($battery, null, 1); $trade_battery_id = 1037; $trade_battery = $this->em->getRepository(Battery::class)->find($trade_battery_id); // add battery for trade in $criteria->addEntry($trade_battery, 'premium', 1); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::BATTERY_REPLACEMENT_NEW) . ' PREMIUM TRADE IN DIFFERENT BATTERY NO DISCOUNT ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testBatterySalesTradeInDifferentBatteryMotoliteNoDiscount() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: new battery, trade-in different battery, motolite, no discount $criteria->setServiceType(ServiceType::BATTERY_REPLACEMENT_NEW); $battery_id = 1038; $battery = $this->em->getRepository(Battery::class)->find($battery_id); // add battery $criteria->addEntry($battery, null, 1); $trade_battery_id = 1037; $trade_battery = $this->em->getRepository(Battery::class)->find($trade_battery_id); // add battery for trade in $criteria->addEntry($trade_battery, 'motolite', 1); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::BATTERY_REPLACEMENT_NEW) . ' MOTOLITE TRADE IN DIFFERENT BATTERY NO DISCOUNT ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testBatterySalesTradeInDifferentBatteryOtherNoDiscount() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: new battery, trade-in different battery, other, no discount $criteria->setServiceType(ServiceType::BATTERY_REPLACEMENT_NEW); $battery_id = 1038; $battery = $this->em->getRepository(Battery::class)->find($battery_id); // add battery $criteria->addEntry($battery, null, 1); $trade_battery_id = 1037; $trade_battery = $this->em->getRepository(Battery::class)->find($trade_battery_id); // add battery for trade in $criteria->addEntry($trade_battery, 'other', 1); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::BATTERY_REPLACEMENT_NEW) . ' OTHER TRADE IN DIFFERENT BATTERY NO DISCOUNT ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testBatterySalesTradeInQuantityNoDiscount() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: new battery, trade-in different battery, premium, no discount $criteria->setServiceType(ServiceType::BATTERY_REPLACEMENT_NEW); $battery_id = 1038; $battery = $this->em->getRepository(Battery::class)->find($battery_id); // add battery $criteria->addEntry($battery, null, 1); $trade_battery_id = 1037; $trade_battery = $this->em->getRepository(Battery::class)->find($trade_battery_id); // add battery for trade in $criteria->addEntry($trade_battery, 'other', 3); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::BATTERY_REPLACEMENT_NEW) . ' QUANTITY TRADE IN NO DISCOUNT ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testBatteryReplacementWarranty() { // TEST SCENARIO: battery replacement warranty $criteria = new InvoiceCriteria(); $criteria->setServiceType(ServiceType::BATTERY_REPLACEMENT_WARRANTY); $battery_id = 1038; $battery = $this->em->getRepository(Battery::class)->find($battery_id); $criteria->addEntry($battery, null, 1); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::BATTERY_REPLACEMENT_WARRANTY) . ' ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testFuelGasWithServiceFee() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: fuel, gas, service fee $criteria->setServiceType(ServiceType::EMERGENCY_REFUEL); // set customer vehicle $cv_id = 1306614; $cv = $this->em->getRepository(CustomerVehicle::class)->find($cv_id); $criteria->setCustomerVehicle($cv); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::EMERGENCY_REFUEL) . ' GAS WITH SERVICE FEE' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testFuelDieselWithServiceFee() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: fuel, diesel, service fee $criteria->setServiceType(ServiceType::EMERGENCY_REFUEL); // set customer vehicle $cv_id = 1306612; $cv = $this->em->getRepository(CustomerVehicle::class)->find($cv_id); $criteria->setCustomerVehicle($cv); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::EMERGENCY_REFUEL) . ' DIESEL WITH SERVICE FEE ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testFuelGasWithNoServiceFee() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: fuel, gas, no service fee $criteria->setServiceType(ServiceType::EMERGENCY_REFUEL); // set customer vehicle $cv_id = 1306604; $cv = $this->em->getRepository(CustomerVehicle::class)->find($cv_id); $criteria->setCustomerVehicle($cv); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::EMERGENCY_REFUEL) . ' GAS WITH NO SERVICE FEE ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testFuelDieselWithNoServiceFee() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: fuel, diesel, no service fee $criteria->setServiceType(ServiceType::EMERGENCY_REFUEL); // set customer vehicle $cv_id = 1306581; $cv = $this->em->getRepository(CustomerVehicle::class)->find($cv_id); $criteria->setCustomerVehicle($cv); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::EMERGENCY_REFUEL) . ' DIESEL WITH NO SERVICE FEE ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testJumpstart() { // TEST SCENARIO: jumpstart $criteria = new InvoiceCriteria(); $criteria->setServiceType(ServiceType::JUMPSTART_TROUBLESHOOT); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::JUMPSTART_TROUBLESHOOT) . ' ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testJumpstartWarranty() { // TEST SCENARIO: jumpstart warranty $criteria = new InvoiceCriteria(); $criteria->setServiceType(ServiceType::JUMPSTART_WARRANTY); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::JUMPSTART_WARRANTY) . ' ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testOverheatAssistanceWithCoolant() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: overheat assistance with coolant $criteria->setServiceType(ServiceType::OVERHEAT_ASSISTANCE); // set customer vehicle $cv_id = 1306614; $cv = $this->em->getRepository(CustomerVehicle::class)->find($cv_id); $criteria->setCustomerVehicle($cv); $criteria->setHasCoolant(); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::OVERHEAT_ASSISTANCE) . ' WITH COOLANT ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testOverheatAssistanceWithoutCoolant() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: overheat assistance without coolant $criteria->setServiceType(ServiceType::OVERHEAT_ASSISTANCE); // set customer vehicle $cv_id = 1306614; $cv = $this->em->getRepository(CustomerVehicle::class)->find($cv_id); $criteria->setCustomerVehicle($cv); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::OVERHEAT_ASSISTANCE) . ' WITHOUT COOLANT ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testPostRecharged() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: post recharged $criteria->setServiceType(ServiceType::POST_RECHARGED); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::POST_RECHARGED) . ' ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testPostReplacement() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: post replacement $criteria->setServiceType(ServiceType::POST_REPLACEMENT); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::POST_REPLACEMENT) . ' ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testTireRepairWithServiceFee() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: tire repair with service fee $criteria->setServiceType(ServiceType::TIRE_REPAIR); // set customer vehicle $cv_id = 1306612; $cv = $this->em->getRepository(CustomerVehicle::class)->find($cv_id); $criteria->setCustomerVehicle($cv); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::TIRE_REPAIR) . ' WITH SERVICE FEE ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } protected function testTireRepairWithoutServiceFee() { $criteria = new InvoiceCriteria(); // TEST SCENARIO: tire repair no service fee $criteria->setServiceType(ServiceType::TIRE_REPAIR); // set customer vehicle $cv_id = 1306604; $cv = $this->em->getRepository(CustomerVehicle::class)->find($cv_id); $criteria->setCustomerVehicle($cv); $criteria->setIsTaxable(); $rules = $this->inv_manager->check($criteria); // error_log(print_r($rules, true)); $invoice_data = $this->inv_manager->compute($criteria, $rules); foreach ($invoice_data as $data) { $invoice_items = $data['invoice_items']; $total = $data['total']; foreach ($invoice_items as $invoice_item) { error_log('TEST: ' . strtoupper(ServiceType::TIRE_REPAIR) . ' WITHOUT SERVICE FEE ' . $invoice_item->getTitle() . ' ' . $invoice_item->getQuantity() . ' ' . $invoice_item->getPrice()); } error_log('TOTAL ' . print_r(json_encode($total), true)); } } }