/**
  *
  *Comprar productos en mostrador. No debe confundirse con comprar productos a un proveedor. Estos productos se agregaran al inventario de esta sucursal de manera automatica e instantanea. La IP ser?omada de la m?ina que realiza la compra. El usuario y la sucursal ser?tomados de la sesion activa. El estado del campo liquidada ser?omado de acuerdo al campo total y pagado.
  *
  * @param retencion float Cantidad sumada por retenciones
  * @param detalle json Objeto que contendr la informacin de los productos comprados, sus cantidades, sus descuentos, y sus precios
  * @param id_vendedor int Id del cliente al que se le compra
  * @param total float Total de la compra despues de impuestos y descuentos
  * @param tipo_compra string Si la compra es a credito o de contado
  * @param subtotal float Total de la compra antes de incluirle impuestos.
  * @param id_empresa int Empresa a nombre de la cual se realiza la compra
  * @param descuento float Cantidad restada por descuento
  * @param impuesto float Cantidad sumada por impuestos
  * @param billetes_pago json Ids de billetes que se usaron para pagar
  * @param billetes_cambio json Ids de billetes que se recibieron como cambio
  * @param tipo_pago string Si el pago ser en efectivo, con tarjeta o con cheque
  * @param saldo float Saldo de la compra
  * @param cheques json Si el tipo de pago es con cheque, se almacena el nombre del banco, el monto y los ultimos 4 numeros del o de los cheques
  * @return id_compra_cliente string Id de la nueva compra
  **/
 public static function ComprarCaja($descuento, $detalle, $id_empresa, $id_vendedor, $impuesto, $retencion, $subtotal, $tipo_compra, $total, $billetes_cambio = null, $billetes_pago = null, $cheques = null, $id_caja = null, $id_compra_caja = null, $id_sucursal = null, $saldo = 0, $tipo_pago = null)
 {
     Logger::log("Realizando la compra");
     //Se obtiene el id del usuario de la sesion actual
     $id_usuario = SesionController::getCurrentUser();
     if (is_null($id_usuario)) {
         Logger::error("No se pudo obtener al usuario de la sesion actual, ya inicio sesion?");
         throw new Exception("No se pudo obtener al usuario de la sesion actual, ya inicio sesion?");
     }
     //Se validan los parametros recibidos
     $validar = self::validarParametrosCompra(null, $id_compra_caja, $id_vendedor, $tipo_compra, $subtotal, $impuesto, $descuento, $total, $id_empresa, $saldo, null, $tipo_pago, $retencion);
     if (is_string($validar)) {
         Logger::error($validar);
         throw new Exception($validar);
     }
     //Se inicializa el usuario con los parametros recibidos.
     $usuario = UsuarioDAO::getByPK($id_vendedor);
     $compra = new Compra();
     $compra->setRetencion($retencion);
     $compra->setIdVendedorCompra($id_vendedor);
     $compra->setSubtotal($subtotal);
     $compra->setImpuesto($impuesto);
     $compra->setTotal($total);
     $compra->setDescuento($descuento);
     $compra->setTipoDeCompra($tipo_compra);
     $compra->setIdCaja(self::getCaja());
     $compra->setIdSucursal(self::getSucursal());
     $compra->setIdUsuario($id_usuario);
     $compra->setIdCompraCaja($id_compra_caja);
     $compra->setCancelada(0);
     $compra->setTipoDePago($tipo_pago);
     $compra->setFecha(time());
     $compra->setIdEmpresa($id_empresa);
     DAO::transBegin();
     try {
         //Si la compra es a contado, se realizan operaciones dependiendo del tipo de pago
         if ($tipo_compra === "contado") {
             //Si se recibe un saldo, se loguea una advertencia indicando que se ignorará
             if (!is_null($saldo)) {
                 Logger::warn("Se recibio un saldo cuando la venta es de contado, el saldo se tomara del total");
             }
             $compra->setSaldo($total);
             CompraDAO::save($compra);
             //Si el tipo de pago es cheque, se crean los nuevos cheques con la informacion obtenida
             //y se almacenan registros por cada cheque para esta compra en la tabla cheque_compra
             if ($tipo_pago === "cheque") {
                 //Si no se recibe informacion de los cheques se lanza una excepcion
                 if (is_null($cheques)) {
                     throw new Exception("El tipo de pago es con cheque pero no se recibio informacion del mismo");
                 }
                 $cheques = object_to_array($cheques);
                 if (!is_array($cheques)) {
                     throw new Exception("Los cheques son invalidos", 901);
                 }
                 $cheque_compra = new ChequeCompra();
                 $cheque_compra->setIdCompra($compra->getIdCompra());
                 foreach ($cheques as $cheque) {
                     $id_cheque = ChequesController::NuevoCheque($cheque["nombre_banco"], $cheque["monto"], $cheque["numero"], 1);
                     $cheque_compra->setIdCheque($id_cheque);
                     ChequeCompraDAO::save($cheque_compra);
                 }
             } else {
                 if ($tipo_pago === "efectivo") {
                     CajasController::modificarCaja($compra->getIdCaja(), 0, $billetes_pago, $total);
                     if (!is_null($billetes_cambio)) {
                         CajasController::modificarCaja($compra->getIdCaja(), 1, $billetes_cambio, 0);
                     }
                 }
             }
         } else {
             if ($tipo_compra == "credito") {
                 if (is_null($saldo)) {
                     Logger::warn("No se recibio un saldo, se tomara 0 como saldo");
                     $saldo = 0;
                 }
                 //El saldo no puede ser mayor que la cantidad a comprar
                 if ($saldo > $total) {
                     throw new Exception("El saldo no puede ser mayor que el total de la compra");
                 }
                 $compra->setSaldo($saldo);
                 CompraDAO::save($compra);
                 $usuario->setSaldoDelEjercicio($usuario->getSaldoDelEjercicio() + $total - $saldo);
                 UsuarioDAO::save($usuario);
             }
         }
         //Si se recibio detalle de productos, se agregan al almacen correspondiente a la empresa
         //dentro de esta sucursal. Tambien se guarda el detalle en la tabla compra_producto
         if (!is_null($detalle)) {
             $detalle = object_to_array($detalle);
             if (!is_array($detalle)) {
                 throw new Exception("El detalle del producto es invalido", 901);
             }
             //Se inicializan variables para el almacenamiento de los registros.
             $d_producto = new CompraProducto();
             $d_producto->setIdCompra($compra->getIdCompra());
             //se buscan los almacenes de esta empresa para esta sucursal y se ignoran los de consginacion
             $almacenes = AlmacenDAO::search(new Almacen(array("id_sucursal" => self::getSucursal(), "id_empresa" => $id_empresa)));
             $id_almacen = null;
             foreach ($almacenes as $a) {
                 if ($a->getIdTipoAlmacen() == 2) {
                     continue;
                 }
                 $id_almacen = $a->getIdAlmacen();
             }
             //Si no se encontro un almacen, se arroja una excepcion
             if (is_null($id_almacen)) {
                 throw new Exception("No existe un almacen para esta empresa en esta sucursal");
             }
             //Por cada producto en el detalle se almacena en la tabla compra_producto y se agregan al
             //almacen de la empresa
             foreach ($detalle as $d_p) {
                 if (!array_key_exists("id_producto", $d_p) || !array_key_exists("cantidad", $d_p) || !array_key_exists("precio", $d_p) || !array_key_exists("descuento", $d_p) || !array_key_exists("impuesto", $d_p) || !array_key_exists("retencion", $d_p) || !array_key_exists("id_unidad", $d_p)) {
                     throw new Exception("El detalle de paquete recibido es invalido", 901);
                 }
                 $validar = self::validarParametrosCompraProducto(null, $d_p["id_producto"], $d_p["precio"], $d_p["cantidad"], $d_p["descuento"], $d_p["impuesto"], $d_p["retencion"], $d_p["id_unidad"]);
                 if (is_string($validar)) {
                     throw $validar;
                 }
                 $producto = ProductoDAO::getByPK($d_p["id_producto"]);
                 //Si el producto no puede ser comprado en mostrador arroja una excepcion
                 if (!$producto->getCompraEnMostrador()) {
                     throw new Exception("No se puede comprar el producto con id " . $d_p["id_producto"] . " en mostrador");
                 }
                 //Si el producto no pertenece a la empresa que quiere hacer la compra, arroja una excepcion
                 if (is_null(ProductoEmpresaDAO::getByPK($d_p["id_producto"], $id_empresa))) {
                     throw new Exception("El producto no pertenece a la empresa seleccionada");
                 }
                 //Se incializa ys e guarda el nuevo registro de la tabla compra_producto
                 $d_producto->setCantidad($d_p["cantidad"]);
                 $d_producto->setDescuento($d_p["descuento"]);
                 $d_producto->setIdProducto($d_p["id_producto"]);
                 $d_producto->setIdUnidad($d_p["id_unidad"]);
                 $d_producto->setImpuesto($d_p["impuesto"]);
                 $d_producto->setPrecio($d_p["precio"]);
                 $d_producto->setRetencion($d_p["retencion"]);
                 CompraProductoDAO::save($d_producto);
                 //Se busca el producto en el almacen en la unidad obtenida, si no existe aun
                 //se crea uno nuevo y al final se guarda.
                 $producto_almacen = ProductoAlmacenDAO::getByPK($d_p["id_producto"], $id_almacen, $d_p["id_unidad"]);
                 if (is_null($producto_almacen)) {
                     $producto_almacen = new ProductoAlmacen(array("id_producto" => $d_p["id_producto"], "id_almacen" => $id_almacen, "id_unidad" => $d_p["id_unidad"]));
                 }
                 $producto_almacen->setCantidad($producto_almacen->getCantidad() + $d_p["cantidad"]);
                 ProductoAlmacenDAO::save($producto_almacen);
             }
         } else {
             throw new Exception("No se recibieron productos para esta compra");
         }
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("No se pudo realizar la compra: " . $e);
         throw new Exception("No se pudo realizar la compra");
     }
     DAO::transEnd();
     Logger::log("compra realizada exitosamente");
     return array("id_compra_cliente" => $compra->getIdCompra());
 }
