<?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\UserCheckoutInfo;
use EADPlataforma\Entity\City;
use EADPlataforma\Entity\State;
use EADPlataforma\Entity\Country;
use EADPlataforma\Entity\User;
use EADPlataforma\Entity\UserSubscription;
use EADPlataforma\Enum\UserCheckoutInfoEnum;
use EADPlataforma\Enum\UserSubscriptionEnum;
use EADPlataforma\Enum\ErrorEnum;
/**
* @Route(
* path = "/admin/user/info/checkout",
* schemes = {"http|https"}
* )
* @Cache(
* maxage = "0",
* smaxage = "0",
* expires = "now",
* public = false
* )
*/
class UserCheckoutInfoController extends AbstractController {
public function getEntityClass(){
return UserCheckoutInfo::class;
}
/**
* @Route(
* path = "/list/paginate",
* methods = {"GET"}
* )
*/
public function getUserCheckoutInfoPaginate(Request $request) {
if(!$this->user){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$this->requestUtil->setRequest($request)->setData();
$columns = [
"ui.id",
"ui.name",
"ui.email",
"ui.document",
"ui.phone",
"ui.address",
"ui.default",
"ui.addressComplement",
"ui.addressNeighborhood",
"ui.addressNumber",
"ui.zipCode",
"ui.receiveEmail",
"IDENTITY(ui.country) AS country",
"IDENTITY(ui.state) AS state",
"IDENTITY(ui.city) AS city",
"DATE_FORMAT(ui.dateDelete, '%Y-%m-%d %H:%i:%s') AS dateDelete",
"ud.name AS userDelete"
];
$userClass = User::class;
$joins = [
"{$userClass} AS ud" => ["LEFT", "ud.id = ui.userDelete"]
];
$orderParam = $this->requestUtil->getField('order');
$searchText = $this->requestUtil->getField('searchText');
$limit = $this->requestUtil->getField('limit');
$offset = $this->requestUtil->getField('offset');
$filter = [];
$filterDelete = $this->requestUtil->getDeletedParam();
$filter = [
"ui.user" => $this->user->getId(),
];
$order = [ "ui.id" => "ASC" ];
if(!empty($orderParam)){
$order = json_decode($orderParam, true);
}
$data = $this->repository->paginate(
"ui",
$searchText,
$columns,
$joins,
$filter,
$order,
$limit,
$offset,
$filterDelete
);
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/list/all",
* methods = {"GET"}
* )
*/
public function getUserCheckoutInfoAll(Request $request) {
if(!$this->user){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$infos = $this->repository->findBy([
"deleted" => UserCheckoutInfoEnum::ITEM_NO_DELETED,
"user" => $this->user->getId(),
]);
$data = [];
foreach ($infos as $key => $info) {
$data[] = $info->toReturn();
}
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/detail/{id}",
* name = "userCheckoutInfoDetail",
* methods = {"GET"},
* requirements = { "id" = "\d+" }
* )
*/
public function getUserCheckoutInfoDetail(Request $request) {
if(!$this->user){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$userCheckoutInfoId = $request->get('id');
$userCheckoutInfo = $this->repository->findOneBy([
"id" => $userCheckoutInfoId,
"deleted" => UserCheckoutInfoEnum::ITEM_NO_DELETED
]);
if (!$userCheckoutInfo) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
return $this->eadResponse($userCheckoutInfo->toReturn());
}
/**
* @Route(
* path = "/register",
* name = "registerUserCheckoutInfo",
* methods = {"POST"},
* )
*/
public function registerUserCheckoutInfo(Request $request) {
if(!$this->user){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$this->requestUtil->setRequest($request)->setData();
$userCheckoutInfo = new userCheckoutInfo();
if($this->requestUtil->issetField('default')){
$userCheckoutInfo->setDefault((int)$this->requestUtil->getField('default'));
}
if($this->requestUtil->issetField('name')){
$userCheckoutInfo->setName($this->requestUtil->getField('name'));
}
if($this->requestUtil->issetField('email')){
$userCheckoutInfo->setEmail($this->requestUtil->getField('email'));
}
if($this->requestUtil->issetField('document')){
$userCheckoutInfo->setDocument($this->requestUtil->getField('document'));
}
if($this->requestUtil->issetField('phone')){
$userCheckoutInfo->setPhone($this->requestUtil->getField('phone'));
}
if($this->requestUtil->issetField('country')){
$countryId = $this->requestUtil->getField('country');
$country = $this->em->getRepository(Country::class)->findOneBy([
"id" => $countryId,
"deleted" => UserCheckoutInfoEnum::ITEM_NO_DELETED
]);
$userCheckoutInfo->setCountry($country);
}
if($this->requestUtil->issetField('state')){
$stateId = $this->requestUtil->getField('state');
$state = $this->em->getRepository(State::class)->findOneBy([
"id" => $stateId,
"deleted" => UserCheckoutInfoEnum::ITEM_NO_DELETED
]);
$userCheckoutInfo->setState($state);
}
if($this->requestUtil->issetField('city')){
$cityId = $this->requestUtil->getField('city');
$city = $this->em->getRepository(City::class)->findOneBy([
"id" => $cityId,
"deleted" => UserCheckoutInfoEnum::ITEM_NO_DELETED
]);
$userCheckoutInfo->setCity($city);
}
if($this->requestUtil->issetField('zipCode')){
$userCheckoutInfo->setZipCode($this->requestUtil->getField('zipCode'));
}
if($this->requestUtil->issetField('address')){
$userCheckoutInfo->setAddress($this->requestUtil->getField('address'));
}
if($this->requestUtil->issetField('addressNumber')){
$userCheckoutInfo->setAddressNumber($this->requestUtil->getField('addressNumber'));
}
if($this->requestUtil->issetField('addressComplement')){
$userCheckoutInfo->setAddressComplement($this->requestUtil->getField('addressComplement'));
}
if($this->requestUtil->issetField('addressNeighborhood')){
$userCheckoutInfo->setAddressNeighborhood(
$this->requestUtil->getField('addressNeighborhood')
);
}
if($this->requestUtil->issetField('receiveEmail')){
$userCheckoutInfo->setReceiveEmail((int)$this->requestUtil->getField('receiveEmail'));
}
$userCheckoutInfo->setUser($this->user);
$numberUserCheckoutInfo = $this->repository->count([
"deleted" => UserCheckoutInfoEnum::ITEM_NO_DELETED,
"user" => $this->user->getId()
]);
if(empty($numberUserCheckoutInfo)){
$userCheckoutInfo->setDefault(UserCheckoutInfoEnum::YES);
}
if($userCheckoutInfo->getDefault() == UserCheckoutInfoEnum::YES){
$this->repository->removeDefault($this->user->getId());
}
$errors = $this->validateEntity($userCheckoutInfo);
if($errors){
return $this->eadResponse($errors, ErrorEnum::FIELD_EMPTY);
}
$this->em->persist($userCheckoutInfo);
$this->em->flush();
$data = $userCheckoutInfo->toReturn();
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/edit/{id}",
* name = "editUserCheckoutInfo",
* methods = {"PUT"},
* )
*/
public function editUserCheckoutInfo(Request $request) {
if(!$this->user){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$this->requestUtil->setRequest($request)->setData();
$userCheckoutInfo = $this->repository->findOneBy([
"id" => (int)$request->get('id'),
"deleted" => UserCheckoutInfoEnum::ITEM_NO_DELETED
]);
if (!$userCheckoutInfo) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
if($this->user->getId() != $userCheckoutInfo->getUser()->getId()){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
if($this->requestUtil->issetField('name')){
$userCheckoutInfo->setName($this->requestUtil->getField('name'));
}
if($this->requestUtil->issetField('email')){
$userCheckoutInfo->setEmail($this->requestUtil->getField('email'));
}
if($this->requestUtil->issetField('document')){
$userCheckoutInfo->setDocument($this->requestUtil->getField('document'));
}
if($this->requestUtil->issetField('phone')){
$userCheckoutInfo->setPhone($this->requestUtil->getField('phone'));
}
if($this->requestUtil->issetField('country')){
$countryId = $this->requestUtil->getField('country');
$country = $this->em->getRepository(Country::class)->findOneBy([
"id" => $countryId,
"deleted" => UserCheckoutInfoEnum::ITEM_NO_DELETED
]);
if($country){
$userCheckoutInfo->setCountry($country);
}else{
$userCheckoutInfo->setCountry(null);
}
}else{
$userCheckoutInfo->setCountry(null);
}
if($this->requestUtil->issetField('state')){
$stateId = $this->requestUtil->getField('state');
$state = $this->em->getRepository(State::class)->findOneBy([
"id" => $stateId,
"deleted" => UserCheckoutInfoEnum::ITEM_NO_DELETED
]);
if($state){
$userCheckoutInfo->setState($state);
}else{
$userCheckoutInfo->setState(null);
}
}else{
$userCheckoutInfo->setState(null);
}
if($this->requestUtil->issetField('city')){
$cityId = $this->requestUtil->getField('city');
$city = $this->em->getRepository(City::class)->findOneBy([
"id" => $cityId,
"deleted" => UserCheckoutInfoEnum::ITEM_NO_DELETED
]);
if($city){
$userCheckoutInfo->setCity($city);
}else{
$userCheckoutInfo->setCity(null);
}
}else{
$userCheckoutInfo->setCity(null);
}
if($this->requestUtil->issetField('zipCode')){
$userCheckoutInfo->setZipCode($this->requestUtil->getField('zipCode'));
}
if($this->requestUtil->issetField('address')){
$userCheckoutInfo->setAddress($this->requestUtil->getField('address'));
}
if($this->requestUtil->issetField('addressNumber')){
$userCheckoutInfo->setAddressNumber($this->requestUtil->getField('addressNumber'));
}
if($this->requestUtil->issetField('addressComplement')){
$userCheckoutInfo->setAddressComplement($this->requestUtil->getField('addressComplement'));
}
if($this->requestUtil->issetField('addressNeighborhood')){
$userCheckoutInfo->setAddressNeighborhood(
$this->requestUtil->getField('addressNeighborhood')
);
}
if($this->requestUtil->issetField('receiveEmail')){
$userCheckoutInfo->setReceiveEmail((int)$this->requestUtil->getField('receiveEmail'));
}
$numberUserCheckoutInfo = $this->repository->count([
"deleted" => UserCheckoutInfoEnum::ITEM_NO_DELETED,
"user" => $this->user->getId()
]);
if(empty($numberUserCheckoutInfo)){
$userCheckoutInfo->setDefault(UserCheckoutInfoEnum::YES);
}
$errors = $this->validateEntity($userCheckoutInfo);
if($errors){
return $this->eadResponse($errors, ErrorEnum::FIELD_EMPTY);
}
$this->em->flush();
$data = $userCheckoutInfo->toReturn();
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/change/default/{userCheckoutInfoId}",
* methods = {"GET"},
* requirements = {"userCheckoutInfoId": "\d+"}
* )
*/
public function changeUserCheckoutInfoDefault(Request $request) {
if(!$this->user){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$userCheckoutInfoId = $request->get('userCheckoutInfoId');
$userCheckoutInfo = $this->repository->findOneBy([
"id" => $userCheckoutInfoId,
"user" => $this->user->getId(),
"deleted" => UserCheckoutInfoEnum::ITEM_NO_DELETED
]);
if(!$userCheckoutInfo){
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$this->repository->removeDefault($this->user->getId());
$userCheckoutInfo->setDefault(UserCheckoutInfoEnum::YES);
$userSubscriptions = $this->em->getRepository(UserSubscription::class)->findBy([
"user" => $this->user->getId(),
"status" => UserSubscriptionEnum::STATUS_ACTIVE,
"deleted" => UserSubscriptionEnum::ITEM_NO_DELETED
]);
foreach($userSubscriptions as $key => $userSubscription) {
$userSubscription->setUserCheckoutInfo($userCheckoutInfo);
}
$this->em->flush();
$data = $userCheckoutInfo->toReturn();
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/delete/{userCheckoutInfoId}",
* methods = {"DELETE"},
* requirements = { "userCheckoutInfoId" = "\d+" }
* )
*/
public function deleteUserCheckoutInfo(Request $request) {
if(!$this->user){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$userCheckoutInfoId = $request->get('userCheckoutInfoId');
$userCheckoutInfo = $this->repository->findOneBy([
"id" => $userCheckoutInfoId,
"user" => $this->user->getId(),
"deleted" => UserCheckoutInfoEnum::ITEM_NO_DELETED
]);
if (!$userCheckoutInfo) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$countUserSubscription = $this->em->getRepository(UserSubscription::class)->count([
"userCheckoutInfo" => $userCheckoutInfoId,
"user" => $this->user->getId(),
"deleted" => UserSubscriptionEnum::ITEM_NO_DELETED
]);
if($countUserSubscription > 0){
return $this->eadResponse([
"message" => "Este faturamento não pode ser deletado, pois está vinculado a uma assinatura"
], ErrorEnum::ACTION_INVALID);
}
$userCheckoutInfo->setUserDelete($this->user);
$userCheckoutInfo->setDateDelete(date('Y-m-d H:i:s'));
$userCheckoutInfo->individual();
$userCheckoutInfo->delete();
$this->userLogService->logDelete("user_checkout_info", $userCheckoutInfo->getId(), [
"deleted" => UserCheckoutInfoEnum::ITEM_DELETED
]);
$this->em->flush();
return $this->eadResponse([ "delete" => 1 ]);
}
}