<?php
$__functions['init'][]='_esmo_billing_site_vars' ;
$__functions['boot_site'][]='_esmo_billing_site_boot' ;

function ESMO_BILLING() {return($_SESSION['esmo_billing_system']);$_SESSION['esmo_billing_system']=new c_esmo_billing_system();return($_SESSION['esmo_billing_system']);} ;


function _esmo_billing_site_vars()
{   // роли модуля
    $_SESSION['init_options']['esmo_billing']['debug']=0 ;
	//$_SESSION['init_options']['esmo_billing']['patch_mode']='TREE_NAME' ;
    $_SESSION['init_options']['esmo_billing']['patch_mode']='NAME' ;
	$_SESSION['init_options']['esmo_billing']['root_dir']	='/cab/personal/' ;
    $_SESSION['init_options']['esmo_billing']['clss_items']='211' ;
    //$_SESSION['init_options']['esmo_billing']['usl_show_items']='enabled=1 and _enabled=1' ;
    $_SESSION['init_options']['esmo_billing']['usl_show_items']='_enabled=1' ; // показываем всех сотрудников, уволенных и действующих
    $_SESSION['init_options']['esmo_billing']['tree_fields']='pkey,parent,clss,indx,enabled,obj_name,tkey' ;

    $_SESSION['ARR_chet_operation_types']=array(1=>'Поступление',2=>'Списание') ;
    $_SESSION['ARR_chet_types']=array(0=>'Расходный',2=>'Приходный') ;

     ////
}

function _esmo_billing_site_boot($options)
{
  create_system_modul_obj('esmo_billing',$options) ;

}


class c_esmo_billing_system  extends c_system
{
    public $table_bill ;

    function c_esmo_billing_system($create_options=array())
    { $this->table_name ='obj_'.SITE_CODE.'_personals' ;
      $this->table_bill ='obj_'.SITE_CODE.'_bill' ;
      $this->system_title ='Биллинг';
      parent::__construct($create_options) ;
      //$this->pages_info=array() ;

      // регистрируем обработчики событий
      ESMO()->reg_event_lister('mo_dopusk_allow',$this,'on_event_mo_allow') ;         //
      ESMO()->reg_event_lister('fixed_hand_check_allow',$this,'on_event_mo_allow') ;
      ESMO()->reg_event_lister('fixed_hand_check_denited',$this,'on_event_mo_allow') ;



      //регистрируем документы

      set_time_point('Создание объекта <strong>esmo_billing_system</strong>') ;
      //parent::c_system($create_options) ;
      //unset($this->pages_info) ;

    }

   //
   function on_event_mo_allow($data)
   {  $rec_mo=ESMO()->get_mo_by_id($data['mo_id']) ;
      if ($rec_mo['pkey'] and $rec_mo['member_id']) $this->apply_mo_bill($rec_mo) ;
   }

    function declare_menu_items_1($page)
       {
           $page->menu['/cab/bill/']=array(   'title'=>'Биллинг',
                                                 'class'=>'fa fa-pencil-square-o',
                                                 'items'=>array('/cab/bill/'=>'Биллинг',
                                                                '/cab/bill/tariff/'=>array('title'=>'Тарифы','class'=>'fa fa-users'),
                                                                '/cab/bill/in/'=>array('title'=>'Счета','class'=>'fa fa-users'),
                                                                '/cab/bill/clients/'=>array('title'=>'Клиенты','class'=>'fa fa-users'),
                                                                '/cab/bill/clients_history/'=>array('title'=>'История зачислений','class'=>'fa fa-users'),
                                                                '/cab/bill/rekvezit/'=>array('title'=>'Мои реквизиты','class'=>'fa fa-users'),
                                                                '/cab/bill/reports/'=>array('title'=>'Отчеты','class'=>'fa fa-users',
                                                                                            'items'=>array('/cab/bill/reports/report1/'=>'Стандартный отчет № 1',
                                                                                                           '/cab/bill/reports/report2/'=>'Стандартный отчет № 2'
                                                                                                          )
                                                                )
                                                                //'/cab/bill/out/'=>array('title'=>'Вывести средства','class'=>'fa fa-users')
                                                                //'/cab/ecp/OpenSSL/'=>'OpenSSL'
                                                               )
                                                 ) ;
       }

//==========================================================================================================================================================================
   // операции по биллингу
   //==========================================================================================================================================================================

