/** * @param $apartmentId * @param $amount * @param $dateFrom * @param $dateTo * @param $weekDays * @param $priceType * @param int $setLockPrice * @param $forceLockPrice * @throws \Exception */ public function updatePriceByApartmentId($apartmentId, $amount, $dateFrom, $dateTo, $weekDays, $priceType, $setLockPrice = 0, $forceLockPrice) { /** * @var \DDD\Dao\Apartment\Rate $rateDao * @var \DDD\Dao\Apartment\Inventory $inventoryDao */ $rateDao = $this->getServiceLocator()->get('dao_apartment_rate'); $inventoryDao = $this->getServiceLocator()->get('dao_apartment_inventory'); // get parent rate $parentRateId = $rateDao->getApartmentParentRate($apartmentId); // update parent rate price by range $inventoryDao->updateParentRatePriceByRang($amount, $priceType, $parentRateId['id'], $dateFrom, $dateTo, $weekDays, $forceLockPrice); // get rates without parent rate $rates = $rateDao->getApartmentRatesWithoutParent($apartmentId); $rates = iterator_to_array($rates); // get parent inventory date by range $parentInventoryData = $inventoryDao->getRateInventoryData($apartmentId, $dateFrom, $dateTo, $weekDays, $forceLockPrice); // for check rate date already updated or not $checkRateIdDateCombination = []; foreach ($parentInventoryData as $parentRate) { // get date name $percentField = Helper::getDateWeekType($parentRate['date']); $parentRatePrice = $parentRate['price']; // update all rate without parent foreach ($rates as $rate) { if (isset($checkRateIdDateCombination[$parentRate['date']]) && in_array($rate['id'], $checkRateIdDateCombination[$parentRate['date']])) { continue; } $checkRateIdDateCombination[$parentRate['date']][] = $rate['id']; $childPrice = round($parentRatePrice + $parentRatePrice * $rate[$percentField] / 100, 2); $inventoryDao->update(['price' => $childPrice], ['rate_id' => $rate['id'], 'date' => $parentRate['date']]); } } // set lock price bit $inventoryDao->updateLockPriceBit($apartmentId, $dateFrom, $dateTo, $weekDays, $setLockPrice, $forceLockPrice); }