/**
  * 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);
 }
Пример #2
0
 /**
  * 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);
 }
Пример #5
0
 /**
  * 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;
 }
Пример #7
0
 /**
  * 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;
 }