<?php
//***************************************************************************************
// Функционал серверной части таблицы "Контроль Уровней"
// Функции вызываются нажатием кнопок в таблице и при выполнении полного цикла действий
// modules/raz_con_base.php
//***************************************************************************************
function cdat($z,$s)            // проверка даты $z дата    $s шаблон
//************************************************************
{if (strlen($z)!=strlen($s))    // если длины шаблона даты и самой даты не совпадают
{return 7;}
// ГГГГ-ММ-ДД чч:мм:сс
//--------------------
$poz=strpos($s, "Г");
$год="";
for ($i =$poz; $i <=strlen($s)-1; $i++) 
{$ts=substr($s, $i, 1);
if ($ts!="Г") {break;}
$год=$год.substr($z, $i, 1); 
}
//--------------------
$poz=strpos($s, "М");
$месяц="";
for ($i =$poz; $i <=strlen($s)-1; $i++) 
{$ts=substr($s, $i, 1);
if ($ts!="М") {break;}
$месяц=$месяц.substr($z, $i, 1); 
}
//-----------------------
$poz=strpos($s, "Ч");
$число="";
for ($i =$poz; $i <=strlen($s)-1; $i++) 
{$ts=substr($s, $i, 1);
if ($ts!="Ч") {break;}
$число=$число.substr($z, $i, 1); 
}
//-----------------------
$poz=strpos($s, "ч");
$час="";
for ($i =$poz; $i <=strlen($s)-1; $i++) 
{$ts=substr($s, $i, 1);
if ($ts!="ч") {break;}
$час=$час.substr($z, $i, 1); 
}
//-----------------------
$poz=strpos($s, "м");
$мин="";
for ($i =$poz; $i <=strlen($s)-1; $i++) 
{$ts=substr($s, $i, 1);
if ($ts!="м") {break;}
$мин=$мин.substr($z, $i, 1); 
}
//-----------------------
$poz=strpos($s, "с");
$сек="";
for ($i =$poz; $i <=strlen($s)-1; $i++) 
{$ts=substr($s, $i, 1);
if ($ts!="с") {break;}
$сек=$сек.substr($z, $i, 1); 
}
//echo "<hr>".$год."+".$месяц."+".$число."+".$час."+".$мин."+".$сек."+";
if(!ctype_digit($год) or !ctype_digit($месяц) or  !ctype_digit($число) or  !ctype_digit($час) or !ctype_digit($мин) or  !ctype_digit($сек))
{return "1";}
if  (!checkdate ($месяц,$число, $год)) {return "2";}
if(!is_numeric($час) or !is_numeric($мин) or  !is_numeric($сек)) {return "3";}
if ($час<0 or $час>23) {return "4";}
if ($мин<0 or $мин>60) {return "5";}
if ($сек<0 or $сек>60) {return "6";}
return $число.".".$месяц.".". $год." ". $час.":". $мин.":". $сек;
}




//*************************************************************************
     function ku_button11($p)
