setCurrency($package->getCurrency()); $catalog->setInventoriesCurrencyCode($package->getCurrency()); $catalog = $this->joinImportWithOfferProducts($catalog, $package); $catalog = $this->joinImportWithOfferServices($catalog, $package); return $catalog; } /** * Add to services in $catalog prices, count and currency from $package. * Return updated $catalog. * @param CmlCatalog $catalog * @param CmlCatalog $package * @return CmlCatalog */ private function joinImportWithOfferServices($catalog, $package) { $catalogServices = $catalog->getServices(); foreach($catalogServices as $number => $catalogService) { //key need to change product in array foreach($package->getProducts() as $packageInventory) { //in package all inventories as products if($catalogService->compare($packageInventory)) { /* Add price, currency and count of service - and reinitilizate array of services */ $catalogService->mergeImportWithOffer($packageInventory); $catalogServices[$number] = $catalogService; break; //no need search more products } } } /* Reinit catalog services */ $catalog->setServices($catalogServices); return $catalog; } /** * Add to products in $catalog prices, count and currency from $package. * Return updated $catalog. * @param CmlCatalog $catalog * @param CmlCatalog $package * @return CmlCatalog */ private function joinImportWithOfferProducts($catalog, $package) { $catalogProducts = $catalog->getProducts(); foreach($catalogProducts as $number => $catalogProduct) { //key need to change product in array foreach($package->getProducts() as $packageProduct) { //in package all inventories as products if($catalogProduct->compare($packageProduct)) { /* Add price, currency and count of product - and reinitilizate array of products */ $catalogProduct->mergeImportWithOffer($packageProduct); $catalogProducts[$number] = $catalogProduct; break; //no need search more products } } } /* Reinit catalog products */ $catalog->setProducts($catalogProducts); return $catalog; } /** * * @param SimpleXMLElement $documentXml */ private function getConcreceParser($documentXml) { $cmlVersion = (string) $documentXml[CmlParser::CML_VERSION_ATTRIBUTE_NAME]; if($cmlVersion == null) { throw new ParseException("Empty CommerceML version"); } return CmlParserFactory::getParser($cmlVersion); } /** * Parse import and offer of catalog described in xml and return CmlCatalog * representation of parsed documents. If error on parse - throw Exception. * @param String $import * @param String $offer * @return CmlCatalog */ public function parseCatalog($import, $offer) { $importXml = $this->getCommerceData($import); $offerXml = $this->getCommerceData($offer); $concreceParser = $this->getConcreceParser($importXml); $catalog = $concreceParser->parseImport($importXml); $package = $concreceParser->parseOffer($offerXml); return $this->joinImportWithOffer($catalog, $package); } /** * Parse orders described in xml and return array of CmlSalesOrder * @param string $order * @return CmlSalesOrder[] */ public function parseOrders($order) { $ordersXml = $this->getCommerceData($order); $concreceParser = $this->getConcreceParser($ordersXml); return $concreceParser->parseOrders($ordersXml); } }