<?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_cliente.php');
require_model('retencion.php');
require_model('pedido_cliente.php');

/**
 * Description of informe_retencion
 *
 * @author carlos
 */
class tab_retencion extends fs_controller
{
   public $retenido;
   public $retencion;
   public $retenciones;
   public $pendiente;
   public $totaliva;
   public $neto;
   public $retenida;
   public $docreten;
   public $importe;

   
   public function __construct()
   {
      parent::__construct(__CLASS__, 'retencion', 'ventas', FALSE, FALSE);
   }
   
   protected function private_core()
   {
      $this->retenido = FALSE;
      $this->retenida = FALSE;
      $this->retencion = new retencion();
      $this->retenciones = array();
      $this->pendiente = 0;
      $this->totaliva = 0;
      $this->importe = 0;
      $this->neto=0;
      $this->tiporeten='';
      $this->basereten='';
      $this->docreten=null;
      
      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_cliente();
                  $factura = $fact0->get($retencion->idfactura);
                  if($factura)
                  {
                     if($factura->retenida)
                     {
			//$this->new_message(" GUADANDO 1 ");
                        $factura->retenida = FALSE;
                        $factura->save();
                     }
                  }
               }
            }
            else
               $this->new_error_msg('Error al eliminar el retencion.');
            }
            else
                $this->new_error_msg('Retencion no encontrado.');
            }
            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->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']) ) /// nuevo retencion --- importe
               {
                    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->retencion->fecha = $_POST['fecha'];
                    $this->retencion->tiporeten = $_REQUEST['tiporeten'];
                    $this->retencion->porcreten = $_REQUEST['porcreten'];
                    $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']) && $this->retencion->porcreten > 0.0001 )
                    {
                        $fact10 = new factura_cliente();
                        $factura10 = $fact10->get($_REQUEST['id']);
                        if( isset($_REQUEST['tiporeten']) ) 
                        {
                            if ($_REQUEST['tiporeten'] == 'IVA')
                            {
                                $this->retencion->basereten = $factura10->totaliva;
                                //$this->new_message(" basereten 1 ---->  ".$this->retencion->basereten);	
                            }else{
                                $this->retencion->basereten = $factura10->neto;
                            }
                         }
                        $preten =   $this->retencion->porcreten;
                        $breten =   $this->retencion->basereten;
                        $this->retencion->importe =  round(($preten/100)*$breten,2);	 
                        //$this->new_message(" Nuevo entra a ver 3");
                        if( $this->retencion->save() )
                        {
                           $this->new_message('Retencion guardado correctamente.');
                        }
                        else
                           $this->new_error_msg('Error al guardar el retencion.');
                    }
               }
               if( isset($_REQUEST['factura']) )
               {
                   // $this->new_message(" entra a ver 2");
                   /// esto es la fase de factura
                    $fact0 = new factura_cliente();
                    $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 retenciones SET idfactura = ".$fact0->var2str($_REQUEST['id'])." WHERE idalbaran = ".$fact0->var2str($idalbaran).";");
                            }
                        }
                        $this->retenciones = $this->retencion->all_from_factura($_REQUEST['id']);
                        $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;
                            //$this->new_message("Pendiente ".$this->pendiente."  importe ".$this->retenciones->importe);
                        }
                            /// 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_cliente();
                    $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_cliente();
                    $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' => 'retencion_factura',
              'page_from' => __CLASS__,
              'page_to' => 'ventas_factura',
              'type' => 'tab',
              'text' => 'Retenciones',
              'params' => '&factura=TRUE'
          ),
          array(
              'name' => 'retencion_albaran',
              'page_from' => __CLASS__,
              'page_to' => 'ventas_albaran',
              'type' => 'tab',
              'text' => 'Retenciones',
              'params' => '&albaran=TRUE'
          ),
          array(
              'name' => 'retencion_pedido',
              'page_from' => __CLASS__,
              'page_to' => 'ventas_pedido',
              'type' => 'tab',
              'text' => 'Retenciones',
              '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'].'.');
         }
      }
   }
}


