/** * @param Listing $baseListing * @param Listing $listingToMerge * @param array $selectedCollisionItems * @param \App\Model\Entities\User|int|null $user * @return Listing * @throws NoCollisionListingItemSelectedException * @throws \DibiException */ public function mergeListings(Listing $baseListing, Listing $listingToMerge, array $selectedCollisionItems = [], $user = null) { $this->checkListingValidity($baseListing); $this->checkListingValidity($listingToMerge); if (!$this->haveListingsSamePeriod($baseListing, $listingToMerge)) { throw new InvalidArgumentException('Given Listings must have same Period(Year and Month).'); } $userID = $this->getIdOfSignedInUserOnNull($user); $items = $this->itemService->getMergedListOfItems($baseListing, $listingToMerge, $selectedCollisionItems); try { $this->transaction->begin(); $newListing = new Listing($baseListing->year, $baseListing->month, $userID); $this->saveListing($newListing); $this->itemService->setListingForGivenItems($items, $newListing); $this->listingItemRepository->saveListingItems($items); $this->transaction->commit(); return $newListing; } catch (\DibiException $e) { $this->transaction->rollback(); Debugger::log($e, Debugger::ERROR); throw $e; } }
/** * @param Listing $listing * @return ListingItemDecorator[] */ public function generateEntireTable(Listing $listing) { $listing->checkEntityState(); $collectionOfDecorators = $this->createListingItemDecoratorsCollection($listing->listingItems); return $this->itemService->generateListingItemDecoratorsForEntireTable($collectionOfDecorators, $listing->getPeriod()); }