<?php
namespace App\Controller;
use App\Entity\ImportOrderSummary;
use App\Service\MessageService;
use Psr\Log\LoggerInterface;
use App\Entity\ClassificationFeedbackRaw;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use \DateTime;
use PDO;
use Symfony\Component\Validator\Constraints\Json;
class ImportOrderSummaryAPIController extends AbstractController
{
/**
* @Route("/import-order-summary/api/get-data", name="import_order_summary_api_get_data")
* @IsGranted("ROLE_USER")
* @param Request $request
* @param LoggerInterface $logger
* @param PDO $pdo
* @param MessageService $messageService
* @return Response
*/
public function getData(Request $request, LoggerInterface $logger, PDO $pdo, MessageService $messageService)
{
// load project id from request or exit
$project_id = $request->get('project_id', false);
$import_id = $request->get('import_id', false);
if ($project_id === false || !$import_id) {
exit('missing ids');
}
// load project
$entityManager = $this->getDoctrine()->getManager();
$import_order_summary_array = $entityManager->getRepository(ImportOrderSummary::class)->findBy(array(
"project_id" => $project_id,
"import_id" => $import_id
));
$data = array();
foreach ($import_order_summary_array as $import_order_summary){
$cogs_net = $import_order_summary->getCogsNet();
$cogs_net = !empty($cogs_net) ? number_format($cogs_net, 2, ',', '') : '';
$sum_net = $import_order_summary->getSumNet();
$sum_net = number_format($sum_net, 2, ',', '');
$price_gross = $import_order_summary->getPriceGross();
$price_gross = number_format($price_gross, 2, ',', '');
$data[] = array(
"id" => $import_order_summary->getId(),
"item_id" => $import_order_summary->getItemId(),
"item_name" => $import_order_summary->getItemName(),
"quantity" => $import_order_summary->getQuantity(),
"sum_net" => $sum_net,
"price_gross" => $price_gross,
"category" => $import_order_summary->getCategory(),
"super_category" => $import_order_summary->getSuperCategory(),
"cogs_net" => $cogs_net,
);
}
// prepare data for return
$return = array(
'result' => true,
'message' => 'loaded data successfully',
'data' => $data
);
// return data
return new JsonResponse($return, 200);
}
/**
* @Route("/import-order-summary/api/save-data", name="import_order_summary_api_save_data")
* @IsGranted("ROLE_USER")
* @param Request $request
* @param LoggerInterface $logger
* @param PDO $pdo
* @param MessageService $messageService
* @return Response
*/
public function saveData(Request $request, LoggerInterface $logger, PDO $pdo, MessageService $messageService)
{
// load project id from request or exit
$project_id = $request->get('project_id', false);
$import_id = $request->get('import_id', false);
if ($project_id === false || !$import_id) {
exit('missing ids');
}
$items_to_save = json_decode($request->get('items', false),true);
if (!$items_to_save) {
exit('nothing to save');
}
$entityManager = $this->getDoctrine()->getManager();
foreach($items_to_save as $item_to_save){
$cogs_net = $item_to_save['cogs_net'];
$cogs_net = $cogs_net ? str_replace(',', '.', $cogs_net) * 1 : null;
$import_order_summary = $entityManager->getRepository(ImportOrderSummary::class)->find($item_to_save['id']);
/*
* Write to class.feedback-table if changes
*/
$oldCat = $import_order_summary->getCategory();
if ($oldCat != $item_to_save["category"]) {
$cf = new ClassificationFeedbackRaw();
$cf->setProjectId($project_id);
$cf->setImportId($import_id);
$cf->setItemId($item_to_save["item_id"]);
$cf->setItemName($item_to_save["item_name"]);
$cf->setItemPrice($item_to_save["price_gross"]);
$cf->setClassType("category");
$cf->setPredictedClass($oldCat ?: "");
$cf->setFeedbackClass($item_to_save["category"] ?: "");
$cf->setTimestamp(DateTime::createFromFormat('Y-m-d H:i:s', date('Y-m-d H:i:s')));
$cf->setExport("");
$entityManager->persist($cf);
}
/*
* Write to class.feedback-table if changes
*/
$oldSuperCat =$import_order_summary->getSuperCategory();
if ($oldSuperCat != $item_to_save["super_category"]) {
$scf = new ClassificationFeedbackRaw();
$scf->setProjectId($project_id);
$scf->setImportId($import_id);
$scf->setItemId($item_to_save["item_id"]);
$scf->setItemName($item_to_save["item_name"]);
$scf->setItemPrice($item_to_save["price_gross"]);
$scf->setClassType("super_category");
$scf->setPredictedClass($oldSuperCat ?: "");
$scf->setFeedbackClass($item_to_save["super_category"] ?: "");
$scf->setTimestamp(DateTime::createFromFormat('Y-m-d H:i:s', date('Y-m-d H:i:s')));
$scf->setExport("");
$entityManager->persist($scf);
}
$import_order_summary->setCategory($item_to_save['category']);
$import_order_summary->setSuperCategory($item_to_save['super_category']);
$import_order_summary->setCogsNet($cogs_net);
$import_order_summary->setModified(new \DateTime());
$entityManager->persist($import_order_summary);
$entityManager->flush();
}
// return data
return new JsonResponse(array(
'result' => true,
'message' => 'saved data successfully',
'data' => count($items_to_save)
), 200);
}
/**
* @Route("/import-order-summary/api/categorize-data", name="import_order_summary_api_categorize_data")
* @IsGranted("ROLE_USER")
* @param Request $request
* @param LoggerInterface $logger
* @param PDO $pdo
* @param MessageService $messageService
* @return Response
*/
public function categorizeData(Request $request, LoggerInterface $logger, PDO $pdo, MessageService $messageService)
{
// load project id from request or exit
$project_id = $request->get('project_id', false);
$import_id = $request->get('import_id', false);
if ($project_id === false || !$import_id) {
exit('missing ids');
}
// load project
$entityManager = $this->getDoctrine()->getManager();
$import_order_summary_array = $entityManager->getRepository(ImportOrderSummary::class)->findBy(array(
"project_id" => $project_id,
"import_id" => $import_id
));
$data = $invoices = array();
foreach ($import_order_summary_array as $import_order_summary){
$arr = array();
$cogs_net = $import_order_summary->getCogsNet();
$cogs_net = !empty($cogs_net) ? number_format($cogs_net, 2, ',', '') : '';
$sum_net = $import_order_summary->getSumNet();
$sum_net = number_format($sum_net, 2, ',', '');
$price_gross = $import_order_summary->getPriceGross();
$price_gross = number_format($price_gross, 2, ',', '');
$arr = array(
"id" => $import_order_summary->getId(),
"item_id" => $import_order_summary->getItemId(),
"item_name" => $import_order_summary->getItemName(),
"quantity" => $import_order_summary->getQuantity(),
"sum_net" => $sum_net,
"price_gross" => $price_gross,
"category" => $import_order_summary->getCategory(),
"super_category" => $import_order_summary->getSuperCategory(),
"cogs_net" => $cogs_net
);
$data[] = $arr;
$arr["category_changed"] = 0;
$arr["super_category_changed"] = 0;
$invoices[$import_order_summary->getId()] = $arr;
}
$url = $this->getParameter("categorization_url");
// Initialize cURL session
$ch = curl_init($url);
// Setup request to send JSON via POST
$payload = json_encode($data);
// Set cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Accept: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
// Execute the POST request
$response = curl_exec($ch);
// Check for errors
if ($response === false) {
$error = curl_error($ch);
//echo 'Error: ' . $error;
$return = array(
'code' => 500,
'message' => $error,
'data' => null
);
} else {
$result = json_decode($response,true);
foreach ($result as $k => $v) {
$id = $v['id'];
if($v["category"] != $invoices[$id]["category"] && $v["category"] !== "\u0027\u0027" && $v['category'] !== "''" && $v['category'] !== '' && $v['category'] !== null){
if(strlen($v["category"]) <= 20){
$invoices[$id]["category"] = $v["category"];
$invoices[$id]["category_changed"] = 1;
}
}
if($v["super_category"] != $invoices[$id]["super_category"] && $v["super_category"] !== "\u0027\u0027" && $v['super_category'] !== "''" && $v['super_category'] !== '' && $v['super_category'] !== null){
if(strlen($v["super_category"]) <= 14){
$invoices[$id]["super_category"] = $v["super_category"];
$invoices[$id]["super_category_changed"] = 1;
}
}
}
// Save updated categories
foreach ($invoices as $invoice) {
if (isset($invoice['category_changed']) || isset($invoice['super_category_changed'])) {
$import_order_summary = $this->getDoctrine()
->getRepository(ImportOrderSummary::class)
->find($invoice['id']);
if ($import_order_summary) {
if (isset($invoice['category_changed'])) {
$import_order_summary->setCategory($invoice['category']);
}
if (isset($invoice['super_category_changed'])) {
$import_order_summary->setSuperCategory($invoice['super_category']);
}
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($import_order_summary);
$entityManager->flush();
}
}
}
// prepare data for return
$return = array(
'result' => true,
'message' => 'loaded data successfully',
'data' => array_values($invoices),
'code' => 200
);
}
return new JsonResponse($return, 200);
}
}