Example #2
0
 /**
  *
  *Lista las compras. Se puede filtrar por empresa, sucursal, caja, usuario que registra la compra, usuario al que se le compra, tipo de compra, si estan pagadas o no, por tipo de pago, canceladas o no, por el total, por fecha, por el tipo de pago y se puede ordenar por sus atributos.
  *
  * @param fecha_inicial string Se listaran las compras cuya fecha sea mayor a la indicada aqui
  * @param tipo_compra string Si es a credito, se listaran las compras que sean a credito, si es de contado, se listaran las compras de contado
  * @param id_usuario_compra int Se listaran las compras realizadas por este usuario, si es sucursal su id sera negativo
  * @param id_caja int Se listaran las compras registradas en esta caja
  * @param id_usuario int Se listaran las compras que ha registrado este usuario
  * @param id_empresa int Id de la empresa de la cual se listaran sus compras
  * @param id_sucursal int Id de la sucursal de la cual se listaran sus compras
  * @param fecha_final string Se listaran las compras cuya fecha sea menor a la indicada aqui
  * @param total_minimo float Se listaran las compras cuyo total sea mayor a este
  * @param total_maximo float Se listaran las compras cuyo total sea menor a este
  * @param saldada bool Si este valor no es obtenido, se listaran las compras tanto saldadas como las que no lo estan. Si es verdadero se listaran solo las compras saldadas, si es falso, se listaran solo las compras que no lo estan
  * @param cancelada bool Si este valor no es obtenido, se listaran tanto compras canceladas como no canceladas. Si es verdadero, se listaran solo las compras canceladas, si su valor es falso, se listaran solo las compras que no lo esten
  * @param tipo_pago string Se listaran las compras pagadas con cheque, tarjeta o efectivo de acuerdo a este valor
  * @return compras json Objeto que contendra la lista de las compras
  **/
 public static function Lista($cancelada = null, $fecha_final = null, $fecha_inicial = null, $id_caja = null, $id_empresa = null, $id_sucursal = null, $id_usuario = null, $id_vendedor_compra = null, $orden = null, $saldada = null, $tipo_compra = null, $tipo_pago = null, $total_maximo = null, $total_minimo = null)
 {
     Logger::log("Listando compras");
     //Se valida que el parametro orden sea correcto
     if (!is_null($orden) && $orden != "id_compra" && $orden != "id_caja" && $orden != "id_compra_caja" && $orden != "id_vendedor_compra" && $orden != "tipo_compra" && $orden != "fecha" && $orden != "subtotal" && $orden != "impuesto" && $orden != "descuento" && $orden != "total" && $orden != "id_sucursal" && $orden != "id_usuario" && $orden != "id_empresa" && $orden != "saldo" && $orden != "cancelada" && $orden != "tipo_de_pago" && $orden != "retencion") {
         Logger::error("EL parametro orden (" . $orden . ") no es valido");
         throw new Exception("EL parametro orden (" . $orden . ") no es valido", 901);
     }
     //Revisa si se recibieron parametros o no para saber cual metodo usar
     $parametros = false;
     if ($fecha_inicial != null || $tipo_compra != null || $id_vendedor_compra != null || $id_caja != null || $id_usuario != null || $id_empresa != null || $id_sucursal != null || $fecha_final != null || $total_minimo != null || $total_maximo != null || $cancelada != null || $tipo_pago != null) {
         $parametros = true;
     }
     $compras = null;
     if ($parametros) {
         Logger::log("Se recibieron parametros, se listan las compras en rango");
         //objetos que serviran para obtener un rango de valores
         $compra_criterio_1 = new Compra();
         $compra_criterio_2 = new Compra();
         $compra_criterio_1->setTipoDeCompra($tipo_compra);
         $compra_criterio_1->setIdVendedorCompra($id_vendedor_compra);
         $compra_criterio_1->setIdCaja($id_caja);
         $compra_criterio_1->setIdUsuario($id_usuario);
         $compra_criterio_1->setIdEmpresa($id_empresa);
         $compra_criterio_1->setIdSucursal($id_sucursal);
         $compra_criterio_1->setCancelada($cancelada);
         $compra_criterio_1->setTipoDePago($tipo_pago);
         //revisa los rangos recibidos y se asignan en conjunto con limites para obtener el rango deseado
         if ($fecha_inicial != null) {
             $compra_criterio_1->setFecha($fecha_inicial);
             if ($fecha_final != null) {
                 $compra_criterio_2->setFecha($fecha_final);
             } else {
                 $compra_criterio_2->setFecha(time());
             }
         } else {
             if ($fecha_final != null) {
                 $compra_criterio_1->setFecha($fecha_final);
                 $compra_criterio_2->setFecha("1001-01-01 00:00:00");
             }
         }
         if ($total_minimo !== null) {
             $compra_criterio_1->setTotal($total_minimo);
             if ($total_maximo !== null) {
                 $compra_criterio_2->setTotal($total_maximo);
             } else {
                 $compra_criterio_2->setTotal(1.8E+100);
             }
         } else {
             if ($total_maximo !== null) {
                 $compra_criterio_1->setTotal($total_maximo);
                 $compra_criterio_2->setTotal(0);
             }
         }
         $compras = CompraDAO::byRange($compra_criterio_1, $compra_criterio_2, $orden);
     } else {
         Logger::log("No se recibieron parametros, se listan todas las compras");
         $compras = CompraDAO::getAll(null, null, $orden);
     }
     //Si se recibe el parametro saldada, se tiene que hace un filtro extra donde solo se incluyan las compras
     //con ese valor de saldadada
     if ($saldada !== null) {
         $temporal = array();
         if ($saldada) {
             foreach ($compras as $compra) {
                 if ($compra->getTotal() <= $compra->getSaldo()) {
                     array_push($temporal, $compra);
                 }
             }
         } else {
             foreach ($compras as $compra) {
                 if ($compra->getTotal() > $compra->getSaldo()) {
                     array_push($temporal, $compra);
                 }
             }
         }
         $compras = $temporal;
     }
     Logger::log("Se obtuvo la lista con éxito");
     return $compras;
 }