<?php

/**
 * marketorders plugin
 *
 * @package marketorders
 * @version 1.0.0
 * @author CMSWorks Team
 * @copyright Copyright (c) CMSWorks.ru
 * @license BSD
 */

defined('COT_CODE') or die('Wrong URL');

// Requirements
require_once cot_langfile('marketorders', 'plug');

// Tables and extras
cot::$db->registerTable('market_orders');
cot::$db->registerTable('market_cart');
cot::$db->registerTable('market_citems');
cot::$db->registerTable('market_track');

function cot_mk_addtrack($oid = 0, $code = '', $fruser = 0, $touser = 0, $data = array(), $status = 0, $subid = 0) {
  global $db, $db_market_track, $sys;
  $id = 0;
  $rt = array(
    't_oid' => $oid,
    't_subid' => $subid,
    't_code' => $code,
    't_date' => $sys['now'],
    't_update' => $sys['now'],
    't_fruser' => $fruser,
    't_touser' => $touser,
    't_status' => $status,
    't_json' => (is_array($data) ? $data : array())
  );
  $rt['t_json'] = json_encode($rt['t_json']);

  $db->insert($db_market_track, $rt);
  $id = $db->lastInsertId();
  return $id;
}

function cot_mk_cost_crt($cost = 0, $type = 'payer', $tax = 0) {
  if($type == 'seller') {
    $cost -= ($cost / 100) * $tax;
  } elseif($type == 'payer') {
    $cost += ($cost / 100) * $tax;
  }
  return $cost;
}

