/** * Proceso de facturacion. * Puede ser facturación separada: Una factura por cada albarán * o facturación agrupada: Una factura con todos los albaranes, con las siguientes salvedades: * * Se agrupan las facturas en base a la forma de pago, comercial y al flag "Facturación agrupada" * de la ficha del cliente. * * @return <type> */ public function facturarAction() { $facturados = array(); $filtro = $this->request['filtro']; $fecha = new Fecha($filtro['desdeFecha']); $desdeFecha = $fecha->getaaaammdd(); $fecha = new Fecha($filtro['hastaFecha']); $hastaFecha = $fecha->getaaaammdd(); unset($fecha); switch ($this->request['tipo']) { case '0': // Facturación individual. Se genera una factura por cada albarán $filter = "IDFactura='0' and IDEstado='2' and IDCliente='{$filtro['idCliente']}' and FechaEntrega>='{$desdeFecha}' and FechaEntrega<'{$hastaFecha}' and FlagFacturar='1'"; $albaran = new AlbaranesCab(); $rows = $albaran->cargaCondicion("IDAlbaran", $filter, "FechaEntrega ASC"); foreach ($rows as $row) { $albaran = new AlbaranesCab($row['IDAlbaran']); $idFactura = $albaran->facturar(new Contadores($this->request['idContador']), $this->request['fecha']); if (count($albaran->getErrores()) != 0) { $this->values['errores'] = $albaran->getErrores(); break; } else { $facturados[] = $idFactura; } } unset($albaran); break; case '1': // Agrupada. Se agrupan los albaranes por forma de pago, comercial $filter = "c.IDFactura='0' and c.IDEstado='2' and c.IDCliente='{$filtro['idCliente']}' and c.FechaEntrega>='{$desdeFecha}' and c.FechaEntrega<'{$hastaFecha}' and c.FlagFacturar='1'"; //COMPRUEBO QUE NO HAYA MAS DE TRES TIPOS DE IVA ENTRE TODOS LOS ALBARANES A FACTURAR $albaran = new AlbaranesCab(); $albaranTabla = $albaran->getDataBaseName() . "." . $albaran->getTableName(); $lineas = new AlbaranesLineas(); $lineasTabla = $lineas->getDataBaseName() . "." . $lineas->getTableName(); $em = new EntityManager($albaran->getConectionName()); if (!$em->getDbLink()) { $this->values['errores'] = $em->getError(); return $this->listAction(); } $query = "select l.Iva from {$lineasTabla} as l, {$albaranTabla} as c\n where {$filter} and c.IDAlbaran=l.IDAlbaran\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 ventas para la sucursal $sucursal = new Sucursales($filtro['idSucursal']); $ctaVentas = $sucursal->getCtaContableVentas(); unset($sucursal); $cliente = new Clientes($filtro['idCliente']); $agruparDireccionEntrega = $cliente->getFacturacionAgrupada()->getIDTipo() == '1'; unset($cliente); $query = $agruparDireccionEntrega ? "select c.IDFP,c.IDComercial, sum(c.Importe) as Importe, sum(Descuento) as Descuento from {$albaranTabla} c where {$filter} GROUP BY c.IDFP, c.IDComercial;" : "select c.IDFP,c.IDComercial, c.IDDirec, sum(c.Importe) as Importe, sum(Descuento) as Descuento from {$albaranTabla} c where {$filter} GROUP BY c.IDFP, c.IDComercial, c.IDDirec;"; unset($cliente); //AGRUPO LOS ALBARANES POR FORMA DE PAGO, COMERCIAL Y (si procede) DIRECCION DE ENTREGA. $em = new EntityManager($albaran->getConectionName()); $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); foreach ($rows as $row) { $numeroFactura = $contador->asignaContador(); $factura = new FemitidasCab(); $factura->setIDSucursal($filtro['idSucursal']); $factura->setIDContador($this->request['idContador']); $factura->setNumeroFactura($numeroFactura); $factura->setIDAgente($_SESSION['usuarioPortal']['Id']); $factura->setIDComercial($row['IDComercial']); $factura->setFecha($this->request['fecha']); $factura->setIDCliente($filtro['idCliente']); $factura->setCuentaVentas($ctaVentas); $factura->setDescuento($row['Descuento']); $factura->setImporte($row['Importe']); $factura->setIDFP($row['IDFP']); $idFactura = $factura->create(); // Guardo en un array los id's de facturas generadas $facturados[] = $idFactura; if ($idFactura != 0) { // Crear las lineas de factura // No incluyo las lineas de albaran cuyas unidades sean 0 $em = new EntityManager($albaran->getConectionName()); $query = $agruparDireccionEntrega ? "select l.* from {$lineasTabla} l, {$albaranTabla} c where (c.IDAlbaran=l.IDAlbaran) and (c.IDFP='{$row['IDFP']}') and (l.Unidades<>0) and {$filter}" : "select l.* from {$lineasTabla} l, {$albaranTabla} c where (c.IDAlbaran=l.IDAlbaran) and (c.IDFP='{$row['IDFP']}') and (c.IDDirec='{$row['IDDirec']}') and (l.Unidades<>0) and {$filter}"; $em->query($query); $lineas = $em->fetchResult(); $em->desConecta(); foreach ($lineas as $linea) { $linFactura = new FemitidasLineas(); $linFactura->setIDFactura($idFactura); $linFactura->setIDArticulo($linea['IDArticulo']); $linFactura->setDescripcion($linea['Descripcion']); $linFactura->setUnidades($linea['Unidades']); $linFactura->setPrecio($linea['Precio']); $linFactura->setDescuento($linea['Descuento']); $linFactura->setImporte($linea['Importe']); $linFactura->setImporteCosto($linea['ImporteCosto']); $linFactura->setIDAlbaran($linea['IDAlbaran']); $linFactura->setIDLineaAlbaran($linea['IDLinea']); $linFactura->setIva($linea['Iva']); $linFactura->setRecargo($linea['Recargo']); $linFactura->setIDVenta($linea['IDVenta']); $linFactura->setComisionAgente($linea['ComisionAgente']); $linFactura->setComisionMontador($linea['ComisionMontador']); $linFactura->setComisionar($linea['Comisionar']); $linFactura->setIDAgente($_SESSION['usuarioPortal']['Id']); $linFactura->setIDComercial($linea['IDComercial']); $linFactura->setIDPromocion($linea['IDPromocion']); $linFactura->setAltoAl($linea['AltoAl']); $linFactura->setAnchoAl($linea['AnchoAl']); $linFactura->setMtsAl($linea['MtsAl']); $linFactura->setAltoFa($linea['AltoFa']); $linFactura->setAnchoFa($linea['AnchoFa']); $linFactura->setMtsFa($linea['MtsFa']); if ($linFactura->create()) { // Pongo el estado de la linea de albaran a "Facturado" $lineaAlbaran = new AlbaranesLineas($linea['IDLinea']); $lineaAlbaran->setIDEstado(3); $lineaAlbaran->save(); } else { print_r($linFactura->getErrores()); } unset($linFactura); } // Totalizar la factura $factura->recalcula(); // Crear vencimientos $factura->creaVctos(); // Anotar en caja sin procede $factura->anotaEnCaja(); // Actualiza las cabecera del grupo de albaranes $em = new EntityManager($albaran->getConectionName()); $query = $agruparDireccionEntrega ? "update {$albaranTabla} c set c.IDFactura='{$idFactura}', c.IDEstado='3' where (c.IDFP='{$row['IDFP']}') and ({$filter})" : "update {$albaranTabla} c set c.IDFactura='{$idFactura}', c.IDEstado='3' where (c.IDFP='{$row['IDFP']}') and (c.IDDirec='{$row['IDDirec']}') and ({$filter})"; $em->query($query); $em->desConecta(); unset($factura); } else { $this->values['errores'] = $factura->getErrores(); } } break; } if ($this->request['imprimir'] == 'on' and count($facturados) > 0) { $this->values['archivo'] = $this->generaPdf('FemitidasCab', $facturados); } if (count($facturados) > 0) { $this->values['alertas'][] = "Se han generado las siguientes facturas:"; foreach ($facturados as $item) { $this->values['alertas'][] = $item; } } return $this->listAction(); }
/** * GENERA LOS ALBARANES Y FACTURAS DE MANTENIMIENTOS * EN BASE A LOS INDICADO EN EL ARCHIVO CSV * * @param string $fileCsv */ public function mantenimientosAction($fileCsv = '') { if ($fileCsv == '') { $fileCsv = 'tmp/mantenimientos.csv'; } $archivo = new Archivo($fileCsv); $archivo->setColumnsDelimiter(";"); if ($archivo->open()) { while (($linea = $archivo->readLine()) !== FALSE) { $idSucursal = $linea[0]; $idAlmacen = $linea[1]; $idComercial = $linea[2]; $idCliente = $linea[3]; $codigoArticulo = $linea[4]; $unidades = $linea[5]; $precio = $linea[6]; $cliente = new Clientes($idCliente); $direccionesEntrega = $cliente->getDireccionesEntrega(); $direcEntrega = $direccionesEntrega[0]; $albaran = new AlbaranesCab(); $albaran->setIDCliente($cliente->getIDCliente()); $albaran->setIDSucursal($idSucursal); $albaran->setFecha(date("d-m-Y")); $albaran->setIDDirec($direcEntrega->getIDDirec()); $albaran->setIDAlmacen($idAlmacen); $albaran->setIDComercial($idComercial); $albaran->setIDContador(2); $albaran->setIDEstado(0); $albaran->setIDFP($cliente->getIDFP()->getIDFP()); $idAlbaran = $albaran->create(); if ($idAlbaran) { $articulo = new Articulos(); $articulo = $articulo->find("Codigo", $codigoArticulo); $lineas = new AlbaranesLineas(); $lineas->setIDAlbaran($idAlbaran); $lineas->setIDArticulo($articulo->getIDArticulo()); $lineas->setDescripcion($articulo->getDescripcion() . " Mes " . date("m Y")); $lineas->setUnidades($unidades); $lineas->setPrecio($precio); $lineas->setDescuento(0); $lineas->setIva($articulo->getIDIva()->getIva()); $lineas->setImporte($unidades * $precio); $ok = $lineas->create(); if ($ok) { $albaran = new AlbaranesCab($idAlbaran); $albaran->confirma(); if ($albaran->expide()) { $albaran = new AlbaranesCab($idAlbaran); $contador = new Contadores(); $contador = $contador->dameContador($idSucursal, 2); $albaran->facturar($contador); } } else { print_r($lineas->getErrores()); exit; } } else { $this->values['errores'][] = "No se ha podido crear el albarán para " . $cliente->getRazonSocial(); } } } else { $this->values['errores'][] = "El fichero de importación " . $fileCsv . " no existe"; } }