<?php
  include("conn.php");
  include('fnc-cajas.php');
  //Recupero parametros
  $vDataPeriodos     = $_POST['xDataPeriodos'];
  $vUnidades         = $_POST['xUnidades'];
  $vMedios           = $_POST['xMedios'];
  $vComprobantes     = $_POST['xComprobantes'];
  $vSoloMedios       = $_POST['xSoloMedios'];

  //Armo el filtro de periodos;
  $sqlPeriodos = "";
  if ($vDataPeriodos != '') {
    $xDataPeriodos = json_decode($vDataPeriodos);
    $sqlPeriodos = " AND (";
    foreach ($xDataPeriodos as $value) {
      if ($sqlPeriodos <> " AND (") {
        $sqlPeriodos .= " OR ";
      }
      $sqlPeriodos .= "(B.FECHA BETWEEN '" . $value->desde . "' AND '" . $value->hasta . "')";
    }
    $sqlPeriodos .= ")";
  }
    
  $sqlVistaCajas = getVistaCajas($DBSegu);
  $cantidadTitulares = 0;
  if ($vUnidades == '') {
    $sqlAdmin = ($_SESSION['CurrentAdmin'] == 0)?" AND UB.ID_USUARIO = ".$_SESSION['CurrentIdUser']:"";
    $sql = "SELECT DISTINCT B.BASE, B.DESCRI AS DESC_BASE, T.TIPO_CAJA, T.descri as DESC_CAJA
            FROM (SELECT XB.BASE, XB.DESCRI 
                 FROM BASES XB 
                      INNER JOIN USUARIOSBASES XUB 
                          INNER JOIN USUARIOS XU ON XUB.ID_USUARIO = XU.ID_USUARIO AND XU.USUARIO = 'PIXO_WEB' 
                      ON XB.BASE = XUB.BASE) B  
                  INNER JOIN ".$sqlVistaCajas." T  ON B.BASE = T.BASE
                  INNER JOIN USUARIOSBASES UB 
                      INNER JOIN USUARIOS U ON UB.ID_USUARIO = U.ID_USUARIO 
                  ON B.BASE = UB.BASE ".$sqlAdmin."
            WHERE 1=1 
            ORDER BY B.DESCRI, T.DESCRI ";
    $RsUnidades = sqlsrv_query( $conn, $sql);    
    if (! $RsUnidades ) {    
      $jsondata['success'] = false;
      $jsondata['message'] = 'Ha ocurrido un error durante la consulta. Ref. #V01.01';
      header('Content-type: application/json; charset=utf-8');
      echo json_encode($jsondata);
      die( print_r( sqlsrv_errors(), true));    
    }
    while( $row = sqlsrv_fetch_array( $RsUnidades, SQLSRV_FETCH_ASSOC)) {  
      if ($vUnidades != '') {$vUnidades.=',';}
      $vUnidades .= $row['BASE'].'-'.$row['TIPO_CAJA']; 
    }
  } 
  $xDataTitulares = explode(',', $vUnidades );
  foreach ($xDataTitulares as $value) {
    $cantidadTitulares ++;
  }

  //Armo el filtro de empresas
  //el filtro de titulares se hace luego en el while de cada empresa
  $sqlEmpresas = '';
  if ($vUnidades != '') {
    $xUnidades = explode(',' , $vUnidades);
    $sqlEmpresas = " AND (";
    foreach ($xUnidades as $value) {
      $aux = explode('-', $value);
      
      if ($sqlEmpresas <> " AND (") {
        $sqlEmpresas .= " OR ";
      }
      $sqlEmpresas .= "(A.BASE = " . $aux[0] . ")";
    }
    $sqlEmpresas .= ")";
  }

  //Armo el filtro de medios de pago
  $sqlMedios = '';
  if ($vMedios != '') {
    $xMedios = explode(',' , $vMedios);
    $sqlMedios = " AND (";
    foreach ($xMedios as $value) {
    //$value->desde;
      if ($sqlMedios <> " AND (") {
        $sqlMedios .= " OR ";
      }
      $sqlMedios .= "(A.TIPO_IMPUTA = " . $value . ")";
    }
    $sqlMedios .= ")";
  }

  //Filtro solo medios de pago
  $sqlSoloMedios = "";
  if ($vSoloMedios == 1) {
    $sqlSoloMedios = " AND A.medio_pago = 1 "; 
  }


  function getDescripcion($conn, $base, $caja, $vista) {
    $sqlAdmin = ($_SESSION['CurrentAdmin'] == 0)?" AND UB.ID_USUARIO = ".$_SESSION['CurrentIdUser']:"";
    $sql = "SELECT DISTINCT B.BASE, B.DESCRI AS DESC_BASE, T.TIPO_CAJA, T.descri as DESC_CAJA
          FROM (SELECT XB.BASE, XB.DESCRI 
               FROM BASES XB 
                    INNER JOIN USUARIOSBASES XUB 
                        INNER JOIN USUARIOS XU ON XUB.ID_USUARIO = XU.ID_USUARIO AND XU.USUARIO = 'PIXO_WEB' 
                    ON XB.BASE = XUB.BASE) B  
                INNER JOIN ".$vista." T  ON B.BASE = T.BASE
                INNER JOIN USUARIOSBASES UB 
                    INNER JOIN USUARIOS U ON UB.ID_USUARIO = U.ID_USUARIO 
                ON B.BASE = UB.BASE ".$sqlAdmin."
          WHERE 1=1 and B.BASE = " . $base . " AND T.TIPO_CAJA = " . $caja . " 
          ORDER BY B.DESCRI, T.DESCRI";
    $RsTitular = sqlsrv_query( $conn, $sql);    
    if (! $RsTitular ) {    
      $jsondata['success'] = false;
      $jsondata['message'] = 'Ha ocurrido un error durante la consulta. Ref. #V01.12';
      header('Content-type: application/json; charset=utf-8');
      echo json_encode($jsondata);
      die( print_r( sqlsrv_errors(), true));    
    }
    $row = sqlsrv_fetch_array( $RsTitular, SQLSRV_FETCH_ASSOC);
    return utf8_encode($row['DESC_BASE']) . ' - ' . utf8_encode($row['DESC_CAJA']);
  }

  function getTitulares($lista, $base) {
    $resu = '';

    if ($lista != '') {
      $xUnidades = explode(',' , $lista);
      $xxx = '';
      foreach ($xUnidades as $value) {
        $aux = explode('-', $value);
        if ($aux[0] == $base) {
          if ($xxx <> "") {
            $xxx .= ", ";
          }
        $xxx .= " " . $aux[1];
        }
      }
      $resu = " AND TIPO_CAJA IN (" . $xxx . ")";
    }

    return $resu;
  }
  $resu = '';

  //Al operatoria va a ser la siguiente
  //1) Voy a hacer una select donde obtenga todas las convinaciones fecha + parcial de todas las bases y las voy a insertar en la temporal convinadas
  //   con todos los medios de pago. Esto me va a dar la convinación para cada una de las filas a mostrar.
  //2) Recorro el set de cajas y para cada una obtengo los valores y con ellos actualizo la temporal
  //3) Cargo la temporal completa, recorro y muestro
  //NOTA: La temporal va tener una columnap para cada caja

  //armo el script para crear la tabla temporal; la cantidad de columnas va a depender del la cantidad de cajas;
  $sqlTemporal = "create table #TablaTemporal (FECHA VARCHAR(8), PARCIAL VARCHAR(2), TIPO_IMPUTA INTEGER, DESCRI VARCHAR(150)";
  for ($i = 1; $i <= $cantidadTitulares; $i++) {
    $sqlTemporal .= ", SALDO".$i." MONEY default 0 ";
  }
  $sqlTemporal .= ")";

  $RsTemporal = sqlsrv_query( $conn, $sqlTemporal);    
  if (! $RsTemporal ) {    
    $jsondata['success'] = false;
    $jsondata['message'] = 'Ha ocurrido un error durante la consulta. Ref. #V01.02';
    header('Content-type: application/json; charset=utf-8');
    echo json_encode($jsondata);
    die( print_r( sqlsrv_errors(), true));    
  }    

  /*$sqlTemporal = "create NONCLUSTERED INDEX idx_TablaTemporal ON #TablaTemporal (FECHA, PARCIAL, TIPO_IMPUTA)";
  $RsTemporal = sqlsrv_query( $conn, $sqlTemporal);    
  if (! $RsTemporal ) {    
    $jsondata['success'] = false;
    $jsondata['message'] = 'Ha ocurrido un error durante la consulta. Ref. #V01.00';
    header('Content-type: application/json; charset=utf-8');
    echo json_encode($jsondata);
    die( print_r( sqlsrv_errors(), true));    
  } */   

  $sqlAdmin = ($_SESSION['CurrentAdmin'] == 0)?" AND UB.ID_USUARIO = ".$_SESSION['CurrentIdUser']:"";
  $sqlBases = "SELECT DISTINCT A.BASE, A.DESCRI, A.NOMBRE_BASE 
               FROM (SELECT XB.BASE, XB.DESCRI, XB.NOMBRE_BASE 
                     FROM BASES xB 
                          INNER JOIN USUARIOSBASES XUB 
                              INNER JOIN USUARIOS XU 
                              ON XUB.ID_USUARIO = XU.ID_USUARIO 
                              AND XU.USUARIO = 'PIXO_WEB' 
                          ON XB.BASE = XUB.BASE) A 
                    INNER JOIN USUARIOSBASES UB 
                        INNER JOIN USUARIOS U 
                        ON UB.ID_USUARIO = U.ID_USUARIO 
                    ON A.BASE = UB.BASE ".$sqlAdmin."
               WHERE 1=1 ".$sqlEmpresas."
               ORDER BY A.DESCRI";
  $RsEmpresas = $DBSegu->Execute($sqlBases);
  if (!$RsEmpresas) {
    $jsondata['success'] = false;
    $jsondata['message'] = 'Ha ocurrido un error durante la consulta. Ref. #V01.03';
    header('Content-type: application/json; charset=utf-8');
    echo json_encode($jsondata);
    die();  
  }

  $subConsulta = '';
  while (!$RsEmpresas->EOF) {
    if ($subConsulta <> "") {
       $subConsulta .= " Union All ";
    }
    $sqlTitulares = getTitulares($vUnidades, $RsEmpresas->fields['BASE']); 
    $subConsulta .= " Select " . $RsEmpresas->fields['BASE'] . " as base, B.cierre, B.fecha, B.parcial, B.tipo_caja, C.tipo_imputa, C.saldo 
                      From " . $RsEmpresas->fields["NOMBRE_BASE"] . ".dbo.caCierre B 
                           INNER JOIN " . $RsEmpresas->fields["NOMBRE_BASE"] . ".dbo.caCierreDet C 
                           on C.cierre = B.cierre 
                      Where 1=1 " . $sqlPeriodos . $sqlTitulares;
     $RsEmpresas->MoveNext();
  }

  //Esta consulta me trae todos los cierres del/los periodo/s
  $sqlConsulta = " select distinct convert(varchar(8), A.fecha, 112) as FECHA, replace(str(A.parcial,2,0),' ','0') as PARCIAL 
                   from (" . $subConsulta . ") A 
                   where 1 = 1 
                   order by fecha, parcial ";
  $RsConsulta = sqlsrv_query( $conn, $sqlConsulta);    
  if (! $RsConsulta ) {    
    $jsondata['success'] = false;
    $jsondata['message'] = 'Ha ocurrido un error durante la consulta. Ref. #V01.04';
    header('Content-type: application/json; charset=utf-8');
    echo json_encode($jsondata);
    die( print_r( sqlsrv_errors(), true));    
  }    
  
  //recorro los cierres e inserto un registro para cada medio de pago
  while( $row = sqlsrv_fetch_array( $RsConsulta, SQLSRV_FETCH_ASSOC)) {  
    $xAux = ($vSoloMedios == 1)?' and MEDIO_PAGO = 1 ':'';
    $sql = "SELECT TIPO_IMPUTA, DESCRI FROM " . $_SESSION["BaseMadre"] . "caTipoImputa A where 1=1 and a.arqueo=1 ".$xAux.$sqlMedios." ORDER BY  DESCRI ";
    $RsMedios = sqlsrv_query( $conn, $sql);    
    if (! $RsMedios ) {    
      $jsondata['success'] = false;
      $jsondata['message'] = 'Ha ocurrido un error durante la consulta. Ref. #V01.05';
      header('Content-type: application/json; charset=utf-8');
      echo json_encode($jsondata);
      die( print_r( sqlsrv_errors(), true));    
    }
    $cantidadMedios = 0;
    while( $row2 = sqlsrv_fetch_array( $RsMedios, SQLSRV_FETCH_ASSOC)) {  
  
      $sqlTemporal = "insert into #TablaTemporal (FECHA, PARCIAL, TIPO_IMPUTA, DESCRI) 
                      values ('".$row['FECHA']."', '".$row['PARCIAL']."', ".$row2['TIPO_IMPUTA'].", '".$row2['DESCRI']."') ";
      $RsTemporal = sqlsrv_query( $conn, $sqlTemporal);    
      if (! $RsTemporal ) {    
        $jsondata['success'] = false;
        $jsondata['message'] = 'Ha ocurrido un error durante la consulta. Ref. #V01.06';
        header('Content-type: application/json; charset=utf-8');
        echo json_encode($jsondata);
        die( print_r( sqlsrv_errors(), true));    
      }
      $cantidadMedios++;
    }
  }

  //Recorro la lista de cajas para ir completando la grilla
  $contador = 1;
  foreach ($xUnidades as $value) {
    $aux = explode('-', $value);

    $sqlConsulta = "select TP.descri as tipopago, convert(varchar(8), A.fecha, 112) as FECHA, replace(str(A.parcial,2,0),' ','0') as PARCIAL, 
                           A.TIPO_IMPUTA, A.SALDO 
                    from (" . $subConsulta. ") A 
                         inner join " . $_SESSION["BaseMadre"] . "caTipoImputa  TP 
                         on A.tipo_imputa = TP.tipo_imputa and TP.arqueo = 1 
                    where 1=1 and (A.BASE = " . $aux[0] . " AND A.TIPO_CAJA = ".$aux[1].")".
                    $sqlMedios .
                   "order by A.fecha, A.parcial, A.tipo_imputa";
  
    $RsConsulta = sqlsrv_query( $conn, $sqlConsulta);    
    if (! $RsConsulta ) {    
      $jsondata['success'] = false;
      $jsondata['message'] = 'Ha ocurrido un error durante la consulta. Ref. #V01.07';
      header('Content-type: application/json; charset=utf-8');
      echo json_encode($jsondata);
      die( print_r( sqlsrv_errors(), true));    
    } 

    //voy completando la temporal   
    while( $row = sqlsrv_fetch_array( $RsConsulta, SQLSRV_FETCH_ASSOC)) {  
  
      $sqlTemporal = "update #TablaTemporal
                      set SALDO".$contador." = " . $row['SALDO'] . "
                      where FECHA = '".$row['FECHA']."'
                        and PARCIAL = '".$row['PARCIAL']."' 
                        and TIPO_IMPUTA = ".$row['TIPO_IMPUTA'];
      $RsTemporal = sqlsrv_query( $conn, $sqlTemporal);    
      if (! $RsTemporal ) {    
        $jsondata['success'] = false;
        $jsondata['message'] = 'Ha ocurrido un error durante la consulta. Ref. #V01.08'.$sqlTemporal;
        header('Content-type: application/json; charset=utf-8');
        echo json_encode($jsondata);
        die( print_r( sqlsrv_errors(), true));    
      }
    }
    $contador++;
  }

  //consulto la temporal, recorro y muestro
  $sqlConsulta = " select FECHA, PARCIAL, TIPO_IMPUTA, DESCRI "; 
                  
  $contador = 1;
  $auxTotal = ', (0';
  foreach ($xDataTitulares as $value) {
    $sqlConsulta .= ", SALDO".$contador;

    $auxTotal .= ' + ' . " SALDO".$contador;

    $contador++;
  }
  $auxTotal .= ') AS SALDO'.$contador;
   
  $sqlConsulta .= $auxTotal;
  $sqlConsulta .=" from #TablaTemporal
                   order by FECHA, PARCIAL, TIPO_IMPUTA";

  $RsConsulta = sqlsrv_query( $conn, $sqlConsulta);    
  if (! $RsConsulta ) {    
    $jsondata['success'] = false;
    $jsondata['message'] = 'Ha ocurrido un error durante la consulta. Ref. #V01.09' . $sqlConsulta;
    header('Content-type: application/json; charset=utf-8');
    echo json_encode($jsondata);
    die( print_r( sqlsrv_errors(), true));    
  }

  $resu = '<table id="tablaResultado" class="display table table-striped table-bordered sticky-header" style="border: none; width:100%">
             <thead style="background-color: #db5916; color: aliceblue;">
               <tr style="background-color: rgb(219, 89, 22); color: aliceblue;">
                  <td class="thalign  text-left" width="10%">
                    Arqueo
                  </td>
                  <td class="thalign  text-left" width="25%">
                    Medio de Pago
                  </td>';

  $acumula = array();
  //Agrego una columna por cada caja
  $contador = 0;
  foreach ($xDataTitulares as $value) {
    $aux = explode('-', $value);

    $xxx = getDescripcion($conn, $aux[0], $aux[1], $sqlVistaCajas);
    $resu .=     '<td class="thalign  text-left">'.$xxx.'</td>';

    $acumula[$contador] = 0;
    $contador++;
  }
  $acumula[$contador] = 0; //este es para el total
  $resu .=     '<td class="thalign  text-left">TOTAL</td>';

  $resu .=  '  </tr>
             </thead>
             <tbody>';

  $cierreAnt = '';
  $parcialAnt = '';
  while( $row = sqlsrv_fetch_array( $RsConsulta, SQLSRV_FETCH_ASSOC)) {  
    if (($cierreAnt != $row['FECHA']) || ($parcialAnt != $row['PARCIAL']) ) {
      //aca el rowspan va a ser $cantidadMedios + 1 para contemplar el total
      if ($cierreAnt != '') {
        $resu .= '<tr class="subtotales odd" style="background-color: red; ">
                    <td style="border-right: 0;" >
                      Total Arqueo
                    </td>
                    <td style="border-right: 0;" >
                      
                    </td>';
        $x = 1;
        foreach ($xDataTitulares as $value) {
          $resu .= '<td class=" text-right">'.number_format($acumula[$x-1], 2,'.',',').'</td>';
          //limpio el acumulador
          $acumula[$x-1] = 0;
          $x++;
        }
        $resu .= '<td class=" text-right">'.number_format($acumula[$x-1], 2,'.',',').'</td>'; //este es para el total
        $acumula[$x-1] = 0; //este es para el total
        $resu .= '</tr>';
      }
      $newDate = date("d/m/Y", strtotime($row['FECHA']));
      $resu .= '<tr>
                  <td class="numerales text-left" style="vertical-align:middle" width="10%" rowspan="'.$cantidadMedios.'">
                    '.$newDate . ' - ' . $row['PARCIAL'] .'
                  </td>
                  <td class="numerales text-left" width="20%">
                    '.utf8_encode($row['DESCRI']).'
                  </td>';

      $cierreAnt = $row['FECHA'];
      $parcialAnt = $row['PARCIAL'];
    }
    else { 
      $resu .= '<tr>
                  <td style="display: none"></td>
                  <td class="numerales text-left" width="20%">
                    '.utf8_encode($row['DESCRI']).'
                  </td>';
    }
    //Agrego una columna por cada caja
    $y = 1;
    foreach ($xDataTitulares as $value) {
      //if ($mostrar) { $resu .=     '<td class="numerales text-left">'.utf8_encode($row['DESCRI']).'</td>'; }
      $resu .=     '<td class="numerales text-right">'.number_format($row['SALDO'.$y], 2,'.',',').'</td>';
      $acumula[$y-1] = (float)$acumula[$y-1] + (float)$row['SALDO'.$y];
      $y++;
    }
    $resu .=     '<td class="numerales text-right">'.number_format($row['SALDO'.$y], 2,'.',',').'</td>'; //este es para el total
    $acumula[$y-1] = (float)$acumula[$y-1] + (float)$row['SALDO'.$y]; //este es para el total

    $resu .=  '  </tr>';
  }

  $resu .= '<tr class="subtotales odd" style="background-color: red; ">
              <td style="border-right: 0;" >
                Total Arqueo
              </td>
              <td style="border-right: 0;" >
                
              </td>';
  $z = 1;
  foreach ($xDataTitulares as $value) {
    $resu .= '<td class=" text-right">'.number_format($acumula[$z-1], 2,'.',',').'</td>';
    $z++;
  }
  $resu .= '<td class=" text-right">'.number_format($acumula[$z-1], 2,'.',',').'</td>';  //esto es para el total
  $resu .= '</tr>';

  $resu .= '  </tbody>
            </table>';

  $jsondata = array();
  $jsondata['success'] = true;
  $jsondata['message'] = $resu;
  
  header('Content-type: application/json; charset=utf-8');
  echo json_encode($jsondata);
  die();  
?>