// Контроль  данных таблицы "Контроль Уровней"
//*************************************************************************
{
 global $контрольуровней_поля;
 global $уровни_поля;
 global $час_поля100;
 global $тренд_поля100;
 list($abs1, $s2) = explode("pages",getcwd( ));
 // индексы и наименования таблицы "Уровни"
$f=$abs1."pages/Na~chalo/contents/10,08,16_001/1.txt";      
$mti = file($f); 	                                         // таблицу в массив
$k=0;                                                   // всего ошибочных строк
for ($i = 0; $i <= count($mti)-1; $i++) 
{$tiz=explode("```",str_replace("\r\n","",$mti[$i]));
$индексы[$tiz[$уровни_поля['индекс']]]=$tiz[$уровни_поля['наименование']];
}

$f=$abs1."pages/100/contents/27,04,17_03/1.txt";      
$mti = file($f); 	                                         // таблицу "час" в массив
for ($i = 0; $i <= count($mti)-1; $i++) 
{$tiz=explode("```",str_replace("\r\n","",$mti[$i]));
$индексы2[$tiz[$час_поля100['час']]]=$i;
}

$f=$abs1."pages/100/contents/27,04,17_04/1.txt";      
$mti = file($f); 	                                         // таблицу "тренд_изменения_уровня" в массив
for ($i = 0; $i <= count($mti)-1; $i++) 
{$tiz=explode("```",str_replace("\r\n","",$mti[$i]));
$индексы3[$tiz[$тренд_поля100['тренд_код']]]=$tiz[$тренд_поля100['тренд']];
}

$fmrep=$abs1."pages/Na~chalo/contents/11,08,16_01/1.txt";    // файл таблицы Контроль уровней
$mrep2 = file($fmrep); 	                                      // корректируемый файл  
$w = fopen($fmrep, 'w') or exit;   

for ($ii = 0; $ii <= count($mrep2)-1; $ii++)                  // каждую строку Контроля уровней
{
$pre=explode("```",str_replace("\r\n","",$mrep2[$ii]));
$os="";                                                        // текст ошибки в строке 
if (!array_key_exists($pre[$контрольуровней_поля['индекс']],$индексы)) 
{$os=$os." Нет поста";
$pre[$контрольуровней_поля['наименование']]="";
}
else                                    // откорректируем или введем наименование
{
$pre[$контрольуровней_поля['наименование']]=$индексы[$pre[$контрольуровней_поля['индекс']]];
}

if ($pre[$контрольуровней_поля['дата']]=="")
{$os=$os." Нет даты";}
else
{$mdat=explode(".",$pre[$контрольуровней_поля['дата']]);
if (count($mdat)!=3)
{$os=$os." Неформат даты";}
else
{$месяц=$mdat[1];
$число=$mdat[0];
$год=$mdat[2];
if  (!checkdate ($месяц,$число, $год))
{$os=$os." Неформат даты";
}}}

if ($pre[$контрольуровней_поля['час']]=="")
{$os=$os." Нет час";}
else
{
if (!array_key_exists($pre[$контрольуровней_поля['час']],$индексы2)) 
{$os=$os." Час вне списка";
}
}

if ($pre[$контрольуровней_поля['тренд_код']]=="")
{$os=$os." Нет тренд_код";}
else
{if (!array_key_exists($pre[$контрольуровней_поля['тренд_код']],$индексы3)) 
{$os=$os." тренд_код вне списка";
}
else
{$pre[$контрольуровней_поля['тренд_значение']]=$индексы3[$pre[$контрольуровней_поля['тренд_код']]];	 
}
}

if ($pre[$контрольуровней_поля['получено']]=="")
{$os=$os." Нет получено";}
else
{
$время=cdat($pre[$контрольуровней_поля['получено']],"ЧЧ-ММ-ГГГГ чч:мм:сс");
if($время=="1" or $время=="2" or $время=="3"  or $время=="4"  or $время=="5"  or $время=="6" or $время=="7")
{$os=$os." получено ".$время;
}
}

$уровень=$pre[$контрольуровней_поля['уровень']];
if ($уровень=="")
{$os=$os." Нет уровень";}
else
{if(!is_numeric ($уровень))
{$os=$os." Уровень не число";}
}
$изменение=$pre[$контрольуровней_поля['изменение']];
if ($изменение=="")
{$os=$os." Нет изменение";}
else
{if(!is_numeric ($изменение))
{$os=$os." изменение не число";}
}
$u20_час=$pre[$контрольуровней_поля['20_час']];
if ($u20_час=="")
{$os=$os." Нет 20_час";}
else
{if(!is_numeric ($u20_час))
{$os=$os." 20_час не число";}
}
// пишем проконтролированную строку
if ($os!="")
{$k++;}

$pre[$контрольуровней_поля['ошибки']]=$os;
fwrite($w,implode("```", $pre)."\r\n"); 
}
if ($p=="tab")              // вызов из таблицы
{ global $soob;	
$soob="Контроль выполнен, ошибок - ".$k;
}
else                       // вызов из главной формы  
{echo  "<li>Контроль выполнен, ошибок - ".$k;
}
fclose($w); 
}


//*******************************************************************************
   function ku_button12($p)
