/** * Recalcula los importes de la factura en base a sus lineas * Se utiliza durante el proceso de facturacion agrupada */ public function recalcula() { //Si el cliente no está sujeto a iva //pongo el iva a cero en las líneas para evitar que por cambio //de cliente se aplique indebidamente $cliente = new Clientes($this->IDCliente); if ($cliente->getIva()->getIDTipo() == '0') { $lineas = new FemitidasLineas(); $lineas->queryUpdate(array("Iva" => 0, "Recargo" => 0), "`IDFactura`= '{$this->IDFactura}'"); unset($lineas); } elseif ($cliente->getRecargoEqu()->getIDTipo() == '0') { $lineas = new FemitidasLineas(); $lineas->queryUpdate(array("Recargo" => 0), "`IDFactura`= '{$this->IDFactura}'"); unset($lineas); } unset($cliente); //SI TIENE DESCUENTO, CALCULO EL PORCENTAJE QUE SUPONE RESPECTO AL IMPORTE BRUTO //PARA REPERCUTUIRLO PORCENTUALMENTE A CADA BASE $pordcto = 0; if ($this->getDescuento() != 0) { $pordcto = round(100 * ($this->getDescuento() / $this->getImporte()), 2); } //Calcular los totales, desglosados por tipo de iva. $this->conecta(); if (is_resource($this->_dbLink)) { $lineas = new FemitidasLineas(); $tableLineas = "{$lineas->getDataBaseName()}.{$lineas->getTableName()}"; $articulos = new Articulos(); $tableArticulos = "{$articulos->getDataBaseName()}.{$articulos->getTableName()}"; unset($lineas); unset($articulos); $query = "select sum(Importe) as Bruto,sum(ImporteCosto) as Costo from {$tableLineas} where (IDFactura='" . $this->getIDFactura() . "')"; $this->_em->query($query); $rows = $this->_em->fetchResult(); $bruto = $rows[0]['Bruto']; $query = "select Iva,Recargo, sum(Importe) as Importe from {$tableLineas} where (IDFactura='" . $this->getIDFactura() . "') group by Iva,Recargo order by Iva"; $this->_em->query($query); $rows = $this->_em->fetchResult(); $totbases = 0; $totiva = 0; $totrec = 0; $bases = array(); foreach ($rows as $key => $row) { $importe = $row['Importe'] * (1 - $pordcto / 100); $cuotaiva = round($importe * $row['Iva'] / 100, 2); $cuotarecargo = round($importe * $row['Recargo'] / 100, 2); $totbases += $importe; $totiva += $cuotaiva; $totrec += $cuotarecargo; $bases[$key] = array('b' => $importe, 'i' => $row['Iva'], 'ci' => $cuotaiva, 'r' => $row['Recargo'], 'cr' => $cuotarecargo); } $subtotal = $totbases + $totiva + $totrec; // Calcular el recargo financiero según la forma de pago $formaPago = new FormasPago($this->IDFP); $recFinanciero = $formaPago->getRecargoFinanciero(); $cuotaRecFinanciero = $subtotal * $recFinanciero / 100; unset($formaPago); $total = $subtotal + $cuotaRecFinanciero; //Calcular el peso, volumen y n. de bultos de los productos inventariables switch ($_SESSION['ver']) { case '1': //Cristal $columna = "MtsAl"; case '0': //Estandar //Estandar default: $columna = "Unidades"; } $em = new EntityManager($this->getConectionName()); $query = "select sum(a.Peso*l.{$columna}) as Peso,\n sum(a.Volumen*l.{$columna}) as Volumen,\n sum(Unidades) as Bultos \n from {$tableArticulos} as a,{$tableLineas} as l\n where (l.IDArticulo=a.IDArticulo)\n and (a.Inventario='1')\n and (l.IDFactura='{$this->IDFactura}')"; $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); $this->setImporte($bruto); $this->setBaseImponible1($bases[0]['b']); $this->setIva1($bases[0]['i']); $this->setCuotaIva1($bases[0]['ci']); $this->setRecargo1($bases[0]['r']); $this->setCuotaRecargo1($bases[0]['cr']); $this->setBaseImponible2($bases[1]['b']); $this->setIva2($bases[1]['i']); $this->setCuotaIva2($bases[1]['ci']); $this->setRecargo2($bases[1]['r']); $this->setCuotaRecargo2($bases[1]['cr']); $this->setBaseImponible3($bases[2]['b']); $this->setIva3($bases[2]['i']); $this->setCuotaIva3($bases[2]['ci']); $this->setRecargo3($bases[2]['r']); $this->setCuotaRecargo3($bases[2]['cr']); $this->setTotalBases($totbases); $this->setTotalIva($totiva); $this->setTotalRecargo($totrec); $this->setRecargoFinanciero($recFinanciero); $this->setCuotaRecargoFinanciero($cuotaRecFinanciero); $this->setTotal($total); $this->setPeso($rows[0]['Peso']); $this->setVolumen($rows[0]['Volumen']); $this->setBultos($rows[0]['Bultos']); $this->save(); } }