/** * Facturar el pedido * Según la forma de pago, se actualiza la cartera de efectos. * Recibe el objeto contador que se utilizará para obtener el nº de factura. * * @param Contadores $contador El objeto contador * @param date $fecha La fecha de la factura (opcional, toma la del sistema) * @param string $suFactura El numero de factura del proveedor (opcional) * @param integer $idFp El id de la forma de pago (opcional) * @return int El id de la factura generada */ public function facturar(Contadores $contador, $fecha = '', $suFactura = '', $idFp = '') { if ($fecha == '') { $fecha = date('d-m-Y'); } $idFactura = 0; if ($this->getIDEstado()->getIDTipo() == 2 and $this->getIDFactura()->getIDFactura() == 0) { // Buscar la cuenta contable de compras para la sucursal $sucursal = new Sucursales($this->IDSucursal); $ctaCompras = $sucursal->getCtaContableCompras(); unset($sucursal); // Lee contador $idContador = $contador->getIDContador(); $numeroFactura = $contador->asignaContador(); unset($contador); // Crear la cabecera de la factura $factura = new FrecibidasCab(); $factura->setIDSucursal($this->IDSucursal); $factura->setIDContador($idContador); $factura->setNumeroFactura($numeroFactura); $factura->setSuFactura($suFactura); $factura->setFecha($fecha); $factura->setIDProveedor($this->IDProveedor); $factura->setImporte($this->Importe); $factura->setDescuento($this->Descuento); $factura->setBaseImponible1($this->BaseImponible1); $factura->setIva1($this->Iva1); $factura->setCuotaIva1($this->CuotaIva1); $factura->setRecargo1($this->Recargo1); $factura->setCuotaRecargo1($this->CuotaRecargo1); $factura->setBaseImponible2($this->BaseImponible2); $factura->setIva2($this->Iva2); $factura->setCuotaIva2($this->CuotaIva2); $factura->setRecargo2($this->Recargo2); $factura->setCuotaRecargo2($this->CuotaRecargo2); $factura->setBaseImponible3($this->BaseImponible3); $factura->setIva3($this->Iva3); $factura->setCuotaIva3($this->CuotaIva3); $factura->setRecargo3($this->Recargo3); $factura->setCuotaRecargo3($this->CuotaRecargo3); $factura->setTotalBases($this->TotalBases); $factura->setTotalIva($this->TotalIva); $factura->setTotalRecargo($this->TotalRecargo); $factura->setTotal($this->Total); $factura->setReferencia($this->Referencia); $factura->setCuentaCompras($ctaCompras); if ($idFp == '') { $factura->setIDFP($this->IDFP); } else { $factura->setIDFP($idFp); } $idFactura = $factura->create(); if ($idFactura != 0) { // Crear las lineas de factura $linPedido = new PedidosLineas(); $rows = $linPedido->cargaCondicion("*", "IDPedido='{$this->IDPedido}'", "IDLinea ASC"); unset($linPedido); foreach ($rows as $row) { $importe = $row['UnidadesRecibidas'] * $row['Precio'] * (1 - $row['Descuento'] / 100); $linFactura = new FrecibidasLineas(); $linFactura->setIDFactura($idFactura); $linFactura->setIDArticulo($row['IDArticulo']); $linFactura->setDescripcion($row['Descripcion']); $linFactura->setUnidades($row['UnidadesRecibidas']); $linFactura->setPrecio($row['Precio']); $linFactura->setDescuento($row['Descuento']); $linFactura->setImporte($importe); $linFactura->setIDPedido($row['IDPedido']); $linFactura->setIDLineaPedido($row['IDLinea']); $linFactura->setIva($row['Iva']); if ($linFactura->create()) { // Pongo el estado de la linea de pedido a "Facturado" $lineaPedido = new PedidosLineas($row['IDLinea']); $lineaPedido->setIDEstado(3); $lineaPedido->setUnidadesPtesFacturar(0); $lineaPedido->save(); unset($lineaPedido); } unset($linFactura); } // Recalcula la factura: // puede que las cantidades facturas sean distintas a las pedidas $factura->recalcula(); // Crear vencimientos $factura->creaVctos(); // Anotar en caja si procede $factura->anotaEnCaja(); // Actualiza la cabecera del pedido $this->setIDFactura($idFactura); $this->setIDEstado(3); $this->save(); } unset($factura); } return $idFactura; }
/** * Proceso de facturación agrupada. * * Se pueden agrupar pedidos de distintas sucursales, en cuyo caso * la factura generada se asignará a la sucursal en curso. * * Se agrupan las facturas en base a la forma de pago. * * @return <type> */ public function ConformarAction() { $facturados = array(); $filtro = $this->request['filtro']; $fecha = new Fecha($filtro['desdeFecha']); $desdeFecha = $fecha->getaaaammdd(); $fecha = new Fecha($filtro['hastaFecha']); $hastaFecha = $fecha->getaaaammdd(); unset($fecha); if ($filtro['idSucursal'] == '') { $filterSucursal = "(1)"; $idSucursal = $_SESSION['suc']; } else { $filterSucursal = "(IDSucursal='{$filtro['idSucursal']}')"; $idSucursal = $filtro['idSucursal']; } $filter = $filterSucursal . " AND c.IDFactura='0' and c.IDEstado='2' and c.IDProveedor='{$filtro['idProveedor']}' and c.Fecha>='{$desdeFecha}' and c.Fecha<'{$hastaFecha}' and c.FlagFacturar='1'"; //COMPRUEBO QUE NO HAYA MAS DE TRES TIPOS DE IVA ENTRE TODOS LOS ALBARANES A FACTURAR $pedidos = new PedidosCab(); $em = new EntityManager($pedidos->getConectionName()); if (!$em->getDbLink()) { $this->values['errores'] = $em->getError(); return $this->listAction(); } $query = "SELECT l.Iva\n FROM\n {$em->getDataBase()}.ErpPedidosLineas as l,\n {$em->getDataBase()}.ErpPedidosCab as c\n WHERE {$filter} and c.IDPedido=l.IDPedido\n GROUP BY l.Iva"; $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); if (count($rows) > 3) { $this->values['alertas'] = "Hay más de tres tipos de iva distintos. No se puede agrupar"; return $this->listAction(); } $contador = new Contadores($this->request['idContador']); // Buscar la cuenta contable de compras para la sucursal $sucursal = new Sucursales($idSucursal); $ctaCompras = $sucursal->getCtaContableCompras(); unset($sucursal); //AGRUPO LOS PEDIDOS POR FORMA DE PAGO. $em = new EntityManager($pedidos->getConectionName()); $query = "SELECT c.IDFP, sum(c.Total) as Total FROM {$pedidos->getDataBaseName()}.ErpPedidosCab as c WHERE {$filter} GROUP BY c.IDFP"; $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); foreach ($rows as $row) { $numeroFactura = $contador->asignaContador(); $factura = new FrecibidasCab(); $factura->setIDSucursal($idSucursal); $factura->setIDContador($this->request['idContador']); $factura->setNumeroFactura($numeroFactura); $factura->setSuFactura($this->request['suFactura']); $factura->setFecha($this->request['fecha']); $factura->setIDProveedor($filtro['idProveedor']); $factura->setCuentaCompras($ctaCompras); $factura->setIDFP($row['IDFP']); $idFactura = $factura->create(); // Guardo en un array los id's de facturas generadas $facturados[] = $idFactura; if ($idFactura != 0) { // Crear las líneas de factura $em = new EntityManager($pedidos->getConectionName()); $query = "select l.* from {$pedidos->getDataBaseName()}.ErpPedidosLineas l, {$pedidos->getDataBaseName()}.ErpPedidosCab c where (c.IDPedido=l.IDPedido) and (c.IDFP='{$row['IDFP']}') and {$filter}"; $em->query($query); $lineas = $em->fetchResult(); $em->desConecta(); foreach ($lineas as $linea) { $linFactura = new FrecibidasLineas(); $linFactura->setIDFactura($idFactura); $linFactura->setIDArticulo($linea['IDArticulo']); $linFactura->setDescripcion($linea['Descripcion']); $linFactura->setUnidades($linea['UnidadesPtesFacturar']); $linFactura->setPrecio($linea['Precio']); $linFactura->setDescuento($linea['Descuento']); $linFactura->setIva($linea['Iva']); $linFactura->setIDPedido($linea['IDPedido']); $linFactura->setIDLineaPedido($linea['IDLinea']); if ($linFactura->create()) { // Pongo el estado de la linea de pedido a "Facturado" y // quitar el pendiente de facturar. $lineaPedido = new PedidosLineas($linea['IDLinea']); $lineaPedido->setIDEstado(3); $lineaPedido->setUnidadesPtesFacturar(0); $lineaPedido->save(); } unset($linFactura); } // Totalizar la factura $factura->recalcula(); // Crear vencimientos $factura->creaVctos(); // Anotar en caja si procede $factura->anotaEnCaja(); // Actualiza las cabecera del grupo de pedidos $em = new EntityManager($pedidos->getConectionName()); $query = "update {$pedidos->getDataBaseName()}.ErpPedidosCab c set c.IDFactura='{$idFactura}', c.IDEstado='3' where (c.IDFP='{$row['IDFP']}') and ({$filter})"; $em->query($query); $em->desConecta(); unset($factura); } else { $this->values['errores'] = $factura->getErrores(); } } return $this->listAction(); }