/** * Generar el listado de albaranes apoyándose en el método padre * Si el usuario es comercial muestra solo los * suyos, si no es comercial muestra todos. * @return array */ public function listAction($aditionalFilter = '') { $filtro = ""; $usuario = new Agentes($_SESSION['usuarioPortal']['Id']); if ($usuario->getEsComercial()) { $albaran = new AlbaranesCab(); $tabla = $albaran->getDataBaseName() . "." . $albaran->getTableName(); unset($albaran); $filtro = $tabla . ".IDComercial='" . $usuario->getIDAgente() . "'"; } return parent::listAction($filtro); }
/** * Devuelve un array con las reservas del articulo y almacen indicado * * Cada elemento del array es otro array con los elementos: * array ( * 'IDAlbaran' => * 'PrimaryKeyMD5' => * 'NumeroAlbaran' => * 'Fecha' => * 'IDCliente' => * 'RazonSocial => * 'Reservas' => * ) * * @param integer $idAlmacen El id de almacen * @return array Array con las reservas */ public function getReservas($idAlmacen) { $reservas = array(); $tablaAlbaranes = new AlbaranesCab(); $tablaAlbaranesLineas = new AlbaranesLineas(); $tablaClientes = new Clientes(); $em = new EntityManager($this->getConectionName()); if ($em->getDbLink()) { //$query = "Call ReservasArticuloAlmacen('{$this->IDArticulo}','{$idAlmacen}');"; $query = "select\n cab.IDAlbaran,\n cab.PrimaryKeyMD5,\n cab.NumeroAlbaran, \n cab.Fecha,\n cab.IDCliente,\n cli.RazonSocial,\n sum(lin.Unidades) as Reservas\n from\n {$tablaAlbaranes->getDataBaseName()}.{$tablaAlbaranes->getTableName()} as cab,\n {$tablaAlbaranesLineas->getDataBaseName()}.{$tablaAlbaranesLineas->getTableName()} as lin,\n {$tablaClientes->getDataBaseName()}.{$tablaClientes->getTableName()} as cli\n where\n cab.IDAlbaran = lin.IDAlbaran and\n cab.IDCliente = cli.IDCliente and\n lin.IDEstado = '1' and\n lin.IDArticulo = '{$this->IDArticulo}' and\n lin.IDAlmacen = '{$idAlmacen}'\n group by IDAlbaran\n order by Fecha ASC"; $em->query($query); //echo $query,"<br/>"; $reservas = $em->fetchResult(); $em->desConecta(); } unset($em); unset($tablaAlbaranes); unset($tablaAlbaranesLineas); unset($tablaClientes); return $reservas; }
/** * 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(); }
/** * Renderiza el template _Emergente/historicoVentas.html.twig * mostrando las ventas realizadas a un cliente de un articulo dado en un periodo. * * La información se obtiene en base a los albaranes confimardos o facturados. * No se tienen en cuenta los albaranes no confirmados. * * Puede entrar por POST o por GET. * * Si es por POST los parametros vienen en: * * idArticulo, idCliente, periodo * * Si es por GET los parametros vienen en: * * posicion 2 (idArticulo), 3 (idCliente), 4 (periodo) * * @return array El template y los datos */ public function HistoricoVentasAction() { switch ($this->request["METHOD"]) { case 'GET': $idArticulo = $this->request['2']; if ($idArticulo == '0') { $idArticulo = ''; } $idCliente = $this->request['3']; if ($idCliente == '0') { $idCliente = ''; } $periodo = $this->request['4']; break; case 'POST': $idArticulo = $this->request['idArticulo']; if ($idArticulo == '0') { $idArticulo = ''; } $idCliente = $this->request['idCliente']; if ($idCliente == '0') { $idCliente = ''; } $periodo = $this->request['periodo']; break; } // Construir la parte del filtro que depende del periodo switch ($periodo) { case '': $periodo = 0; case '0': // Ultimo mes $diferenciaDias = -30; break; case '1': // Ultimo Trimestre $diferenciaDias = -90; break; case '2': // Ultimo año $diferenciaDias = -365; break; case '3': // Todo, 20 años hacia atrás $diferenciaDias = -7300; break; } $fecha = new Fecha(date('Y-m-d')); $desdeFecha = $fecha->sumaDias($diferenciaDias); unset($fecha); $cliente = new Clientes($idCliente); $clienteTabla = $cliente->getDataBaseName() . "." . $cliente->getTableName(); $articulo = new Articulos($idArticulo); $articuloTabla = $articulo->getDataBaseName() . "." . $articulo->getTableName(); $albaran = new AlbaranesCab(); $albaranTabla = $albaran->getDataBaseName() . "." . $albaran->getTableName(); unset($albaran); $lineas = new AlbaranesLineas(); $lineasTabla = $lineas->getDataBaseName() . "." . $lineas->getTableName(); unset($lineas); // Calcular el total de unidades vendidas y el precio medio de venta // No tiene en cuenta los albaranes que no están confirmados if ($idArticulo != '' or $idCliente != '') { $em = new EntityManager($articulo->getConectionName()); if ($em->getDbLink()) { $query = "SELECT SUM(t1.Unidades) as Unidades, SUM(t1.Importe) as Importe\n FROM {$lineasTabla} as t1, {$albaranTabla} as t2"; $query .= " WHERE t1.IDAlbaran=t2.IDAlbaran AND t2.IDEstado<>'0' AND t2.Fecha>='{$desdeFecha}'"; if ($idCliente !== '') { $query .= " AND t2.IDCliente='{$idCliente}'"; } if ($idArticulo !== '') { $query .= " AND t1.IDArticulo='{$idArticulo}'"; } $em->query($query); //echo $query; $rows = $em->fetchResult(); $em->desConecta(); } $precioMedio = $rows[0]['Unidades'] != 0 ? $rows[0]['Importe'] / $rows[0]['Unidades'] : 0; $unidades = $rows[0]['Unidades'] == '' ? 0 : $rows['0']['Unidades']; } $this->values['datos'] = array('idsucursal' => $_SESSION['usuarioPortal']['SucursalActiva']['Id'], 'articulo' => $articulo, 'cliente' => $cliente, 'unidades' => $unidades, 'periodo' => $periodo, 'periodos' => $this->periodos, 'precioMedio' => number_format($precioMedio, 3)); // Obtener el litado histórico de ventas para el articulo y cliente // Solo muestra los albaranes que están confirmador o facturados $em = new EntityManager($articulo->getConectionName()); if ($em->getDbLink()) { $query = "SELECT t2.IDLinea,t1.IDAlbaran,t1.NumeroAlbaran,t1.PrimaryKeyMD5,DATE_FORMAT(t1.Fecha,'%d-%m-%Y') as Fecha,t1.IDEstado,t1.IDFactura,t2.Descripcion,t2.Unidades,t2.Precio,t2.Descuento,t2.Importe,t2.IDPromocion\n FROM {$albaranTabla} as t1, {$lineasTabla} as t2"; if ($idCliente !== '') { $query .= ", {$clienteTabla} as t3"; } if ($idArticulo !== '') { $query .= ", {$articuloTabla} as t4"; } $query .= " WHERE t1.IDAlbaran=t2.IDAlbaran"; if ($idCliente !== '') { $query .= " AND t1.IDCliente=t3.IDCliente AND t1.IDCliente='{$idCliente}' "; } if ($idArticulo !== '') { $query .= " AND t2.IDArticulo=t4.IDArticulo AND t2.IDArticulo='{$idArticulo}'"; } $query .= "\n AND t1.IDEstado<>'0'\n AND t1.Fecha>='{$desdeFecha}'\n ORDER BY t1.Fecha DESC, t1.IDAlbaran DESC"; $em->query($query); //echo $query; $rows = $em->fetchResult(); $em->desConecta(); } // Recorro el array de resultados y convierto (si procede) la columna IDPromocion // en un objeto promocion para tener todos los datos de la promocion en el template. foreach ($rows as $key => $value) { $rows[$key]['Estado'] = new EstadosAlbaranes($value['IDEstado']); if ($value['IDFactura']) { $rows[$key]['Factura'] = new FemitidasCab($value['IDFactura']); } if ($value['IDPromocion']) { $rows[$key]['IDPromocion'] = new Promociones($value['IDPromocion']); } } $this->values['listado'] = $rows; unset($em); unset($articulo); unset($cliente); return array('template' => '_Emergente/historicoVentas.html.twig', 'values' => $this->values); }
/** * Devuelve un array con los clientes que tienen albaranes pendientes * de facturar (IDEstado=2) en el periodo de fechas indicado y de la * sucursal indicada. * * El array tiene tres columnas: * Id (el id del cliente), * Value (la razon social del cliente) * Total (la suma de los totales de todos sus albaranes pendientes de facturar) * * @param integer $idSucursal * @param date $desdeFecha Fecha en formato dd/mm/aaaa * @param date $hastaFecha Fecha en formato dd/mm/aaaa * @return array Array con los clientes */ public function fetchConPendienteDeFacturar($idSucursal, $desdeFecha, $hastaFecha) { $fecha = new Fecha($desdeFecha); $desdeFecha = $fecha->getaaaammdd(); $fecha = new Fecha($hastaFecha); $hastaFecha = $fecha->getaaaammdd(); unset($fecha); $this->conecta(); $rows = array(); $albaranes = new AlbaranesCab(); $em = new EntityManager($albaranes->getConectionName()); if (is_resource($em->getDbLink())) { $filtro = "(a.IDSucursal='{$idSucursal}') and\n (a.FechaEntrega>='{$desdeFecha}') and\n (a.FechaEntrega<='{$hastaFecha}') and\n (a.IDFactura='0') and\n (c.IDCliente=a.IDCliente)"; $query = "SELECT a.IDCliente as Id, c.RazonSocial as Value, sum(a.Total) as Total\n FROM `{$this->_dataBaseName}`.`{$this->_tableName}` c, `{$albaranes->getDataBaseName()}`.`{$albaranes->getTableName()}` a\n WHERE ( {$filtro} )\n GROUP BY c.IDCliente\n ORDER BY c.RazonSocial"; $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); unset($em); } unset($albaranes); return $rows; }
/** * Devuelve un array de objetos AlbaranesCab con los albaranes * que están en estado Confirmado (1) y/o Expedido (2) y que pertenecen al * almacén $idAlmacen, sucursal en curso y dia de reparto $idDia seleccionados, * agrupados por ruta y ordenados de forma inversa al orden de la ruta de reparto. * * @param integer $idAlmacen El id del almacen a mostrar * @param integer $idDia El dia a mostrar * @param integer $idPeriodo El periodo a mostrar * @param integer $idEstado El estado a mostrar * @return array Array de objetos AlbaranesCab */ private function getAlbaranes($idAlmacen, $idDia, $idPeriodo, $idEstado) { $data = array(); $fecha = new Fecha(); $fechaDesde = $fecha->sumaDias(-1 * $idPeriodo); unset($fecha); $albaran = new AlbaranesCab(); $ruta = new RutasRepartoDetalle(); $em = new EntityManager($albaran->getConectionName()); if ($em->getDbLink()) { $query = "SELECT DISTINCT a.IDAlbaran\n FROM \n {$albaran->getDataBaseName()}.{$albaran->getTableName()} as a, \n {$ruta->getDataBaseName()}.{$ruta->getTableName()} as r\n WHERE a.Fecha>'{$fechaDesde}'\n AND a.IDEstado='{$idEstado}'\n AND a.IDAlmacen='{$idAlmacen}'\n AND a.IDSucursal='{$_SESSION['suc']}'\n AND a.DiaReparto='{$idDia}'\n AND a.IDDirec=r.IDDirec\n ORDER BY r.IDRuta ASC, a.IDEstado ASC, r.OrdenDirec DESC;"; $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); } foreach ($rows as $row) { $data[] = new AlbaranesCab($row['IDAlbaran']); } return $data; }
/** * Albaranes confirmados que están sin entregar. * * Si el rol del usuario es comercial solo se muestran * los que ha generado dicho comercial * * @return type */ static function getPteServir() { $idRol = $_SESSION['usuarioPortal']['IdRol']; if ($idRol != '0' and $idRol != '9') { $filtro = "a.IDComercial='{$_SESSION['usuarioPortal']['Id']}'"; } else { $filtro = "1"; } $alb = new AlbaranesCab(); $tablaAlbaranes = $alb->getDataBaseName() . "." . $alb->getTableName(); $cli = new Clientes(); $tablaClientes = $cli->getDataBaseName() . "." . $cli->getTableName(); $rows = array(); $em = new EntityManager($alb->getConectionName()); if ($em->getDbLink()) { $query = "select a.PrimaryKeyMD5 as PrimaryKeyMD5,NumeroAlbaran,Fecha,RazonSocial,TotalBases from {$tablaAlbaranes} as a left join {$tablaClientes} as c on a.IDCliente=c.IDCliente where {$filtro} AND (IDEstado='1') order by Fecha ASC"; $em->query($query); $rows = $em->fetchResult(); } unset($em); unset($alb); unset($cli); return $rows; }