/** * Handles order updates and creation. * * @param Request $request * @param Order $order * * @return array */ protected function update(Request $request, Order $order = null) { $formName = $order ? 'marello_order_update' : 'marello_order_order'; if ($order === null) { $order = new Order(); } /* * Copy of original order items collection to be used as a reference to find detached order items. */ $originalItems = new ArrayCollection($order->getItems()->toArray()); $form = $this->createForm($formName, $order); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $manager = $this->getDoctrine()->getManager(); /* * Remove detached order items. */ $originalItems->filter(function (OrderItem $originalItem) use($order) { return false === $order->getItems()->contains($originalItem); })->map(function (OrderItem $orderItem) use($manager) { $manager->remove($orderItem); }); $manager->persist($order); $manager->flush(); return $this->get('oro_ui.router')->redirectAfterSave(['route' => 'marello_order_order_update', 'parameters' => ['id' => $order->getId()]], ['route' => 'marello_order_order_view', 'parameters' => ['id' => $order->getId()]], $order); } return ['entity' => $order, 'form' => $form->createView()]; }
/** * create orders and related entities * * @param array $order * @param int $orderNo * * @return Order */ protected function createOrder(array $order, $orderNo) { $billing = new Address(); $billing->setNamePrefix($order['title']); $billing->setFirstName($order['firstname']); $billing->setLastName($order['lastname']); $billing->setStreet($order['street_address']); $billing->setPostalCode($order['zipcode']); $billing->setCity($order['city']); $billing->setCountry($this->getRepository('OroAddressBundle:Country')->find($order['country'])); $billing->setRegion($this->getRepository('OroAddressBundle:Region')->findOneBy(['combinedCode' => $order['country'] . '-' . $order['state']])); $billing->setPhone($order['telephone_number']); $billing->setEmail($order['email']); $shipping = clone $billing; $orderEntity = new Order($billing, $shipping); $channel = $this->getReference('marello_sales_channel_' . $order['channel']); $orderEntity->setSalesChannel($channel); if ($order['order_ref'] !== 'NULL') { $orderEntity->setOrderReference($order['order_ref']); } $orderEntity->setSubtotal(0)->setTotalTax(0)->setGrandTotal(0)->setOrderNumber(sprintf('%09d', $orderNo + 1)); $this->manager->persist($orderEntity); return $orderEntity; }