   function get_bill_to_mo($mo_id)
   {
       $recs=execSQL('select t1.*,t2.obj_name as _member_from_name,t3.obj_name as _member_to_name from obj_site_bill t1'.
                     ' left join obj_site_account t2 on t2.pkey=t1.member_from '.
                     ' left join obj_site_account t3 on t3.pkey=t1.member_to '.
                     ' where t1.mo_id='.$mo_id) ;
       return($recs) ;
   }

   // списываем/начислям оплату за проведенное МО
   function apply_mo_bill($rec_mo)
   {
        // проверяем, что по этому МО еще не было проводки
        ob_start() ;
        global $debug_db ; $debug_db=2 ;
        $bill_id=execSQL_value('select pkey from obj_site_bill where mo_id='.$rec_mo['pkey'].' limit 1') ;
        if (!$bill_id)
        {   if ($rec_mo['_ord_id'])
            { $client_id=execSQL_value('select client_id from obj_site_personals where pkey='.$rec_mo['_ord_id']) ;
              if ($client_id)
              {   $agent_id=execSQL_value('select agent from obj_site_account where pkey='.$client_id) ;
                  $client_rs_out=execSQL_value('select pkey from obj_site_rs where member_id='.$client_id) ;
                  $agent_rs_in=execSQL_value('select pkey from obj_site_rs where member_id='.$agent_id.' and typ=2') ;

                  $agent_price=$GLOBALS['LS_bill_price_client'] ;
                  $esmo_price=$GLOBALS['LS_pp_bill_price_esmo'] ;

                  $tarif_id=execSQL_value('select tarif from obj_site_account where pkey='.$client_id) ;
                  if (!$tarif_id) $tarif_id=execSQL_value('select tarif from obj_site_rs where pkey='.$client_rs_out) ;
                  if ($tarif_id)
                  { $tarif_rec=execSQL_van('select * from obj_site_list where id='.$tarif_id.' and clss=402') ;
                     $agent_price=($rec_mo['dopusk']==1)? $tarif_rec['price_1']:$tarif_rec['price_2'] ;
                     $esmo_price=($rec_mo['dopusk']==1)? $tarif_rec['price_3']:$tarif_rec['price_4'] ;
                  }

                  if ($agent_id)
                  {   // списываем сумму с клиента в пользу менеджера
                      $this->adding_bill_rec(array( 'data'=>$rec_mo['c_data'],
                                                    'member_from'=>$client_id,
                                                    'member_to'=>$agent_id,
                                                    'rs_from'=>$client_rs_out,
                                                    'rs_to'=>$agent_rs_in,
                                                    'type'=>2, // списание
                                                    'tarif'=>$tarif_rec['id'], // списание
                                                    'price'=>$agent_price, // списание
                                                    'mo_id'=>$rec_mo['pkey']
                              ))  ;
                      // получаем id франчайзера агентп
                      $esmo_id=execSQL_value('select agent from obj_site_account where pkey='.$agent_id) ;

                      if ($esmo_id)
                      {   $agent_rs_out=execSQL_value('select pkey from obj_site_rs where member_id='.$agent_id.' and (typ=0 or typ is null)') ;
                          $esmo_rs_in=execSQL_value('select pkey from obj_site_rs where member_id='.$esmo_id.' and typ=2') ;
                          if ($esmo_rs_in)
                          {   // списываем сумму с менеджера в пользу кваазара
                              $this->adding_bill_rec(array( 'data'=>$rec_mo['c_data'],
                                                            'member_from'=>$agent_id,
                                                            'member_to'=>$esmo_id,
                                                            'rs_from'=>$agent_rs_out,
                                                            'rs_to'=>$esmo_rs_in,
                                                            'type'=>2, // списание
                                                            'tarif'=>$tarif_rec['id'], // списание
                                                            'price'=>$esmo_price, // списание
                                                            'mo_id'=>$rec_mo['pkey']
                                      ))  ;

                              $manager_name=execSQL_value('select obj_name from obj_site_account where pkey='.$agent_id) ;
                              $kvazar_name=execSQL_value('select obj_name from obj_site_account where pkey='.$esmo_id) ;
                              if ($GLOBALS['LS_bill_logging_full']) LOGS()->reg_log('Биллинг',$rec_mo['_org_name'].' =>  '.$manager_name.': '.$agent_price.'<br>'.
                                                                              $manager_name.' => '.$kvazar_name.': '.$esmo_price.'<br>',
                                                                              array('mo_id'=>$rec_mo['pkey'],'user_id'=>$client_id)) ;
                          } else LOGS()->reg_log('Биллинг','МО № '.$rec_mo['pkey'].' - не задан счет франчайзера, невозможно произвести расчет',array('mo_id'=>$rec_mo['pkey'])) ;
                      }  else LOGS()->reg_log('Биллинг','МО № '.$rec_mo['pkey'].' - не задан франчайзер для агента, невозможно произвести расчет',array('mo_id'=>$rec_mo['pkey'])) ;
                  } else LOGS()->reg_log('Биллинг','МО № '.$rec_mo['pkey'].' - не задан агент для клиента, невозможно произвести расчет',array('mo_id'=>$rec_mo['pkey'])) ;
              } else LOGS()->reg_log('Биллинг','МО № '.$rec_mo['pkey'].' - не задан клиент для организации, невозможно произвести расчет',array('mo_id'=>$rec_mo['pkey'])) ;
            }
            else LOGS()->reg_log('Биллинг','МО № '.$rec_mo['pkey'].' - не указана организация, невозможно произвести расчет',array('mo_id'=>$rec_mo['pkey'])) ;


        }
       $text=ob_get_clean() ;
       $debug_db=0 ;
      // LOGS()->reg_log('Биллинг',$text,array('mo_id'=>$rec_mo['pkey'])) ;
   }




