em = $em ; $this->documentRepository = $this->em->getRepository($this->em->getClassMetadata(DocumentInterface::class)->getName()) ; $this->merchantUtils = $merchantUtils ; } public function generateReference($documentType) { $prefix = ''; if($documentType == Document::TYPE_DELIVERY_NOTE) { $prefix = 'BL'; } elseif($documentType == Document::TYPE_PURCHASE_ORDER) { $prefix = 'BC'; } elseif($documentType == Document::TYPE_INVOICE) { $prefix = 'FA'; } elseif($documentType == Document::TYPE_QUOTATION) { $prefix = 'DE'; } $oneDocumentExist = $this->documentRepository->findOneBy([ 'status' => 1, 'type' => $documentType, 'merchant' => $this->merchantUtils->getMerchantCurrent() ], [ 'reference' => 'DESC' ]); if ($oneDocumentExist) { $reference = $oneDocumentExist->getReference(); $pattern = '#([A-Z]+)?([0-9]+)#'; preg_match($pattern, $reference, $matches, PREG_OFFSET_CAPTURE); $sizeNumReference = strlen($matches[2][0]); $numReference = ((int)$matches[2][0]) + 1; $numReference = str_pad($numReference, $sizeNumReference, '0', STR_PAD_LEFT); return $prefix . $numReference; } else { return $prefix . '00001'; } } public function createDocument($params = []) { $documentClass = $this->em->getClassMetadata(DocumentInterface::class)->getName(); $document = new $documentClass ; if(isset($params['merchant'])) { $document->setMerchant($params['merchant']) ; } elseif(isset($params['order_shops'])) { $document->setMerchant($params['order_shops'][0]->getMerchant()) ; } if(isset($params['order_shops'])) { foreach ($params['order_shops'] as $orderShop) { $document->addOrderShop($orderShop); } } $document->setType($params['type']) ; $document->setTitle($params['title']) ; $document->setStatus((isset($params['status'])) ? $params['status'] : 1) ; $document->setReference($this->generateReference($params['type'])) ; $document->setMerchantAddress($params['merchant_address']) ; $document->setBuyerAddress($params['buyer_address']) ; $document->setMerchantAddressText($params['merchant_address']->getSummary()) ; $document->setBuyerAddressText($params['buyer_address']->getSummary()) ; $document->setCreatedBy($params['created_by']) ; $document->setUpdatedBy($params['created_by']) ; $this->em->persist($document); $this->em->flush() ; return $document ; } }