230 lines
7.8 KiB
PHP
230 lines
7.8 KiB
PHP
<?php
|
||
|
||
namespace App\Commands;
|
||
|
||
use App\Component\Models\Terminal;
|
||
use App\Console\Commands\HRCCommand;
|
||
use App\Console\Commands\HRCCommandInterface;
|
||
|
||
class GETImportMenu extends HRCCommand implements HRCCommandInterface {
|
||
protected $signature = 'getimportmenu';
|
||
|
||
public function command($input, $output = null) {
|
||
$HRCPortalURL = 'https://portal.hrc.by/';
|
||
$folder = 'menu';
|
||
$terminal = Terminal::where('soft', '=', 1)->where('is_active', '=', 1)->first();
|
||
$url = $HRCPortalURL . 'api/cloud/list?api=2.0&project_code=hrc&code=' . $terminal['key'] . '&folder=' . $folder;
|
||
$search = curl_init();
|
||
|
||
curl_setopt_array($search, array(
|
||
CURLOPT_URL => $url,
|
||
CURLOPT_RETURNTRANSFER => true,
|
||
CURLOPT_HEADER => false,
|
||
CURLOPT_MAXREDIRS => 10,
|
||
CURLOPT_TIMEOUT => 0,
|
||
CURLOPT_FOLLOWLOCATION => true,
|
||
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
|
||
));
|
||
$search_response = curl_exec($search);
|
||
curl_close($search);
|
||
$responses = json_decode($search_response, TRUE)['files'];
|
||
|
||
/*{"status":"success","message":[{"size":"61671","mimetype":"application\/xml","timestamp":1655321649,"type":"file","path":"menu\/Menu_1_1.xml","dirname":"menu","basename":"Menu_1_1.xml","extension":"xml","filename":"Menu_1_1"}]}*/
|
||
|
||
foreach ($responses as $key => $response) {
|
||
$filename = $response['basename'];
|
||
//$path = '/backup/' . $filename . '.xml';
|
||
$path = '/menu/' . $filename;
|
||
$download_url = $HRCPortalURL . 'api/cloud/download?api=2.0&project_code=hrc&code=' . $terminal['key'] . '&path=' . $path;
|
||
$download = curl_init();
|
||
|
||
curl_setopt_array($download, array(
|
||
CURLOPT_URL => $download_url,
|
||
CURLOPT_RETURNTRANSFER => true,
|
||
CURLOPT_HEADER => false,
|
||
CURLOPT_MAXREDIRS => 10,
|
||
CURLOPT_TIMEOUT => 0,
|
||
CURLOPT_FOLLOWLOCATION => true,
|
||
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
|
||
));
|
||
$download_response = curl_exec($download);
|
||
curl_close($download);
|
||
$file = json_decode($download_response, TRUE)['content'];
|
||
}
|
||
$dirname = __DIR__ . "\\..\\..\\..\\Exchange\\" . $terminal['key'] . "\\menu\\";
|
||
if (!is_dir($dirname)) {
|
||
mkdir($dirname, 0755, 'w+');
|
||
}
|
||
if (file_exists($dirname . $filename)) {
|
||
unlink($dirname . $filename);
|
||
}
|
||
$handle = fopen($dirname . $filename, 'w+');
|
||
fputs($handle, chr(0xEF) . chr(0xBB) . chr(0xBF)); // BOM
|
||
file_put_contents($dirname . $filename, base64_decode($file));
|
||
fclose($handle);
|
||
$menu_file = $dirname . $filename;
|
||
$objXmlDocument = simplexml_load_file($menu_file);
|
||
$objJsonDocument = json_encode($objXmlDocument);
|
||
$xmlmenu = json_decode($objJsonDocument, TRUE);
|
||
$GeneralSettings = $xmlmenu['GeneralSettings']['@attributes'];
|
||
$Printers = $xmlmenu['Printers']['Item'];
|
||
$ReportCategory = $xmlmenu['ReportCategory']['Item'];
|
||
$TypesMenu = $xmlmenu['TypesMenu']['Item'];
|
||
$Dishes = $xmlmenu['Dishes']['Item'];
|
||
$MenuItems = $xmlmenu['Menu']['Item'];
|
||
$Units_Dishes = $xmlmenu['Units_Dishes']['Item'];
|
||
$Modifiers = $xmlmenu['Modifiers']['Item'];
|
||
|
||
//проверка целостности меню
|
||
$errors = [];
|
||
$error_counter = 0;
|
||
foreach ($MenuItems as $key => $MenuItem) {
|
||
$folder_trigger = $MenuItem['@attributes']['isGroop'] + 0;
|
||
if ($folder_trigger == 0) {
|
||
if ($MenuItem['@attributes']['CodePrinter'] == ' ' || $MenuItem['@attributes']['CodePrinter'] == '0') {
|
||
$error_counter = $error_counter + 1;
|
||
array_push($errors, 'Отсутствует место хранения у товара ' . $MenuItem['@attributes']['Name']);
|
||
} else {
|
||
$dish_code_printer = $MenuItem['@attributes']['CodePrinter'] + 0;
|
||
}
|
||
$dish_code = $MenuItem['@attributes']['Code'] + 0;
|
||
$printer_trigger = 0;
|
||
$units_trigger = 0;
|
||
foreach ($Printers as $key => $printer) {
|
||
$printer_code = $printer['@attributes']['Code'] + 0;
|
||
if ($printer_code == $dish_code_printer) {
|
||
$printer_trigger = $printer_trigger + 1;
|
||
}
|
||
}
|
||
if ($printer_trigger == 0) {
|
||
$error_counter = $error_counter + 1;
|
||
array_push($errors, 'Место хранения для товара ' . $MenuItem['@attributes']['Name'] . ' не найдено');
|
||
}
|
||
foreach ($Units_Dishes as $key => $Unit) {
|
||
$unit_dish_code = $Unit['@attributes']['CodeDishes'] + 0;
|
||
if ($unit_dish_code == $dish_code) {
|
||
$units_trigger = $units_trigger + 1;
|
||
}
|
||
}
|
||
if ($units_trigger == 0) {
|
||
$error_counter = $error_counter + 1;
|
||
array_push($errors, 'Порционность для товара ' . $dish['@attributes']['Name'] . ' не найдена');
|
||
}
|
||
}
|
||
}
|
||
//конец проверки целостности меню
|
||
|
||
if ($error_counter == 0) {
|
||
//Menus, Folders, Dishes, Units, Printers, Report Categories, Modifiers
|
||
|
||
//Start menu parser
|
||
$base_menus = Menu::where('is_history', 0)->get();
|
||
foreach ($TypesMenu as $key => $Menu) {
|
||
$menu_code = $Menu['@attributes']['Code'] + 0;
|
||
$menu_name = $Menu['@attributes']['Name'];
|
||
foreach ($base_menus as $key => $base_menu) {
|
||
if ($base_menu['code'] == $menu_code) {
|
||
$old_menu = Menu::where('is_history', 0)
|
||
->where('code', $base_menu['code'])
|
||
->update(['is_history' => 1]);
|
||
}
|
||
$new_menu = Menu::upsert([
|
||
['name' => $menu_name,
|
||
'application_id' => 1,
|
||
'code' => $menu_code,
|
||
'is_history' => 0,
|
||
'is_export' => 1],
|
||
], ['name'],
|
||
['application_id'],
|
||
['code'],
|
||
['is_history'],
|
||
['is_export']
|
||
);
|
||
}
|
||
}
|
||
//End menu parser
|
||
|
||
//Start folders parser
|
||
$base_folders = Folders::where('is_history', 0)->get();
|
||
foreach ($MenuItems as $key => $MenuItem) {
|
||
$folder_code = $MenuItem['@attributes']['Code'] + 0;
|
||
$folder_name = $MenuItem['@attributes']['Name'];
|
||
$folder_complex = $MenuItem['@attributes']['Complex'] + 0;
|
||
$folder_menu_code = $MenuItem['@attributes']['CodeTypeMenu'] + 0;
|
||
$folder_trigger = $MenuItem['@attributes']['isGroop'] + 0;
|
||
if ($folder_trigger == 1) {
|
||
$folder_code_parent = $MenuItem['@attributes']['CodeParent'] + 0;
|
||
$create_folder_trigger = 1;
|
||
foreach ($base_folders as $key => $base_folder) {
|
||
if ($base_folder['code'] == $folder_code && $base_folder['name'] != $folder_name) {
|
||
$old_folder = Folders::where('is_history', 0)
|
||
->where('code', $base_folder['code'])
|
||
->update(['is_history' => 1]);
|
||
$create_folder_trigger = 1;
|
||
}
|
||
if ($base_folder['code'] == $folder_code && $base_folder['name'] == $folder_name) {
|
||
$create_folder_trigger = 0;
|
||
}
|
||
}
|
||
if ($create_folder_trigger == 1) {
|
||
$new_folder = Folders::upsert([
|
||
['name' => $folder_name,
|
||
'parent_code' => $folder_code_parent,
|
||
'menu_code' => $folder_menu_code,
|
||
'code' => $folder_code,
|
||
'color' => '',
|
||
'is_history' => 0,
|
||
'is_export' => 1,
|
||
'is_complex' => $folder_complex,
|
||
'is_migrate' => 0,
|
||
'is_p_migrate' => 0,
|
||
'show_on_display' => 0,
|
||
'is_bot_export' => 0,
|
||
],
|
||
], ['name'],
|
||
['parent_code'],
|
||
['menu_code'],
|
||
['code'],
|
||
['color'],
|
||
['is_history'],
|
||
['is_export'],
|
||
['is_complex'],
|
||
['is_migrate'],
|
||
['is_p_migrate'],
|
||
['show_on_display'],
|
||
['is_bot_export']
|
||
);
|
||
}
|
||
}
|
||
}
|
||
//End folders parser
|
||
|
||
//Start Dishes
|
||
$base_dishes = Dishes::get();
|
||
foreach ($MenuItems as $key => $MenuItem) {
|
||
$dish_code = $MenuItem['@attributes']['Code'] + 0;
|
||
$folder_trigger = $MenuItem['@attributes']['isGroop'] + 0;
|
||
if ($folder_trigger == 0) {
|
||
foreach ($base_dishes as $key => $base_dish) {
|
||
if ($base_dish['code'] == $dish_code) {
|
||
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//End Dishes
|
||
}
|
||
|
||
/* $check_setting = Settings::where('code', 12)->first();
|
||
$check_setting = $check_setting['value'] + 0;
|
||
if ($check_setting == 0) {
|
||
|
||
*/
|
||
|
||
return [
|
||
'status' => 'success',
|
||
'error_counter' => $error_counter,
|
||
'errors' => $errors,
|
||
];
|
||
}
|
||
} |