   // добавление проводки для счета
   // typ=1 - приход
   //    =2 - расход
   function adding_bill_rec($params)
   { //damp_array($params) ;

     // ищем последнуую сумму на счете источника и счете получателя
     $from_value_in=execSQL_value('select value_out from '.$this->table_bill.' where rs='.$params['rs_from'].' order by pkey desc limit 1') ;
     $to_value_in=execSQL_value('select value_out from '.$this->table_bill.' where rs='.$params['rs_to'].' order by pkey desc limit 1') ;

     $typ1=$params['type'];
     $typ2=($params['type']==2)? 1:2 ;

     $from_value_out=($params['type']==2)? $from_value_in-$params['price']:$from_value_in+$params['price'] ;
     $to_value_out=($params['type']==2)? $to_value_in+$params['price']:$to_value_in-$params['price'] ;

     // фиксируем операцию по первому счету
     $rec=array( 'clss'         =>  400,
                 'c_data'       =>  $params['data'],
                 'typ'          =>  $typ1,
                 'member_from'  =>  $params['member_from'],
                 'member_to'    =>  $params['member_to'],
                 'rs'           =>  $params['rs_from'],
                 'rs_from'      =>  $params['rs_from'],
                 'rs_to'        =>  $params['rs_to'],
                 'mo_id'        =>  $params['mo_id'],
                 'tarif'        =>  $params['tarif'],
                 'value_in'     =>  $from_value_in,
                 'value'        =>  $params['price'],
                 'value_out'    =>  $from_value_out,
                 'obj_name'     =>  $params['comment']
               ) ;
     adding_rec_to_table($this->table_bill,$rec,array('debug'=>0)) ;
     update_rec_in_table('obj_site_rs',array('value'=>$from_value_out),'pkey='.$params['rs_from']) ;

     // фиксируем операцию по второму счету
     $rec=array( 'clss'         =>  400,
                 'c_data'       =>  $params['data'],
                 'typ'          =>  $typ2,
                 'member_from'  =>  $params['member_from'],
                 'member_to'    =>  $params['member_to'],
                 'rs'           =>  $params['rs_to'],
                 'rs_from'      =>  $params['rs_from'],
                 'rs_to'        =>  $params['rs_to'],
                 'mo_id'        =>  $params['mo_id'],
                 'tarif'        =>  $params['tarif'],
                 'value_in'     =>  $to_value_in,
                 'value'        =>  $params['price'],
                 'value_out'    =>  $to_value_out,
                 'obj_name'     =>  $params['comment']
               ) ;
     adding_rec_to_table($this->table_bill,$rec,array('debug'=>0)) ;
     update_rec_in_table('obj_site_rs',array('value'=>$to_value_out),'pkey='.$params['rs_to']) ;
     //return($id) ;
   }


    function add_money_to_rs($rs_id,$member_id,$summa,$comment='')
    { // ищем последнуую сумму на счете
      $value_in=execSQL_value('select value_out from '.$this->table_bill.' where rs='.$rs_id.' order by pkey desc limit 1') ;
      $rec_rs=execSQL_van('select * from obj_site_rs where pkey='.$rs_id) ;
      $value_out=$value_in+$summa ;

      adding_rec_to_table('obj_site_bill',array('c_data'=>time(),
                                                 'clss'=>400,
                                                 'typ'=>1,
                                                 'member_from'=>$member_id,
                                                 'member_to'=>$rec_rs['member_id'],
                                                 'rs'=>$rs_id,
                                                 'rs_to'=>$rs_id,
                                                 'value_in'=>$value_in,
                                                 'value'=>$summa,
                                                 'value_out'=>$value_out,
                                                 'obj_name'=>$comment
                                            )) ;
      update_rec_in_table('obj_site_rs',array('value'=>$value_out),'pkey='.$rs_id) ;
      LOGS()->reg_log('Биллинг','р/с '.$rs_id.': '.$comment.' =>  '.$summa,array('user_id'=>$member_id)) ;
    }

