/** * Crea las líneas de recepción relativas al pedido * * @param integer $idPedido */ private function cargaLineasPedido($idPedido) { $rows = array(); $lineas = new PedidosLineas(); $articulos = new Articulos(); $em = new EntityManager($lineas->getConectionName()); if ($em->getDbLink()) { $query = "select l.IDLinea\n from {$lineas->getDataBaseName()}.{$lineas->getTableName()} l, {$articulos->getDataBaseName()}.{$articulos->getTableName()} a\n where l.IDPedido='{$idPedido}' and\n l.IDEstado='1' and\n l.IDArticulo=a.IDArticulo and\n a.Inventario='1'\n order by IDLinea ASC;"; $em->query($query); $rows = $em->fetchResult(); // Borrar eventuales recepciones del pedido que no estén recepcionadas $recepciones = new Recepciones(); $recepciones->queryDelete("Entidad='PedidosCab' and IDEntidad='{$idPedido}' and Recepcionada='0'"); $em->desConecta(); } // Por cada línea de pedido crea una línea de recepción foreach ($rows as $row) { $this->creaLineaRecepcion('PedidosCab', $idPedido, new PedidosLineas($row['IDLinea'])); } }
/** * Borra una línea de factura recibida. * Si procede de una línea de pedido, la marca como no facturada y cambia lo pendiente de facturar * * @return boolean */ public function erase() { $this->conecta(); if (is_resource($this->_dbLink)) { //Volver a poner la linea de pedido como pendiente de facturar. $query = "DELETE FROM {$this->getDataBaseName()}.{$this->getTableName()} where (IDLinea='{$this->IDLinea}')"; if ($this->_em->query($query)) { if ($this->IDPedido != 0) { $lineasPedido = new PedidosLineas(); $tabla = $lineasPedido->getDataBaseName() . "." . $lineasPedido->getTableName(); unset($lineasPedido); $query = "UPDATE {$tabla} SET UnidadesPtesFacturar = UnidadesPtesFacturar + {$this->Unidades} WHERE IDLinea='{$this->IDLineaPedido}';"; $this->_em->query($query); } } else { $this->_errores[] = $this->_em->getError(); } $this->_em->desConecta(); } unset($this->_em); return count($this->_errores) == 0; }
/** * Devuelve un array con las entradas en curso del articulo y almacen indicado * * Cada elemento del array es otro array con los elementos: * array ( * 'IDPedido' => * 'PrimaryKeyMD5' => * 'Fecha' => * 'FechaEntraga' => * 'IDProveedor' => * 'RazonSocial => * 'Entrando' => * ) * * @param integer $idAlmacen El id de almacen * @return array Array con las unidades entrando */ public function getEntrando($idAlmacen) { $reservas = array(); $tablaPedidos = new PedidosCab(); $tablaPedidosLineas = new PedidosLineas(); $tablaProveedores = new Proveedores(); $em = new EntityManager($this->getConectionName()); if ($em->getDbLink()) { $query = "select\n cab.IDPedido,\n cab.PrimaryKeyMD5, \n cab.Fecha,\n cab.FechaEntrega,\n cab.IDProveedor,\n prv.RazonSocial,\n sum(lin.Unidades) as Entrando\n from\n {$tablaPedidos->getDataBaseName()}.{$tablaPedidos->getTableName()} as cab,\n {$tablaPedidosLineas->getDataBaseName()}.{$tablaPedidosLineas->getTableName()} as lin,\n {$tablaProveedores->getDataBaseName()}.{$tablaProveedores->getTableName()} as prv\n where\n cab.IDPedido = lin.IDPedido and\n cab.IDProveedor = prv.IDProveedor and\n lin.IDEstado = '1' and\n lin.IDArticulo = '{$this->IDArticulo}' and\n lin.IDAlmacen = '{$idAlmacen}'\n group by IDPedido\n order by Fecha ASC"; $em->query($query); //echo $query,"<br/>"; $reservas = $em->fetchResult(); $em->desConecta(); } unset($em); unset($tablaPedidos); unset($tablaPedidosLineas); unset($tablaProveedores); return $reservas; }
/** * 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, formato * * Si es por GET los parametros vienen en: * * posicion 2 (idArticulo), 3 (idCliente), 4 (periodo), 5 (formato) * * @return array El template y los datos */ public function HistoricoVentasAction() { $periodos = array(array('Id' => '0', 'Value' => 'Último Mes'), array('Id' => '1', 'Value' => 'Último Trimestre'), array('Id' => '2', 'Value' => 'Último Año'), array('Id' => '3', 'Value' => 'Todo')); 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']; $formato = $this->request['5']; break; case 'POST': $idArticulo = $this->request['idArticulo']; if ($idArticulo == '0') { $idArticulo = ''; } $idCliente = $this->request['idCliente']; if ($idCliente == '0') { $idCliente = ''; } $periodo = $this->request['periodo']; $formato = $this->request['formato']; break; } $formato = strtoupper($formato); // Construir la parte del filtro que depende del periodo switch ($periodo) { case '': $periodo = 1; 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(); $pedido = new PedidosCab(); $pedidoTabla = $pedido->getDataBaseName() . "." . $pedido->getTableName(); unset($pedido); $lineas = new PedidosLineas(); $lineasTabla = $lineas->getDataBaseName() . "." . $lineas->getTableName(); unset($lineas); // Calcular el total de unidades vendidas y el precio medio de venta 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, {$pedidoTabla} as t2"; $query .= " WHERE t1.IdPedido=t2.Id 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']; } $values['datos'] = array('articulo' => $articulo->iterator(), 'cliente' => $cliente->iterator(), 'unidades' => $unidades, 'periodo' => $periodo, 'periodos' => $periodos, 'precioMedio' => number_format($precioMedio, 3)); // Obtener el litado histórico de ventas para el articulo y cliente $em = new EntityManager($articulo->getConectionName()); if ($em->getDbLink()) { $query = "SELECT t2.Id,t1.Id NumeroPedido,t1.PrimaryKeyMD5,DATE_FORMAT(t1.Fecha,'%d-%m-%Y') as Fecha,t2.Descripcion,t2.Unidades,t2.Precio,t2.Descuento1,t2.Descuento2,t2.Descuento3,t2.Importe\n FROM {$pedidoTabla} as t1, {$lineasTabla} as t2"; if ($idCliente !== '') { $query .= ", {$clienteTabla} as t3"; } if ($idArticulo !== '') { $query .= ", {$articuloTabla} as t4"; } $query .= " WHERE t1.Id=t2.IdPedido"; if ($idCliente !== '') { $query .= " AND t1.IdCliente=t3.Id AND t1.IdCliente='{$idCliente}' "; } if ($idArticulo !== '') { $query .= " AND t2.IdArticulo=t4.Id AND t2.IdArticulo='{$idArticulo}'"; } $query .= "\n AND t1.Fecha>='{$desdeFecha}'\n ORDER BY t1.Fecha DESC, t1.Id DESC"; $em->query($query); //echo $query; $rows = $em->fetchResult(); $em->desConecta(); } $values['listado'] = $rows; unset($em); unset($articulo); unset($cliente); if (in_array($formato, $this->formats)) { $values['status'] = '200'; $values['statusMessage'] = ""; switch ($formato) { case '': case 'JSON': header('Content-type: application/json; charset="UTF-8"', true); $template = "_global/json.twig"; $this->values['json'] = $values; break; case 'HTML': $this->values = $values; $template = "_Emergente/historicoVentas.html.twig"; break; } } else { $this->values['json'] = array('status' => 401, 'statusMessage' => 'Format not implemented', 'result' => array()); $template = "_global/json.twig"; } return array('template' => $template, 'values' => $this->values); }
/** * Renderiza el template _Emergente/historicoCompras.html.twig * mostrando las compras realizadas a un proveedor de un articulo y un periodo dado. * * La información se obtiene en base a los pedidos RECEPCIONADOS o FACTURADOS. * * No se tienen en cuenta los pedidos no confirmados. * * Puede entrar por POST o por GET. * * Si es por POST los parametros vienen en: * * idArticulo, idProveedor, periodo * * Si es por GET los parametros vienen en: * * posicion 2 (idArticulo), 3 (idProveedor), 4 (periodo) * * @return array El template y los datos */ public function HistoricoComprasAction() { switch ($this->request["METHOD"]) { case 'GET': $idArticulo = $this->request['2']; if ($idArticulo == '0') { $idArticulo = ''; } $IDProveedor = $this->request['3']; if ($IDProveedor == '0') { $IDProveedor = ''; } $periodo = $this->request['4']; break; case 'POST': $idArticulo = $this->request['idArticulo']; if ($idArticulo == '0') { $idArticulo = ''; } $idProveedor = $this->request['idProveedor']; if ($idProveedor == '0') { $idProveedor = ''; } $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); $proveedor = new Proveedores($idProveedor); $proveedorTabla = $proveedor->getDataBaseName() . "." . $proveedor->getTableName(); $articulo = new Articulos($idArticulo); $articuloTabla = $articulo->getDataBaseName() . "." . $articulo->getTableName(); $pedidos = new PedidosCab(); $pedidosTabla = $pedidos->getDataBaseName() . "." . $pedidos->getTableName(); unset($pedidos); $lineas = new PedidosLineas(); $lineasTabla = $lineas->getDataBaseName() . "." . $lineas->getTableName(); unset($lineas); // Calcular el total de unidades compradas y el precio medio de compra // Solo calcula los pedidos que están recepcionados o facturados if ($idArticulo != '' or $idProveedor != '') { $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, {$pedidosTabla} as t2\n WHERE t1.IDPedido=t2.IDPedido AND t2.IDEstado>='2' AND t2.FechaEntrada>='{$desdeFecha}'"; if ($idProveedor !== '') { $query .= " AND t2.IDProveedor='{$idProveedor}'"; } if ($idArticulo !== '') { $query .= " AND t1.IDArticulo='{$idArticulo}'"; } $em->query($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, 'proveedor' => $proveedor, 'unidades' => $unidades, 'periodo' => $periodo, 'periodos' => $this->periodos, 'precioMedio' => number_format($precioMedio, 3)); // Obtener el litado historico de compras para el articulo y proveedor // Solo muestra los pedidos que están confirmador o facturados $em = new EntityManager($articulo->getConectionName()); if ($em->getDbLink()) { $query = "SELECT t2.IDLinea,t1.IDPedido,t1.PrimaryKeyMD5,DATE_FORMAT(t1.FechaEntrada,'%d-%m-%Y') as FechaEntrada,t4.Descripcion,t2.Unidades,t2.Precio,t2.Descuento,t2.Importe\n FROM {$pedidosTabla} as t1, {$lineasTabla} as t2"; if ($idProveedor !== '') { $query .= ", {$proveedorTabla} as t3"; } if ($idArticulo !== '') { $query .= ", {$articuloTabla} as t4"; } $query .= " WHERE t1.IDPedido=t2.IDPedido"; if ($idProveedor !== '') { $query .= " AND t1.IDProveedor=t3.IDProveedor AND t1.IDProveedor='{$idProveedor}' "; } if ($idArticulo !== '') { $query .= " AND t2.IDArticulo=t4.IDArticulo AND t2.IDArticulo='{$idArticulo}'"; } $query .= "\n AND t1.IDEstado>='2'\n AND t1.FechaEntrada>='{$desdeFecha}'\n ORDER BY t1.FechaEntrada, t1.IDPedido DESC"; //echo $query; $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); } $this->values['listado'] = $rows; unset($em); unset($articulo); unset($proveedor); return array('template' => '_Emergente/historicoCompras.html.twig', 'values' => $this->values); }
private function recalcula($idAlmacen) { // Poner las reservadas y el entrando a cero $stock = new Existencias(); $stock->queryUpdate(array("Reservadas" => 0, "Entrando" => 0), "IDAlmacen='{$idAlmacen}'"); // Borrar los registros de stock que estén a cero $stock->queryDelete("IDAlmacen='{$idAlmacen}' and Reales=0 and Pales=0 and Cajas=0 and Reservadas=0 and Entrando=0"); // Calcular las reservas de los artículos inventariables $lineas = new AlbaranesLineas(); $articulos = new Articulos(); $tablaLineas = $lineas->getDataBaseName() . "." . $lineas->getTableName(); $tablaArticulos = $articulos->getDataBaseName() . "." . $articulos->getTableName(); unset($lineas); unset($articulos); $query = "select l.IDArticulo,a.Codigo,l.Descripcion, sum(l.Unidades) Unidades,l.UnidadMedida "; $query .= "from {$tablaLineas} as l "; $query .= "join {$tablaArticulos} as a on l.IDArticulo=a.IDArticulo "; $query .= "where l.IDEstado='1' and a.Inventario='1' "; $query .= "group by l.IDArticulo"; $em = new EntityManager($_SESSION['project']['conection']); $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); unset($em); $resultado['reservas'] = $rows; foreach ($rows as $row) { $stock = new Existencias(); $stock->hazReserva($idAlmacen, $row['IDArticulo'], $row['Unidades'], $row['UnidadMedida']); } // Calcular el entrando de los artículos inventariables $lineas = new PedidosLineas(); $articulos = new Articulos(); $tablaLineas = $lineas->getDataBaseName() . "." . $lineas->getTableName(); $tablaArticulos = $articulos->getDataBaseName() . "." . $articulos->getTableName(); unset($lineas); unset($articulos); $query = "select l.IDArticulo,a.Codigo,l.Descripcion,sum(l.Unidades) Unidades,l.UnidadMedida "; $query .= "from {$tablaLineas} as l "; $query .= "join {$tablaArticulos} as a on l.IDArticulo=a.IDArticulo "; $query .= "where l.IDEstado='1' and a.Inventario='1' "; $query .= "group by l.IDArticulo"; $em = new EntityManager($_SESSION['project']['conection']); $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); unset($em); $resultado['entrando'] = $rows; foreach ($rows as $row) { $stock = new Existencias(); $stock->hazEntrando($idAlmacen, $row['IDArticulo'], $row['Unidades'], $row['UnidadMedida']); } return $resultado; }
/** * Anula la confirmación del pedido * Pasando del estado CONFIRMADO (1) a PTE. CONFIRMAR (0) * Solo se tienen en cuenta los artículos inventariables. * Anula del registro de existencias las cantidades pendientes de entrada */ public function anulaConfirmacion() { // Si está confirmado if ($this->getIDEstado()->getIDTipo() == 1) { $lineas = new PedidosLineas(); $tablaLineas = $lineas->getDataBaseName() . "." . $lineas->getTableName(); $articulos = new Articulos(); $tablaArticulos = $articulos->getDataBaseName() . "." . $articulos->getTableName(); $em = new EntityManager($this->getConectionName()); $query = "SELECT t1.IDArticulo, t1.IDAlmacen, sum(t1.Unidades) as Entrando, t1.UnidadMedida\n FROM {$tablaLineas} as t1, {$tablaArticulos} as t2\n WHERE t1.IDPedido='{$this->IDPedido}'\n AND t1.IDEstado='1'\n AND t1.IDArticulo=t2.IDArticulo\n AND t2.Inventario='1'\n GROUP BY t1.IDArticulo, t1.IDAlmacen, t1.UnidadMedida"; $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); // Quitar previsión de entrada $exi = new Existencias(); foreach ($rows as $row) { $exi->quitaEntrando($row['IDAlmacen'], $row['IDArticulo'], $row['Entrando'], $row['UnidadMedida'], $this->Deposito); } unset($exi); // Marcar como NO CONFIRMADAS las líneas de pedido y // quitar la eventual asignación de lotes y UnidadesRecbidas $lineas->queryUpdate(array("IDEstado" => 0), "IDPedido='{$this->IDPedido}' and IDEstado='1'"); // Borrar las eventuales líneas de recepción $recepciones = new Recepciones(); $recepciones->queryDelete("Entidad='PedidosCab' and IDEntidad='{$this->IDPedido}'"); // Anular la reserva en la cabecera del pedido // y quitar la fecha prevista de entrega y las posibles incidencias $this->setIDEstado(0); $this->setFechaEntrega('00/00/0000'); $this->setIncidencias(''); $this->save(); } }