Files
admin-php-module/commands/GETImportMenu.php
miroman-afk 9c3b633098 v.2.19
Обновлены миграции
Разработка парсера меню из 1с
2022-06-22 23:05:26 +03:00

230 lines
7.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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,
];
}
}