<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\Menu;
use App\Service\LogHistoryService;
use App\Entity\User;
use App\Entity\UserToken;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use App\Service\AppApiService;
use App\Service\PowerOn;
use App\Entity\AppPersonalAccount;
use App\Entity\MediaObject;
use App\Entity\AppCounterReading;
use App\Entity\ServiceOrderHistory;
use App\Entity\Accounts;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Serializer\SerializerInterface;
use App\Repository\ServiceOrderHistoryRepository;
class PersonalController extends AbstractController
{
public $datetime;
public $entityManager;
public $passwordEncoder;
public $appApiService;
private $kernel;
private $logHistory;
private $security;
private $powerOn;
public function __construct(
?\DateTimeInterface $datetime,
EntityManagerInterface $entityManager,
PowerOn $powerOn,
AppApiService $appApiService,
KernelInterface $kernel,
LogHistoryService $logHistory,
Security $security
){
$this->datetime = $datetime;
$this->entityManager = $entityManager;
$this->appApiService = $appApiService;
$this->kernel = $kernel;
$this->logHistory = $logHistory;
$this->security = $security;
$this->powerOn = $powerOn;
}
public function valid($requestFilds, $requiredFilds){
$errors = '';
foreach($requiredFilds as $f){
if(!isset($requestFilds[$f]))
$errors .= " $f";
}
return $errors;
}
private function isUserData($userId=false, $accountNumber=false){
$user = $this->security->getUser();
if(!$user)
return ['rezult' => false, 'error' => 'Користувач не авторизований'];
if(!$userId AND !$accountNumber)
return ['rezult' => false, 'error' => 'Не вказані всі необхідні параметри'];
/** Якщо користувач вказаний і він не рівний залогованому */
if($userId AND $user->getId() != $userId)
return ['rezult' => false, 'error' => '1) Недостатньо прав для виконання дії'];
elseif($userId AND $user->getId() == $userId AND !$accountNumber)
return ['rezult' => true];
/** якщо є номер особового і він рівний номеру залогованого користувача */
if($accountNumber)
foreach($user->getAppPersonalAccounts() as $acc){
if( $acc->getNumber() == $accountNumber)
return ['rezult' => true];
}
return ['rezult' => false, 'error' => '2) Недостатньо прав для виконання дії'];
}
#[Route('/api/create-personal-account-bot', name: 'createPersonalAccountBot')]
public function createPersonalAccountBot(Request $request)
{
$data = json_decode($request->getContent(), true);
$logId = $this->logHistory->save(false, 'create-personal-account-bot', $data);
$valid = $this->valid( $data, ['accounts', 'method', 'owner'] );
if( empty($valid) ){
$isUserData = $this->isUserData($data['owner']);
if( $isUserData['rezult'] ){
$find = $this->entityManager->getRepository(User::class)->findOneBy(['id' => $data['owner']]);
if($find){
$resultAccounts = [];
foreach($data['accounts'] as $value){
$number = trim( array_key_first($value) );
$name = $value[$number];
$resultAccounts[$number] = false;
$data = [
'account' => $number
];
$res = json_decode( $this->appApiService->account_all_data($data) , true );
if(isset($res['rez']) AND $res['rez'] == 1){
if(isset($res['data']) AND count($res['data']) > 0){
$name = (!empty($name)) ? $name : $number;
$accounts = $this->entityManager->getRepository(Accounts::class)->findOneBy(['number' => $number]);
if(!$accounts){
$accounts = new Accounts();
$accounts->setNumber($number);
$accounts->setEic($res['data'][0]['eic_kod']);
$this->entityManager->persist($accounts);
$this->entityManager->flush();
}
$personal = new AppPersonalAccount();
$personal->setOwner($find);
$personal->setNumber($number);
$personal->setName($name);
$personal->setNumberOfScale((int) $res['data'][0]['number_of_scale']);
$personal->setActive(true);
$personal->setIsMain(true);
$personal->setFullAddress($res['data'][0]['name']);
$personal->setCity($res['data'][0]['city_name']);
$personal->setStreet($res['data'][0]['street_name']);
$personal->setBuilding($res['data'][0]['building_name']);
// $personal->setRoom($res['room']);
$personal->setMainFullAddress($res['data'][0]['name']);
$personal->setEic($res['data'][0]['eic_kod']);
$personal->setDateEntered($this->datetime);
$personal->setType('person');
$personal->setAccounts($accounts);
$personal->setCounter($res['data'][0]['counter']);
$personal->setNotificationStatus('active');
$this->entityManager->persist($personal);
$this->entityManager->flush();
$resultAccounts[$number] = true;
}
}
$rez = [
'registered' => true,
'registerAccounts' => $resultAccounts
];
}
}else{
$rez = ['registered' => false];
}
}else{
$rez = ['registered' => false, 'error' => $isUserData['error']];
}
}else{
$rez = ['registered' => false, 'error' => "Не задано поля: $valid"];
}
$response = new JsonResponse();
$response->setData($rez);
$this->logHistory->save($logId, 'create-personal-account-bot', $rez);
return $response;
}
/** Cтворити рахунок { "owner": "31", "account":"0900015104", "method":"by_name", "value": "Подолюк", "name": "Test 1" } */
#[Route('/api/create-personal-account', name: 'createPersonalAccount')]
public function createPersonalAccount(Request $request)
{
$data = json_decode($request->getContent(), true);
$logId = $this->logHistory->save(false, 'create-personal-account', $data);
$valid = $this->valid( $data, ['owner', 'account', 'method', 'value'] );
if( empty($valid) ){
$isUserData = $this->isUserData($data['owner']);
if( $isUserData['rezult'] ){
$find = $this->entityManager->getRepository(User::class)->findOneBy(['id' => $data['owner']]);
if($find){
$data = ['account' => $data['account'], 'app_user_id' => $find->getId(), 'check_method' => $data['method'], 'check_value' => $data['value'], 'name' => $data['name']];
$res = json_decode( $this->appApiService->checkPersonalAccount($data) , true );
$name = (!empty($data['name'])) ? $data['name'] : $data['account'];
if(isset($res['account_ok']) AND $res['account_ok'] ){
$accounts = $this->entityManager->getRepository(Accounts::class)->findOneBy(['number' => $data['account']]);
if(!$accounts){
$accounts = new Accounts();
$accounts->setNumber( trim( $data['account'] ));
$accounts->setEic($res['eic']);
$this->entityManager->persist($accounts);
$this->entityManager->flush();
}
$personal = new AppPersonalAccount();
$personal->setOwner($find);
$personal->setNumber(trim( $data['account'] ));
$personal->setName($name);
$personal->setNumberOfScale((int) $res['number_of_scale']);
$personal->setActive(true);
$personal->setIsMain(true);
$personal->setFullAddress($res['full_address']);
$personal->setCity($res['city']);
$personal->setStreet($res['street']);
$personal->setBuilding($res['building']);
$personal->setRoom($res['room']);
$personal->setMainFullAddress($res['full_address']);
$personal->setEic($res['eic']);
$personal->setDateEntered($this->datetime);
$personal->setType('person');
$personal->setAccounts($accounts);
$personal->setCounter($res['counter']);
$personal->setNotificationStatus('active');
$this->entityManager->persist($personal);
$this->entityManager->flush();
$rez = [
'registered' => true,
'id' => $personal->getId(),
'name' => $personal->getName(),
'number' => trim( $personal->getNumber() ),
'numberOfScale' => $personal->getNumberOfScale(),
'fullAddress' => $personal->getFullAddress(),
'city' => $personal->getCity(),
'street' => $personal->getStreet(),
'building' => $personal->getBuilding(),
'room' => $personal->getRoom(),
'mainFullAddress' => $personal->getMainFullAddress(),
'account' => [
'statusLight' => $accounts->getStatusLight(),
'statusPlanning' => $accounts->getStatusPlanning(),
]
];
}else{
$rez = ['registered' => false, $res];
}
}else{
$rez = ['registered' => false];
}
}else{
$rez = ['registered' => false, 'error' => $isUserData['error']];
}
}else{
$rez = ['registered' => false, 'error' => "Не задано поля: $valid"];
}
$response = new JsonResponse();
$response->setData($rez);
$this->logHistory->save($logId, 'create-personal-account', $rez);
return $response;
}
#[Route('/api/create-personal-account_test', name: 'createPersonalAccountTest')]
public function createPersonalAccountTest(Request $request)
{
$data = json_decode($request->getContent(), true);
// $data = ['account' => '0900015104', 'check_method' => 'by_name', 'check_value' => 'Подолюк'];
$res = json_decode( $this->appApiService->checkPersonalAccount($data) , true );
var_dump($res); die;
}
/** наяність світла { "user": "31", "account":"0900015104" } */
#[Route('/api/check-light', name: 'check_light')]
public function check_light(Request $request)
{
$data = json_decode($request->getContent(), true);
$logId = $this->logHistory->save(false, 'check-light', $data);
$valid = $this->valid( $data, ['account', 'user'] );
if( empty($valid) ){
$isUserData = $this->isUserData($data['user'], $data['account']);
if( $isUserData['rezult'] ){
$data = [
'method' => 'check-light',
'data' => [
'account' => $data['account'],
// 'eic' => '36457',
],
];
$rezult = json_decode( $this->appApiService->get($data) , true );
if($rezult['rez']){
$rez = [
'rezult' => true,
'іs_included_disconnection_task' => (isset( $rezult['іs_included_disconnection_task']) ) ? $rezult['іs_included_disconnection_task'] : 0,
'reazon' => (isset( $rezult['reazon']) ) ? $rezult['reazon'] : '',
'reazon_yur' => (isset( $rezult['reazon_yur']) ) ? $rezult['reazon_yur']: '' ,
'owner_adress' => $rezult['owner_adress'],
'light' => $rezult['light'],
'date' => $rezult['date'],
'diff_eic_count' => $rezult['diff_eic_count'],
'eic' => $rezult['eic'],
'dno_id' => $rezult['dno_id'],
'disconnect_warning_guid' => (isset( $rezult['disconnect_warning_guid']))?$rezult['disconnect_warning_guid'] : '',
];
}else{
$rez = ['rezult' => false, 'error' => $rezult['err_msg']];
}
}else{
$rez = ['rezult' => false, 'error' => $isUserData['error']];
}
}else{
$rez = ['rezult' => false, 'error' => "Не задано поля: $valid"];
}
$response = new JsonResponse();
$response->setData($rez);
$this->logHistory->save($logId, 'check-light', $rez);
return $response;
}
/** графік гпв { "user": "31", "account":"0900015104" } */
#[Route('/api/get-group-gpv', name: 'get_group_gpv')]
public function get_group_gpv(Request $request)
{
$data = json_decode($request->getContent(), true);
// $logId = $this->logHistory->save(false, 'get_group_gpv', $data);
$valid = $this->valid( $data, ['account', 'user'] );
if( empty($valid) ){
$isUserData = $this->isUserData($data['user'], $data['account']);
if( $isUserData['rezult'] ){
$data = [
'method' => 'get-group-gpv',
'data' => [
'account' => $data['account'],
// 'eic' => '36457',
],
];
$rezult = json_decode( $this->appApiService->get($data) , true );
if($rezult['rez']){
$rez = [
'rezult' => true,
'rem_name' => $rezult['rem_name'],
'odg_name' => $rezult['odg_name'],
'cherg_gav' => $rezult['cherg_gav'],
'cherg_achr' => $rezult['cherg_achr'],
'cherg_gvsp' => $rezult['cherg_gvsp'],
'cherg_sgav' => $rezult['cherg_sgav'],
'cherg_gpv' => $rezult['cherg_gpv'],
];
}else{
$rez = ['rezult' => false, 'error' => $rezult['err_msg']];
}
}else{
$rez = ['rezult' => false, 'error' => $isUserData['error']];
}
}else{
$rez = ['rezult' => false, 'error' => "Не задано поля: $valid"];
}
$response = new JsonResponse();
$response->setData($rez);
// $this->logHistory->save($logId, 'get_group_gpv', $rez);
return $response;
}
/** заплановані роботи { "user": "31", "account":"0900015104" } */
#[Route('/api/get-scheduled-works', name: 'get_scheduled_works')]
public function get_scheduled_works(Request $request)
{
$data = json_decode($request->getContent(), true);
$logId = $this->logHistory->save(false, 'get_scheduled_works', $data);
$valid = $this->valid( $data, ['account', 'user'] );
if( empty($valid) ){
$data = [
'method' => 'get-scheduled-works',
'data' => [
'account' => $data['account'],
// 'eic' => '36457',
],
];
$rezult = json_decode( $this->appApiService->get($data) , true );
if($rezult['rez']){
$rez = [
'rezult' => true,
'message' => $rezult['message'],
'works' => $rezult['works'],
];
}else{
$rez = ['rezult' => false, 'error' => $rezult['err_msg']];
}
}else{
$rez = ['rezult' => false, 'error' => "Не задано поля: $valid"];
}
$response = new JsonResponse();
$response->setData($rez);
$this->logHistory->save($logId, 'get_scheduled_works', $rez);
return $response;
}
/** Низька напруга { "user": "31", "account": "", "phone":"", "voltage":"", "voltage_susidy": "", "media": "111" } */
#[Route('/api/set-low-quality-voltage', name: 'set_low_quality_voltage')]
public function set_low_quality_voltage(Request $request)
{
// echo '<pre>';
$data = json_decode($request->getContent(), true);
// $data = [
// 'user' => 31,
// 'account' => '0900015104',
// 'phone' => '380xxxxxxxxx',
// 'voltage' => '123',
// 'voltage_susidy' => 'Так',
// 'media' => 2
// // 'imageFile' => new CURLFile(realpath(__DIR__) . '/11.png'),
// ];
$logId = $this->logHistory->save(false, 'set_low_quality_voltage', $data);
$valid = $this->valid( $data, ['account', 'user', 'phone', 'voltage', 'voltage_susidy', 'media'] );
if( empty($valid) ){
$isUserData = $this->isUserData($data['owner']);
if( $isUserData['rezult'] ){
$find = $this->entityManager->getRepository(User::class)->findOneBy(['id' => $data['user']]);
if($find){
$mediaObject = $this->entityManager->getRepository(MediaObject::class)->findOneBy(['id' => $data['media']]);
if (!$mediaObject) {
return new JsonResponse(['rezult' => false,'error' => 'MediaObject not found'], 404);
}
// Отримуємо шлях до файлу
$filePath = $this->kernel->getProjectDir() . '/public' .$mediaObject->getFullPath() ;
// echo "<br> $filePath <br>";
$permission = json_decode( $this->appApiService->check_allow_for_low_quality_voltage($data['account']) , true);
if(!$permission['rez'] AND $permission['dozvil'] !== true){
// print_r( $permission); die;
return new JsonResponse(['rezult' => false,'error' => $permission['err_msg']], 404);
}
// var_dump( $permission);
// die;
$data = [
'app_user_id' => $find->getId(),
'account' => $data['account'],
'phone' => $data['phone'],
'voltage' => $data['voltage'],
'voltage_susidy' => $data['voltage_susidy'],
'imageFile' => new \CURLFile( $filePath ),
];
$rezult = json_decode( $this->appApiService->set_low_quality_voltage($data) , true );
if($rezult['rez']){
$rez = [
'rezult' => true,
'message' => 'Дані відправлено!',
// 'account' => $rezult['account'],
];
}else{
$rez = ['rezult' => false, 'error' => $rezult['err_msg']];
}
}else{
$rez = ['rezult' => false, 'error' => "Користувача не знайдено!"];
}
}else{
$rez = ['rezult' => false, 'error' => $isUserData['error']];
}
}else{
$rez = ['rezult' => false, 'error' => "Не задано поля: $valid"];
}
$response = new JsonResponse();
$response->setData($rez);
$this->logHistory->save($logId, 'set_low_quality_voltage', $rez);
return $response;
}
/** Заявка на сервісне обслуговування { "user": "31", "account": "", "phone":"", "service_code":"", "description":"", "media": [1,2,3], "pdf": "" } */
#[Route('/api/service-order', name: 'service_order')]
public function service_order(Request $request)
{
// echo '<pre>';
$data = json_decode($request->getContent(), true);
// $data = [
// 'user' => 31,
// 'account' => '0900015104',
// 'phone' => '380xxxxxxxxx',
// 'service_code' => '9',
// 'description' => 'Так',
// 'media' => [4,5,6]
// // 'imageFile' => new CURLFile(realpath(__DIR__) . '/11.png'),
// ];
$logId = $this->logHistory->save(false, 'service-order', $data);
if(isset($data['service_code']) AND ( $data['service_code'] == 63 OR $data['service_code'] == 10 OR $data['service_code'] == 9 OR $data['service_code'] == 113 OR $data['service_code'] == 26))
$valid = $this->valid( $data, ['account', 'user', 'phone', 'service_code', 'description', 'pdf'] );
else
$valid = $this->valid( $data, ['account', 'user', 'phone', 'service_code', 'description', 'media', 'pdf'] );
if( empty($valid) ){
$isUserData = $this->isUserData($data['user'], $data['account']);
if($isUserData['rezult'] ){
$find = $this->entityManager->getRepository(User::class)->findOneBy(['id' => $data['user']]);
if($find){
if($data['service_code'] != 63 AND $data['service_code'] != 10 AND $data['service_code'] != 9 AND $data['service_code'] != 113 AND $data['service_code'] != 26){
// $mediaObject = $this->entityManager->getRepository(MediaObject::class)->findOneBy(['id' => $data['media']]);
$mediaObjects = $this->entityManager->getRepository(MediaObject::class)->findBy(['id' => $data['media']]);
if (!$mediaObjects) {
return new JsonResponse(['rezult' => false,'error' => 'MediaObject not found'], 404);
}
}
$pdf = (!empty($data['pdf'])) ? $data['pdf']: false;
$data = [
'account' => $data['account'],
'app_user_id' => $find->getId(),
'phone' => str_replace('+', '', $find->getPhone() ), /// $data['phone'] присилають декілька номерів тел через кому
'service_code' => $data['service_code'],
'description' => $data['description'],
// 'imageFile' => new \CURLFile( $filePath ),
];
$i = 1;
if($data['service_code'] != 63 AND $data['service_code'] != 10 AND $data['service_code'] != 9 AND $data['service_code'] != 113 AND $data['service_code'] != 26)
foreach($mediaObjects as $k => $mediaObject){
$i = $k + 1;
$filePath = $this->kernel->getProjectDir() . '/public' .$mediaObject->getFullPath() ;
$data["imageFile$i"] = new \CURLFile( $filePath );
}
if($pdf){
if(isset($data["imageFile$i"]))
++$i;
$data["imageFile$i"] = new \CURLFile( $this->kernel->getProjectDir() . '/public' . $pdf );
}
// $filePath = $this->kernel->getProjectDir() . '/public' .$mediaObject->getFullPath() ;
// echo "<br> $filePath <br>";
// $permission = json_decode( $this->appApiService->check_allow_for_low_quality_voltage($data['account']) , true);
// if(!$permission['rez'] AND $permission['dozvil'] !== true){
// // print_r( $permission); die;
// return new JsonResponse(['rezult' => false,'error' => $permission['err_msg']], 404);
// }
// var_dump( $permission);
// die;
// $data = [
// 'account' => $data['account'],
// 'phone' => $data['phone'],
// 'voltage' => $data['voltage'],
// 'voltage_susidy' => $data['voltage_susidy'],
// 'imageFile' => new \CURLFile( $filePath ),
// ];
/*
const serviceCodesArr = [
{ service_code: 9, label: "Встановлення зонного лічильника" },
{ service_code: 10, label: "Лічильник не працює" },
{ service_code: 21, label: "Неправильний показ" },
{ service_code: 32, label: "Зміна власника" },
{ service_code: 35, label: "Підключення електроустановок замовника після виконання ТУ" },
{ service_code: 63, label: "Звернення щодо підозри на крадіжку" },
{ service_code: 79, label: "Заміна автоматичного вимикача, який опломбований ОСР" },
{ service_code: 85, label: "Відсутність пломб на засобі обліку" },
{ service_code: 86, label: "Закриття особового рахунку" },
];
*/
$orderNames = [
9 => "Встановлення зонного лічильника",
10 => "Лічильник не працює",
21 => "Неправильний показ",
32 => "Зміна власника",
35 => "Підключення електроустановок замовника після виконання ТУ",
63 => "Звернення щодо підозри на крадіжку",
79 => "Заміна автоматичного вимикача, який опломбований ОСР",
85 => "Відсутність пломб на засобі обліку",
86 => "Закриття особового рахунку",
113 => "Узгодження дати візиту",
26 => "Відновити живлення після відключення",
];
foreach($find->getAppPersonalAccounts() as $acc){
if(trim( $acc->getNumber() ) == $data['account'])
$account = $acc;
}
if($account){
$ServiceOrderHistory = new ServiceOrderHistory();
$ServiceOrderHistory->setName($orderNames[$data['service_code']]);
// $ServiceOrderHistory->setRequest($data);
$ServiceOrderHistory->setDateEntered( new \DateTime() );
$ServiceOrderHistory->setType($data['service_code']);
$ServiceOrderHistory->setDescription($data['description']);
$ServiceOrderHistory->setCommentar($data['description']);
$ServiceOrderHistory->setStatus('new');
$ServiceOrderHistory->setPersonalAccount($account);
if($pdf)
$ServiceOrderHistory->setPdf( $pdf );
$ServiceOrderHistory->setPersonalAccount($account);
$this->entityManager->persist($ServiceOrderHistory);
$this->entityManager->flush();
$data["id"] = $ServiceOrderHistory->getId();
}
$rezult = json_decode( $this->appApiService->service_order($data) , true );
if($rezult['rez']){
$account = false;
$rez = [
'rezult' => true,
'message' => 'Дані відправлено!',
// 'account' => $rezult['account'],
];
}else{
$rez = ['rezult' => false, 'error' => $rezult['err_msg']];
}
}else{
$rez = ['rezult' => false, 'error' => "Користувача не знайдено!"];
}
}else{
$rez = ['rezult' => false, 'error' => $isUserData['error']];
}
}else{
$rez = ['rezult' => false, 'error' => "Не задано поля: $valid"];
}
$response = new JsonResponse();
$response->setData($rez);
$this->logHistory->save($logId, 'service-order', $rez);
return $response;
}
/** Обірваний провід { "user": 31, "account": "0900015104", "reason_type": "brok", "phone": "380xxxxxxxxx", "address": "Тернопільська 75", "lat": "50.067404", "lon": "25.171442", "media": 111 } */
#[Route('/api/set-broken-lines', name: 'set_broken_lines')]
public function set_broken_lines(Request $request)
{
// echo '<pre>';
$data = json_decode($request->getContent(), true);
// $data = [
// 'user' => 31,
// 'account' => '0900015104',
// 'phone' => '380xxxxxxxxx',
// 'voltage' => '123',
// 'voltage_susidy' => 'Так',
// 'media' => 2,
// 'lat' => '1111',
// 'lon' => '2222',
// 'reason_type' => '22',
// 'address' => '222',
// // 'imageFile' => new CURLFile(realpath(__DIR__) . '/11.png'),
// ];
$logId = $this->logHistory->save(false, 'set_broken_lines', $data);
$valid = $this->valid( $data, ['reason_type', 'user', 'phone', 'address', 'lat', 'lon'] );
if( empty($valid) ){
$isUserData = $this->isUserData($data['user'], $data['account']);
if($isUserData['rezult'] ){
$find = $this->entityManager->getRepository(User::class)->findOneBy(['id' => $data['user']]);
if($find){
if(isset($data['media'])){
$mediaObject = $this->entityManager->getRepository(MediaObject::class)->findOneBy(['id' => $data['media']]);
if (!$mediaObject) {
return new JsonResponse(['rezult' => false,'error' => 'MediaObject not found'], 404);
}
// Отримуємо шлях до файлу
$filePath = $this->kernel->getProjectDir() . '/public' .$mediaObject->getFullPath() ;
}
// echo "<br> $filePath <br>";
$permission = json_decode( $this->appApiService->check_allow_for_low_quality_voltage($data['account']) , true);
if(!$permission['rez'] AND $permission['dozvil'] !== true){
// print_r( $permission); die;
return new JsonResponse(['rezult' => false,'error' => $permission['err_msg']], 404);
}
// var_dump( $permission);
// die;
$data = [
'phone' => $data['phone'],
'app_user_id' => $find->getId(),
'reason_type' => $data['reason_type'],
'address' => $data['address'],
'lat' => $data['lat'],
'lon' => $data['lon'],
// 'imageFile' => new \CURLFile( $filePath ),
];
if(isset($filePath))
$data['imageFile'] = new \CURLFile( $filePath );
$rezult = json_decode( $this->appApiService->set_broken_lines($data) , true );
if($rezult['rez']){
// foreach($find->getAppPersonalAccounts() as $acc){
// if($acc->getNumber() == $data['account'])
// $account = $acc;
// }
// if($account){
// $ServiceOrderHistory = new ServiceOrderHistory();
// $ServiceOrderHistory->setName('set-broken-lines');
// $ServiceOrderHistory->setDateEntered( new \DateTime() );
// $ServiceOrderHistory->setType('set-broken-lines');
// $ServiceOrderHistory->setStatus('new');
// $ServiceOrderHistory->setPersonalAccount($account);
// $this->entityManager->persist($ServiceOrderHistory);
// $this->entityManager->flush();
// }
$rez = [
'rezult' => true,
'message' => 'Дані відправлено!',
// 'account' => $rezult['account'],
];
}else{
$rez = ['rezult' => false, 'error' => $rezult['err_msg']];
}
}else{
$rez = ['rezult' => false, 'error' => "Користувача не знайдено!"];
}
}else{
$rez = ['rezult' => false, 'error' => $isUserData['error']];
}
}else{
$rez = ['rezult' => false, 'error' => "Не задано поля: $valid"];
}
$response = new JsonResponse();
$response->setData($rez);
$this->logHistory->save($logId, 'set_broken_lines', $rez);
return $response;
}
/** Отримати останній показник {} */
#[Route('/api/get-last-meter-readings', name: 'get_last_meter_readings')]
public function get_last_meter_readings(Request $request)
{
// echo '<pre>';
$data = json_decode($request->getContent(), true);
// $data = [
// 'user' => 31,
// 'account' => '0900015104',
// ];
$logId = $this->logHistory->save(false, 'get_last_meter_readings', $data);
$valid = $this->valid( $data, ['account', 'user'] );
if( empty($valid) ){
$isUserData = $this->isUserData($data['user'], $data['account']);
if( $isUserData['rezult'] ){
$data = [
'method' => 'get-last-meter-readings',
'data' => [
'account' => $data['account'],
],
];
$rezult = json_decode( $this->appApiService->get($data) , true );
if($rezult['rez']){
$rez = [
'rezult' => true,
'date_on' => $rezult['date_on'],
'reading1' => $rezult['reading1'],
'reading2' => $rezult['reading2'],
'reading3' => $rezult['reading3'],
// 'account' => $rezult['account'],
];
}else{
$rez = ['rezult' => false, 'error' => $rezult['err_msg']];
}
}else{
$rez = ['rezult' => false, 'error' => $isUserData['error']];
}
}else{
$rez = ['rezult' => false, 'error' => "Не задано поля: $valid"];
}
$response = new JsonResponse();
$response->setData($rez);
$this->logHistory->save($logId, 'get_last_meter_readings', $rez);
return $response;
}
/** Отримати Історію показників лічильника {} */
#[Route('/api/get-meter-readings-history', name: 'get_meter_readings_history')]
public function get_meter_readings_history(Request $request)
{
file_put_contents('/var/www/symfony_docker/var/log/log.txt', date('Y-m-d H:i:s') . "get_meter_readings_history: " . $request->getContent() . "\n", FILE_APPEND);
// echo '<pre>';
$data = json_decode($request->getContent(), true);
// $data = [
// 'user' => 31,
// 'account' => '0900015104',
// ];
$logId = $this->logHistory->save(false, 'get_meter_readings_history', $data);
$valid = $this->valid( $data, ['account', 'user'] );
if( empty($valid) ){
$isUserData = $this->isUserData($data['user'], $data['account']);
file_put_contents('/var/www/symfony_docker/var/log/log.txt', date('Y-m-d H:i:s') . "1111\n", FILE_APPEND);
if( $isUserData['rezult'] ){
$accountNumber = $data['account'];
$data = [
'method' => 'get-meter-readings-history',
'data' => [
'account' => $data['account'],
],
];
file_put_contents('/var/www/symfony_docker/var/log/log.txt', date('Y-m-d H:i:s') . "22222\n", FILE_APPEND);
$rezult = json_decode( $this->appApiService->get($data) , true );
file_put_contents('/var/www/symfony_docker/var/log/log.txt', date('Y-m-d H:i:s') . "33333\n", FILE_APPEND);
if($rezult['rez'] AND isset($rezult['data']) ){
$user = $this->security->getUser();
$rez = json_decode($rezult['data'], true);
$lastAnswerDate = new \DateTime( );
file_put_contents('/var/www/symfony_docker/var/log/log.txt', date('Y-m-d H:i:s') . "4444444\n", FILE_APPEND);
foreach($user->getAppPersonalAccounts() as $acc){
if( $acc->getNumber() == $accountNumber){
if(!empty($rez)){
$acc->setLastHistoryCounterDate( new \DateTime() );
$acc->setLastHistoryCounter( $rez);
}else{
$rez = $acc->getLastHistoryCounter();
$lastAnswerDate = $acc->getLastHistoryCounterDate();
if(empty($rez)){
$rez = [];
$lastAnswerDate = new \DateTime( );
}
}
// $acc->setLastHistoryCounter()
}
}
file_put_contents('/var/www/symfony_docker/var/log/log.txt', date('Y-m-d H:i:s') . "555555\n", FILE_APPEND);
$rez = [
'rezult' => true,
'data' => $rez,
'lastAnswerDate' => $lastAnswerDate->format('Y-m-d H:i:s'),
];
}else{
$rez = ['rezult' => false, 'error' => $rezult['err_msg']];
}
}else{
$rez = ['rezult' => false, 'error' => $isUserData['error']];
}
}else{
$rez = ['rezult' => false, 'error' => "Не задано поля: $valid"];
}
file_put_contents('/var/www/symfony_docker/var/log/log.txt', date('Y-m-d H:i:s') . "666666\n", FILE_APPEND);
$response = new JsonResponse();
$response->setData($rez);
$this->logHistory->save($logId, 'get_meter_readings_history', $rez);
file_put_contents('/var/www/symfony_docker/var/log/log.txt', date('Y-m-d H:i:s') . "77777\n", FILE_APPEND);
return $response;
}
#[Route('/api/cron-set-meter-readings', name: 'cron_set_meter_readings')]
public function cron_set_meter_readings(Request $request)
{
$AppCounterReading = $this->entityManager->getRepository(AppCounterReading::class)->findBy(['status' => 'new']);
if(count($AppCounterReading) > 0){
$Ids = array_map(fn($n) => $n->getId(), $AppCounterReading);
// Масове оновлення статусу та дати
$this->entityManager->createQuery(
'UPDATE App\Entity\AppCounterReading n
SET n.status = :newStatus,
n.date_send = :now
WHERE n.id IN (:ids)'
)
->setParameter('newStatus', 'in_progress')
->setParameter('now', new \DateTime())
->setParameter('ids', $Ids)
->execute();
}
$i = 0;
foreach($AppCounterReading as $counterReding){
$p = $counterReding->getPersonal()->getOwner()->getPhone();
$p = str_replace('+', '', $p);
$data = [
'method' => 'set-meter-readings',
'data' => [
'phone' => $p,
'app_user_id' => $counterReding->getPersonal()->getOwner()->getId(),
'account' => trim($counterReding->getPersonal()->getNumber()),
'number_of_scale' => $counterReding->getPersonal()->getNumberOfScale(),
'reading1' => $counterReding->getValue(),
'reading2' => $counterReding->getValue2(),
'reading3' => $counterReding->getValue3(),
]
];
$rezult = json_decode( $this->appApiService->get($data) , true );
if($rezult['rez']){
$counterReding->setDateSend(new \DateTime());
$counterReding->setStatus('complate');
$this->entityManager->persist($counterReding);
$this->entityManager->flush();
$i++;
}else{
$rez = ['rezult' => false, 'error' => $rezult['err_msg']];
$counterReding->setStatus('error');
$counterReding->setDescription($rezult['err_msg']);
$this->entityManager->persist($counterReding);
$this->entityManager->flush();
}
}
$rez = ['count' => count($AppCounterReading)];
$response = new JsonResponse();
$response->setData($rez);
return $response;
}
/** Відправка показників лічильника { "user": "31", "account":"0900015104", "number_of_scale":"3", "reading1":"1234", "reading2":"0", "reading3":"0" } */
#[Route('/api/set-meter-readings', name: 'set_meter_readings')]
public function set_meter_readings(Request $request)
{
$data = json_decode($request->getContent(), true);
$logId = $this->logHistory->save(false, 'set_meter_readings', $data);
$valid = $this->valid( $data, ['account', 'user', 'number_of_scale', 'reading1', 'reading2', 'reading3'] );
if( empty($valid) ){
$isUserData = $this->isUserData($data['user'], $data['account']);
if( $isUserData['rezult'] ){
$find = $this->entityManager->getRepository(User::class)->findOneBy(['id' => $data['user']]);
if($find){
$data = [
'method' => 'set-meter-readings',
'data' => [
'phone' => $find->getPhone(),
'app_user_id' => $find->getId(),
'account' => $data['account'],
'number_of_scale' => $data['number_of_scale'],
'reading1' => $data['reading1'],
'reading2' => $data['reading2'],
'reading3' => $data['reading3'],
]
];
$rezult = json_decode( $this->appApiService->get($data) , true );
if($rezult['rez']){
$rez = [
'rezult' => true,
'message' => 'Дані відправлено!',
];
}else{
$rez = ['rezult' => false, 'error' => $rezult['err_msg']];
}
}else{
$rez = ['rezult' => false, 'error' => 'Користувача не знайдено!'];
}
}else{
$rez = ['rezult' => false, 'error' => $isUserData['error']];
}
}else{
$rez = ['rezult' => false, 'error' => "Не задано поля: $valid"];
}
$response = new JsonResponse();
$response->setData($rez);
$this->logHistory->save($logId, 'set_meter_readings', $rez);
return $response;
}
/** Заявка на відновлення електропостачання { "user": 31, "account": "0900015104", "eic": "36457", "dno_id": "1", "when_off": "2024-08-01 14:30", "pib": "Іваненко Іван Іванович", "phone": "380xxxxxxxxx", "eic_count": "1" } */
#[Route('/api/set-no-light-request', name: 'set_no_light_request')]
public function set_no_light_request(Request $request)
{
// echo '<pre>';
$data = json_decode($request->getContent(), true);
// $data = [
// 'user' => 31,
// 'account' => '0900015104',
// 'phone' => '380xxxxxxxxx',
// 'voltage' => '123',
// 'voltage_susidy' => 'Так',
// 'media' => 2
// // 'imageFile' => new CURLFile(realpath(__DIR__) . '/11.png'),
// ];
$logId = $this->logHistory->save(false, 'set_no_light_request', $data);
$valid = $this->valid( $data, ['account', 'eic', 'user', 'dno_id', 'when_off', 'pib', 'phone', 'eic_count'] );
if( empty($valid) ){
$isUserData = $this->isUserData($data['user'], $data['account']);
if( $isUserData['rezult'] ){
$find = $this->entityManager->getRepository(User::class)->findOneBy(['id' => $data['user']]);
$accountNumber = trim($data['account']);
$account = false;
if($find){
$permission = json_decode( $this->appApiService->check_last_register_no_power($data['account']) , true);
if(!$permission['rez'] AND $permission['dozvil'] !== true){
// print_r( $permission); die;
return new JsonResponse(['rezult' => false,'error' => $permission['err_msg']], 404);
}
// var_dump( $permission);
// die;
$data = [
'method' => 'set-no-light-request',
'data' => [
'account' => $accountNumber,
'app_user_id' => $find->getId(),
'eic' => $data['eic'],
'dno_id' => $data['dno_id'],
'when_off' => $data['when_off'],
'pib' => $data['pib'],
'phone' => $data['phone'],
'eic_count' => $data['eic_count'],
],
];
$rezult = json_decode( $this->appApiService->get($data) , true );
if(isset($rezult['rez']) AND $rezult['rez']){
foreach($find->getAppPersonalAccounts() as $acc){
if(trim( $acc->getNumber() ) == $accountNumber)
$account = $acc;
}
if($account){
$ServiceOrderHistory = new ServiceOrderHistory();
$ServiceOrderHistory->setName('Заявка про відсутність електроенерії');
$ServiceOrderHistory->setDateEntered( new \DateTime() );
$ServiceOrderHistory->setType('set-no-light-request');
$ServiceOrderHistory->setStatus('new');
$ServiceOrderHistory->setPersonalAccount($account);
$this->entityManager->persist($ServiceOrderHistory);
$this->entityManager->flush();
}
$rez = [
'rezult' => true,
'message' => 'Дані відправлено!',
// 'account' => $rezult['account'],
];
}else{
$rez = ['rezult' => false, 'error' => $rezult['err_msg']];
}
}else{
$rez = ['rezult' => false, 'error' => 'Користувача не знайдено!'];
}
}else{
$rez = ['rezult' => false, 'error' => $isUserData['error']];
}
}else{
$rez = ['rezult' => false, 'error' => "Не задано поля: $valid"];
}
$response = new JsonResponse();
$response->setData($rez);
$this->logHistory->save($logId, 'set_no_light_request', $rez);
return $response;
}
/** Отримати всі акаунти по номеру телефону { "phone": "380xxxxxxxxx", "bot_type": "telegram" } */
#[Route('/api/get-all-accounts-by-phone', name: 'get_all_accounts_by_phone')]
public function get_all_accounts_by_phone(Request $request)
{
$data = json_decode($request->getContent(), true);
$logId = $this->logHistory->save(false, 'get_all_accounts_by_phone', $data);
$valid = $this->valid( $data, ['phone', 'bot_type'] );
if( empty($valid) ){
$user = $this->security->getUser();
if($user and $user->getPhone() == $data['phone']){
// ok
$data = [
'method' => 'get-all-accounts-by-phone',
'data' => [
'phone' => $data['phone'],
'bot_type' => $data['bot_type'],
],
];
$rezult = json_decode( $this->appApiService->get($data) , true );
if($rezult['rez']){
$rez = [
'rezult' => true,
'accounts' => $rezult['accounts']
];
}else{
$rez = ['rezult' => false, 'error' => $rezult['err_msg']];
}
}else{
$rez = ['rezult' => false, 'error' => "Користувача не знайдено або номер телефону не співпадає!"];
}
}else{
$rez = ['rezult' => false, 'error' => "Не задано поля: $valid"];
}
$response = new JsonResponse();
$response->setData($rez);
$this->logHistory->save($logId, 'get_all_accounts_by_phone', $rez);
return $response;
}
/** Створення особового рахунку юридичної особи { "eic": "36457", "edrpou": "12345678", "name": "ТОВ Ромашка", "owner": "31" } */
#[Route('/api/yur-create-personal-account', name: 'yurCreatePersonalAccount')]
public function yurCreatePersonalAccount(Request $request)
{
$data = json_decode($request->getContent(), true);
$logId = $this->logHistory->save(false, 'yurCreatePersonalAccount', $data);
$valid = $this->valid( $data, ['eic', 'edrpou', 'name', 'owner'] );
if( empty($valid) ){
$isUserData = $this->isUserData($data['owner'], false);
if( $isUserData['rezult'] ){
$find = $this->entityManager->getRepository(User::class)->findOneBy(['id' => $data['owner']]);
if($find){
$data = ['eic' => $data['eic'], 'app_user_id' => $find->getId(), 'edrpou' => $data['edrpou'],'name' => $data['name']];
$res = json_decode( $this->appApiService->YurCheckPersonalAccount($data) , true );
$name = (!empty($data['name'])) ? $data['name'] : $data['eic'];
if(isset($res['rez']) AND $res['rez'] AND $res['correct_data']){
$personal = new AppPersonalAccount();
$personal->setOwner($find);
$personal->setNumber(trim( $data['eic'] ));
$personal->setName($name);
$personal->setNumberOfScale(0);
$personal->setActive(true);
$personal->setIsMain(true);
$personal->setDateEntered($this->datetime);
$personal->setType('factory');
$personal->setEic($data['eic']);
$personal->setNotificationStatus('disabled');
$this->entityManager->persist($personal);
$this->entityManager->flush();
foreach($res['data'] as $res_data){
$accounts = $this->entityManager->getRepository(Accounts::class)->findOneBy(['number' => $res_data['acc'], 'eic' => $res_data['eic_kod']]);
if(!$accounts){
$accounts = new Accounts();
$accounts->setNumber(trim( $res_data['acc'] ));
$accounts->setEic($res_data['eic_kod']);
$accounts->setEicParent($res_data['eic_kod_place']);
$this->entityManager->persist($accounts);
$this->entityManager->flush();
}
$personalChild = new AppPersonalAccount();
$personalChild->setOwner($find);
$personalChild->setNumber(trim( $res_data['acc'] ));
$personalChild->setName($res_data['name']);
$personalChild->setCounter($res_data['counter']);
$personalChild->setNumberOfScale(0);
$personalChild->setActive(true);
$personalChild->setIsMain(false);
$personalChild->setIsShow(true);
$personalChild->setDateEntered($this->datetime);
$personalChild->setType('factory');
$personalChild->setEic($res_data['eic_kod']);
$personalChild->setParent($personal);
$fullAdresses = $res_data['city_name'] . ' ' . $res_data['street_name'] . ' ' . $res_data['building_name'];
$personalChild->setFullAddress($fullAdresses);
$personalChild->setCity($res_data['city_name']);
$personalChild->setStreet($res_data['street_name']);
$personalChild->setBuilding($res_data['building_name']);
$personalChild->setMainFullAddress($fullAdresses);
$personalChild->setNotificationStatus('active');
$this->entityManager->persist($personalChild);
$this->entityManager->flush();
}
$rez = [
'registered' => true,
'id' => $personal->getId(),
];
}else{
$rez = ['registered' => false, $res];
}
}else{
$rez = ['registered' => false];
}
}else{
$rez = ['registered' => false, 'error' => $isUserData['error']];
}
}else{
$rez = ['registered' => false, 'error' => "Не задано поля: $valid"];
}
$response = new JsonResponse();
$response->setData($rez);
$this->logHistory->save($logId, 'yurCreatePersonalAccount', $rez);
return $response;
}
#[Route('/api/service_order_histories/last', name: 'service_order_history_last', methods: ['GET'])]
public function getLastByFilter(
Request $request,
ServiceOrderHistoryRepository $repository,
SerializerInterface $serializer,
): JsonResponse {
$type = $request->query->get('type');
$number = $request->query->get('number');
if (!$type || !$number) {
return new JsonResponse([
'error' => 'Parameters "type" and "number" are required',
], 400);
}
$qb = $repository->createQueryBuilder('h')
->leftJoin('h.personalAccount', 'pa')
->andWhere('h.type = :type')
->andWhere('pa.number = :number') // ⚠️ якщо інше поле — зміни тут
->setParameter('type', $type)
->setParameter('number', $number)
->orderBy('h.dateEntered', 'DESC')
->setMaxResults(1);
$result = $qb->getQuery()->getOneOrNullResult();
if (!$result) {
return new JsonResponse([], 200);
}
return new JsonResponse(
$serializer->serialize(
$result,
'json',
['groups' => ['service_history:read']]
),
200,
[],
true
);
}
#[Route('/api/pw_cities', name: 'pw_cities', methods: ['GET'])]
public function pw_cities(
Request $request
): JsonResponse {
$request = $request->query->all();
$result = $this->powerOn->sendCurl($request, '/api/pw_cities');
return new JsonResponse(
$result,
200,
[],
true
);
}
#[Route('/api/pw_otgs', name: 'pw_otgs', methods: ['GET'])]
public function pw_otgs(
Request $request
): JsonResponse {
$request = $request->query->all();
// echo '<pre>';
// print_r($request);
// die;
$result = $this->powerOn->sendCurl($request, '/api/pw_otgs');
return new JsonResponse(
$result,
200,
[],
true
);
}
/**
* pagination:false
* city.id: 851
*/
#[Route('/api/pw_streets', name: 'pw_streets', methods: ['GET'])]
public function pw_streets(
Request $request
): JsonResponse {
$request = $request->query->all();
$result = $this->powerOn->sendCurl($request, '/api/pw_streets');
return new JsonResponse(
$result,
200,
[],
true
);
}
/**
* pagination: false
* city.id: 851
* street.id: 7815
*
*/
#[Route('/api/pw_accounts', name: 'pw_accounts', methods: ['GET'])]
public function pw_accounts(
Request $request
): JsonResponse {
$request = $request->query->all();
$result = $this->powerOn->sendCurl($request, '/api/pw_accounts');
return new JsonResponse(
$result,
200,
[],
true
);
}
// #[Route('/api/pw_accounts', name: 'pw_accounts', methods: ['GET'])]
// public function pw_accounts(
// Request $request
// ): JsonResponse {
// // /api/pw_accounts_all_data
// $request = $request->query->all();
// $result = $this->powerOn->sendCurl($request, '/api/pw_accounts');
// return new JsonResponse(
// $result,
// 200,
// [],
// true
// );
// }
#[Route('/api/create-personal-account-address', name: 'createPersonalAccountAddress')]
public function createPersonalAccountAddress(Request $request)
{
// 473629
$data = json_decode($request->getContent(), true);
$logId = $this->logHistory->save(false, 'create-personal-account-address', $data);
$valid = $this->valid( $data, ['account', 'owner', 'full_address'] );
if( empty($valid) ){
$isUserData = $this->isUserData($data['owner']);
if( $isUserData['rezult'] ){
$find = $this->entityManager->getRepository(User::class)->findOneBy(['id' => $data['owner']]);
if($find){
$number = trim( $data['account'] );
$name = isset($data['name']) ? trim( $data['name'] ) : '';
$d = [
'account' => $number
];
$res = json_decode( $this->powerOn->sendPost($d, '/api/pw_accounts_all_data') , true );
if(isset($res['res']) AND $res['res']){
if(isset($res['data'])){
$personal = $this->entityManager->getRepository(AppPersonalAccount::class)->findOneBy(['number' => $res['data']['acc'], 'owner' => $find]);
if(!$personal){
$name = (!empty($name)) ? $name : $number;
$accounts = $this->entityManager->getRepository(Accounts::class)->findOneBy(['number' => $res['data']['acc']]);
if(!$accounts){
$accounts = new Accounts();
$accounts->setNumber($res['data']['acc']);
$accounts->setEic($res['data']['eicKod']);
$this->entityManager->persist($accounts);
$this->entityManager->flush();
}
$personal = new AppPersonalAccount();
$personal->setOwner($find);
$personal->setNumber($res['data']['acc']);
$personal->setName($name);
$personal->setActive(true);
$personal->setIsMain(true);
$personal->setFullAddress($data['full_address']);
$personal->setCity($res['data']['city']);
$personal->setStreet($res['data']['street']);
$personal->setBuilding($res['data']['buildingName']);
$personal->setMainFullAddress($data['full_address']);
$personal->setEic($res['data']['eicKod']);
$personal->setDateEntered($this->datetime);
$personal->setType('address');
$personal->setAccounts($accounts);
$personal->setNotificationStatus('active');
$this->entityManager->persist($personal);
$this->entityManager->flush();
$rez = [
'registered' => true,
'id' => $personal->getId(),
'full_address' => $personal->getFullAddress()
];
}else{
$rez = [
'registered' => false,
'error' => 'Особовий рахунок вже існує!'
];
}
}else{
$rez = ['registered' => false, 'error' => "Не знайдено даних по адресі!"];
}
}else{
$rez = ['registered' => false, 'error' => "Нема відповіді сервера!"];
}
}else{
$rez = ['registered' => false];
}
}else{
$rez = ['registered' => false, 'error' => $isUserData['error']];
}
}else{
$rez = ['registered' => false, 'error' => "Не задано поля: $valid"];
}
$response = new JsonResponse();
$response->setData($rez);
$this->logHistory->save($logId, 'create-personal-account-address', $rez);
return $response;
}
}