function cot_mk_user_analytics($uid = 0) {
  global $db, $db_market_orders, $sys;

  $mk_analytics = array(
    'cnt_orders_all' => 0,
    'cnt_orders_done' => 0,
    'cnt_orders_done_time' => 0,
    'cnt_orders_again_client' => 0,
    'cnt_orders_done_prcnt' => 0,
    'cnt_orders_done_time_prcnt' => 0,
    'cnt_orders_again_client_prcnt' => 0,
    'clients' => array()
  );

  if($uid > 0) {
    $orders = $db->query("SELECT * FROM $db_market_orders
      WHERE order_paid>0 AND order_status!='new' AND order_status!='check' AND order_status!='claim' AND order_seller=".$uid)->fetchAll();

    foreach($orders as $ord) {
      $mk_analytics['cnt_orders_all']++;

      if($ord['order_done'] > 0) {
        $mk_analytics['cnt_orders_done']++;
        if($ord['order_deadline'] >= $ord['order_worktime']) $mk_analytics['cnt_orders_done_time']++;

        if(in_array($ord['order_userid'], $mk_analytics['clients']) || $db->query("SELECT COUNT(*) FROM $db_market_orders
            WHERE order_paid>0 AND order_status!='new' AND order_userid=".$ord['order_userid']." AND order_seller=".$uid.' AND order_id!='.$ord['order_id'])->fetchColumn() > 0) {
          if(!in_array($ord['order_userid'], $mk_analytics['clients'])) $mk_analytics['clients'][] = $ord['order_userid'];
          $mk_analytics['cnt_orders_again_client']++;
        }
      }
    }

    $mk_analytics['cnt_orders_again_client'] -= count($mk_analytics['clients']);

    if($mk_analytics['cnt_orders_all'] > 0) {
      $mk_analytics['cnt_orders_done_prcnt'] = round(($mk_analytics['cnt_orders_done']/($mk_analytics['cnt_orders_all']/100)), 0);
      $mk_analytics['cnt_orders_done_time_prcnt'] = round(($mk_analytics['cnt_orders_done_time']/($mk_analytics['cnt_orders_all']/100)), 0);
      $mk_analytics['cnt_orders_again_client_prcnt'] = round(($mk_analytics['cnt_orders_again_client']/($mk_analytics['cnt_orders_all']/100)), 0);
    }
  }
  return $mk_analytics;
}

function cot_mk_queue_cnt($ord = array(), $urrid = 0) {
  global $sys, $db, $db_market_orders;

  if(!$urrid && is_array($ord)) $urrid = $ord['order_seller'];
  if(!$urrid) $urrid = 0;

  //return ((is_array($ord) && $ord['order_pid'] > 0) ? $db->query("SELECT COUNT(*) FROM $db_market_orders WHERE order_pid=".$ord['order_pid']." AND order_accept>0 AND order_status!='cancel' AND order_status!='new' AND order_status!='paid' AND order_status!='done' AND order_accept<".($ord['order_accept'] > 0 ? $ord['order_accept'] : $sys['now']))->fetchColumn() : 0);
  return $db->query("SELECT COUNT(*) FROM $db_market_orders WHERE order_seller=".$urrid." AND order_accept>0 AND order_status!='cancel' AND order_status!='new' AND order_status!='paid' AND order_status!='done' AND order_accept<".(is_array($ord) && $ord['order_accept'] > 0 ? $ord['order_accept'] : $sys['now']))->fetchColumn();
}

function cot_mk_queue_next($urrid = 0) {
  global $sys, $db, $db_market_orders;

  $marketordernext = array(
    'order_id' => 0
  );
  if($urrid > 0) {
    $marketordernext = $db->query("SELECT * FROM $db_market_orders
      WHERE order_seller=".$urrid." AND order_sendinstr>0 AND order_accept>0 AND order_queue=0 AND order_paid>0 AND order_status='queue' ORDER BY order_accept ASC LIMIT 1")->fetch();
      //order_pid=".$marketorder['order_pid']." AND
    if($marketordernext['order_id'] > 0) {
      $db->update($db_market_orders, array('order_queue' => $sys['now']), 'order_id='.$marketordernext['order_id']);
    }
  }

  return $marketordernext['order_id'];
}

function cot_mk_queue_text($ord = array(), $queuecnt = 0, $type = 'payer') {
  $queuemsg = '';

  if(!$ord['order_start']) {
    $queuemsg = ($type == 'seller' ?
      'Если вы не начнете работу над заказом в течение 24 часов, заказ будет отменен автоматически.'
      :
      'Если продавец не начнет работу над заказом в течение 24 часов, заказ будет отменен автоматически.'
      );
    if($queuecnt > 0) {
      if($ord['order_accept'] > 0 ) {
        $queuemsg = ($type == 'seller' ?
        'Вы приняли заказ, покупатель готов подождать пока вы завершите '.cot_declension($queuecnt, 'заказ,заказа,заказов').' из очереди'
        :
        'Продавец принял заказ и сможет приступить после завершения '.cot_declension($queuecnt, 'заказа,заказов,заказов')
        );
      } else {
        $queuemsg = ($type == 'seller' ?
        'Если вы не примете заказ в течение 24 часов, заказ будет отменен автоматически.'
        :
        'Если продавец не примет заказ в течение 24 часов, заказ будет отменен автоматически.<br>Продавец сможет приступить к вашему заказу после завершения '.cot_declension($queuecnt, 'заказа,заказов,заказов')
        );
      }
    } elseif(!$ord['order_accept']) {
      $queuemsg = ($type == 'seller' ?
      'Если вы не примете заказ в течение 24 часов, заказ будет отменен автоматически.'
      :
      'Если продавец не примет заказ в течение 24 часов, заказ будет отменен автоматически.'
      );
    } elseif(!$ord['order_sendinstr']) {
      $queuemsg = ($type == 'seller' ?
      'Покупатель еще не предоставил всю необходимую информацию. Только после получения всей информации вы сможете начать работу над заказом'
      :
      'Отправьте всю необходимую информацию продавцу. Только после получения всей информации начнется работа над заказом'
      );
    }
  }

  return $queuemsg;
}

function cot_mk_cancel_reasons($ord = array(), $role = '', $getreason = '', $getrule = false) {
  global $marketorders_cancel_reasons;
  $return_full = array();
  $return = array();

  if($getrule) {
    $getreason = '';
    $return = 0;
    if($role == 'seller') {
      if(!$ord['order_done'] && !$ord['order_claim'] && !$ord['order_cancel'] && !$ord['order_cancel_perf']) $return = 1;
    } elseif($role == 'payer') {
      if(!$ord['order_done'] && !$ord['order_claim'] && !$ord['order_cancel'] && !$ord['order_cancel_perf']) $return = 1;
    }
  } else {
    if(!$ord['order_done'] && !$ord['order_claim'] && !$ord['order_cancel']) {
      if($role == 'seller') {
        if($ord['order_start'] > 0) {
          foreach(array('seller_payer_cannot_execute_correct', 'seller_do_not_like_this_worker', 'seller_no_communication_with_worker', 'seller_no_time', 'seller_force_cancel') as $type) {
            if($marketorders_cancel_reasons[$type]['showradio']) $return[$type] = $marketorders_cancel_reasons[$type];
            $return_full[$type] = $marketorders_cancel_reasons[$type];
          }
        } else {
          if($marketorders_cancel_reasons['seller_no_reason']['showradio']) $return['seller_no_reason'] = $marketorders_cancel_reasons['seller_no_reason'];
          $return_full['seller_no_reason'] = $marketorders_cancel_reasons['seller_no_reason'];
        }
      } elseif($role == 'payer') {
        if($ord['order_start'] > 0) {
          foreach(array('payer_worker_cannot_execute_correct', 'payer_do_not_like_this_worker', 'payer_no_communication_with_worker', 'payer_other_no_guilt') as $type) {
            if($marketorders_cancel_reasons[$type]['showradio']) $return[$type] = $marketorders_cancel_reasons[$type];
            $return_full[$type] = $marketorders_cancel_reasons[$type];
          }
        } else {
          if($marketorders_cancel_reasons['payer_no_reason']['showradio']) $return['payer_no_reason'] = $marketorders_cancel_reasons['payer_no_reason'];
          $return_full['payer_no_reason'] = $marketorders_cancel_reasons['payer_no_reason'];
        }
      }
    }
  }

  return (!empty($getreason) ? $return_full[$getreason] : $return);
}

function cot_mk_step_plus_one($i) {
  return $i+1;
}

function cot_mk_track_stack($lastdate = 0, $IS_ORDER_PAGE = 0, $getnotygroup = false) {
  global $usr, $sys, $L, $db, $db_x, $db_market_track, $db_market, $db_market_orders, $db_users,
    $marketorders_status_codes, $marketorders_status_hist, $marketorders_notify_group, $marketorders_notify_group_title;

  $return['push'] = array(
    'cnt' => array(
      'notify' => 0,
      'message' => 0,
    ),
    'cntnew' => array(
      'order' => 0,
      'notify' => 0,
      'message' => 0,
    ),
    'order' => array(
      'tracks' => array(),
      'hist' => array()
    ),
    'notify' => array(),
    'message' => array(),
  );

  $queuecnt = 0;
  $queuemsg = '';

  if($usr['id'] > 0) {
    if(!$lastdate) $lastdate = 0;
    $newlastdate = $lastdate;

    $IS_ORDER_UTYPE = '';
    $IS_ORDER = array();
    $marketorder = array();

    $tracks = $db->query("SELECT * FROM $db_market_track WHERE t_touser=".$usr['id']." AND t_status=0 ORDER BY t_update DESC")->fetchAll();

    $return['test'] = ($lastdate > 0 ? $db->query("SELECT * FROM $db_market_track WHERE t_touser=".$usr['id']." AND t_update>".$lastdate." ORDER BY t_update DESC")->fetchAll() : array());

    $orders = array();
    if($IS_ORDER_PAGE > 0) {
      $IS_ORDER = $db->query("SELECT * FROM $db_market_orders  AS o
        		LEFT JOIN $db_market AS m ON m.item_id=o.order_pid
        		WHERE order_status!='new' AND order_id=".$IS_ORDER_PAGE." LIMIT 1")->fetch();

      if($IS_ORDER['order_id'] > 0 && ($IS_ORDER['order_userid'] == $usr['id'] || $IS_ORDER['order_seller'] == $usr['id'])) {
        $orders[$IS_ORDER['order_id']] = $IS_ORDER;
        $marketorder = $IS_ORDER;
        $IS_ORDER_UTYPE = ($IS_ORDER['order_seller'] == $usr['id'] ? 'seller' : 'payer');
        $t = new XTemplate(cot_tplfile(array('marketorders', 'order', $IS_ORDER_UTYPE, $structure['market'][$marketorder['item_cat']]['tpl']), 'plug'));

        $t->assign(cot_generate_markettags($IS_ORDER['order_pid'], 'ORDER_PRD_', $cfg['market']['shorttextlen'], $usr['isadmin'], $cfg['homebreadcrumb']));

        $utags = array(
          'seller' => cot_generate_usertags($IS_ORDER['order_seller'], 'ORDER_SELLER_'),
          'payer' => cot_generate_usertags($IS_ORDER['order_userid'], 'ORDER_CUSTOMER_')
        );
        $t->assign($utags['seller']);
        $t->assign($utags['payer']);

        $queuecnt = cot_mk_queue_cnt($IS_ORDER);
        $queuemsg = cot_mk_queue_text($IS_ORDER, $queuecnt, ($IS_ORDER['order_seller'] == $usr['id'] ? 'seller' : 'payer'));

        $order_steps = (!empty($IS_ORDER['order_steps']) ? json_decode($IS_ORDER['order_steps'], 1) : array());

        $t->assign(array(
          "MK_COST_CTR_SIMPLE" => cot_mk_cost_crt(500, 'seller', $IS_ORDER['order_tax']),
        	"ORDER_ID" => $IS_ORDER['order_id'],
          "ORDER_ITEM_ID" => $IS_ORDER['item_id'],
        	"ORDER_COUNT" => $IS_ORDER['order_count'],
        	"ORDER_COST" => $IS_ORDER['order_cost'],
          "ORDER_COST_FORMAT" => cot_market_cost_format($IS_ORDER['order_cost'], $IS_ORDER['order_cost_dodji']),
        	"ORDER_TITLE" => $IS_ORDER['order_title'],
        	"ORDER_TEXT" => $IS_ORDER['order_text'],
        	"ORDER_EMAIL" => $IS_ORDER['order_email'],
          "ORDER_PAID" => $IS_ORDER['order_paid'],
          "ORDER_ACCEPT" => $IS_ORDER['order_accept'],
          "ORDER_START" => $IS_ORDER['order_start'],
        	"ORDER_DONE" => $IS_ORDER['order_done'],
          "ORDER_CANCEL" => $IS_ORDER['order_cancel'],
          "ORDER_CANCEL_PERF" => $IS_ORDER['order_cancel_perf'],
          "ORDER_SENDINSTR" => $IS_ORDER['order_sendinstr'],
        	"ORDER_STATUS" => $IS_ORDER['order_status'],
        	"ORDER_LOCALSTATUS" => $L['marketorders_status_'.$IS_ORDER['order_status']],
          "ORDER_CUEUECNT" => $queuecnt,
          "ORDER_STEPS" => $order_steps,
          "ORDER_STEPS_LOCK" => false, //todo
          "ORDER_LOWRATING" => $IS_ORDER['order_lowrating'],
        ));
      } else {
        $IS_ORDER_PAGE = 0;
      }
    }

    $extpl1 = cot_getextplugins('marketorders.order.track.loop');
    $track_loop = cot_incfile('marketorders', 'plug', 'track_loop');
    $fmsg = false;

    $notygroup = array(
      'notify' => array(),
      'message' => array()
    );

    foreach($tracks as $mkt) {
      $ord = array();
      if($mkt['t_oid'] > 0) {
        if(is_array($orders[$mkt['t_oid']])) {
          $ord = $orders[$mkt['t_oid']];
        } else {
          $ord = $db->query("SELECT * FROM $db_market_orders  AS o
        		LEFT JOIN $db_market AS m ON m.item_id=o.order_pid
        		WHERE order_status!='new' AND order_id=".$mkt['t_oid']." LIMIT 1")->fetch();

          if($ord['order_id'] > 0 && ($ord['order_userid'] == $usr['id'] || $ord['order_seller'] == $usr['id'])) {
            $orders[$ord['order_id']] = $ord;
          }
        }
      }

      if($mkt['t_update'] > $lastdate) {
        if($mkt['t_update'] > $newlastdate) $newlastdate = $mkt['t_update'];

        if($ord['order_id'] > 0) {
          if($IS_ORDER_PAGE > 0 && $IS_ORDER_PAGE == $ord['order_id']) {
            if($lastdate > 0) {
              $return['push']['cntnew']['order']++;

              $fmsg = true;
              include $track_loop;

              $return['push']['order']['hist'][] = array(
                'mkt_id' => $mkt['t_id'],
                'html' => cot_html_removelines($t->text('MAIN.MKT_ROW_RIGHT')),
              );
              $return['push']['order']['tracks'][] = array(
                'mkt_id' => $mkt['t_id'],
                'html' => cot_html_removelines($t->text('MAIN.MKT_ROW_MAIN')),
              );

              if($mkt['t_code'] == 'market_msg' && $mktdata['type'] == 'instruction' && $mkt['t_fruser'] == $ord['order_userid']) {
                $t->assign(array(
                  "MKT_ID" => 0,
                  "MKT_TITLE" => "Предоставлены данные",
                  "MKT_TEXT" => $queuemsg,
                  "MKT_CODE" => 'market_fmsg',
                	"MKT_JSON" => array(
                    'type' => $ord['order_status'],
                    'queue' => $queuecnt
                  ),
                ));
                $t->parse('MAIN.MKT_ROW_RIGHT');
                $t->parse('MAIN.MKT_ROW_MAIN');
                $return['push']['order']['hist'][] = array(
                  'mkt_id' => 0,
                  'html' => cot_html_removelines($t->text('MAIN.MKT_ROW_RIGHT')),
                );
                $return['push']['order']['tracks'][] = array(
                  'mkt_id' => 0,
                  'html' => cot_html_removelines($t->text('MAIN.MKT_ROW_MAIN')),
                );
              }
            }
          } else {
            $mkt['t_code_parse'] = $mkt['t_code'];

            if(in_array($mkt['t_code'], array_keys($marketorders_status_codes))) {
              $mkt['t_code_parse'] = 'cancel';
            }
            elseif($mkt['t_code'] == 'arbitrage_result') {
              $mktdata = json_decode($mkt['t_json'], 1);
              $mkt['t_code_parse'] = 'arbitrage_result';
              $mkt['t_code'] .= '_'.$mktdata['status'];
            }

            $mkt['notify_group'] = '';

            if($mkt['t_code'] == 'market_msg') {
              $mktdata = json_decode($mkt['t_json'], 1);
              if($mktdata['type'] == 'instruction') {
                $mkt['notymsg'] = 'Заказчик предоставил информацию по заказу #'.$ord['order_id'];
                $mkt['notify_group'] = 'market_msg_instruction';
              } else {
                $mkt['notymsg'] = 'Новое сообщение по заказу #'.$ord['order_id'];
                $mkt['notify_group'] = 'market_msg';
              }
            } else {
              $mkt['notymsg'] = cot_rc(($mkt['t_code_parse'] == 'cancel' ? $marketorders_status_codes[$mkt['t_code']]['notify'] : $marketorders_status_hist[$mkt['t_code']]['notify']), array(
                'order_id' => $ord['order_id']
              ));
            }

            if(empty($mkt['notify_group'])) $mkt['notify_group'] = $marketorders_notify_group[($mkt['t_code_parse'] == 'cancel' ? 'codes_' : 'hist_').$mkt['t_code']];
            if(empty($mkt['notify_group'])) $mkt['notify_group'] = 'nogroup';

            $notygroup['notify'][$mkt['notify_group']][] = array(
              'date' => $mkt['t_date'],
              'mkt' => $mkt,
              'href' => cot_url('plug', 'e=marketorders&m=order&id='.$ord['order_id'].'&scroll=1'),
              'title' => $mkt['notymsg'],
              'html' => '<a class="bold fs13 db nowrap" href="'.cot_url('plug', 'e=marketorders&m=order&id='.$ord['order_id'].'&scroll=1').'">
                          '.$mkt['notymsg'].'
                         </a>'
            );
            $notygroup['notify_notgroup'][] = array(
              'date' => $mkt['t_date'],
              'mkt' => $mkt,
              'href' => cot_url('plug', 'e=marketorders&m=order&id='.$ord['order_id'].'&scroll=1'),
              'title' => $mkt['notymsg'],
              'html' => '<a class="bold fs13 db nowrap" href="'.cot_url('plug', 'e=marketorders&m=order&id='.$ord['order_id'].'&scroll=1').'">
                          '.$mkt['notymsg'].'
                         </a>'
            );

            $return['push']['cntnew']['notify']++;
          }
        }
      }

      if(!($ord['order_id'] > 0 && $IS_ORDER_PAGE > 0 && $IS_ORDER_PAGE == $ord['order_id'])) $return['push']['cnt']['notify']++;
    }

    /*
      $ordersfolio = $db->query("SELECT * FROM $db_market_orders as o
        LEFT JOIN ".$db_x."reviews as r on o.order_id=r.item_code
        WHERE o.order_seller=".$usr['id']." AND order_done>0 AND order_done>".($sys['now']-86400*2)." AND (o.order_folio IS NULL OR o.order_folio='')")->fetchAll();
      //$return['test'] = $ordersfolio;
      foreach($ordersfolio as $tord) {
        if($lastdate < $tord['order_done']) {
          $notygroup['notify']['order_folio'][] = array(
            'date' => $tord['order_done'],
            'mkt' => array(
              't_oid' => $tord['order_id'],
            ),
            'href' => cot_url('plug', 'e=marketorders&m=order&id='.$tord['order_id'].'&scroll=1'),
            'title' => 'Добавьте работу в портфолио в заказе #'.$tord['order_id'],
            'html' => '<a class="bold fs13 db nowrap" href="'.cot_url('plug', 'e=marketorders&m=order&id='.$tord['order_id'].'&scroll=1').'">
                Добавьте работу в портфолио в заказе #'.$tord['order_id'].'
            </a>'
          );

          $notygroup['notify_notgroup'][] = array(
            'date' => $tord['order_done'],
            'mkt' => array(
              't_oid' => $tord['order_id'],
            ),
            'href' => cot_url('plug', 'e=marketorders&m=order&id='.$tord['order_id'].'&scroll=1'),
            'title' => 'Добавьте работу в портфолио в заказе #'.$tord['order_id'],
            'html' => '<a class="bold fs13 db nowrap" href="'.cot_url('plug', 'e=marketorders&m=order&id='.$tord['order_id'].'&scroll=1').'">
                Добавьте работу в портфолио в заказе #'.$tord['order_id'].'
            </a>'
          );
        }

        $return['push']['cnt']['notify']++;
        $return['push']['cntnew']['notify']++;
      }
    */

    if($getnotygroup) $return['notygroup'] = $notygroup;

    foreach($notygroup['notify'] as $tcode => $_arr) {
      $_arr_data['cnt'] = count($_arr);
      if($_arr_data['cnt'] > 1 && $tcode != 'nogroup') {
        $_arr_data['notymsg'] = cot_rc($marketorders_notify_group_title[$tcode], array(
            'cnt' => $_arr_data['cnt']
          ));
        $return['push']['notify'][] = '<a class="bold fs13 db nowrap" href="'.cot_url('plug', 'e=marketorders&m=notifications&type='.$tcode).'">
            '.$_arr_data['notymsg'].'
         </a>';
      } else {
        $return['push']['notify'][] = $_arr[0]['html'];
      }
    }

    if($t) unset($t);
  }

  $return['lastdate'] = ($newlastdate > 0 ? $newlastdate : $sys['now']);
  return $return;
}

global $marketorders_status_codes;
$marketorders_status_codes = array(
  'afterpaid_24hour' => array(
    'label' => 'Заказ отменен автоматически, т.к. не был взят продавцом в работу в течение 24 часов',
    'label_perf' => 'Заказ отменен автоматически, т.к. вы не приняли заказ в течении 24 часов',
    'balance' => 'Возврат по заказу, т.к. не был взят продавцом в работу в течение 24 часов',
    'track_state' => 'Отменен',
    'track_cust' => 'Заказ отменен автоматически, т.к. не был взят продавцом в работу в течение 24 часов',
    'track_perf' => 'Заказ отменен автоматически, т.к. вы не приняли заказ в течении 24 часов',
    'notify' => 'Заказ #{$order_id} отменен автоматически'
  ),
  'afterqueue_24hour' => array(
    'label' => 'Заказ отменен автоматически, т.к. продавец не приступил к заказу',
    'label_perf' => 'Заказ отменен автоматически, т.к. вы не приступили к заказу',
    'balance' => 'Возврат по заказу, т.к. продавец не приступил к заказу',
    'track_state' => 'Отменен',
    'track_cust' => 'Заказ отменен автоматически, т.к. продавец не приступил к заказу',
    'track_perf' => 'Заказ отменен автоматически, т.к. вы не приступили к заказу',
    'notify' => 'Заказ #{$order_id} отменен автоматически'
  ),
  'seller_no_reason' => array(
    'label' => 'Продавец отказался выполнить заказ',
    'label_perf' => 'Вы отказались выполнить заказ',
    'balance' => '',
    'track_state' => 'Отменен',
    'track_cust' => 'Продавец отказался выполнить заказ',
    'track_perf' => 'Вы отказались выполнить заказ',
    'notify' => 'Продавец отказался выполнить заказ #{$order_id}'
  ),
  'payer_no_reason' => array(
    'label' => 'Заказчик отменил заказа',
    'label_perf' => 'Заказчик отменил заказа',
    'balance' => 'Возврат по заказу, т.к. вы отказались',
    'track_state' => 'Отменен',
    'track_cust' => 'Вы отменили заказ',
    'track_perf' => 'Заказчик отменил заказ',
    'notify' => 'Заказчик отменил заказ #{$order_id}'
  ),
  'payer_worker_cannot_execute_correct' => array(
    'label' => 'Продавец не выполнил заказ',
    'label_perf' => 'Продавец не выполнил заказ',
    'balance' => 'Возврат по заказу, т.к. заказ не выполнен',
    'track_state' => 'Отменен',
    'track_cust' => 'Вы отказались от заказа',
    'track_perf' => 'Заказчик отказался от заказа',
    'notify' => 'Заказчик отказался от заказа #{$order_id}'
  ),
  'payer_do_not_like_this_worker' => array(
    'label' => 'Сложилось непонимание с продавцом',
    'label_perf' => 'Сложилось непонимание с продавцом',
    'balance' => 'Возврат по заказу, т.к. сложилось непонимание с продавцом',
    'track_state' => 'Отменен',
    'track_cust' => 'Вы отказались от заказа',
    'track_perf' => 'Заказчик отказался от заказа',
    'notify' => 'Заказчик отказался от заказа #{$order_id}'
  ),
  'payer_no_communication_with_worker' => array(
    'label' => 'Нет связи с продавцом',
    'label_perf' => 'Нет связи с продавцом',
    'balance' => 'Возврат по заказу, т.к. нет связи с продавцом',
    'track_state' => 'Отменен',
    'track_cust' => 'Вы отказались от заказа',
    'track_perf' => 'Заказчик отказался от заказа',
    'notify' => 'Заказчик отказался от заказа #{$order_id}'
  ),
  'payer_other_no_guilt' => array(
    'label' => 'Заказчик отказался от заказа',
    'label_perf' => 'Заказчик отказался от заказа',
    'balance' => 'Возврат по заказу, т.к. вы отказались',
    'track_state' => 'Отменен',
    'track_cust' => 'Вы отказались от заказа',
    'track_perf' => 'Заказчик отказался от заказа',
    'notify' => 'Заказчик отказался от заказа #{$order_id}'
  ),
  'seller_payer_cannot_execute_correct' => array(
    'label' => 'Покупатель не поставил задачу',
    'label_perf' => 'Покупатель не поставил задачу',
    'balance' => 'Возврат по заказу, т.к. не указана нужная для начала работы',
    'track_state' => 'Отменен',
    'track_cust' => 'Продавец отказался от заказа',
    'track_perf' => 'Вы отказались от заказа',
    'notify' => 'Продавец отказался от заказа #{$order_id}'
  ),
  'seller_do_not_like_this_worker' => array(
    'label' => 'Сложилось непонимание с покупателем',
    'label_perf' => 'Сложилось непонимание с покупателем',
    'balance' => 'Возврат по заказу, т.к. сложилось непонимание с покупателем',
    'track_state' => 'Отменен',
    'track_cust' => 'Продавец отказался от заказа',
    'track_perf' => 'Вы отказались от заказа',
    'notify' => 'Продавец отказался от заказа #{$order_id}'
  ),
  'seller_no_communication_with_worker' => array(
    'label' => 'Нет связи с покупателем',
    'label_perf' => 'Нет связи с покупателем',
    'balance' => 'Возврат по заказу, т.к. нет связи с покупателем',
    'track_state' => 'Отменен',
    'track_cust' => 'Продавец отказался от заказа',
    'track_perf' => 'Вы отказались от заказа',
    'notify' => 'Продавец отказался от заказа #{$order_id}'
  ),
  'seller_no_time' => array(
    'label' => 'Нет времени на выполнение заказа',
    'label_perf' => 'Нет времени на выполнение заказа',
    'balance' => 'Возврат по заказу, т.к. у продавца нет времени на выполнение заказа',
    'track_state' => 'Отменен',
    'track_cust' => 'Продавец отказался от заказа',
    'track_perf' => 'Вы отказались от заказа',
    'notify' => 'Продавец отказался от заказа #{$order_id}'
  ),
  'seller_force_cancel' => array(
    'label' => 'Другая причина',
    'label_perf' => 'Другая причина',
    'balance' => 'Возврат по заказу, т.к. у продавца есть на то причины',
    'track_state' => 'Отменен',
    'track_cust' => 'Продавец отказался от заказа',
    'track_perf' => 'Вы отказались от заказа',
    'notify' => 'Продавец отказался от заказа #{$order_id}'
  ),
  'payer_and_perf_sogl' => array(
    'label' => 'Заказ отменён по согласованию сторон',
    'label_perf' => 'Заказ отменён по согласованию сторон',
    'balance' => 'Возврат по заказу, т.к. отменен по согласованию сторон',
    'track_state' => 'Отменен',
    'track_cust' => 'Заказ отменён по согласованию сторон',
    'track_perf' => 'Заказ отменён по согласованию сторон',
    'notify' => 'Заказ #{$order_id} отменён по согласованию сторон'
  ),
);

global $marketorders_status_hist;
$marketorders_status_hist = array(
  'order_paid' => array(
    'label' => 'Создан новый заказ',
    'label_perf' => 'Создан',
    'balance' => '',
    'track_state' => 'Создан',
    'track_cust' => 'Вы создали заказ',
    'track_perf' => 'Покупатель создал заказ',
    'notify' => 'Новый заказ #{$order_id}'
  ),
  'seller_accept_order' => array(
    'label' => 'Продавец принял заказ',
    'label_perf' => 'Вы приняли заказ',
    'balance' => '',
    'track_state' => 'Принят продавцом',
    'track_cust' => 'Продавец принял заказ',
    'track_perf' => 'Вы приняли заказ',
    'notify' => 'Продавец принял заказ #{$order_id}'
  ),
  'seller_start_order' => array(
    'label' => 'Взят в работу',
    'label_perf' => 'Вы взяли заказ в работу',
    'balance' => '',
    'track_state' => 'Взят в работу',
    'track_cust' => 'Продавец взял заказ в работу',
    'track_perf' => 'Вы взяли заказ в работу',
    'notify' => 'Продавец взял заказ #{$order_id} в работу'
  ),
  'seller_check_order' => array(
    'label' => 'Сдан на проверку',
    'label_perf' => 'Вы сдали заказ на проверку',
    'balance' => '',
    'track_state' => 'Сдан на проверку',
    'track_cust' => 'Продавец сдал заказ на проверку',
    'track_perf' => 'Вы сдали заказ на проверку',
    'notify' => 'Продавец сдал заказ #{$order_id} на проверку'
  ),
  'payer_addextras' => array(
    'label' => 'Добавлены опции',
    'label_perf' => 'Добавлены опции',
    'balance' => '',
    'track_state' => 'Добавлены опции',
    'track_cust' => 'Вы добавили опции',
    'track_perf' => 'Добавлены опции',
    'notify' => 'Добавлены новые опции в заказе #{$order_id}'
  ),
  'seller_addextras' => array(
    'label' => 'Предложены опции',
    'label_perf' => 'Предложены опции',
    'balance' => '',
    'track_state' => 'Предложены опции',
    'track_cust' => 'Предложены опции',
    'track_perf' => 'Вы предложили опции',
    'notify' => 'Продавец предложил опции в заказе #{$order_id}'
  ),
  'payer_reorder' => array(
    'label' => 'Отправлен на доработку',
    'label_perf' => 'Отправлен на доработку',
    'balance' => '',
    'track_state' => 'Отправлен на доработку',
    'track_cust' => 'Отправлен на доработку',
    'track_perf' => 'Отправлен на доработку',
    'notify' => 'Покупатель вернул заказ #{$order_id} на доработку'
  ),
  'payer_done_order' => array(
    'label' => 'Заказ принят',
    'label_perf' => 'Заказ принят',
    'balance' => '',
    'track_state' => 'Заказ принят',
    'track_cust' => 'Вы приняли принят',
    'track_perf' => 'Заказ принят',
    'notify' => 'Продавец принял заказ #{$order_id}'
  ),
  'auto_done_order' => array(
    'label' => 'Заказ принят автоматически',
    'label_perf' => 'Заказ принят автоматически',
    'balance' => '',
    'track_state' => 'Заказ принят автоматически',
    'track_cust' => 'Заказ принят автоматически',
    'track_perf' => 'Заказ принят автоматически',
    'notify' => 'Заказ #{$order_id} принят автоматически'
  ),
  'add_phases' => array(
    'label' => 'Заказ разделен на этапы',
    'label_perf' => 'Заказ разделен на этапы',
    'balance' => '',
    'track_state' => 'Заказ разделен на этапы',
    'track_cust' => 'Заказ разделен на этапы',
    'track_perf' => 'Заказ разделен на этапы',
    'notify' => 'Заказ #{$order_id} разделен на этапы'
  ),
  'report_phases' => array(
    'label' => 'Получен промежуточный отчет',
    'label_perf' => 'Получен промежуточный отчет',
    'balance' => '',
    'track_state' => 'Получен промежуточный отчет',
    'track_cust' => 'Получен промежуточный отчет',
    'track_perf' => 'Отправлен промежуточный отчет',
    'notify' => 'Получен промежуточный отчет по заказу #{$order_id}'
  ),
  'add_review' => array(
    'label' => 'Покупатель оставил отзыв по заказу',
    'label_perf' => 'Покупатель оставил отзыв по заказу',
    'balance' => '',
    'track_state' => 'Покупатель оставил отзыв по заказу',
    'track_cust' => 'Вы оставили отзыв по заказу',
    'track_perf' => 'Покупатель оставил отзыв по заказу',
    'notify' => 'Покупатель оставил отзыв по заказу #{$order_id}'
  ),
  'add_review_answer' => array(
    'label' => 'Продавец оставил ответ на отзыв',
    'label_perf' => 'Продавец оставил ответ на отзыв',
    'balance' => '',
    'track_state' => 'Продавец оставил ответ на отзыв',
    'track_cust' => 'Продавец оставил ответ на отзыв',
    'track_perf' => 'Вы оставили ответ на отзыв',
    'notify' => 'Продавец оставил ответ на отзыв по заказу #{$order_id}'
  ),
  'seller_to_arbitrage' => array(
    'label' => 'Продавец перевел заказ в Арбитраж',
    'label_perf' => 'Вы перевели заказ в Арбитраж',
    'balance' => '',
    'track_state' => 'Продавец перевел заказ в Арбитраж',
    'track_cust' => 'Продавец перевел заказ в Арбитраж',
    'track_perf' => 'Вы перевели заказ в Арбитраж',
    'notify' => 'Продавец перевел заказ #{$order_id} в Арбитраж'
  ),
  'payer_to_arbitrage' => array(
    'label' => 'Покупатель перевел заказ в Арбитраж',
    'label_perf' => 'Покупатель перевел заказ в Арбитраж',
    'balance' => '',
    'track_state' => 'Покупатель перевел заказ в Арбитраж',
    'track_cust' => 'Вы перевели заказ в Арбитраж',
    'track_perf' => 'Покупатель перевел заказ в Арбитраж',
    'notify' => 'Покупатель перевел заказ #{$order_id} в Арбитраж'
  ),
  'arbitrage_result_start' => array(
    'label' => 'Модератор вернул заказ в работу',
    'label_perf' => 'Модератор вернул заказ в работу',
    'balance' => '',
    'track_state' => 'Вернут в работу',
    'track_cust' => 'Модератор вернул заказ в работу',
    'track_perf' => 'Модератор вернул заказ в работу',
    'notify' => 'Модератор вернул заказ #{$order_id} в работу'
  ),
  'arbitrage_result_cancel' => array(
    'label' => 'Модератор отменил заказ',
    'label_perf' => 'Модератор отменил заказ',
    'balance' => '',
    'track_state' => 'Модератор отменил заказ',
    'track_cust' => 'Модератор отменил заказ',
    'track_perf' => 'Модератор отменил заказ',
    'notify' => 'Модератор отменил заказ #{$order_id}'
  ),
  'arbitrage_result_done' => array(
    'label' => 'Модератор завершил заказ',
    'label_perf' => 'Модератор завершил заказ',
    'balance' => '',
    'track_state' => 'Модератор завершил заказ',
    'track_cust' => 'Модератор завершил заказ',
    'track_perf' => 'Модератор завершил заказ',
    'notify' => 'Модератор завершил заказ #{$order_id}'
  ),
);

//группировка по коду, где код => группа
global $marketorders_notify_group;
$marketorders_notify_group = array(
  'codes_afterpaid_24hour' => 'order_cancel_auto',
  'codes_afterqueue_24hour' => 'order_cancel_auto',
  'codes_seller_no_reason' => 'seller_order_cancel',
  'codes_payer_no_reason' => 'payer_order_cancel',
  'codes_payer_worker_cannot_execute_correct' => 'payer_order_cancel',
  'codes_payer_do_not_like_this_worker' => 'payer_order_cancel',
  'codes_payer_no_communication_with_worker' => 'payer_order_cancel',
  'codes_payer_other_no_guilt' => 'payer_order_cancel',
  'codes_seller_payer_cannot_execute_correct' => 'seller_order_cancel',
  'codes_seller_do_not_like_this_worker' => 'seller_order_cancel',
  'codes_seller_no_communication_with_worker' => 'seller_order_cancel',
  'codes_seller_no_time' => 'seller_order_cancel',
  'codes_seller_force_cancel' => 'seller_order_cancel',
  'codes_payer_and_perf_sogl' => 'order_cancel',
  'hist_order_paid' => 'order_paid',
  'hist_seller_accept_order' => 'order_seller_start_order',
  'hist_seller_start_order' => 'order_seller_start_order',
  'hist_seller_check_order' => 'order_seller_check_order',
  'hist_payer_addextras' => 'order_payer_addextras',
  'hist_seller_addextras' => 'order_seller_addextras',
  'hist_payer_reorder' => 'order_payer_reorder',
  'hist_payer_done_order' => 'order_done_order',
  'hist_auto_done_order' => 'order_done_order',
  'hist_add_phases' => 'order_add_phases',
  'hist_report_phases' => 'order_report_phase',
  'hist_add_review' => 'order_add_review',
  'hist_add_review_answer' => 'order_add_review_answer',
  'hist_seller_to_arbitrage' => 'order_seller_to_arbitrage',
  'hist_payer_to_arbitrage' => 'order_payer_to_arbitrage',
  'hist_arbitrage_result_start' => 'order_start_moder',
  'hist_arbitrage_result_cancel' => 'order_cancel_moder',
  'hist_arbitrage_result_done' => 'order_done_moder',
//  'order_folio' => 'order_folio',
  'market_msg' => 'market_msg',
  'market_msg_instruction' => 'market_msg_instruction',
);

//Описание группировок
global $marketorders_notify_group_title;
$marketorders_notify_group_title = array(
  'order_cancel_auto' => 'Заказ отменён автоматически ({$cnt})',
  'payer_order_cancel' => 'Заказчик отказался от заказа ({$cnt})',
  'seller_order_cancel' => 'Продавец отказался от заказа ({$cnt})',
  'order_cancel' => 'Заказ отменён ({$cnt})',
  'order_paid' => 'Новый заказ ({$cnt})',
  'order_seller_start_order' => 'Продавец принял заказ ({$cnt})',
  'order_seller_start_order' => 'Заказ взят в работу ({$cnt})',
  'order_seller_check_order' => 'Заказ сдан на проверку ({$cnt})',
  'order_payer_addextras' => 'Добавлены новые опции в заказе ({$cnt})',
  'order_seller_addextras' => 'Продавец предложил опции в заказе ({$cnt})',
  'order_payer_reorder' => 'Заказ вернут на доработку ({$cnt})',
  'order_done_order' => 'Заказ принят ({$cnt})',
  'order_add_phases' => 'Заказ разделен на этапы ({$cnt})',
  'order_report_phase' => 'Получен промежуточный отчет ({$cnt})',
  'order_add_review' => 'Покупатель оставил отзыв ({$cnt})',
  'order_add_review_answer' => 'Продавец оставил ответ на отзыв ({$cnt})',
  'order_seller_to_arbitrage' => 'Продавец перевел заказ в Арбитраж ({$cnt})',
  'order_payer_to_arbitrage' => 'Покупатель перевел заказ в Арбитраж ({$cnt})',
  'order_start_moder' => 'Модератор вернул заказ в работу ({$cnt})',
  'order_cancel_moder' => 'Модератор отменил заказ ({$cnt})',
  'order_done_moder' => 'Модератор завершил заказ ({$cnt})',
//  'order_folio' => 'Добавьте работу в портфолио ({$cnt})',
  'market_msg' => 'Новое сообщение в заказе ({$cnt})',
  'market_msg_instruction' => 'Покупатель предоставил информацию ({$cnt})',
);

global $marketorders_cancel_reasons;
$marketorders_cancel_reasons = array(
  'seller_no_reason' => array(
    "showradio" => 0,
    "name" => "Отмена заказа",
    "track_status" => "seller_inpaid_cancel_request",
    "tooltip" => "",
    "lowrating" => 1
  ),
  'payer_no_reason' => array(
    "showradio" => 0,
    "name" => "Отмена заказа",
    "track_status" => "payer_inpaid_cancel_request",
    "tooltip" => "",
    "lowrating" => 0
  ),
  'payer_worker_cannot_execute_correct' => array(
    "showradio" => 1,
    "name" => "Продавец не может корректно выполнить заказ",
    "track_status" => "payer_inprogress_cancel_request",
    "tooltip" => "Выбирайте эту причину, если продавец не может выполнить заказ качественно и в том объеме, который указан в ".cot_sitename('padeg', 'p').".",
    "lowrating" => 2
  ),
  'payer_do_not_like_this_worker' => array(
    "showradio" => 1,
    "name" => "Сложилось непонимание с продавцом",
    "track_status" => "payer_inprogress_cancel_request",
    "tooltip" => "Выбирайте эту причину, если вы не можете договориться об условиях заказа с продавцом.",
    "lowrating" => 1
  ),
  'payer_no_communication_with_worker' => array(
    "showradio" => 1,
    "name" => "Нет связи с продавцом",
    "track_status" => "payer_inprogress_cancel_request",
    "tooltip" => "Выбирайте эту причину, если продавец не отвечает на ваши сообщения.",
    "lowrating" => 1
  ),
  'payer_other_no_guilt' => array(
    "showradio" => 1,
    "name" => "Другая причина, вины продавца нет",
    "track_status" => "payer_inprogress_cancel_request",
    "tooltip" => "Выбирайте эту причину если отмена происходит не по вине продавца. Не стоит указывать ее, если отменить заказ хочет сам продавец и просит выбрать именно эту причину.",
    "lowrating" => 0
  ),
  'seller_payer_cannot_execute_correct' => array(
    "showradio" => 1,
    "name" => "Покупатель не может корректно поставить задачу",
    "track_status" => "seller_inprogress_cancel_request",
    "tooltip" => "Выбирайте эту причину, если покупатель не может указать техническое задание.",
    "lowrating" => 0
  ),
  'seller_do_not_like_this_worker' => array(
    "showradio" => 1,
    "name" => "Сложилось непонимание с покупателем",
    "track_status" => "seller_inprogress_cancel_request",
    "tooltip" => "Выбирайте эту причину, если вы не можете договориться об условиях заказа с покупателем.",
    "lowrating" => 0
  ),
  'seller_no_communication_with_worker' => array(
    "showradio" => 1,
    "name" => "Нет связи с покупателем",
    "track_status" => "seller_inprogress_cancel_request",
    "tooltip" => "Выбирайте эту причину, если покупатель не отвечает на ваши сообщения.",
    "lowrating" => 0
  ),
  'seller_no_time' => array(
    "showradio" => 1,
    "name" => "Нет времени (неуважительная)",
    "track_status" => "seller_inprogress_cancel_request",
    "tooltip" => "Выбирайте ее, если не можете выполнить заказ из-за отсутствия времени. Ваш рейтинг ответственности будет снижен.",
    "lowrating" => 1
  ),
  'seller_force_cancel' => array(
    "showradio" => 1,
    "name" => "Указать другую причину (неуважительную)",
    "track_status" => "seller_inprogress_cancel_request",
    "tooltip" => "Укажите другую неуважительную причину. Ваш рейтинг ответственности будет снижен.",
    "lowrating" => 1
  ),
  'payer_and_perf_sogl' => array(
    "showradio" => 0,
    "name" => "Отмена заказа",
    "track_status" => "payer_inprogress_cancel_bysogl",
    "tooltip" => "",
    "lowrating" => 0
  ),
  'arbit_result_done_to_payer' => array(
    "showradio" => 0,
    "name" => "Завершение заказа",
    "track_status" => "arbitrage_result",
    "tooltip" => "Завершение заказа в пользу покупателя (по решению арбитража)",
    "lowrating" => 0
  ),
  'arbit_result_done_to_seller' => array(
    "showradio" => 0,
    "name" => "Завершение заказа",
    "track_status" => "arbitrage_result",
    "tooltip" => "Завершение заказа в пользу продавца (по решению арбитража)",
    "lowrating" => 0
  ),
  'arbit_result_done_to_split' => array(
    "showradio" => 0,
    "name" => "Завершение заказа",
    "track_status" => "arbitrage_result",
    "tooltip" => "Завершение заказа с разделением суммы заказа (по решению арбитража)",
    "lowrating" => 0
  ),
  'arbit_result_cancel_to_payer' => array(
    "showradio" => 0,
    "name" => "Отмена заказа",
    "track_status" => "arbitrage_result",
    "tooltip" => "Отмена заказа в пользу покупателя (по решению арбитража)",
    "lowrating" => 0
  ),
  'arbit_result_cancel_to_seller' => array(
    "showradio" => 0,
    "name" => "Отмена заказа",
    "track_status" => "arbitrage_result",
    "tooltip" => "Отмена заказа в пользу продавца (по решению арбитража)",
    "lowrating" => 0
  ),
  'arbit_result_cancel_to_split' => array(
    "showradio" => 0,
    "name" => "Отмена заказа",
    "track_status" => "arbitrage_result",
    "tooltip" => "Отмена заказа с разделением суммы заказа (по решению арбитража)",
    "lowrating" => 0
  ),
);

function cot_mk_reset_analytics($urrid = 0) {
  global $db, $db_users;
  if($urrid > 0) $db->update($db_users, array('user_mk_cache_upd' => 0, 'user_mk_cache' => json_encode(array())), 'user_id='.$urrid);
}

function cot_mk_workspeed($item = array()) {
  global $sys, $db, $db_market_orders;

  $return = array(
    'title' => '',
    'ratio' => 0,
    'mintime' => ($item['item_info_costplan_days'] > 0 ? $item['item_info_costplan_days'] : 1)*86400
  );

  $work_speed = array();

  if($item['item_id'] > 0) {
    $orders = $db->query("SELECT order_deadline, order_worktime FROM $db_market_orders as o
      WHERE order_paid>0 AND order_worktime>0 AND order_status='done' AND order_pid=".$item['item_id']." AND order_seller=".$item['item_userid'])->fetchAll();

    foreach($orders as $ord) {
      $work_speed[] = (100 / $ord['order_deadline']) * ($ord['order_worktime']);
    }

    $return['ratio'] = (count($work_speed) > 0 ? (array_sum($work_speed)/count($work_speed)) : 0);
  }

  if($return['ratio'] > 0) {
    $return['ratio'] = $return['ratio']/100;
    $return['title'] = cot_build_timegap((int)($sys['now'] - $return['mintime']*$return['ratio']));
  }

  return $return;
}

function cot_mk_stat_comparison($type = '', $urr = array(), $totalusers = -1, $extra = array()) {
  global $db, $db_users, $db_market, $sys;

  $higher = 0;
  $precent = 0;

  if($urr['user_id'] > 0) {
    if($totalusers == -1) {
      $totalusers = (int)$db->query("SELECT COUNT(*) FROM $db_users WHERE user_maingrp>3")->fetchColumn();
    }
    $totalusers--;
    $precent = 100;

    if($type == 'user_mk_avgocost') {
      if(count($extra) > 0) {
        $usrids = $db->query("SELECT u.user_id FROM $db_users as u
                JOIN $db_market as m ON u.user_id=m.item_userid
                WHERE u.user_id!=".$urr['user_id']." AND u.user_maingrp>3 AND (m.item_cat='".implode("' OR item_cat='", $extra)."') GROUP BY m.item_userid")->fetchAll(PDO::FETCH_COLUMN);

        $totalusers = count($usrids);
        if($totalusers > 0) {
          $higher = $db->query("SELECT COUNT(*) FROM $db_users
              WHERE (user_id=".implode(' OR user_id=', $usrids).") AND user_mk_avgocost<".$urr['user_mk_avgocost'])->fetchColumn();
        } else {
          $precent = 100;
        }
      } else {
        $totalusers = 0;
      }
    } elseif(in_array($type, array('user_mk_work_speed', 'user_mk_reaction_time'))) {
      if($totalusers > 0) {
        $higher = $totalusers - $db->query("SELECT COUNT(*) FROM $db_users
          WHERE user_id!=".$urr['user_id']." AND user_maingrp>3 AND $type>0 AND $type<=".$urr[$type])->fetchColumn();
      }
    } elseif(in_array($type, array('user_rt_rating', 'user_mk_rating', 'user_mk_conversoin'))) {
      if($totalusers > 0) {
        //$totalusers = $totalusers - $db->query("SELECT COUNT(*) FROM $db_users
        //  WHERE user_id!=".$urr['user_id']." AND user_maingrp>3 AND $type=".$urr[$type])->fetchColumn();

        $higher = $db->query("SELECT COUNT(*) FROM $db_users
          WHERE user_id!=".$urr['user_id']." AND user_maingrp>3 AND $type<=".$urr[$type])->fetchColumn();
      }
    }

    if($totalusers > 0) {
      if($higher > 0) {
        $precent = ((100 / $totalusers) * $higher);

        $precent = (($precent > 0) ? (($precent > 100) ? 100 : round($precent)) : 0);
      } else {
        $precent = 0;
      }
    }
  }

  return array($totalusers, $higher, $precent);
}

function cot_mk_update_analytics($urrs = array(), $type = 1, $userinit = false) {
  global $sys, $cfg, $db, $db_users, $db_marketfav, $db_market, $db_market_orders, $db_market_track, $db_reviews;
  $return = array();

  $mk_cache_upd = 10800; //TODO config 3 часа

  if(cot_plugin_active('reviews') && cot_plugin_active('marketfav')) {
    require_once cot_incfile('reviews', 'plug');
    require_once cot_incfile('marketfav', 'plug');
  } else {
    foreach($urrs as $urr) {
      if($urr['user_id'] > 0) $return[$urr['user_id']] = array(
        'anlt' => array(),
        'ruserupd' => array()
      );
    }
    return $return;
  }

  $pre_query = array(
    'total_users' => (int)$db->query("SELECT COUNT(*) FROM $db_users WHERE user_maingrp>3")->fetchColumn(),
  );

  foreach($urrs as $urr) {
    $urrid = $urr['user_id'];

    if($urrid > 0) {
      $ruserupd = array();

      $anlt_cache = (!empty($urr['user_mk_cache']) ? json_decode($urr['user_mk_cache'], 1) : array());
      $cache_found = false;

      if($userinit && $urr['user_mk_cache_upd'] > 0 && $urr['user_mk_cache_upd'] > ($sys['now'] - $mk_cache_upd) && count($anlt_cache) > 0 && is_array($anlt_cache[$type]) && count($anlt_cache[$type]) > 0) {
        if($anlt_cache[$type]['anlt_cache_upd'] > 0 && $anlt_cache[$type]['anlt_cache_upd'] > ($sys['now'] - $mk_cache_upd) ) {
          $anlt = $anlt_cache[$type];
          $anlt['anlt_cache'] = 1;
          $cache_found = true;
        }
      }

      if(!$cache_found) {
        $anlt = array(
          'anlt_cache' => 0,
          'anlt_cache_upd' => $sys['now'],
          'total_summ_all_orders' => array(
            'value' => 0,
            'value_def' => (float)$db->query("SELECT SUM(order_cost-(order_cost*order_tax/100)) FROM $db_market_orders WHERE order_status='done' AND order_seller=".$urrid)->fetchColumn(),
          ),
          'total_summ_all_onlyextra' => 0,
          'total_done_prders' => 0,
          'sales_sum' => array(
            'value' => 0,
            'value_def' => 0,
          ),
          'sales_count' => array(
            'value' => 0,
            'value_def' => 0,
          ),
          'avg_bill' => array(
            'value' => 0,
            'value_def' => 0,
              'user_percent' => array(
                'good' => 0,
                'bad' => 0
              ),
            'level' => 'bad'
          ),
          'extra_orders_sum_percent' => array(
            'value' => 0,
            'value_def' => 0,
            'user_percent' => 0,
            'level' => 'bad'
          ),
          'review_rating' => array(
            'value' => 0,
            'value_def' => 0,
              'user_percent' => array(
                'good' => 0,
                'bad' => 0
              ),
            'level' => 'bad'
          ),
          'review_positive' => 0,
          'review_total' => 0,
          'review_good' => array(
            'value' => 0,
            'value_def' => 0,
            'level' => 'bad'
          ),
          'review_bad' => array(
            'value' => 0,
            'value_def' => 0,
            'level' => 'bad'
          ),
          'review_empty' => array(
            'value' => 0,
            'value_def' => 0,
            'level' => 'bad'
          ),
          'review_repeat' => array(
            'value' => 0,
            'value_def' => 0,
            'level' => 'bad'
          ),
          'review_percent' => array(
            'value' => 0,
            'value_def' => 0,
            'level' => 'bad'
          ),

          'cancellation' => array(
            'value' => 0,
            'value_def' => 0,
            'level' => 'bad'
          ),
          'auto_cancel' => array(
            'value' => 0,
            'value_def' => 0,
            'level' => 'bad'
          ),
          'expiration_cancel' => array(
            'value' => 0,
            'value_def' => 0,
            'level' => 'bad'
          ),
          'done_orders' => array(
            'value' => 0,
            'value_def' => 0,
            'level' => 'bad'
          ),
          'done_orders_percent' => array(
            'value' => 0,
            'value_def' => 0,
            'user_percent' => array(
              'good' => 0,
              'bad' => 0
            ),
            'level' => 'bad'
          ),
          'other_cancel' => array(
            'value' => 0,
            'value_def' => 0,
            'level' => 'bad'
          ),
          'sales_distinct_count' => array(
            'value' => 0,
            'value_def' => 0,
            'level' => 'bad'
          ),
          'conversion' => array(
            'value' => 0,
            'value_def' => (float)$db->query("SELECT AVG(item_mk_conversoin) FROM $db_market WHERE item_userid=".$urrid.' AND item_state=0')->fetchColumn(),
            'user_percent' => array(
              'good' => 0,
              'bad' => 0
            ),
            'level' => 'bad'
          ),

          'work_speed' => array(
            'array' => array(),
            'array_procent_avg' => array(),
            'value' => '',
            'value_def' => 0,
            'user_percent' => array(
              'good' => 0,
              'bad' => 0
            ),
            'percent' => 0,
            'level' => 'bad'
          ),
          'reaction_time' => array(
            'array' => array(),
            'value' => '',
            'value_def' => 0,
            'user_percent' => array(
              'good' => 0,
              'bad' => 0
            ),
            'percent' => 0,
            'level' => 'bad'
          ),

          'favorites' => array(
            'value' => 0,
            'value_def' => 0,
            'level' => 'bad'
          ),
          'views' => array(
            'value' => 0,
            'value_def' => $db->query("SELECT SUM(item_count) FROM $db_market WHERE item_userid=".$urrid.' AND item_state=0')->fetchColumn(),
          ),

          'base-sales' => array(),
          'extra-sales' => array(),

          'items_cats' => $db->query("SELECT DISTINCT(item_cat) FROM $db_market WHERE item_userid=".$urrid.' AND item_cat!=""')->fetchAll(PDO::FETCH_COLUMN),
          'items_active' => (int)$db->query("SELECT COUNT(*) FROM $db_market WHERE item_userid=".$urrid.' AND item_state=0')->fetchColumn(),
          'rt_rating' => 0,
          'mk_avgocost' => 0,
          'mk_rating' => 0,
          'mk_conversoin' => 0,
          'mk_work_speed' => 0,
          'mk_reaction_time' => 0,
        );
        if(!$anlt['total_summ_all_orders']['value_def']) $anlt['total_summ_all_orders']['value_def'] = 0;
        if(!$anlt['conversion']['value_def']) $anlt['conversion']['value_def'] = 0;
        if(!$anlt['views']['value_def']) $anlt['views']['value_def'] = 0;
        if(!$anlt['items_active']) $anlt['items_active'] = 0;

        foreach($pre_query as $i => $val) {
          if(is_array($val)) {
            foreach($val as $vi => $vval) {
              if(!is_array($vval)) {
                $anlt[$i][$vi] = $vval;
              }
            }
          } else {
            $anlt[$i] = $val;
          }
        }

        $anlt['items_cats'] = array_unique($anlt['items_cats']);

        $type_fdate = ($type > 0 ? cot_date2stamp('01.'.cot_date('m.Y', ($sys['now']-(86400*30*$type))), 'd.m.Y') : 0);
        if(!($type_fdate > 0)) $type_fdate = 1;

        $orders = $db->query("SELECT * FROM $db_market_orders  as o
          LEFT JOIN $db_reviews as r ON r.item_code=o.order_id
          WHERE (item_id IS NULL OR (item_area='market' AND item_type='review'))
                AND order_paid>=".$type_fdate." AND order_status!='new' AND order_seller=".$urrid)->fetchAll();
        foreach($orders as $ord) {
          $ord['order_cost_with_tax'] = $ord['order_cost'] - ($ord['order_cost'] * $ord['order_tax'] / 100);

          //reviews
          if($ord['item_id'] > 0) {
            if($ord['item_score'] == 0) {
              $anlt['review_bad']['value_def']++;
            } else {
              $anlt['review_good']['value_def']++;
            }
          } elseif($ord['order_status'] != 'check' && $ord['order_status'] != 'claim') {
            if($db->query("SELECT * FROM $db_market_orders WHERE order_userid=".$ord['order_userid']." AND order_pid=".$ord['order_pid']." AND order_id!=".$ord['order_id']." AND order_status!='new'")->fetchColumn() > 0) {
              $anlt['review_repeat']['value_def']++;
            } else {
              $anlt['review_empty']['value_def']++;
            }
          }
          if($ord['order_status'] != 'check' && $ord['order_status'] != 'claim') $anlt['review_total']++;
          //END reviews

          //orders
            $extbuyscounts = array();
            $extminus = 0;
            $extbuys = $db->query("SELECT * FROM $db_market_track WHERE t_oid=".$ord['order_id']." AND t_touser=".$urrid." AND (t_code='payer_addextras' OR t_code='seller_addextras')")->fetchAll();
            foreach($extbuys as $exb) {
              $exb_json = (!empty($exb['t_json']) ? json_decode($exb['t_json'],1) : array());
              if(!is_array($exb_json)) $exb_json = array();

              if($exb['t_code'] == 'payer_addextras' || $exb_json['payed'] > 0) {
                if($exb_json['totalcost'] > 0) {
                  $exb_json['totalcost_with_tax'] = $exb_json['totalcost'] - ($exb_json['totalcost'] * $ord['order_tax'] / 100);

                  $extminus += $exb_json['totalcost_with_tax'];
                  if($exb_json['payed'] > 0) $exb['t_date'] = $exb_json['payed'];

                  $exb['t_date_format'] = cot_date('Y-m-d', $exb['t_date']);
                  $anlt['extra-sales'][$exb['t_date_format']]['sum'] += $exb_json['totalcost_with_tax'];
                  $anlt['extra-sales'][$exb['t_date_format']]['count']++;
                  foreach($exb_json['selected'] as $select) {
                    $extbuyscounts[$select['id']] += $select['count'];
                  }
                }
              }
            }

            $ord['order_paid_format'] = cot_date('Y-m-d', $ord['order_paid']);

            $costplan = (!empty($ord['order_catcostplans']) ? json_decode($ord['order_catcostplans'],1) : array(
              'package' => 'single',
              'extras' => array(
                'selected' => array(),
                'selected_custom' => array()
              )
            ));

            if($costplan['package'] == 'single' && (count($costplan['extras']['selected']) > 0 || (is_array($costplan['extras']['selected_custom']) && count($costplan['extras']['selected_custom']) > 0))) {
              foreach(array('selected', 'selected_custom') as $path) {
                if(is_array($costplan['extras'][$path])) foreach($costplan['extras'][$path] as $select) {
                  $select['count'] -= $extbuyscounts[$select['id']];
                  if($select['count'] > 0) {
                    $select['payerPrice_with_tax'] = ($select['payerPrice'] - ($select['payerPrice'] * $ord['order_tax'] / 100)) * $select['count'];

                    $extminus += $select['payerPrice_with_tax'];

                    $anlt['extra-sales'][$ord['order_paid_format']]['sum'] += $select['payerPrice_with_tax'];
                    $anlt['extra-sales'][$ord['order_paid_format']]['count']++;
                  }
                }
              }
            }

            if($ord['order_done'] > 0) {
              $anlt['total_summ_all_onlyextra'] += $extminus;
              $anlt['done_orders']['value_def']++;
            } elseif($ord['order_cancel'] > 0) {
              if(in_array($ord['order_status_code'], array('afterpaid_24hour', 'afterqueue_24hour')))
          		{
          			$anlt['auto_cancel']['value_def']++;
              }
              elseif(in_array($ord['order_status_code'], array('seller_payer_cannot_execute_correct', 'seller_do_not_like_this_worker', 'seller_no_communication_with_worker', 'seller_no_time', 'seller_force_cancel')))
          		{
          			$anlt['expiration_cancel']['value_def']++;
              } else {
                $anlt['other_cancel']['value_def']++;
              }
              $anlt['cancellation']['value_def']++;
            }
            $anlt['sales_distinct_count']['value_def']++;

            $anlt['base-sales'][$ord['order_paid_format']]['sum'] += $ord['order_cost_with_tax']-$extminus;
            $anlt['base-sales'][$ord['order_paid_format']]['count']++;

            if(!is_array($anlt['extra-sales'][$ord['order_paid_format']])) {
              $anlt['extra-sales'][$ord['order_paid_format']] = array(
                'sum' => 0,
                'count' => 0
              );
            }

            //время реации
            $ord['reaction_time'] = $db->query("SELECT t_date FROM $db_market_track WHERE t_oid=".$ord['order_id']." AND t_code='market_msg' AND t_fruser=".$urrid.' ORDER BY t_date ASC LIMIT 1')->fetchColumn();
            if($ord['order_accept'] > 0 && (!$ord['reaction_time'] || $ord['order_accept'] < $ord['reaction_time'])) $ord['reaction_time'] = $ord['order_accept'];

            if($ord['reaction_time'] > 0) {
               $ord['reaction_time'] -= (($ord['reaction_time'] > $ord['order_queue'] && $ord['order_queue'] > $ord['order_paid']) ? $ord['order_queue'] : $ord['order_paid']);
               $anlt['reaction_time']['array'][] = ($ord['reaction_time'] > 86400 ? 86400 : $ord['reaction_time']);
            }
            //время выполнения

            if($ord['order_worktime'] > 0) {
              $anlt['work_speed']['array'][] = $ord['order_worktime'];
              $anlt['work_speed']['array_procent_avg'][] = (100 / $ord['order_deadline']) * ($ord['order_worktime']);
            }
          //END orders

          //кол-во просмотров
          //$anlt['views']['value_def'] += 0;

          //кол-во в избранном
          if(cot_plugin_active('marketfav')) $anlt['favorites']['value_def'] += $db->query("SELECT COUNT(*) FROM $db_marketfav WHERE fav_pid=".$ord['order_pid'].' AND fav_date>='.$type_fdate)->fetchColumn();

          //counters
          if($ord['order_done'] > 0) {
            $anlt['sales_sum']['value_def'] += $ord['order_cost_with_tax'];
            $anlt['total_done_prders']++;
          }
          $anlt['sales_count']['value_def']++;
        }

        $ruserupd['user_mk_done_cnt'] = $anlt['total_done_prders'];

        ///

        /** вычисление статистики **/
        //reviews
        $anlt['review_positive'] = $anlt['review_good']['value_def'] + $anlt['review_repeat']['value_def'] + $anlt['review_empty']['value_def'];
        $anlt['rt_rating'] = round(($anlt['review_total'] > 0 ? ((100 / $anlt['review_total']) * $anlt['review_positive']) : 0), 2);

        if($anlt['rt_rating'] == 0 && $anlt['review_total'] > $anlt['review_positive']) {
          $anlt['rt_rating'] = -round(($anlt['review_total'] > 0 ? ((100 / $anlt['review_total']) * ($anlt['review_total'] - $anlt['review_positive'])) : 0), 2);
        }

        $anlt['review_rating']['value_def'] = $anlt['review_rating']['value'] = $anlt['rt_rating'];
        $ruserupd['user_rt_rating'] = $anlt['rt_rating'];

        list($anlt['rt_rating_all_users'],
             $anlt['rt_rating_all_users_higher'],
             $anlt['rt_rating_all_users_precent']
            ) = cot_mk_stat_comparison('user_rt_rating', $urr, $anlt['total_users']);
        //END reviews

        //orders
        $anlt['avg_bill']['value_def'] = round((($anlt['total_done_prders'] > 0 ? ($anlt['sales_sum']['value_def'] / $anlt['total_done_prders']) : 0)), 2);
        $urr['user_mk_avgocost'] = $ruserupd['user_mk_avgocost'] = $anlt['mk_avgocost'] = $anlt['avg_bill']['value_def'];

        //orders - сравнение с другими пользователями
        list($anlt['mk_avgocost_all_users'],
             $anlt['mk_avgocost_all_users_higher'],
             $anlt['mk_avgocost_all_users_precent']
            ) = cot_mk_stat_comparison('user_mk_avgocost', $urr, 0, $anlt['items_cats']);

        //Процент от продажи доп.опций
        $anlt['extra_orders_sum_percent']['value_def'] = ($anlt['total_summ_all_onlyextra'] > 0 ? ($anlt['total_summ_all_onlyextra'] / ($anlt['total_summ_all_orders']['value_def'] / 100)) : 0);

        //сравнение ответственности с другими юзерами
        $anlt['mk_rating'] = round(($anlt['sales_count']['value_def'] > 0 ? ($anlt['total_done_prders'] > 0 ? ((100 / $anlt['sales_count']['value_def']) * $anlt['total_done_prders']) : 0) : 100));
        $anlt['done_orders_percent']['value_def'] = $anlt['mk_rating'];
        $urr['user_mk_rating'] = $ruserupd['user_mk_rating'] = $anlt['mk_rating'];

        list($anlt['mk_rating_all_users'],
             $anlt['mk_rating_all_users_higher'],
             $anlt['mk_rating_all_users_precent']
            ) = cot_mk_stat_comparison('user_mk_rating', $urr, $anlt['total_users']);

        //сравнение конверсии с другими юзерами
        $anlt['mk_conversoin'] = $anlt['conversion']['value_def'];
        $urr['user_mk_conversoin'] = $ruserupd['user_mk_conversoin'] = $anlt['mk_conversoin'];

        list($anlt['mk_conversoin_all_users'],
             $anlt['mk_conversoin_all_users_higher'],
             $anlt['mk_conversoin_all_users_precent']
            ) = cot_mk_stat_comparison('user_mk_conversoin', $urr, $anlt['total_users']);

        //сравнение времени выполнения работы с другими юзерами
        //$ruserupd['user_mk_work_speed']
        $anlt['work_speed']['value_def'] = (count($anlt['work_speed']['array']) > 0 ? (array_sum($anlt['work_speed']['array'])/count($anlt['work_speed']['array'])) : 0);
        $work_speed_percent = 0;

        if($anlt['work_speed']['value_def'] > 0) {
          $anlt['work_speed']['value'] = cot_build_timegap($sys['now'] - $anlt['work_speed']['value_def']);
          $work_speed_percent = round((count($anlt['work_speed']['array_procent_avg']) > 0 ? (array_sum($anlt['work_speed']['array_procent_avg'])/count($anlt['work_speed']['array_procent_avg'])) : 0), 2);
          if(!$work_speed_percent) $work_speed_percent = 0.01;
          if($work_speed_percent > 100) $work_speed_percent = 100;
          $anlt['work_speed']['percent'] = round(100 - $work_speed_percent);
        } else {
          $anlt['work_speed']['value'] = 'Нет данных';
        }
        $urr['user_mk_work_speed'] = $ruserupd['user_mk_work_speed'] = $work_speed_percent;
        list($anlt['mk_work_speed_all_users'],
             $anlt['mk_work_speed_all_users_higher'],
             $anlt['mk_work_speed_all_users_precent']
            ) = cot_mk_stat_comparison('user_mk_work_speed', $urr, $anlt['total_users']);

        //сравнение времени реакции
        $anlt['reaction_time']['value_def'] = (count($anlt['reaction_time']['array']) > 0 ? (array_sum($anlt['reaction_time']['array'])/count($anlt['reaction_time']['array'])) : 0);
        if($anlt['reaction_time']['value_def'] > 0) {
          $anlt['reaction_time']['value'] = cot_build_timegap($sys['now'] - $anlt['reaction_time']['value_def']);
          $reaction_time_percent = 86400;
          if($anlt['reaction_time']['value_def'] <= 60*10) {
            $reaction_time_percent = 60*10;
            //$anlt['reaction_time']['level'] = 'excellent_time';
          } elseif ($anlt['reaction_time']['value_def'] <= 60*60) {
            $reaction_time_percent = 60*60;
            //$anlt['reaction_time']['level'] = 'excellent';
          } elseif ($anlt['reaction_time']['value_def'] <= 60*60*3) {
            $reaction_time_percent = 60*60*3;
            //$anlt['reaction_time']['level'] = 'good';
          } elseif ($anlt['reaction_time']['value_def'] <= 60*60*6) {
            $reaction_time_percent = 60*60*6;
            //$anlt['reaction_time']['level'] = 'satisfactorily';
          } elseif ($anlt['reaction_time']['value_def'] <= 60*60*8) {
            $reaction_time_percent = 60*60*8;
            //$anlt['reaction_time']['level'] = 'bad_time';
          }

          $anlt['reaction_time']['percent'] = round((100 / $reaction_time_percent) * ($anlt['reaction_time']['value_def']));
          $anlt['reaction_time']['percent'] = 100 - $anlt['reaction_time']['percent'];
        } else {
          $anlt['reaction_time']['value'] = 'Нет данных';
        }
        $urr['user_mk_reaction_time'] = $ruserupd['user_mk_reaction_time'] = $anlt['reaction_time']['value_def'];
        list($anlt['mk_reaction_time_all_users'],
             $anlt['mk_reaction_time_all_users_higher'],
             $anlt['mk_reaction_time_all_users_precent']
            ) = cot_mk_stat_comparison('user_mk_reaction_time', $urr, $anlt['total_users']);
        //END orders

        foreach(
            array(
              'avg_bill',
              'extra_orders_sum_percent',
            ) as $i) {
          $anlt[$i]['value_def'] = ($anlt[$i]['value_def'] > 0 ? round($anlt[$i]['value_def']) : 0);
        }

        foreach(
            array(
              'total_summ_all_orders',
              'sales_count',
              'review_bad', 'review_good', 'review_repeat', 'review_empty', 'review_percent',
              'cancellation', 'auto_cancel', 'expiration_cancel', 'done_orders', 'other_cancel', 'sales_distinct_count',
              'favorites',
              'views'
            ) as $i) {
          $anlt[$i]['value'] = ($anlt[$i]['value_def'] > 0 ? number_format($anlt[$i]['value_def'], 0, '', ' ') : 0);
        }

        foreach(
            array(
              'avg_bill' => 'mk_avgocost_all_users_precent',
              'review_rating' => 'rt_rating_all_users_precent',
              'done_orders_percent' => 'mk_rating_all_users_precent',
              'conversion' => 'mk_conversoin_all_users_precent',

              'work_speed' => 'mk_work_speed_all_users_precent',
              'reaction_time' => 'mk_reaction_time_all_users_precent'
            ) as $i => $iv) {
          $anlt[$i]['user_percent']['good'] = round($anlt[$iv], 0);
          $anlt[$i]['user_percent']['bad'] = 100 - $anlt[$i]['user_percent']['good'];
        }

        /*
        foreach(
            array(
              'work_speed', 'reaction_time'
            ) as $i) {
          $anlt[$i]['user_percent']['good'] = round(($anlt[$i]['percent'] > 100 ? 100 : ($anlt[$i]['percent'] < 0 ? 0 : $anlt[$i]['percent'])), 0);
          $anlt[$i]['user_percent']['bad'] = 100 - $anlt[$i]['user_percent']['good'];
        }
        */
        $anlt['review_percent']['value'] = $anlt['review_percent']['value_def'];// = $anlt['review_rating']['user_percent']['good'];

        foreach(array(
            'review_rating',
            'done_orders_percent',

            'extra_orders_sum_percent',
            'review_bad', 'review_good', 'review_repeat', 'review_empty', 'review_percent',
            'cancellation', 'auto_cancel', 'expiration_cancel', 'done_orders', 'other_cancel', 'sales_distinct_count',
          ) as $i) {
          if($anlt[$i]['value_def'] >= 75) {
            $anlt[$i]['level'] = 'excellent';
          } elseif ($anlt[$i]['value_def'] >= 50) {
            $anlt[$i]['level'] = 'good';
          } elseif ($anlt[$i]['value_def'] >= 25) {
            $anlt[$i]['level'] = 'satisfactorily';
          }
        }

        foreach(
            array(
              'avg_bill',
              'work_speed', 'reaction_time',
              'conversion',
            ) as $i) {
          if($anlt[$i]['user_percent']['good'] >= 75) {
            $anlt[$i]['level'] = 'excellent';
          } elseif ($anlt[$i]['user_percent']['good'] >= 50) {
            $anlt[$i]['level'] = 'good';
          } elseif ($anlt[$i]['user_percent']['good'] >= 25) {
            $anlt[$i]['level'] = 'satisfactorily';
          }
        }

        foreach(
            array(
              'avg_bill', 'sales_sum'
            ) as $i) {
          $anlt[$i]['value'] = ($anlt[$i]['value_def'] > 0 ? number_format($anlt[$i]['value_def'], 0, '', ' ') : 0).'&nbsp;<span class=\'rouble\'>Р</span>';
        }
        foreach(
            array(
              'extra_orders_sum_percent', 'done_orders_percent',
              'review_percent',
              'conversion'
            ) as $i) {
          $anlt[$i]['value'] = ($anlt[$i]['value_def'] > 0 ? number_format($anlt[$i]['value_def'], 0, '', ' ') : 0).'%';
        }
        /** вычисление статистики **/

        $anlt_cache[$type] = $anlt;

        $ruserupd['user_mk_cache'] = json_encode($anlt_cache);
        $ruserupd['user_mk_cache_upd'] = $sys['now'];
      }

      $return[$urrid] = array(
        'anlt' => $anlt,
        'ruserupd' => $ruserupd
      );
    }
  }
  return $return;
}

?>