    function remove_money_from_rs($rs_id,$member_id,$summa,$comment='')
    { // ищем последнуую сумму на счете
      $value_in=execSQL_value('select value_out from '.$this->table_bill.' where rs='.$rs_id.' order by pkey desc limit 1') ;
      $value_out=$value_in-$summa ;
      adding_rec_to_table('obj_site_bill',array('c_data'=>time(),
                                                 'clss'=>400,
                                                 'typ'=>2,
                                                 'member_from'=>$member_id,
                                                 'member_to'=>$member_id,
                                                 'rs'=>$rs_id,
                                                 'rs_from'=>$rs_id,
                                                 'value_in'=>$value_in,
                                                 'value'=>$summa,
                                                 'value_out'=>$value_out,
                                                 'obj_name'=>$comment,
                                                )) ;
      update_rec_in_table('obj_site_rs',array('value'=>$value_out),'pkey='.$rs_id) ;
      LOGS()->reg_log('Биллинг','р/с '.$rs_id.': '.$comment.' =>  '.$summa,array('user_id'=>$member_id)) ;

    }


   function get_bill_last_rec($from,$to)
   { $bill_rec=execSQL_van('select * from '.$this->table_bill.' where rs_from='.$from.' and rs_to='.$to.' order by pkey desc limit 1') ;
     return($bill_rec) ;
   }

   function get_bill_sum_payments_to_invoice($inv_id)
   { $sum=execSQL_value('select sum(value) from '.$this->table_bill.' where inv_id='.$inv_id) ;
     return($sum) ;
   }

   function get_bill_of_member($member_id,$options=array())
   {  global $TM_account ;
      $_usl=array() ; $recs=array() ;
      $_usl[]='t1.clss=207' ;
      $_usl[]='t1.enabled=1' ;
      $_usl[]='(t1.member_from='.$member_id.' or t1.member_to='.$member_id.')' ;
      if ($options['inv_id']) { //$_usl[]='t1.inv_id in ('.$options['inv_id'].')' ;
                                //$_usl[]='t1.pkey=t1.parent' ;
                              }
      //damp_array($_usl) ;
      if (_sizeof($_usl))
      { $sql='select t1.*,'.
             '(select obj_name from '.$TM_account.' t_acc where t_acc.pkey=t1.member_from) as member_from_name, '.
             '(select obj_name from '.$TM_account.' t_acc where t_acc.pkey=t1.member_to) as member_to_name '.
             'from '.$this->table_bill.' t1 where ('.implode(' and ',$_usl).')' ;
        if ($options['inv_id']) $sql.=' and ((t1.pkey in ( select t3.parent from '.$this->table_bill.' t3 where t3.inv_id in ('.$options['inv_id'].')))'.
                                      ' or t1.inv_id in ('.$options['inv_id'].'))' ;
        $sql.=($options['sort']=='asc')? ' order by t1.c_data asc,t1.pkey asc':' order by t1.c_data desc,t1.pkey desc' ;
        $recs=execSQL($sql) ;
      }
      return($recs);
   }

   function get_rs_by_id($id)
   { $rec=execSQL_van('select * from obj_site_rs where pkey='.$id) ;
     return($rec) ;
   }

   function set_tarif($rs,$tarif)
   { update_rec_in_table('obj_site_rs',array('tarif'=>$tarif),'pkey='.$rs) ;

   }

   function delete_tarif($tarif_reffer)
   {   ESMO()->list_rec_delete($tarif_reffer) ;
       list($id,$tkey)=explode('.',$tarif_reffer) ;
       update_rec_in_table('obj_site_rs',array('tarif'=>0),'tarif='.$id) ;
       return(1) ;
   }


    function clss_210_on_create_event($rec_client)
    { $this->create_rs($rec_client) ;
    }

