<?php
namespace EADPlataforma\Controller\Admin;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use EADPlataforma\Entity\Product;
use EADPlataforma\Entity\ProductOffer;
use EADPlataforma\Entity\ProductPage;
use EADPlataforma\Entity\ProductTeam;
use EADPlataforma\Entity\Category;
use EADPlataforma\Entity\Course;
use EADPlataforma\Entity\Faq;
use EADPlataforma\Entity\Group;
use EADPlataforma\Entity\CycleItem;
use EADPlataforma\Entity\Enrollment;
use EADPlataforma\Entity\User;
use EADPlataforma\Entity\UserSubscription;
use EADPlataforma\Enum\ProductEnum;
use EADPlataforma\Enum\ProductPageEnum;
use EADPlataforma\Enum\ProductTeamEnum;
use EADPlataforma\Enum\ProductOfferEnum;
use EADPlataforma\Enum\UserSubscriptionEnum;
use EADPlataforma\Enum\ErrorEnum;
/**
* @Route(
* path = "/admin/product",
* schemes = {"http|https"}
* )
* @Cache(
* maxage = "0",
* smaxage = "0",
* expires = "now",
* public = false
* )
*/
class ProductController extends AbstractController {
public function getEntityClass(){
return Product::class;
}
/**
* @Route(
* path = "/list/",
* methods = {"GET"},
* )
*/
public function getProductPaginate(Request $request) {
$p1 = $this->userPermissionUtil->getPermission("product", "see");
$p2 = $this->userPermissionUtil->getPermission(
"product", "product_coupon", "create"
);
$p3 = $this->userPermissionUtil->getPermission(
"product", "product_coupon", "edit"
);
if(
$this->userPermissionUtil->isLow($p1) &&
$this->userPermissionUtil->isLow($p2) &&
$this->userPermissionUtil->isLow($p3)
){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$userOnId = $this->user->getId();
$userClass = User::class;
$productTeamClass = ProductTeam::class;
$productOfferClass = ProductOffer::class;
$courseClass = Course::class;
$categoryClass = Category::class;
$columns = [
"p.id",
"p.status",
"p.title",
"p.order",
"p.type",
"u.name",
"u.photo",
"u.email",
"u.id AS userId",
"DATE_FORMAT(p.dateDelete, '%Y-%m-%d %H:%i:%s') AS dateDelete",
"ud.name AS userDelete"
];
$columnNotUseInFilter = [
"(CASE WHEN p.id IN (
SELECT
IDENTITY(pt.product)
FROM {$productTeamClass} AS pt
WHERE pt.deleted = 0
AND pt.user = {$userOnId}
) THEN 1 ELSE 0 END ) AS isInTeam "
];
$joins = [
"{$userClass} AS u" => "u.id = p.user",
"{$userClass} AS ud" => ["LEFT", "ud.id = p.userDelete"]
];
$courseIdNotInclude = (int)$this->requestUtil->getField('courseIdNotInclude');
if($courseIdNotInclude > 0){
$courseType = ProductEnum::COURSE;
$joins["{$courseClass} AS c"] = "
p NOT MEMBER OF c.product
AND c.deleted = 0
AND c.id = {$courseIdNotInclude}
AND ( SIZE(p.course) = 0 OR p.type != {$courseType} )
";
}
$courseId = $this->requestUtil->getField('course');
if($courseId > 0){
$joins["{$courseClass} AS c"] = "
p MEMBER OF c.product
AND c.deleted = 0
AND c.id = {$courseId} ";
}
$categoryId = $this->requestUtil->getField('category');
if($categoryId > 0){
$joins["{$categoryClass} AS cat"] = "
p MEMBER OF cat.product
AND cat.deleted = 0
AND cat.id = {$categoryId} ";
}
$filter = [];
$filterDelete = $this->requestUtil->getDeletedParam();
$filter["whereText"] = " p.id > 0 ";
if(
!$this->userPermissionUtil->isHigh($p1) &&
!$this->userPermissionUtil->isHigh($p2) &&
!$this->userPermissionUtil->isHigh($p3)
){
$filter["whereText"] .= " AND p.id IN (
SELECT
IDENTITY(pteam.product)
FROM {$productTeamClass} AS pteam
WHERE pteam.deleted = 0
AND pteam.user = {$userOnId}
) ";
}
$productId = (int)$this->requestUtil->getField('product');
$status = $this->requestUtil->getField('status');
$type = (int)$this->requestUtil->getField('type');
$isCharge = (int)$this->requestUtil->getField('isCharge');
$hasOffer = (int)$this->requestUtil->getField('hasOffer');
$types = json_decode($this->requestUtil->getField('types'));
$isOrderBump = (int)$this->requestUtil->getField('isOrderBump');
$orderParam = $this->requestUtil->getField('order');
$searchText = $this->requestUtil->getField('searchText');
$limit = (int)$this->requestUtil->getField('limit');
$offset = (int)$this->requestUtil->getField('offset');
$yes = ProductEnum::YES;
$offerDeleted = ProductOfferEnum::ITEM_NO_DELETED;
$offerPublished = ProductOfferEnum::PUBLISHED;
$draft = ProductEnum::DRAFT;
if($isCharge == ProductEnum::YES){
$filter["whereText"] .= "
AND p.status != {$draft}
AND p.id IN (
SELECT
IDENTITY(po.product)
FROM {$productOfferClass} AS po
WHERE po.deleted = {$offerDeleted}
AND po.status = {$offerPublished}
)
";
}
if($hasOffer == ProductEnum::YES){
$filter["whereText"] .= "
AND p.status != {$draft}
AND p.id IN (
SELECT
IDENTITY(po.product)
FROM {$productOfferClass} AS po
WHERE po.deleted = {$offerDeleted}
AND po.status = {$offerPublished}
)
";
}
$free = ProductOfferEnum::FREE;
if($isOrderBump == ProductEnum::YES){
$filter["whereText"] .= "
AND p.status != {$draft}
AND p.id IN (
SELECT
IDENTITY(po.product)
FROM {$productOfferClass} AS po
WHERE po.deleted = {$offerDeleted}
AND po.status = {$offerPublished}
AND po.saleOption != {$free}
)
";
}
if(!empty($userId)){
$filter["p.user"] = $userId;
}
if(!empty($productId)){
$filter["p.id"] = $productId;
}
if(!is_null($status) && is_numeric($status)){
$filter["p.status"] = $status;
}
if(!empty($type)){
$filter["p.type"] = $type;
}
if(!empty($types) && is_array($types)){
$typesFilter = null;
$typesFilter .= ' AND ( ';
foreach ($types as $key => $value) {
if($key == 0){
$typesFilter .= " p.type = {$value} ";
}else{
$typesFilter .= " OR p.type = {$value} ";
}
}
$typesFilter .= ' ) ';
$filter["whereText"] .= $typesFilter;
}
$order = [ "p.order" => "DESC" ];
if(!empty($orderParam)){
$order = json_decode($orderParam, true);
}
$data = $this->repository->paginate(
"p",
$searchText,
$columns,
$joins,
$filter,
$order,
$limit,
$offset,
$filterDelete,
false,
$columnNotUseInFilter
);
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/list/related",
* methods = {"GET"},
* )
*/
public function getProductRelated(Request $request) {
$permission = $this->userPermissionUtil->getPermission("product", "see");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$productId = (int)$request->get('product');
$products = $this->repository->getProductRelated($productId);
return $this->eadResponse($products);
}
/**
* @Route(
* path = "/list/select",
* methods = {"GET"},
* )
*/
public function getProductToSelect(Request $request) {
$permission = $this->userPermissionUtil->getPermission("product", "see");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$type = (int)$this->requestUtil->getField('type');
$products = $this->repository->getProductToSelect($type);
return $this->eadResponse($products);
}
/**
* @Route(
* path = "/check/user/{id}",
* methods = {"GET"},
* requirements = { "id" = "\d+" }
* )
*/
public function checkIsInProduct(Request $request){
$productId = $request->get('id');
$product = $this->repository->findOneBy([
"id" => $productId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if (!$product) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$isInTeam = $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
$product,
$this->user
);
return $this->eadResponse([ "is" => ( $isInTeam ? 1 : 0 ) ]);
}
/**
* @Route(
* path = "/check/link/{productLink}",
* methods = {"GET"}
* )
*/
public function checkExistProductLink(Request $request){
$productLink = $request->get('productLink');
$productLink = $this->stringUtil->slug($productLink);
$product = $this->repository->findOneBy([
"productLink" => $productLink,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
return $this->eadResponse([ "exist" => ( $product ? 1 : 0 ) ]);
}
/**
* @Route(
* path = "/detail/{id}",
* methods = {"GET"},
* requirements = { "id" = "\d+" }
* )
*/
public function getProduct(Request $request) {
$permission = $this->userPermissionUtil->getPermission("product", "see");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$ignoreOption = $this->requestUtil->getField('ignoreOption');
$productId = $request->get('id');
if($ignoreOption == ProductEnum::ITEM_ON_TRASH){
$product = $this->repository->findOneBy([
"id" => $productId
]);
}
if($ignoreOption == ProductEnum::ITEM_NO_DELETED || !$ignoreOption){
$product = $this->repository->findOneBy([
"id" => $productId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
}
if (!$product) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$productTeamRepository = $this->em->getRepository(ProductTeam::class);
$isInTeam = $productTeamRepository->userExistInProductTeam(
$product,
$this->user
);
if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$productTeam = $productTeamRepository->findOneBy([
"product" => $product->getId(),
"user" => $product->getUser()->getId(),
"deleted" => ProductTeamEnum::ITEM_NO_DELETED
]);
$data = $product->toReturn();
$data['productTeam'] = ($productTeam ? $productTeam->getId() : null);
$data['isInTeam'] = $isInTeam;
$data['urlProductPage'] = "{$this->eadDomain}{$product->getProductTypeText()}/";
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/certificate/origin/{id}",
* methods = {"GET"},
* defaults = {"id": null}
* )
*/
public function getProductCertificateOrigin(Request $request) {
$p1 = $this->userPermissionUtil->getPermission("product", "see");
$p2 = $this->userPermissionUtil->getPermission("product", "create");
$p3 = $this->userPermissionUtil->getPermission("product", "general");
if(
$this->userPermissionUtil->isLow($p1) &&
$this->userPermissionUtil->isLow($p2) &&
$this->userPermissionUtil->isLow($p3)
){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$productId = (int)$request->get('id');
$product = $this->repository->findOneBy([
"id" => $productId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
$data = $this->em->getRepository(Enrollment::class)->getEnrollmentOrigins();
$dataSave = null;
if ($product) {
$isInTeam = $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
$product,
$this->user
);
if(
!$isInTeam &&
$this->userPermissionUtil->isMiddle($p1) &&
$this->userPermissionUtil->isMiddle($p2) &&
$this->userPermissionUtil->isMiddle($p3)
){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$dataSave = $product->getCertificateEnrollmentOrigin();
}
if(!empty($dataSave)){
$dataSave = json_decode($dataSave);
if(is_array($dataSave)){
foreach ($data as $key => $item) {
if(in_array($item->id, $dataSave)){
$data[$key]->selected = ProductEnum::YES;
}
}
}
}
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/register",
* methods = {"POST"},
* )
*/
public function registerProduct(Request $request) {
$permission = $this->userPermissionUtil->getPermission("product", "create");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$product = new Product();
if($this->requestUtil->issetField('user')){
$userId = $this->requestUtil->getField('user');
if($userId > 0 && $this->userPermissionUtil->isHigh($permission)){
$user = $this->em->getRepository(User::class)->findOneBy([
"id" => $userId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if($user){
$product->setUser($user);
}
}else if($userId == $this->user->getId()){
$course->setUser($this->user);
}
}else{
$product->setUser($this->user);
}
if($this->requestUtil->issetField('cycleItem')){
$cycleItem = $this->em->getRepository(CycleItem::class)->findOneBy([
"id" => $this->requestUtil->getField('cycleItem'),
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if($cycleItem){
$product->setCycleItem($cycleItem);
}
}
if($this->requestUtil->issetField('group')){
$group = $this->em->getRepository(Group::class)->findOneBy([
"id" => $this->requestUtil->getField('group'),
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if($group){
$product->setGroup($group);
}
}
$categories = json_decode(
$this->requestUtil->getField('productCategory', $request)
);
if(!empty($categories)){
$categoryRepository = $this->em->getRepository(Category::class);
foreach ($categories as $key => $categoryId) {
$category = $categoryRepository->findOneBy([
"id" => $categoryId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if($category){
$product->addCategory($category);
}
}
}
$productRelatedArr = json_decode(
$this->requestUtil->getField('productRelated', $request)
);
$product->removeAllProductRelated();
if(!empty($productRelatedArr)){
foreach ($productRelatedArr as $key => $productRelatedId) {
$productRelated = $this->repository->findOneBy([
"id" => $productRelatedId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if($productRelated){
$product->addProductRelated($productRelated);
}
}
}
if($this->requestUtil->issetField('certificateEnrollmentOrigin')){
$product->setCertificateEnrollmentOrigin(
$this->requestUtil->getField('certificateEnrollmentOrigin')
);
}
if($this->requestUtil->issetField('type')){
$product->setType((int)$this->requestUtil->getField('type'));
}
if($this->requestUtil->issetField('title')){
$product->setTitle($this->requestUtil->getField('title'));
}
if($this->requestUtil->issetField('description')){
$product->setDescription($this->requestUtil->getField('description'));
}
if($this->requestUtil->issetField('spotlight')){
$product->setSpotlight((int)$this->requestUtil->getField('spotlight'));
}
if($this->requestUtil->issetField('planSpotlight')){
$product->setPlanSpotlight((int)$this->requestUtil->getField('planSpotlight'));
}
if($this->requestUtil->issetField('executeScriptTypeNative')){
$product->setExecuteScriptTypeNative(
(int)$this->requestUtil->getField('executeScriptTypeNative')
);
}
if($this->requestUtil->issetField('executeScriptTypeGlobal')){
$product->setExecuteScriptTypeGlobal(
(int)$this->requestUtil->getField('executeScriptTypeGlobal')
);
}
if($this->requestUtil->issetField('executeScriptStatusApproved')){
$product->setExecuteScriptStatusApproved(
(int)$this->requestUtil->getField('executeScriptStatusApproved')
);
}
if($this->requestUtil->issetField('executeScriptStatusWaiting')){
$product->setExecuteScriptStatusWaiting(
(int)$this->requestUtil->getField('executeScriptStatusWaiting')
);
}
if($this->requestUtil->issetField('executeScriptStatusCanceled')){
$product->setExecuteScriptStatusCanceled(
(int)$this->requestUtil->getField('executeScriptStatusCanceled')
);
}
if($this->requestUtil->issetField('executeScriptCard')){
$product->setExecuteScriptCard(
(int)$this->requestUtil->getField('executeScriptCard')
);
}
if($this->requestUtil->issetField('executeScriptPix')){
$product->setExecuteScriptPix(
(int)$this->requestUtil->getField('executeScriptPix')
);
}
if($this->requestUtil->issetField('executeScriptBill')){
$product->setExecuteScriptBill(
(int)$this->requestUtil->getField('executeScriptBill')
);
}
if($this->requestUtil->issetField('conversionScript')){
$product->setConversionScript($this->requestUtil->getField('conversionScript'));
}
if($this->requestUtil->issetField('contract')){
$product->setContract($this->requestUtil->getField('contract'));
}
$lastOrder = $this->repository->count([
"deleted" => ProductEnum::ITEM_NO_DELETED
]) + 1;
$product->setOrder($lastOrder);
$hash = uniqid();
$product->setProductLink("{$product->getTitle()}-{$hash}");
$groupsValidation = [];
if(
ProductEnum::PERIOD == $product->getType() ||
ProductEnum::SUPPORT == $product->getType()
){
$groupsValidation[] = "isCycle";
}else if(ProductEnum::GROUP == $product->getType()){
$groupsValidation[] = "isGroup";
}
if($product->getPlanSpotlight() == ProductEnum::YES){
$this->repository->updatePlanSpotlight();
}
$errors = $this->validateEntity($product, $groupsValidation);
if($errors){
return $this->eadResponse($errors, ErrorEnum::FIELD_EMPTY);
}
$this->repository->refreshOrder(null, $lastOrder);
$productTeam = new ProductTeam();
$productTeam->setProduct($product);
$productTeam->setUser($product->getUser());
$productPage = new ProductPage();
$productPage->setProduct($product);
$productPage->setName($product->getTitle());
$productPage->setTitle($product->getTitle());
$productPage->setStatus(ProductPageEnum::PUBLISHED);
$productPage->setDefault(ProductPageEnum::YES);
$productPage->setType(ProductPageEnum::TYPE_DEFAULT);
$productPage->setDescription($product->getDescription());
$filePhoto = $this->requestUtil->getFile('photo');
if($filePhoto){
$filePhoto = $this->fileService->setFile($filePhoto);
if($filePhoto){
$this->fileService->moveFile(ProductEnum::PATH_PRODUCT_PHOTO);
$productPage->setPhoto($this->fileService->getFileName());
}
}
$this->em->persist($product);
$this->em->persist($productTeam);
$this->em->persist($productPage);
$this->em->flush();
$crmService = $this->generalService->getService('CRM\\CrmService');
$crmService->saveProduct($product);
$data = $product->toReturn();
$this->userLogService->logInsert(
"product_page",
$productPage->getId(),
$productPage->toReturn()
);
$this->userLogService->logInsert("product", $product->getId(), $data);
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/edit/general/{id}",
* methods = {"PUT"},
* requirements = { "id" = "\d+" }
* )
*/
public function editProductGeneral(Request $request) {
$permission = $this->userPermissionUtil->getPermission("product", "edit_general");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$productId = $request->get('id');
$product = $this->repository->findOneBy([
"id" => $productId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if (!$product) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$isInTeam = $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
$product,
$this->user
);
if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
if($this->requestUtil->issetField('user')){
$user = $this->em->getRepository(User::class)->findOneBy([
"id" => $this->requestUtil->getField('user'),
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if($user){
$product->setUser($user);
}
}
if($this->requestUtil->issetField('productTeam')){
$productTeamId = $this->requestUtil->getField('productTeam');
if($productTeamId > 0 && $this->userPermissionUtil->isHigh($permission)){
$productTeam = $this->em->getRepository(ProductTeam::class)->findOneBy([
"id" => $productTeamId,
"product" => $product->getId(),
"deleted" => ProductTeamEnum::ITEM_NO_DELETED
]);
if($productTeam){
$product->setUser($productTeam->getUser());
}
}
}
if($this->requestUtil->issetField('cycleItem')){
$cycleItem = $this->em->getRepository(CycleItem::class)->findOneBy([
"id" => $this->requestUtil->getField('cycleItem'),
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if($cycleItem){
$product->setCycleItem($cycleItem);
}
}
if($this->requestUtil->issetField('group')){
$group = $this->em->getRepository(Group::class)->findOneBy([
"id" => $this->requestUtil->getField('group'),
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if($group){
$product->setGroup($group);
}
}
if($this->requestUtil->issetField('productCategory')){
$categories = json_decode(
$this->requestUtil->getField('productCategory', $request)
);
$product->removeAllCategory();
if(!empty($categories)){
$categoryRepository = $this->em->getRepository(Category::class);
foreach ($categories as $key => $categoryId) {
$category = $categoryRepository->findOneBy([
"id" => $categoryId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if($category){
$product->addCategory($category);
}
}
}
}
if($this->requestUtil->issetField('productRelated')){
$productRelatedArr = json_decode(
$this->requestUtil->getField('productRelated', $request)
);
$product->removeAllProductRelated();
if(!empty($productRelatedArr)){
foreach ($productRelatedArr as $key => $productRelatedId) {
$productRelated = $this->repository->findOneBy([
"id" => $productRelatedId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if($productRelated){
$product->addProductRelated($productRelated);
}
}
}
}
$oldOrder = $product->getOrder();
if($this->requestUtil->issetField('order')){
$product->setOrder((int)$this->requestUtil->getField('order'));
}
if($this->requestUtil->issetField('status')){
$product->setStatus((int)$this->requestUtil->getField('status'));
}
if($this->requestUtil->issetField('productLink')){
$product->setProductLink($this->requestUtil->getField('productLink'));
}
if($this->requestUtil->issetField('certificateEnrollmentOrigin')){
$product->setCertificateEnrollmentOrigin(
$this->requestUtil->getField('certificateEnrollmentOrigin')
);
}
if($this->requestUtil->issetField('type')){
$product->setType((int)$this->requestUtil->getField('type'));
}
if($this->requestUtil->issetField('title')){
$product->setTitle($this->requestUtil->getField('title'));
}
if($this->requestUtil->issetField('description')){
$product->setDescription($this->requestUtil->getField('description'));
}
if($this->requestUtil->issetField('spotlight')){
$product->setSpotlight((int)$this->requestUtil->getField('spotlight'));
}
if($this->requestUtil->issetField('planSpotlight')){
$product->setPlanSpotlight((int)$this->requestUtil->getField('planSpotlight'));
}
if($this->requestUtil->issetField('executeScriptTypeNative')){
$product->setExecuteScriptTypeNative(
(int)$this->requestUtil->getField('executeScriptTypeNative')
);
}
if($this->requestUtil->issetField('executeScriptTypeGlobal')){
$product->setExecuteScriptTypeGlobal(
(int)$this->requestUtil->getField('executeScriptTypeGlobal')
);
}
if($this->requestUtil->issetField('executeScriptStatusApproved')){
$product->setExecuteScriptStatusApproved(
(int)$this->requestUtil->getField('executeScriptStatusApproved')
);
}
if($this->requestUtil->issetField('executeScriptStatusWaiting')){
$product->setExecuteScriptStatusWaiting(
(int)$this->requestUtil->getField('executeScriptStatusWaiting')
);
}
if($this->requestUtil->issetField('executeScriptStatusCanceled')){
$product->setExecuteScriptStatusCanceled(
(int)$this->requestUtil->getField('executeScriptStatusCanceled')
);
}
if($this->requestUtil->issetField('executeScriptCard')){
$product->setExecuteScriptCard(
(int)$this->requestUtil->getField('executeScriptCard')
);
}
if($this->requestUtil->issetField('executeScriptPix')){
$product->setExecuteScriptPix(
(int)$this->requestUtil->getField('executeScriptPix')
);
}
if($this->requestUtil->issetField('executeScriptBill')){
$product->setExecuteScriptBill(
(int)$this->requestUtil->getField('executeScriptBill')
);
}
if($this->requestUtil->issetField('conversionScript')){
$product->setConversionScript($this->requestUtil->getField('conversionScript'));
}
if($this->requestUtil->issetField('contract')){
$product->setContract($this->requestUtil->getField('contract'));
}
$groupsValidation = [];
if(
ProductEnum::PERIOD == $product->getType() ||
ProductEnum::SUPPORT == $product->getType()
){
$groupsValidation[] = "isCycle";
}else if(ProductEnum::GROUP == $product->getType()){
$groupsValidation[] = "isGroup";
}
$lastOrder = $this->repository->count([
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
$newOrder = $product->getOrder();
if(empty($newOrder) || ($newOrder > $lastOrder)){
$product->setOrder($lastOrder);
$newOrder = $lastOrder;
}
if($product->getPlanSpotlight() == ProductEnum::YES){
$this->repository->updatePlanSpotlight();
}
$errors = $this->validateEntity($product, $groupsValidation);
if($errors){
return $this->eadResponse($errors, ErrorEnum::FIELD_EMPTY);
}
if($oldOrder != $newOrder){
$this->repository->refreshOrder($oldOrder, $newOrder);
}
$this->em->flush();
$crmService = $this->generalService->getService('CRM\\CrmService');
$crmService->saveProduct($product);
$data = $product->toReturn();
$this->userLogService->logUpdate("product", $product->getId(), $data);
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/edit/theme/{id}",
* methods = {"POST"},
* requirements = { "id" = "\d+" }
* )
*/
public function editProductTheme(Request $request){
$permission = $this->userPermissionUtil->getPermission("product", "create");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$productId = $request->get('id');
$product = $this->repository->findOneBy([
"id" => $productId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if (!$product) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$isInTeam = $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
$product,
$this->user
);
if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$productPageRepository = $this->em->getRepository(ProductPage::class);
$productPage = $productPageRepository->findOneBy([
"deleted" => ProductPageEnum::ITEM_NO_DELETED,
"product" => $product->getId(),
"default" => ProductPageEnum::YES,
"status" => ProductPageEnum::PUBLISHED,
]);
if(!$productPage){
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$filePhoto = $this->requestUtil->getFile('photo');
$filePhotoStand = $this->requestUtil->getFile('photoStand');
$filePhotoExpand = $this->requestUtil->getFile('photoExpand');
$fileCover = $this->requestUtil->getFile('cover');
if($filePhoto){
$filePhoto = $this->fileService->setFile($filePhoto);
if($filePhoto){
$this->fileService->moveFile(ProductEnum::PATH_PRODUCT_PHOTO);
$productPage->setPhoto($this->fileService->getFileName());
}
}
if($filePhotoStand){
$filePhotoStand = $this->fileService->setFile($filePhotoStand);
if($filePhotoStand){
$this->fileService->moveFile(ProductEnum::PATH_PRODUCT_PHOTO);
$productPage->setPhotoStand($this->fileService->getFileName());
}
}
if($filePhotoExpand){
$filePhotoExpand = $this->fileService->setFile($filePhotoExpand);
if($filePhotoExpand){
$this->fileService->moveFile(ProductEnum::PATH_PRODUCT_PHOTO);
$productPage->setPhotoExpand($this->fileService->getFileName());
}
}
if($fileCover){
$fileCover = $this->fileService->setFile($fileCover);
if($fileCover){
$this->fileService->moveFile(ProductEnum::PATH_PRODUCT_COVER);
$productPage->setCover($this->fileService->getFileName());
}
}
$this->em->flush();
$data = $productPage->toReturn();
$this->userLogService->logUpdate("product_page", $productPage->getId(), $data);
return $this->eadResponse($product->toReturn());
}
/**
* @Route(
* path = "/edit/many/status",
* methods = {"PUT"}
* )
*/
public function editManyStatusProduct(Request $request) {
$permission = $this->userPermissionUtil->getPermission("product", "create");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$productId = $this->requestUtil->getField('products');
if(empty($productId)){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
};
$productId = json_decode($productId);
foreach ($productId as $key => $id) {
$product = $this->repository->findOneBy([
"id" => $id,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if($product) {
$isInTeam = $this->em->getRepository(ProductTeam::class)->userExistInProductTeam($product, $this->user);
if($isInTeam && $this->userPermissionUtil->isMiddle($permission) ||
$this->userPermissionUtil->isHigh($permission)){
if($this->requestUtil->issetField('status')){
$product->setStatus((int)$this->requestUtil->getField('status'));
}
$errors = $this->validateEntity($product);
if(!$errors){
$this->em->flush();
$data = $product->toReturn();
$this->userLogService->logUpdate(
"product",
$product->getId(),
$data
);
}
}
}
}
return $this->eadResponse([ "message" => "Success" ]);
}
/**
* @Route(
* path = "/copy/{id}",
* methods = {"COPY"},
* requirements = { "id" = "\d+" }
* )
*/
public function copyProduct(Request $request) {
$permission = $this->userPermissionUtil->getPermission("product", "copy");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$productId = $request->get('id');
$product = $this->repository->findOneBy([
"id" => $productId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if (!$product) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$isInTeam = $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
$product,
$this->user
);
if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$newProduct = clone $product;
$date = date('Y-m-d-H-i-s');
$newProduct->setTitle("{$newProduct->getTitle()} - COPY ");
$newProduct->setStatus(ProductEnum::DRAFT);
$newProduct->setPlanSpotlight(ProductEnum::NO);
$linkHash = $this->stringUtil->randomText(6) . $this->stringUtil->randomText(6);
$newProduct->setProductLink($linkHash);
$order = $newProduct->getOrder();
$lastOrder = $this->repository->count([
"deleted" => ProductEnum::ITEM_NO_DELETED
]) + 1;
if(empty($order) || ($order > $lastOrder)){
$newProduct->setOrder($lastOrder);
$order = $lastOrder;
}
$errors = $this->validateEntity($newProduct);
if($errors){
return $this->eadResponse($errors, ErrorEnum::FIELD_EMPTY);
}
$this->repository->refreshOrder(null, $order);
$this->em->persist($newProduct);
$productOfferRepository = $this->em->getRepository(ProductOffer::class);
$productTeamRepository = $this->em->getRepository(ProductTeam::class);
$productPageRepository = $this->em->getRepository(ProductPage::class);
$faqRepository = $this->em->getRepository(Faq::class);
$filter = [
"product" => $productId,
"deleted" => ProductEnum::ITEM_NO_DELETED
];
$productTeams = $productTeamRepository->findBy($filter);
$productOffers = $productOfferRepository->findBy($filter);
$productPages = $productPageRepository->findBy($filter);
$faqs = $faqRepository->findBy($filter);
$fileService = $this->generalService->getService('FileService');
$oldPagesOffers = [];
foreach ($productPages as $key => $productPage) {
$newProductPage = clone $productPage;
$newProductPage->setProduct($newProduct);
try {
if(!empty($newProductPage->getPhoto())){
$pathPhoto = ProductEnum::PATH_PRODUCT_PHOTO;
$fileService->setFile("{$pathPhoto}/{$newProductPage->getPhoto()}");
$hashImg = md5(rand() . time() . $product->getId());
$fileName = "{$hashImg}.{$fileService->getFileExtension()}";
$copyFile = "{$pathPhoto}/{$fileName}";
$fileService->copyFile($copyFile);
$newProductPage->setPhoto($fileName);
}
if(!empty($newProductPage->getPhotoStand())){
$pathPhoto = ProductEnum::PATH_PRODUCT_PHOTO;
$fileService->setFile("{$pathPhoto}/{$newProductPage->getPhotoStand()}");
$hashImg = md5(rand() . time() . $product->getId());
$fileName = "{$hashImg}.{$fileService->getFileExtension()}";
$copyFile = "{$pathPhoto}/{$fileName}";
$fileService->copyFile($copyFile);
$newProductPage->setPhotoStand($fileName);
}
if(!empty($newProductPage->getPhotoExpand())){
$pathPhoto = ProductEnum::PATH_PRODUCT_PHOTO;
$fileService->setFile("{$pathPhoto}/{$newProductPage->getPhotoExpand()}");
$hashImg = md5(rand() . time() . $product->getId());
$fileName = "{$hashImg}.{$fileService->getFileExtension()}";
$copyFile = "{$pathPhoto}/{$fileName}";
$fileService->copyFile($copyFile);
$newProductPage->setPhotoExpand($fileName);
}
if(!empty($newProductPage->getCover())){
$pathCover = ProductEnum::PATH_PRODUCT_COVER;
$fileService->setFile("{$pathCover}/{$newProductPage->getCover()}");
$hashImg = md5(rand() . time() . $product->getId());
$fileName = "{$hashImg}.{$fileService->getFileExtension()}";
$copyFile = "{$pathCover}/{$fileName}";
$fileService->copyFile($copyFile);
$newProductPage->setCover($fileName);
}
} catch (\Exception $e) {
return $this->eadResponse([ "message" => $e->getMessage() ], ErrorEnum::FIELD_EMPTY);
}
$this->em->persist($newProductPage);
$oldPagesOffers[$productPage->getId()] = $newProductPage;
}
foreach ($productTeams as $key => $productTeam) {
$newProductTeam = clone $productTeam;
$newProductTeam->setProduct($newProduct);
$this->em->persist($newProductTeam);
}
foreach ($productOffers as $key => $productOffer) {
$newproductOffer = clone $productOffer;
$newproductOffer->setProduct($newProduct);
$link = md5(rand() + time());
$newproductOffer->setOfferLink($link);
if(isset($oldPagesOffers[$productOffer->getProductPage()->getId()])){
$newproductOffer->setProductPage(
$oldPagesOffers[$productOffer->getProductPage()->getId()]
);
}
$this->em->persist($newproductOffer);
}
foreach ($faqs as $key => $faq) {
$newFaq = clone $faq;
$newFaq->setProduct($newProduct);
$this->em->persist($newFaq);
}
$this->em->flush();
$data = $newProduct->toReturn();
$this->userLogService->logInsert("product", $newProduct->getId(), $data);
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/add/course/{id}",
* methods = {"POST"},
* requirements = { "id" = "\d+" }
* )
*/
public function addCourse(Request $request) {
$permission = $this->userPermissionUtil->getPermission(
"product", "product_course", "add"
);
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$productId = $request->get('id');
$product = $this->repository->findOneBy([
"id" => $productId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if (!$product) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$isInTeam = $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
$product,
$this->user
);
if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$courses = $this->requestUtil->getField('courses');
if(empty($courses)){
return $this->eadResponse([ "courses" ], ErrorEnum::FIELD_EMPTY);
}
if($product->getType() == ProductEnum::COURSE){
if(count($product->getCourse()) > 0){
return $this->eadResponse([ "message" => "Success" ]);
}
}
$courses = json_decode($courses);
if(!is_array($courses)){
return $this->eadResponse([ "courses" ], ErrorEnum::FIELD_EMPTY);
}
if($product->getType() == ProductEnum::COURSE){
$first = array_shift($courses);
$courses = [ $first ];
}
$coursesObj = [];
$courseRepository = $this->em->getRepository(Course::class);
if(is_array($courses)){
foreach ($courses as $key => $courseId) {
$course = $courseRepository->findOneBy([
"id" => $courseId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if($course){
$coursesObj[] = $course;
$product->addCourse($course);
}
}
$this->em->flush();
}
if($product->getType() == ProductEnum::SUBSCRIPTION){
$this->em->getRepository(UserSubscription::class)->enrollUsers(
$product,
$coursesObj
);
}
$courseRepository->getAllCourseTimeByProduct($product, true);
$data = [
'courses' => $courses,
];
$this->userLogService->logInsert("product_x_course", $product->getId(), $data);
return $this->eadResponse([ "message" => "Success" ]);
}
/**
* @Route(
* path = "/remove/course/{productId}/{courseId}",
* methods = {"DELETE"},
* requirements = { "productId" = "\d+", "courseId" = "\d+" }
* )
*/
public function removeCourse(Request $request) {
$permission = $this->userPermissionUtil->getPermission(
"product",
"product_course",
"remove"
);
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$productId = $request->get('productId');
$product = $this->repository->findOneBy([
"id" => $productId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if (!$product) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$isInTeam = $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
$product,
$this->user
);
if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$courseId = $request->get('courseId');
$courseRepository = $this->em->getRepository(Course::class);
$course = $courseRepository->findOneBy([
"id" => $courseId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if (!$course) {
return $this->eadResponse([
"message" => "Course not found! ID: {$courseId}"
], ErrorEnum::ACTION_INVALID);
}
$product->removeCourse($course);
$this->em->flush();
$courseRepository->getAllCourseTimeByProduct($product, true);
$this->userLogService->logDelete(
"product_x_course",
$product->getId(),
[ "course" => $courseId ]
);
return $this->eadResponse([ "message" => "Success" ]);
}
/**
* @Route(
* path = "/remove/course/many/{productId}",
* methods = {"DELETE"},
* requirements = { "productId" = "\d+" }
* )
*/
public function removeManyCourse(Request $request) {
$permission = $this->userPermissionUtil->getPermission(
"product",
"product_course",
"remove"
);
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$productId = $request->get('productId');
$product = $this->repository->findOneBy([
"id" => $productId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if (!$product) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$isInTeam = $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
$product,
$this->user
);
if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$all = (int)$this->requestUtil->getField('all');
$courses = json_decode($this->requestUtil->getField('courses'));
if(empty($all)){
if(empty($courses) || count($courses) == 0){
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
}
$courseRepository = $this->em->getRepository(Course::class);
if($all == ProductEnum::YES){
$product->removeAllCourse();
}else{
foreach ($courses as $key => $courseId) {
$course = $courseRepository->findOneBy([
"id" => $courseId,
"deleted" => ProductEnum::ITEM_NO_DELETED
]);
if ($course) {
$product->removeCourse($course);
}
}
}
$this->em->flush();
$courseRepository->getAllCourseTimeByProduct($product, true);
$this->userLogService->logDeleteMany(
"product_x_course",
$product->getId(),
[
"all" => $all,
"courses" => $courses
]
);
return $this->eadResponse([ "message" => "Success" ]);
}
}