<?php
/*
 * This file is part of FacturaSctipts
 * Copyright (C) 2014-2015  Carlos Garcia Gomez  neorazorx@gmail.com
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

require_model('albaran_cliente.php');
require_model('factura_proveedor.php');
require_model('retencompra.php');
require_model('pedido_cliente.php');
require_model('conceptoreten.php');
require_once 'plugins/facturacion_base/extras/fbase_controller.php';
/**
 * Description of informe_retencion
 *
 * @author carlos
 */
class cretencompra extends fbase_controller
{
   public $retenido;
   public $retencion;
   public $retenciones;
   public $pendiente;
   public $totaliva;
   public $neto;
   public $retenida;
   public $docreten;
   public $codigo;
   public $conceptos;
   public $concepto;
   //public $tiporeten;
   
   public $conceptoret;

   public function __construct()
   {
      parent::__construct(__CLASS__, 'cretencompra', 'compras', FALSE, FALSE);
   }
   
   protected function private_core()
   {
      $this->retenido = FALSE;
      $this->retenida = FALSE;
      $this->retencion = new retencompra();
      $this->retenciones = array();
      $this->pendiente = 0;
      $this->totaliva = 0;
	  //$this->importe = 0;
      $this->neto=0;
      $this->tiporeten='';
      $this->coddocsustento='';
      $this->basereten='';
      $this->docreten=null;
      $this->numret=null;
      $this->conceptoret=null;
    
    //if ( isset($_GET['johnli']) ) {
        //$this->new_message("hola soy john ");
        //$this->tiporeten = $_GET['johnli'] ; //$_POST['tiporeten'];
        //$data1 = $this->db->select("SELECT * from conceptoreten where tiporet ='".$this->tiporeten."';" );      
        $data1 = $this->db->select("SELECT * from conceptoreten ;" );      
        if($data1)
        {
            foreach($data1 as $d)
            $this->selconcepto[] = new conceptoreten($d);
        }

        $porcentajeR = 0;
        $codret = $_POST['codigoret'];
        $coddocsustento = $_POST['coddocsustento'];
        $treten = $_REQUEST['tiporeten'];
        if (isset($_POST['codigoret']) && isset($_REQUEST['tiporeten'])){
            $sqlreten = $this->db->select("SELECT count(*) as contar, porcent from conceptoreten where tiporet = '".$treten."' and codigo ='".$codret."';" );
            if($sqlreten)
            {
                $porcentajeR = $sqlreten[0]['porcent'];
                $contaR = $sqlreten[0]['contar'];
               // $this->new_message('porcentaje de retencion '.$porcentajeR."  cod sust ".$coddocsustento); 
            }        
        }      

        // $contaR   Numewro de registros           
         
      
      if( isset($_GET['delete']) ) /// eliminar retencion
      {
		  
         $retencion = $this->retencion->get($_GET['delete']);
         if($retencion)
         {
            if( $retencion->delete() )
            {
               $this->new_message('Retencion eliminado correctamente.');
               
               if( !is_null($retencion->idfactura) )
               {
                  $fact0 = new factura_proveedor();
                 

                  $factura = $fact0->get($retencion->idfactura);
                  if($factura)
                  {
                     if($factura->retenida)
                     {
						            //$this->new_message(" GUADANDO 1 ");
                        $factura->retenida = FALSE;   // poner aqui los condiciones de eliminar o anular una retencion
                        $factura->save();
                     }
                  }
               }
            }
            else
               $this->new_error_msg('Error al eliminar el retencion.');
         }
         else
            $this->new_error_msg('Retencion no encontrado.');
      }
// anular retencion 
      if( isset($_GET['anular']) ) /// anular retencion
      {
      
         $retencion = $this->retencion->get($_GET['anular']);
         if($retencion)
         {
            if( $retencion->anular() )
            {
               $this->new_message('Retencion anulada correctamente.');
               
               if( !is_null($retencion->idfactura) )
               {
                  $fact0 = new factura_proveedor();
                 

                  $factura = $fact0->get($retencion->idfactura);
                  if($factura)
                  {
                     if($factura->retenida)
                     {
                        //$this->new_message(" GUADANDO 1 ");
                        $factura->retenida = FALSE;   // poner aqui los condiciones de eliminar o anular una retencion
                        $factura->save();
                     }
                  }
               }
            }
            else
               $this->new_error_msg('Error al anular el retencion.');
         }
         else
            $this->new_error_msg('Retencion no encontrado.');
      }

// fin anular retencion       




      else if( isset($_POST['idretencion']) ) /// modificar retencion
      {
		     // $this->new_message(" modif entra a ver 0"); 
         $retencion = $this->retencion->get($_POST['idretencion']);
         if($retencion)
         {
            $retencion->fecha = $_POST['fecha'];
            
      			$retencion->tiporeten = $_POST['tiporeten'];
      			$retencion->porcreten = floatval($_POST['porcreten']);
            $retencion->codigoret = floatval($_POST['codigoret']);
      			$retencion->basereten = floatval($_POST['basereten']);
      			$retencion->importe = floatval($_POST['importe']);

			
			
            if( $retencion->save() )
            {
               $this->new_message('Retencion modificado correctamente.');
            }
            else
               $this->new_error_msg('Error al modificar el retencion.');
         }
         else
            $this->new_error_msg('Retencion no encontrado.');
      }
      else if( isset($_POST['porcreten']) && $contaR > 0 ) /// nuevo retencion --- importe
      {

		     //$this->new_message('nueva retencion--'. $_REQUEST['tiporeten']."---".$codret);
         if( isset($_REQUEST['factura']) )
         {

            $this->retencion->fase = 'Factura';
            $this->retencion->idfactura = $_REQUEST['id'];


         }
         else if( isset($_REQUEST['albaran']) )
         {
            $this->retencion->fase = ucfirst(FS_ALBARAN);
            $this->retencion->idalbaran = $_REQUEST['id'];
         }
         else if( isset($_REQUEST['pedido']) )
         {
            $this->retencion->fase = ucfirst(FS_PEDIDO);
            $this->retencion->idpedido = $_REQUEST['id'];
         }
		     //$this->new_message('segundo'." %--".$this->retencion->porcreten);
         $this->retencion->fecha = $_POST['fecha'];
    		 $this->retencion->tiporeten = $treten; //$_POST['tiporeten'];
         $this->retencion->codigoreten = $treten;

    		 $this->retencion->porcreten = $porcentajeR; //$_REQUEST['º'];
         //$this->retencion->docreten = $_REQUEST['docreten'];
    		 //$this->retencion->basereten = $_POST['basereten'];
             //$this->retencion->importe = floatval($_POST['importe']); 
             //$this->retencion->nota = $_POST['nota'];
      if( isset($_REQUEST['factura']))     
      {
        
        $fact10 = new factura_proveedor();
        $factura10 = $fact10->get($_REQUEST['id']);
		 
    		 if( $treten != "" ) 
    		 {
          
    		 		if ($treten == 'IVA')
    				{
    					$this->retencion->basereten = $factura10->totaliva;
    					//$this->new_message(" basereten 1 ---->  ".$this->retencion->basereten);	
    				}else{
    					$this->retencion->basereten = $factura10->neto;
    					//$this->new_message(" basereten 2 ---->".$this->retencion->basereten);	
    				}
              $this->retencion->importe = number_format(($this->retencion->basereten *  $this->retencion->porcreten)/100,2,".","");
              //$this->new_message(" basereten 2 ---->".$this->retencion->importe);         
    		 }
	       $this->retencion->codigoret = $codret;
         $this->retencion->docreten = $factura10->numproveedor;
         $this->retencion->coddocsustento = $coddocsustento;
		      
         if( $this->retencion->docreten !== "")
         { 
           //$this->new_message(" Nuevo entra a ver 3");
           if( $this->retencion->save() && $this->retencion->docreten !== "")
           {
              $this->new_message('Retencion guardado correctamente.');
           }else{
              $this->new_error_msg('Error al guardar el retencion.');
           }
         }else{
            $this->new_error_msg('Debe ingresar Numero de documento del proveedor');
         }
	     }
     }


      
      if( isset($_REQUEST['factura']) )
      {
		 // $this->new_message(" entra a ver 2");
         /// esto es la fase de factura
         $fact0 = new factura_proveedor();
         $factura = $fact0->get($_REQUEST['id']);
		 
		 
		 
		 
		 
         if($factura)
         {
            /// buscamos pagos de la fase albarán
            /// una factura puede ser una agrupación de muchos albaranes
            $idalbaran = NULL;
            foreach($factura->get_lineas() as $linea)
            {
               /// el idalbaran lo tienes en las lineas de la factura
               if($linea->idalbaran != $idalbaran)
               {
                  $idalbaran = $linea->idalbaran;
                  $this->db->exec("UPDATE retencompras SET idfactura = ".$fact0->var2str($_REQUEST['id'])." WHERE idalbaran = ".$fact0->var2str($idalbaran).";");
               }
            }
            
            $this->retenciones = $this->retencion->all_from_factura_reten($_REQUEST['id']);
//print_r($this->retenciones);
            
            $this->pendiente = 0; //$factura->total;


			if( isset($_REQUEST['tiporeten']) )
			{
				$this->tiporeten = $_REQUEST['tiporeten'];
				
				
			}
			if( isset($_REQUEST['porcreten']) )
			{
				$this->porcreten = $_REQUEST['porcreten'];
			
			}			
      if( isset($_REQUEST['docreten']) )
      {
        $this->docreten = $_REQUEST['docreten'];
      
      }   			
			
            foreach($this->retenciones as $i => $value)
            {
			
               //$this->new_message(" porcentaje  reten ".$value->basereten."---".  $value->porcreten);
      				//$value->basereten = $this->retencion->basereten;
      				
      			   $this->pendiente = round(($value->basereten * $value->porcreten)/100,2);// $this->pendiente -= $value->importe;		// calculo del importe por cada retencion
               $this->retenciones[$i]->importe = $this->pendiente;
      			   $this->retenciones[$i]->porcreten = $value->porcreten;
			   
            }
            
            /// si nos han pagado el total, marcamos la factura como pagada
			
            if( !$factura->retenida AND abs($this->pendiente) < 0.1 )
            {
               $factura->retenida = TRUE;
			  
               $factura->save();
            }
            
            $this->retenido = $factura->retenida;
         }
      }
      else if( isset($_REQUEST['albaran']) )
      {
         /// fase de albarán
         $this->retenciones = $this->retencion->all_from_albaran($_REQUEST['id']);
         
         /**
          * Falta poner el idalbaran a los retenciones de los pedidos que forman este
          * albarán. Si es que hay.
          * Copia esto de la fase de factura.
          */
         
         $alb0 = new albaran_proveedor();
         $albaran = $alb0->get($_REQUEST['id']);
         if($albaran)
         {
            $this->pendiente = $albaran->total;
            foreach($this->retenciones as $i => $value)
            {
               $this->pendiente -= $value->importe;
               $this->retenciones[$i]->pendiente = $this->pendiente;
            }
            
            if( abs($this->pendiente) < 0.1 )
            {
               $this->retenido = TRUE;
            }
         }
      }
      else if( isset($_REQUEST['pedido']) )
      {
         /// fose de pedido
         $this->retenciones = $this->retencion->all_from_pedido($_REQUEST['id']);
         
         $ped0 = new pedido_proveedor();
         $pedido = $ped0->get($_REQUEST['id']);
         if($pedido)
         {
            $this->pendiente = $pedido->total;
            foreach($this->retenciones as $i => $value)
            {
               $this->pendiente -= $value->importe;
               $this->retenciones[$i]->pendiente = $this->pendiente;
            }
            
            if( abs($this->pendiente) < 0.1 )
            {
               $this->retenido = TRUE;
            }
         }
      }
      
      $this->share_extensions();
   }
   