    function create_rs($rec_client)
    { // создаем расчетный счет
      $id=adding_rec_to_table('obj_site_rs',array('parent'=>1,'clss'=>401,'obj_name'=>'Оплата МО','member_id'=>$rec_client['pkey'])) ;
      LOGS()->reg_log('Биллинг','Создан расчетный счет '.$id.' для нового аккаунта "'.$rec_client['obj_name'].'" [#'.$rec_client['pkey'].']') ;
      // в качестве агента клиента указываем пользователя, который создал клиента - он будет получать оплату за МО
      update_rec_in_table('obj_site_account',array('agent'=>MEMBER()->id),'pkey='.$rec_client['pkey']) ;
      LOGS()->reg_log('Биллинг','Для клиента "'.$rec_client['obj_name'].'" [#'.$rec_client['pkey'].'] назначен агент "'.MEMBER()->name.'" [#'.MEMBER()->id.']') ;
    }


  function create_html_invoice($client_id,$params,$options=array())
  {

  }


  function create_invoice($client_id,$params,$options=array())
  {
      $doc_id=DOCS()->reg_doc(array('obj_name'=>'Счет ',
                                            'member_id'=>MEMBER()->id
                                            ),
                                        'INV',
                                      MEMBER()->info['_ext_info']['seria_INV']
                         ) ;

       $doc_number=DOCS()->get_doc_number($doc_id) ;
     //update_rec_in_table($this->table_name,array('doc_number'=>$doc_number),'pkey='.$to_id) ; // обновляем номер документа в записи по ТО, так как он будет проставлен на документе


        $member_org_id=execSQL_value('select pkey from obj_site_personals where clss=207 and enabled=1 and client_id='.MEMBER()->id.' order by c_data limit 1') ;
        $client_org_id=execSQL_value('select pkey from obj_site_personals where clss=207 and enabled=1 and client_id='.$client_id.' order by c_data limit 1') ;
        $rec_org1=PERSONAL()->get_org_by_id($member_org_id,array('get_ext_info'=>1)) ;
        $rec_org2=PERSONAL()->get_org_by_id($client_org_id,array('get_ext_info'=>1)) ;

        $usluga='Услуги по организации и проведению обязательных предрейсовых медицинских осмотров водителей и предрейсового контроля технического состояния транспортных средств' ;
        $usluga_info='' ;
        if ($params['time_from']) $usluga_info='с '.$params['time_from'] ;
        if ($params['time_to'])   $usluga_info.=' по '.$params['time_to'] ;

        include_once(_DIR_EXT.'/aspmo_bill/template_invoice.php') ;
        ob_start() ;
        $invoice_params=array('invoice_number'=>$doc_number,
                               'invoice_data'=>$params['time_to'],
                               ///---------------------------
                               'org1'=>$rec_org1['full_name'],
                               'adr1'=>$rec_org1['adres1'],
                               'inn1'=>$rec_org1['inn'],
                               'kpp1'=>$rec_org1['kpp'],
                               'bank1'=>$rec_org1['bank'],
                               'bik1'=>$rec_org1['bik'],
                               'rs1'=>$rec_org1['rs'],
                               'ks1'=>$rec_org1['ks'],
                                ///---------------------------
                               'org2'=>$rec_org2['full_name'],
                               'adr2'=>$rec_org2['adres1'],
                               'inn2'=>$rec_org2['inn'],
                               'kpp2'=>$rec_org2['kpp'],
                               ///---------------------------
                               'uslugi_itogo'=>$params['price'],
                               'nds'=>array('title'=>'Без налога (НДС)',
                                            'summa'=>''
                                            ),
                               'k_oplate'=>$params['price'],
                               'summa_propis'=>$this->mb_ucfirst($this->num_propis(floor($params['price']))).' '.get_case_by_count_1_2_5(floor($params['price']),'рубль,рубля,рублей').' 00 копеек',
                               'buh_working'=>$rec_org1['buh_working'],   // должность лица, выставляющего счет
                               'buh_fio'=>$rec_org1['buh_fio'],   // ФИО лица, выставляющего счет
                               'director_working'=>$rec_org1['director_working'],   // должность лица, выставляющего счет
                               'director_fio'=>$rec_org1['director_fio']   // ФИО лица, выставляющего счет
                               ) ;
         //if (_sizeof($params['tarif_price'])) foreac
         $i=1 ;
         if (_sizeof($params['tarif_price'])) foreach($params['tarif_price'] as $tarif_name=>$arr_dopusk)
            { if (_sizeof($arr_dopusk)) foreach($arr_dopusk as $dopusk_name=>$arr_price)
                  if (_sizeof($arr_price)) foreach($arr_price as $price=>$cnt)
                  { $usluga_info2='<br><strong>'.$usluga_info.',  тариф "'.$tarif_name.'", '.$dopusk_name.'</strong>' ;
                    $invoice_params['uslugi'][$i]=array('name'=>$usluga.$usluga_info2,
                                                        'ed'=>'шт.',
                                                        'count'=>$cnt,
                                                        'price'=>$price,
                                                        'summa'=>$price*$cnt
                                                        ) ;
                    $i++ ;

                  }
            }
         else
         {   $usluga_info2='<br><strong>'.$usluga_info.'</strong>' ;
             $invoice_params['uslugi'][1]=array('name'=>$usluga.$usluga_info2,
                                             'ed'=>'шт.',
                                             'count'=>$params['cnt'],
                                             'price'=>$params['price'],
                                             'summa'=>$params['price']
                                             ) ;
         }


          template_invoice($invoice_params,array()) ;

          $html=ob_get_clean() ;

          // готовим PDF документ
          $doc_name='INV_'.$doc_number.'.pdf' ;
          $doc_url=DOCS()->doc_save_as_PDF($doc_name,$html,$options) ;


          DOCS()->update_doc($doc_id,
                      array('obj_name'=>'Счет '.MEMBER()->info['_ext_info']['seria_INV'].' № '.$doc_number,
                            'doc_name'=>$doc_name,
                            )
                       ) ;

      //update_rec_in_table($this->table_name,array('doc_name'=>$doc_name,'doc_id'=>$doc_id,'doc_number'=>$doc_number),'pkey='.$to_id) ;
      return($doc_url) ;
  }