// Перемещение данных без ошибок из  таблицы "Контроль уровней" в таблицу "Уровни"
//*******************************************************************************
{
 global $контрольуровней_поля;
 global $уровни_поля;
 global $уровни_сын_поля;
 global $soob;	
 list($abs1, $s2) = explode("pages",getcwd( ));
$os="";                                           // тексты ошибок 
//*************************************************************
// Отсортируем Контроль уровней по Идекс+год+мес+день+час+номер пп
//*************************************************************
//************************************
// массив индексов  в таблице УРОВНЕЙ
//************************************
$mmti=array(); 
$mmtiz=array(); 
$f=$abs1."pages/Na~chalo/contents/10,08,16_001/1.txt";      
$mti = file($f); 	                             // таблицу в массив
for ($i = 0; $i <= count($mti)-1; $i++) 
{$tiz=explode("```",str_replace("\r\n","",$mti[$i]));
$mmti[$tiz[1]]=$tiz[0];                          // ключ - индекс значенеие номер по порядку
$mmtiz[$tiz[1]]=$tiz[2];                         // мссив наименований пунктов 
}

$mgk=array(); 
$ftt=$abs1."pages/Na~chalo/contents/11,08,16_01/1.txt";   // файл таблицы  
$ku=  file($ftt);                                // строки Контроль уровней (МАССИВ СТРОК)
for ($i = 0; $i <= count($ku)-1; $i++)           // по всем строкам
{$ts=str_replace("\r\n","",$ku[$i]);             // уберем конец строки
 $mz=explode("```",$ts);                         // строку на столбцы   
if (trim($mz[$контрольуровней_поля["ошибки"]])=="")    // ошибочные строки исключаем
{
if (array_key_exists($mz[$контрольуровней_поля["индекс"]],$mmti))
{
$dd=$mz[$контрольуровней_поля["дата"]];         // получим дату
 list($d, $m,$g) = explode(".",$dd);             // разобьем дату 
 // значение в асс массив  индекс+год+мес+день+час+номер пп  значение - указатель на массив строк
$mgk[$mz[$контрольуровней_поля["индекс"]].$g.$m.$d.$mz[$контрольуровней_поля["час"]].$mz[0]]=$i;
}
else
{
if (strstr($os2, $mz[$контрольуровней_поля["индекс"]]))
{}
else
{$os2=$os2."Нет индекса ".$mz[$контрольуровней_поля["индекс"]]." выполни контроль !<br>";}
}
}
}
ksort($mgk);                                    // отсортируем по ключу  (по времени N пп) тк возможны повторения
reset($mgk);                                    // на начало  
//*******************************************
// удалим повторения  принимается последний
//*******************************************
$mgk2=array(); 
for ($i2 = 0; $i2 <= count($mgk)-1; $i2++)       // индекс+год+мес+день+час
{$wss=current($mgk); 
 $mz=explode("```",$ku[$wss]);                   // строку на столбцы   
 $dd=$mz[$контрольуровней_поля["дата"]];         // получим дату
 list($d, $m,$g) = explode(".",$dd);             // разобьем дату 
 // значение в асс массив  год+мес+день+час -> значение индекс на строку в массиве строк
$mgk2[$mz[$контрольуровней_поля["индекс"]].$g.$m.$d.$mz[$контрольуровней_поля["час"]]]=$wss; //
next($mgk);   
}
ksort($mgk2);                                    // отсортируем по ключу 
reset($mgk2);                                    // на начало  
$mgk3=array(); 
for ($i2 = 0; $i2 <= count($mgk2)-1; $i2++)      // сформируем массив ключ - индекс,содержание - указатели через 
{$wss=current($mgk2); 
 $mz=explode("```",$ku[current($mgk2)]);          // строку на столбцы   
 // добавим строки в асс массив  ключ ->индекс, знчения указатели на строки этого индекса
 if (array_key_exists($mz[$контрольуровней_поля["индекс"]],$mgk3)) 
 {
 $mgk3[$mz[$контрольуровней_поля["индекс"]]]=$mgk3[$mz[$контрольуровней_поля["индекс"]]].",".$wss;
 }
 else
 {$mgk3[$mz[$контрольуровней_поля["индекс"]]]=$wss;}
 next($mgk2);   
 }


for ($j = 0; $j <= count($mgk3)-1; $j++)         // для каждого индекса из Контроля уровней
{
// определим файл сына уровней
$f=$abs1."pages/Na~chalo/contents/10,08,16_001/".$mmti[key($mgk3)]."/1.txt";
// определим папку сына уровней
$f2=$abs1."pages/Na~chalo/contents/10,08,16_001/".$mmti[key($mgk3)]."/";      
if  (!file_exists($f2))                     // если сына уровней нет папки
{mkdir($f2);                                // создадим ее   
}
if  (!file_exists($f))                      // если у сына нет файла
{$ww100=  fopen($f, 'w') or exit;           // создадим пустой файл
fclose($ww100);
}
$mgs=  file($f);                             // читаем сына УРОВНЕЙ
$mgs_son=array();                            // массив строку сына уровней  

for ($ii = 0; $ii <= count($mgs)-1; $ii++)   // для каждой из строк сына уровней
{
$ges_son = explode("```",$mgs[$ii]);        // строку на столбец
$dd=$ges_son[$уровни_сын_поля["дата"]];
list($d, $m,$g) = explode(".",$dd);          // разобьем дату 
$mges_son[$g.$m.$d.$ges_son[$уровни_сын_поля["час"]]]=$mgs[$ii];  // значение в асс массив  год+мес+день+час
}

//массив сына УРОВНИ сформирован или нет 
//*************************************************************************
// поместим в массив сына данные из массива Контроль уровней (слияние массивов)
//*************************************************************************
$wss2=current($mgk3);                                // список указателей на строки индекса контроля уровней 
$wss=explode(",",$wss2);                             // преобразуем в массив 
for ($i = 0; $i <= count($wss)-1; $i++)              // каждую строку масства указателей  
{$ws5=$ku[$wss[$i]];                                 // по указателю получим строку 
 $ws5=str_replace("\r\n","",$ws5);                    // уберем конец строки
 $ws3 = explode("```",$ws5);                          // строку из Контроль уровней на столбцы 
 $wsn=$i+1;                                           // N пп
 for ($ii = 1; $ii <= count($уровни_сын_поля2)-1; $ii++)  // по всему полям сына уровней
{if (array_key_exists($уровни_сын_поля2[$ii],$контрольуровней_поля))   // если по обозначению такой есть в масс контр
{$wsn=$wsn."```".$ws3[$контрольуровней_поля[$уровни_сын_поля2[$ii]]];  // поместим его значение в стору сына 
}
else                                          
{$wsn=$wsn."```";                                // можно было и по умолчанию вставить
}
}
 $dd=$ws3[$контрольуровней_поля["дата"]];        // получим дату из контроля уровней
 list($d, $m,$g) = explode(".",$dd);             // разобьем дату 
 $keykur=$g.$m.$d.$ws3[$контрольуровней_поля["час"]];  // ключ строки из контроля уровней
$mges_son[$keykur]=$wsn."\r\n";
next($wss);            
}
ksort($mges_son);                               // отсортируем по ключу  слияние
reset($mges_son);                               // на начало  
$w = fopen($f, 'w') or exit;                    // откроем для записи сына уровней
for ($i7 = 0; $i7 <= count($mges_son)-1; $i7++) // каждую строку слияния
{$ws7=current($mges_son);                       // текущая строка
//echo $ws7."<br>";
$rez = explode("```",$ws7);                     // на столбцы
$rez[0]=$i7+1;                                  // новый N пп 
fwrite($w,implode("```", $rez));                // пишем  слияние столбцов
next($mges_son);                                // следующая строка слияния
}
fclose($w);                                     // закрыли слияние
array_splice ($mges_son,0);                     // зачистим массив слияния 
next($mgk3);                                    // следующаий индекс массива контроля уровней 
}

// покажем окно ошибок
if ($os3!="" || $os2!="")
{
}
else
{
// из таблицы контроль данных удалим строки без ошибок
$w = fopen($ftt, 'w') or exit;                   // откроем для записи контроль уровней
$k=1;
$kos=0;
for ($i = 0; $i <= count($ku)-1; $i++)           // по всем строкам
{$ts=str_replace("\r\n","",$ku[$i]);             // уберем конец строки
 $mz=explode("```",$ts);                         // строку на столбцы   
if ($mz[$контрольуровней_поля["ошибки"]]!="")    // только ошибочные строки сохраним
{$mz[0]=$k++;
fwrite($w,implode("```", $mz)."\r\n");           // пишем 
}
else
{$kos++;}
}
fclose($w);                                     // закрыли
if ($p=="tab")              // вызов из таблицы
{ global $soob;	
$soob="Перемещено в базу ".$kos;
}
else                       // вызов из главной формы  
{echo  "<li>Перемещено в базу - ".$kos;
}



}
}
