FacturaScripts  
Hola,

Retomando el comentario que hice hace 3 meses: https://www.facturascripts.com/comm3/index.php?page=community_item&id=3242

Al hacer click en INFORMES -> CLIENTES -> DEUDORES, se muestran correctamente el listado de clientes deudores, pero el monto adeudado esta incorrecto.

He descubierto que el problema esta en el SQL ejecutado al momento de listar los deudores, actualmente se esta ejecutando la sentencia:
select codcliente,sum(importeeuros) as total from reciboscli where estado != 'Pagado' group by codcliente order by total DESC LIMIT 100 OFFSET 0;


Se puede apreciar que la columna que esta sumando es "importeeuros", entonces trae el valor en euros y lo convierte a la moneda local configurada en FS utilizando la columna "CODDIVISA" que en mi caso es DOP(Pesos Dominicanos), esto es un problema obvio ya que si emites una factura a un cliente en DOP$100.00 (Pesos dominicanos) y en ese momento se guardo también el valor de importeeuros utilizando la tasa configurada en ese momento hasta ahí va bien. El problema es que la tasa cambia en el tiempo, y cuando ejecutas la consulta de DEUDORES un mes mas tarde el valor del recibo sera diferente.

En mi caso particular y de todo el que factura en una sola moneda, se podria solucionarlo solo cambiando la columna a sumar en la sentencia SQL, quedaría de esta forma:
select codcliente,sum(importe) as total from reciboscli where estado != 'Pagado' group by codcliente order by total DESC LIMIT 100 OFFSET 0;


Pero esto no solucionaría el problema del que factura en varias monedas, por lo que rapidamente se me ocurre que una solución seria:
1- Agregar la columna "tasaconv" en la tabla "reciboscli", y calcular el "sum(importeeuros)" en base a este valor, de esta manera el calculo siempre dará el valor correcto original.

Que piensan ustedes ?

Saludos.

hace 3 meses   360st   [partner]
Como aclaración adicional, he cambiado las siguientes dos lineas en el controlador "informes_clientes" de Facturación Premium:
image
hace 3 meses   NeoRazorX   [admin]
Para solucionar esto, lo más sencillo es consultar la tasa de conversión en la tabla divisas al momento de calcular.
hace 3 meses   360st   [partner]
Carlos, acabo de verificar y FS actualmente guarda el CODDIVISA y TASACONV en las tablas 'reciboscli' y "facturascli" y tambien veo que al método 'euro_convert' se le puede pasar ambos valores :
public function euro_convert($precio, $coddivisa = NULL, $tasaconv = NULL)


Por lo que creo que debería quedar de la siguiente forma:
   private function clientes_deudores()
   {
      $tclist = array();
      
      if( class_exists('recibo_cliente') )
      {
         $sql = "select codcliente, coddivisa, tasaconv, sum(importeeuros) as total from reciboscli"
                 . " where estado != 'Pagado' group by codcliente order by total DESC";
         //$sql = "select codcliente,sum(importeeuros) as total from reciboscli"
         //        . " where estado != 'Pagado' group by codcliente order by total DESC";
      }
      else
      {
         $sql = "select codcliente,coddivisa, tasaconv,sum(totaleuros) as total from facturascli"
                 . " where pagada = false group by codcliente order by total DESC";        
        // $sql = "select codcliente,sum(totaleuros) as total from facturascli"
        //         . " where pagada = false group by codcliente order by total DESC";
      }
      
      $data = $this->db->select_limit($sql, 100, 0);
      if($data)
      {
         foreach($data as $d)
         {
            $cliente = $this->cliente->get($d['codcliente']);
            if($cliente)
            {
               if(!$cliente->debaja)
               {
                  $deudas = $this->euro_convert( floatval($d['total']),$d['coddivisa'],$d['tasaconv'] );
                  //$deudas = $this->euro_convert( floatval($d['total']) );
                  $tclist[] = array($cliente, $deudas);
               }
            }
         }
      }
      
      return $tclist;
   }


Que piensas Carlos, esta correcta esta implementación ?
hace 3 meses   360st   [partner]
Carlos, he modificado nuevamente el controlador y la vista, esta vez para que muestre el total de los deudores correctamente cuando se utiliza multiples divisas. ( Cierra el otro hilo, para continuar en este https://www.facturascripts.com/comm3/index.php?page=community_item&id=3770

Agregar variable al controlador:
class informe_clientes extends fs_controller
{
   public $cliente;
   public $opcion;
   public $resultados;
   public $clientes_deuda_total;
   
   public function __construct()



   private function clientes_deudores()
   {
      $tclist = array();
      $this->clientes_deuda_total=0;
      
      if( class_exists('recibo_cliente') )
      {
         $sql = "select codcliente, coddivisa, tasaconv, sum(importeeuros) as total from reciboscli"
                 . " where estado != 'Pagado' group by codcliente order by total DESC";
         //$sql = "select codcliente,sum(importeeuros) as total from reciboscli"
         //        . " where estado != 'Pagado' group by codcliente order by total DESC";
      }
      else
      {
         $sql = "select codcliente,coddivisa, tasaconv,sum(totaleuros) as total from facturascli"
                 . " where pagada = false group by codcliente order by total DESC";   
        // $sql = "select codcliente,sum(totaleuros) as total from facturascli"
        //         . " where pagada = false group by codcliente order by total DESC";
      }
      
      $data = $this->db->select($sql);
      if($data)
      {
         foreach($data as $d)
         {
            $cliente = $this->cliente->get($d['codcliente']);
            if($cliente)
            {
               if(!$cliente->debaja)
               {
                  $deudas = $this->euro_convert( floatval($d['total']),$d['coddivisa'],$d['tasaconv'] );
                  $this->clientes_deuda_total += $deudas;
                  //$deudas = $this->euro_convert( floatval($d['total']) );
                  $tclist[] = array($cliente, $deudas);
               }
            }
         }
      }
      
      return $tclist;
   }



En la vista solo hay que modificar despues de la linea 111:
      <tr class="warning">
         <td colspan="6">Sin resultados.</td>
      </tr>
      {/loop}
      <tr class="warning">
          <td colspan="6" class="text-right">Total: {$fsc->show_precio($fsc->clientes_deuda_total)}</td>
      </tr> 

hace 2 meses   NeoRazorX   [admin]
La solución correcta es la del resto de informes, primero consultar la divisa de la empresa y luego las demás y convertirlas a la de la empresa usando el importe en euros.
Estará en la siguiente actualización.
Saludos.
hace 2 meses   360st   [partner]
Perfecto, gracias por la corrección Carlos.
No se pueden hacer más comentarios. Mejor escribe una nueva pregunta

¿Necesita hosting?


Loading.es

Loading.es le ofrece hosting para FacturaScripts y/o su tienda online desde 3,90 € / mes, con servidores en España y copias de seguridad diarias.


VPS de alto rendimiento:

Linode

El dobre de RAM por el mismo precio.







© 2013-2017 FacturaScripts