  function create_akt($client_id,$params,$options=array())
  {
      $doc_id=DOCS()->reg_doc(array('obj_name'=>'Акт ',
                                            'member_id'=>MEMBER()->id
                                            ),
                                        'AKT',
                                      MEMBER()->info['_ext_info']['seria_AKT']
                         ) ;

       $doc_number=DOCS()->get_doc_number($doc_id) ;
     //update_rec_in_table($this->table_name,array('doc_number'=>$doc_number),'pkey='.$to_id) ; // обновляем номер документа в записи по ТО, так как он будет проставлен на документе


        $member_org_id=execSQL_value('select pkey from obj_site_personals where clss=207 and enabled=1 and client_id='.MEMBER()->id.' order by c_data limit 1') ;
        $client_org_id=execSQL_value('select pkey from obj_site_personals where clss=207 and enabled=1 and client_id='.$client_id.' order by c_data limit 1') ;
        $rec_org1=PERSONAL()->get_org_by_id($member_org_id,array('get_ext_info'=>1)) ;
        $rec_org2=PERSONAL()->get_org_by_id($client_org_id,array('get_ext_info'=>1)) ;

        $usluga='Услуги по организации и проведению обязательных предрейсовых медицинских осмотров водителей и предрейсового контроля технического состояния транспортных средств' ;
        $usluga_info='' ;
        if ($params['time_from']) $usluga_info='с '.$params['time_from'] ;
        if ($params['time_to'])   $usluga_info.=' по '.$params['time_to'] ;

        include_once(_DIR_EXT.'/aspmo_bill/template_akt.php') ;
        ob_start() ;
          //damp_array($params,1,-1) ;
        $invoice_params=array('akt_number'=>$doc_number,
                               'akt_data'=>$params['time_to'],
                               ///---------------------------
                               'org1_small'=>$rec_org1['obj_name'],
                               'org1'=>$rec_org1['full_name'],
                               'adr1'=>$rec_org1['adres1'],
                               'inn1'=>$rec_org1['inn'],
                               'kpp1'=>$rec_org1['kpp'],
                               'bank1'=>$rec_org1['bank'],
                               'bik1'=>$rec_org1['bik'],
                               'rs1'=>$rec_org1['rs'],
                               'ks1'=>$rec_org1['ks'],
                               'working1'=>$rec_org1['director_working'],   // должность лица, выставляющего счет
                               'fio1'=>$rec_org1['director_fio'],   // ФИО лица, выставляющего счет
                                ///---------------------------
                               'org2_small'=>$rec_org2['obj_name'],
                               'org2'=>$rec_org2['full_name'],
                               'adr2'=>$rec_org2['adres1'],
                               'inn2'=>$rec_org2['inn'],
                               'kpp2'=>$rec_org2['kpp'],
                               'working2'=>$rec_org2['director_working'],   // должность лица, выставляющего счет
                               'fio2'=>$rec_org2['director_fio'],   // ФИО лица, выставляющего счет
                               ///---------------------------
                               'uslugi_itogo'=>$params['price'],
                               'nds'=>array('title'=>'Без налога (НДС)',
                                            'summa'=>''
                                            ),
                               'k_oplate'=>$params['price'],
                               'summa_propis'=>$this->mb_ucfirst($this->num_propis(floor($params['price']))).' '.get_case_by_count_1_2_5(floor($params['price']),'рубль,рубля,рублей').' 00 копеек',
                               ) ;
         //if (_sizeof($params['tarif_price'])) foreac
         $i=1 ; $all_cnt=0 ;
         if (_sizeof($params['tarif_price'])) foreach($params['tarif_price'] as $tarif_name=>$arr_dopusk)
            { if (_sizeof($arr_dopusk)) foreach($arr_dopusk as $dopusk_name=>$arr_price)
                  if (_sizeof($arr_price)) foreach($arr_price as $price=>$cnt)
                  { $usluga_info2='<br><strong>'.$usluga_info.',  тариф "'.$tarif_name.'", '.$dopusk_name.'</strong>' ;
                    $invoice_params['uslugi'][$i]=array('name'=>$usluga.$usluga_info2,
                                                        'ed'=>'шт.',
                                                        'count'=>$cnt,
                                                        'price'=>$price,
                                                        'summa'=>$price*$cnt
                                                        ) ;
                    $i++ ;
                    $all_cnt+=$cnt ;
                  }
            }
         else
         {   $usluga_info2='<br><strong>'.$usluga_info.'</strong>' ;
             $invoice_params['uslugi'][1]=array('name'=>$usluga.$usluga_info2,
                                             'ed'=>'шт.',
                                             'count'=>$params['cnt'],
                                             'price'=>$params['price'],
                                             'summa'=>$params['price']
                                             ) ;
             $all_cnt+=$params['cnt'] ;
         }
         $invoice_params['all_cnt']=$all_cnt ;

          template_akt($invoice_params,array()) ;

          $html=ob_get_clean() ;

          // готовим PDF документ
          $doc_name='AKT_'.$doc_number.'.pdf' ;
          $doc_url=DOCS()->doc_save_as_PDF($doc_name,$html,$options) ;

          DOCS()->update_doc($doc_id,
                      array('obj_name'=>'Акт '.MEMBER()->info['_ext_info']['seria_AKT'].' № '.$doc_number,
                            'doc_name'=>$doc_name,
                            )
                       ) ;

      //update_rec_in_table($this->table_name,array('doc_name'=>$doc_name,'doc_id'=>$doc_id,'doc_number'=>$doc_number),'pkey='.$to_id) ;
      return($doc_url) ;
  }