   public function url()
   {
      if( isset($_REQUEST['factura']) )
      {
         return 'index.php?page='.__CLASS__.'&factura=TRUE&id='.$_REQUEST['id'];
      }
      else if( isset($_REQUEST['albaran']) )
      {
         return 'index.php?page='.__CLASS__.'&albaran=TRUE&id='.$_REQUEST['id'];
      }
      else if( isset($_REQUEST['pedido']) )
      {
         return 'index.php?page='.__CLASS__.'&pedido=TRUE&id='.$_REQUEST['id'];
      }
      else
         return parent::url();
   }
   
   private function share_extensions()
   {
      $extensiones = array(
          array(
              'name' => 'cretencion_factura',
              'page_from' => __CLASS__,
              'page_to' => 'compras_factura',
              'type' => 'tab',
              'text' =>  '<span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span>'
            . '<span class="hidden-xs">&nbsp; Retenciones</span>',
              'params' => '&factura=TRUE'
          ),
          array(
              'name' => 'cretencion_albaran',
              'page_from' => __CLASS__,
              'page_to' => 'compras_albaran',
              'type' => 'tab',
              'text' => 'RetencionesC',
              'params' => '&albaran=TRUE'
          ),
          array(
              'name' => 'cretencion_pedido',
              'page_from' => __CLASS__,
              'page_to' => 'compras_pedido',
              'type' => 'tab',
              'text' => 'RetencionesC',
              'params' => '&pedido=TRUE'
          )
      );
      foreach($extensiones as $ext)
      {
         $fsext = new fs_extension($ext);
         if( !$fsext->save() )
         {
            $this->new_error_msg('Imposible guardar los datos de la extensión '.$ext['name'].'.');
         }
      }
   }

public function johnli(){

    $this->new_error_msg("hola jon");
}

}


