OpenXE/classes/Modules/Api/Controller/Legacy/OpenTransConnectController.php
2021-05-21 08:49:41 +02:00

412 lines
13 KiB
PHP

<?php
namespace Xentral\Modules\Api\Controller\Legacy;
use TransferOpentrans;
use Xentral\Components\Http\Request;
use Xentral\Components\Http\Response;
use Xentral\Modules\Api\Converter\OpenTransConverter;
use Xentral\Modules\Api\Exception\ResourceNotFoundException;
use Xentral\Modules\Api\LegacyBridge\LegacyApplication;
class OpenTransConnectController
{
/** @var Request $request */
protected $request;
/** @var LegacyApplication $app */
protected $app;
/** @var int $accountId */
protected $accountId;
/**
* @param LegacyApplication $app
* @param Request $request
*/
public function __construct(LegacyApplication $app, OpenTransConverter $converter, Request $request, $accountId)
{
$this->request = $request;
$this->converter = $converter;
$this->app = $app;
$this->accountId = $accountId;
}
/**
* @return Response
*/
public function deleteOrder()
{
$orderId = $this->getDoctypeIdByRequestAttributes('order');
$transferOpenTrans = $this->getTransferObject();
list($result, $statusCode, $rootNode) = $transferOpenTrans->deleteOrder($orderId);
if(is_array($result)) {
$result = $this->converter->arrayToXml($result, $rootNode);
}
if(empty($result)) {
throw new ResourceNotFoundException('Auftrag konnte nicht gelöscht werden');
}
return $this->sendResponse($result,$statusCode);
}
/**
* @param string $doctype
*
* @return int
*/
protected function getDoctypeIdByRequestAttributes($doctype = 'deliverynote')
{
$id = (int)$this->request->attributes->get('id');
$orderId = $this->request->attributes->get('orderid');
$ordernumber = $orderId > 0?'':$this->request->attributes->get('ordernumber');
$extOrder = $orderId > 0 || !empty($ordernumber)?'':$this->request->attributes->get('extorder');
if($id > 0) {
return $id;
}
if(!empty($ordernumber)) {
$orderId = $this->app->DB->Select(
sprintf(
"SELECT id FROM auftrag WHERE belegnr = '%s' AND belegnr <> '' LIMIT 1",
$this->app->DB->real_escape_string($ordernumber)
)
);
if(empty($orderId)) {
throw new ResourceNotFoundException(sprintf('Auftrag mit Belegnr \'%s\' nicht gefunden', $ordernumber));
}
}
if(!empty($extOrder)) {
$orderId = $this->app->DB->Select(
sprintf(
"SELECT id FROM auftrag WHERE internet = '%s' AND internet <> '' LIMIT 1",
$this->app->DB->real_escape_string($extOrder)
)
);
if(empty($orderId)) {
throw new ResourceNotFoundException(sprintf('Auftrag mit Externer Belegnr \'%s\' nicht gefunden', $extOrder));
}
}
if(!empty($orderId)) {
switch($doctype) {
case 'order':
return $orderId;
break;
case 'invoice':
$id = $this->app->DB->Select(
sprintf(
"SELECT id FROM rechnung WHERE auftragid = %d ORDER BY status = 'storniert' LIMIT 1",
$orderId
)
);
if(!empty($id)) {
return $id;
}
throw new ResourceNotFoundException(
sprintf('Rechnung mit Order-ID \'%s\' nicht gefunden',
$orderId
)
);
break;
case 'deliverynote':
default:
$id = $this->app->DB->Select(
sprintf(
"SELECT id FROM lieferschein WHERE auftragid = %d ORDER BY status = 'storniert' LIMIT 1",
$orderId
)
);
if(!empty($id)) {
return $id;
}
throw new ResourceNotFoundException(
sprintf('Lieferschein mit Order-ID \'%s\' nicht gefunden',
$orderId
)
);
break;
}
}
return $id;
}
/**
* @return Response
*/
public function readDispatchnotification()
{
$deliveryNoteId = $this->getDoctypeIdByRequestAttributes('deliverynote');
$transferOpenTrans = $this->getTransferObject();
list($result, $statusCode, $rootNode) = $transferOpenTrans->getDispatchnotification($deliveryNoteId);
if(is_array($result)) {
$result = $this->converter->arrayToXml($result, $rootNode);
}
if(empty($result)) {
throw new ResourceNotFoundException(
sprintf('Lieferschein mit ID \'%s\' nicht gefunden',
$deliveryNoteId
)
);
}
return $this->sendResponse($result,$statusCode);
}
/**
* @param int $apiId
* @param string $request
* @param string $type
* @param bool $isIncoming
* @param string $doctype
* @param string $status
* @param int $doctypeId
*
* @return int
*/
protected function insertApiRequestLog(
$apiId, $request, $type, $isIncoming, $doctype, $status = '', $doctypeId = 0
)
{
$this->app->DB->Insert(
sprintf(
"INSERT INTO `api_request_response_log`
(api_id, raw_request, raw_response, type, status, doctype, doctype_id, is_incomming, created_at)
VALUES (%d, '%s', '%s', '%s', '%s','%s',%d,%d,NOW()) ",
$apiId,
($isIncoming?$this->app->DB->real_escape_string($request):''),
(!$isIncoming?$this->app->DB->real_escape_string($request):''),
$this->app->DB->real_escape_string($type),
$this->app->DB->real_escape_string($status),
$this->app->DB->real_escape_string($doctype),
$doctypeId,
$isIncoming
)
);
return (int)$this->app->DB->GetInsertID();
}
/**
* @param int $logId
* @param string $status
*/
protected function setLogStatus($logId, $status)
{
$this->app->DB->Update(
sprintf(
"UPDATE `api_request_response_log` SET `status` = '%s' WHERE `id` = %d",
$this->app->DB->real_escape_string($status),
$logId
)
);
}
/**
* @param int $logId
* @param int $doctypeId
*/
protected function setLogDoctypeId($logId, $doctypeId)
{
$this->app->DB->Update(
sprintf(
'UPDATE `api_request_response_log` SET `doctype_id` = %d WHERE `id` = %d',
$doctypeId,
$logId
)
);
}
/**
* @return Response
*/
public function createOrder()
{
$transferOpenTrans = $this->getTransferObject();
if(!empty($this->accountId)) {
$transferOpenTrans->setApiId($this->accountId);
}
$post = $this->request->getContent();
if(empty($post)) {
throw new ResourceNotFoundException('Data is empty');
}
$logId = $this->insertApiRequestLog($this->accountId, $post, 'create_order',true,'auftrag');
$xml = $this->converter->getXmlFromString($post);
if(empty($xml)) {
$this->setLogStatus($logId, 'error');
throw new ResourceNotFoundException('Data is no valid Xml');
}
list($result, $statusCode, $rootNode, $orderId) = $transferOpenTrans->createOrder($xml);
if(!empty($orderId)) {
$this->setLogDoctypeId($logId, $orderId);
}
if(is_array($result)) {
$result = $this->converter->arrayToXml($result, $rootNode);
}
if(empty($result)) {
$this->setLogStatus($logId, 'error');
throw new ResourceNotFoundException('Auftrag konnte nicht erstellt werden');
}
if($statusCode === Response::HTTP_CREATED) {
$this->setLogStatus($logId, 'ok');
}
else {
$this->setLogStatus($logId, 'error');
}
return $this->sendResponse($result,$statusCode);
}
/**
* @return Response
*/
public function updateDispatchnotification()
{
$deliveryNoteId = $this->getDoctypeIdByRequestAttributes('deliverynote');
$post = $this->request->getContent();
if(empty($post)) {
throw new ResourceNotFoundException('Data is empty');
}
$logId = $this->insertApiRequestLog(
$this->accountId, $post, 'update_dispatchnotification',true,'lieferschein','', $deliveryNoteId
);
$xml = $this->converter->getXmlFromString($post);
if(empty($xml)) {
$this->setLogStatus($logId, 'error');
throw new ResourceNotFoundException('Data is no valid Xml');
}
$transferOpenTrans = $this->getTransferObject();
list($result, $statusCode, $rootNode) = $transferOpenTrans->updateDispatchnotification($deliveryNoteId, $xml);
if(is_array($result)) {
$result = $this->converter->arrayToXml(
$result,
$rootNode
);
}
if($statusCode === Response::HTTP_OK) {
$this->setLogStatus($logId, 'ok');
}
return $this->sendResponse($result,$statusCode);
}
/**
* @return Response
*/
public function readInvoice()
{
$invoiceId = $this->getDoctypeIdByRequestAttributes('invoice');
$transferOpenTrans = $this->getTransferObject();
list($result, $statusCode, $rootNode) = $transferOpenTrans->getInvoice($invoiceId);
if(is_array($result)) {
$result = $this->converter->arrayToXml(
$result,
$rootNode
);
}
if(empty($result)) {
throw new ResourceNotFoundException(sprintf('Rechnung mit ID \'%s\' nicht gefunden', $invoiceId));
}
return $this->sendResponse($result,$statusCode);
}
/**
* @return Response
*/
public function readOrder()
{
$orderId = $this->getDoctypeIdByRequestAttributes('order');
$transferOpenTrans = $this->getTransferObject();
list($result,$statusCode, $rootNode) = $transferOpenTrans->getOrder($orderId);
if(is_array($result)) {
$result = $this->converter->arrayToXml
(
$result,
$rootNode
);
}
if(empty($result)) {
throw new ResourceNotFoundException(sprintf('Auftrag mit ID \'%s\' nicht gefunden', $orderId));
}
return $this->sendResponse($result,$statusCode);
}
public function updateOrder()
{
$orderId = $this->getDoctypeIdByRequestAttributes('order');
$transferOpenTrans = $this->getTransferObject();
$order = $transferOpenTrans->getOrderArr($orderId);
if(empty($order)) {
throw new ResourceNotFoundException(sprintf('Auftrag mit ID \'%s\' nicht gefunden', $orderId));
}
$post = $this->request->getContent();
$logId = $this->insertApiRequestLog(
$this->accountId, $post, 'update_order',true,'auftrag','', $orderId
);
$arr = $this->converter->toArray($post);
if(empty($arr)) {
$this->setLogStatus($logId, 'error');
throw new ResourceNotFoundException('XML konnte nicht geparsed werden');
}
}
/**
* @param string $data
* @param string $contentType [xml|json]
* @param int $statusCode HTTP-Statuscode
*
* @return Response
*/
protected function sendResponse($data, $contentType, $statusCode = Response::HTTP_OK)
{
return new Response(
$data,
$statusCode,
['Content-Type' => 'application/xml; charset=UTF-8']
);
}
/**
* @return TransferOpentrans
*/
private function getTransferObject()
{
$id = (int)$this->app->DB->Select(
"SELECT id FROM uebertragungen_account WHERE aktiv = 1 AND xml_pdf = 'TransferOpenTrans' AND id = %d LIMIT 1",
$this->accountId
);
if($id < 0) {
throw new ResourceNotFoundException('TransferOpenTrans Module not found');
}
/** @var \Uebertragungen $transferObject */
$transferObject = $this->app->loadModule('uebertragungen');
if(empty($transferObject)) {
throw new ResourceNotFoundException('TransferOpenTrans Module not found');
}
return $transferObject->LoadTransferModul('TransferOpentrans', $id);
}
}