  function create_bill_details($client_id,$params,$options=array())
  {
      $doc_id=DOCS()->reg_doc(array('obj_name'=>'Детализация биллинга',
                                            'member_id'=>MEMBER()->id
                                            ),
                                        'BILL_DETAIL'
                         ) ;

       $doc_number=DOCS()->get_doc_number($doc_id) ;
       //update_rec_in_table($this->table_name,array('doc_number'=>$doc_number),'pkey='.$to_id) ; // обновляем номер документа в записи по ТО, так как он будет проставлен на документе

        $client_org_id=execSQL_value('select pkey from obj_site_personals where clss=207 and enabled=1 and client_id='.$client_id.' order by c_data limit 1') ;
        $rec_org2=PERSONAL()->get_org_by_id($client_org_id,array('get_ext_info'=>1)) ;


        ob_start() ;

        ?><div id="panel_rs_report"><form><?
          $_usl=array() ;
          $_usl[]='clss=400' ;
          $_usl[]='rs='.$params['rs_id'] ;
          if ($params['time_from']) $_usl[]='c_data>='.strtotime($params['time_from']) ;
          if ($params['time_to']) $_usl[]='c_data<='.strtotime($params['time_to']) ;
          $_usl[]='member_from='.$client_id ;

          $usl=implode(' and ',$_usl) ;
          ?><style type="text/css">
              table.basic{width:100%;table-layout:fixed;border-collapse:collapse;}
              table.basic th{text-align:center;background:#eeeeee;padding:10px;border: 1px solid #dddddd}
              table.basic td{padding:10px;text-align:center;border:1px solid #eeeeee;}

              table.basic.b2 td{padding:10px;text-align:left;border-top:1px solid #eeeeee;border-bottom:1px solid #eeeeee;border-left:none;border-right:none;background:white;}
              table.basic.b2 td:first-child{font-weight:bold;}
              table.basic.b2 tr:last-child td{border-bottom:none;}
              table.basic.b2.fz_small td{padding:5px;}
              table.basic.fz_small2 th{padding:4px;}
              table.basic.fz_small2 td{padding:4px;background-color:white;}

              table.basic.left td{text-align:left;}
              table.basic ul{padding-left:0;}
              table.basic ul li{padding-left:0;}

              table.basic td.left{text-align:left;}
              table.basic td.right{text-align:right;}

              p.center{text-align:center;}
              p.right{text-align:right;}
          </style>
          <p class="center"><strong>ДЕТАЛИЗАЦИЯ БИЛЛИНГА № <?echo $doc_number?> от <?echo $params['time_to']?></strong></p>
          <p class="center">по организациии "<?echo $rec_org2['obj_name']?>"</p>
          <p class="center">c <?echo $params['time_from']?> по <?echo $params['time_to']?></p>
          <?
          show_list_items('obj_site_bill',$usl,'aspmo_bill/list_recs_bill',array('order'=>'c_data','no_link'=>1)) ;

          $html=ob_get_clean() ;

          // готовим PDF документ
          $doc_name='BILL_DETAIL_'.$doc_number.'.pdf' ;
          $options['font_size']=8 ;
          $options['padding_top']=5 ;
          $options['padding_bottom']=5 ;
          $options['padding_left']=5 ;
          $options['padding_right']=5 ;
          $doc_url=DOCS()->doc_save_as_PDF($doc_name,$html,$options) ;

          DOCS()->update_doc($doc_id,
                      array('obj_name'=>'Детализация биллинга  № '.$doc_number,
                            'doc_name'=>$doc_name,
                            )
                       ) ;

      //update_rec_in_table($this->table_name,array('doc_name'=>$doc_name,'doc_id'=>$doc_id,'doc_number'=>$doc_number),'pkey='.$to_id) ;
      return($doc_url) ;
  }


    function num_propis($num)
    { // $num - цело число

        # Все варианты написания чисел прописью от 0 до 999 скомпонуем в один небольшой массив
         $m=array(
          array('ноль'),
          array('-','один','два','три','четыре','пять','шесть','семь','восемь','девять'),
          array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать','пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать'),
          array('-','-','двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят','восемьдесят','девяносто'),
          array('-','сто','двести','триста','четыреста','пятьсот','шестьсот','семьсот','восемьсот','девятьсот'),
          array('-','одна','две')
         );

        # Все варианты написания разрядов прописью скомпануем в один небольшой массив
         $r=array(
          array('...ллион','','а','ов'), // используется для всех неизвестно больших разрядов
          array('тысяч','а','и',''),
          array('миллион','','а','ов'),
          array('миллиард','','а','ов'),
          array('триллион','','а','ов'),
          array('квадриллион','','а','ов'),
          array('квинтиллион','','а','ов')
          // ,array(... список можно продолжить
         );

         if($num==0)return$m[0][0]; # Если число ноль, сразу сообщить об этом и выйти
         $o=array(); # Сюда записываем все получаемые результаты преобразования

        # Разложим исходное число на несколько трехзначных чисел и каждое полученное такое число обработаем отдельно
         foreach(array_reverse(str_split(str_pad($num,ceil(strlen($num)/3)*3,'0',STR_PAD_LEFT),3))as$k=>$p){
          $o[$k]=array();

        # Алгоритм, преобразующий трехзначное число в строку прописью
          foreach($n=str_split($p)as$kk=>$pp)
          if(!$pp)continue;else
           switch($kk){
            case 0:$o[$k][]=$m[4][$pp];break;
            case 1:if($pp==1){$o[$k][]=$m[2][$n[2]];break 2;}else$o[$k][]=$m[3][$pp];break;
            case 2:if(($k==1)&&($pp<=2))$o[$k][]=$m[5][$pp];else$o[$k][]=$m[1][$pp];break;
           }$p*=1;if(!$r[$k])$r[$k]=reset($r);

        # Алгоритм, добавляющий разряд, учитывающий окончание руского языка
          if($p&&$k)switch(true){
           case preg_match("/^[1]$|^\\d*[0,2-9][1]$/",$p):$o[$k][]=$r[$k][0].$r[$k][1];break;
           case preg_match("/^[2-4]$|\\d*[0,2-9][2-4]$/",$p):$o[$k][]=$r[$k][0].$r[$k][2];break;
           default:$o[$k][]=$r[$k][0].$r[$k][3];break;
          }$o[$k]=implode(' ',$o[$k]);
         }

         return implode(' ',array_reverse($o));
        }

        function mb_ucfirst($str, $encoding='UTF-8')
        {
            $str = mb_ereg_replace('^[\ ]+', '', $str);
            $str = mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding).
                   mb_substr($str, 1, mb_strlen($str), $encoding);
            return $str;
        }


    }



?>
