function descripcion_sucursal($id_sucursal)
{
    if (!SucursalDAO::getByPK($id_sucursal)) {
        return "";
    }
    return "<font title = \"Ir a sucursal\" style = \"cursor:pointer;\" onClick = \"(function(){ window.location = 'sucursales.ver.php?sid={$id_sucursal}'; })();\" >" . SucursalDAO::getByPK($id_sucursal)->getRazonSocial() . "</font>";
}
 public function testNuevoCorteSucursal()
 {
     $id = ScenarioMaker::CreateSucursalAndReturnID("N");
     EfectivoController::NuevoCorteSucursal(0, $id);
     //now, 'UltimoCorte' should not return null
     $this->assertNotNull(EfectivoController::UltimoCorte(SucursalDAO::getByPK($id)));
 }
 private static function Cotizar($descuento, $id_comprador_venta, $impuesto, $subtotal, $tipo_venta, $total, $datos_cheque = null, $detalle_orden = null, $detalle_paquete = null, $detalle_venta = null, $id_sucursal = null, $saldo = "0", $tipo_de_pago = null)
 {
     Logger::log("Cotizando ....");
     //Se obtiene el id del usuario actualmente logueado
     $aS = SesionController::Actual();
     $id_usuario = $aS["id_usuario"];
     //Se busca al usuario comprador
     $usuario = UsuarioDAO::getByPK($id_comprador_venta);
     if (!is_null($id_sucursal)) {
         $sucursal = SucursalDAO::getByPK($id_sucursal);
         if (is_null($sucursal)) {
             Logger::error("La sucursal " . $id_sucursal . " no existe");
             throw new InvalidDataException("La sucursal no existe", 901);
         }
         if (!$sucursal->getActiva()) {
             Logger::error("La sucursal " . $id_sucursal . " esta desactivada");
             throw new InvalidDataException("La sucursal esta desactivada", 901);
         }
     }
     //Se inicializa la venta con los parametros obtenidos
     $venta = new Venta();
     $venta->setRetencion(0);
     $venta->setEsCotizacion(true);
     $venta->setIdCompradorVenta($id_comprador_venta);
     $venta->setSubtotal($subtotal);
     $venta->setImpuesto($impuesto);
     $venta->setTotal($total);
     $venta->setDescuento($descuento);
     $venta->setTipoDeVenta($tipo_venta);
     $venta->setIdCaja(null);
     $venta->setIdSucursal($id_sucursal);
     $venta->setIdUsuario($id_usuario);
     $venta->setIdVentaCaja(NULL);
     $venta->setCancelada(0);
     $venta->setTipoDePago(null);
     $venta->setSaldo(0);
     $venta->setFecha(time());
     DAO::transBegin();
     try {
         VentaDAO::save($venta);
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("No se pudo realizar la venta: " . $e);
         throw new Exception("No se pudo realizar la venta", 901);
     }
     //Si el detalle de las ordenes compradas, el detalle de los paquetes y el detalle de los productos
     //son nulos, manda error.
     if (is_null($detalle_orden) && is_null($detalle_paquete) && is_null($detalle_venta)) {
         throw new InvalidDataException("No se recibieron ni paquetes ni productos ni servicios para esta venta", 901);
     }
     //Por cada detalle, se valida la informacion recibida, se guarda en un registro
     //que contiene el id de la venta generada y se guarda el detalle en su respectiva tabla.
     if (!is_null($detalle_venta)) {
         $detalle_producto = object_to_array($detalle_venta);
         if (!is_array($detalle_producto)) {
             throw new Exception("El detalle del producto es invalido", 901);
         }
         foreach ($detalle_producto as $d_p) {
             $d_producto = new VentaProducto();
             $d_producto->setIdVenta($venta->getIdVenta());
             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 del producto es invalido", 901);
             }
             Logger::log("Insertando venta_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"]);
             Logger::log($d_producto);
             try {
                 VentaProductoDAO::save($d_producto);
             } catch (Exception $e) {
                 DAO::transRollback();
                 Logger::error("No se pudo realizar la venta: " . $e);
                 throw new Exception("No se pudo realizar la venta", 901);
             }
         }
     }
     /* Fin de if para detalle_producto */
     DAO::transEnd();
     Logger::log("====== Cotizacion realizada exitosamente ======== ");
     return array("id_venta" => $venta->getIdVenta());
 }
 public static function validarParametrosUsuario($id_usuario = null, $id_direccion = null, $id_sucursal = null, $id_rol = null, $id_clasificacion_cliente = null, $id_clasificacion_proveedor = null, $id_moneda = null, $activo = null, $nombre = null, $rfc = null, $curp = null, $comision_ventas = null, $telefono_personal1 = null, $telefono_personal2 = null, $limite_credito = null, $descuento = null, $password = null, $salario = null, $correo_electronico = null, $pagina_web = null, $saldo_del_ejercicio = null, $ventas_a_credito = null, $representante_legal = null, $facturar_a_terceros = null, $dia_de_pago = null, $mensajeria = null, $intereses_moratorios = null, $denominacion_comercial = null, $dias_de_credito = null, $cuenta_de_mensajeria = null, $dia_de_revision = null, $codigo_usuario = null, $dias_de_embarque = null, $tiempo_entrega = null, $cuenta_bancaria = null, $id_tarifa_compra = null, $id_tarifa_venta = null, $id_usuario_padre = null)
 {
     //valida que el id del usuario exista en la base de datos
     if (!is_null($id_usuario)) {
         if (is_null(UsuarioDAO::getByPK($id_usuario))) {
             return "El usuario con id: " . $id_usuario . " no existe";
         }
     }
     //valida que el id de la direccion exista en la base de datos
     if (!is_null($id_direccion)) {
         if (is_null(DireccionDAO::getByPK($id_direccion))) {
             return "La direccion con id: " . $id_direccion . " no existe";
         }
     }
     //valida el id de la sucursal exista en la base de datos
     if (!is_null($id_sucursal)) {
         if (is_null(SucursalDAO::getByPK($id_sucursal))) {
             return "La sucursal con id: " . $id_sucursal . " no existe";
         }
     }
     //valida que el id del rol exista en la base de datos
     if (!is_null($id_rol)) {
         if (is_null(RolDAO::getByPK($id_rol))) {
             return "El rol con id: " . $id_rol . " no existe";
         }
     }
     //valida que la clasificacion del cliente exista en la base de datos
     if (!is_null($id_clasificacion_cliente)) {
         if (is_null(ClasificacionClienteDAO::getByPK($id_clasificacion_cliente))) {
             return "La clasificacion cliente con id: " . $id_clasificacion_cliente . " no existe";
         }
     }
     //valida que la clasificacion del proveedor exista en la base de datos
     if (!is_null($id_clasificacion_proveedor)) {
         if (is_null(ClasificacionProveedorDAO::getByPK($id_clasificacion_proveedor))) {
             return "La clasficiacion proveedor con id: " . $id_clasificacion_proveedor . " no existe";
         }
     }
     //valida que la moneda exista en la base de datos
     if (!is_null($id_moneda)) {
         Logger::log("Editando a moneda:" . $id_moneda);
         if (is_null(MonedaDAO::getByPK($id_moneda))) {
             return "La moneda con id: " . $id_moneda . " no existe";
         }
     }
     //valida el nombre
     if (!is_null($nombre)) {
         $e = ValidacionesController::validarLongitudDeCadena($nombre, 1, 100);
         if (!$e) {
             return "El numero de caracteres del nombre (" . $nombre . ") no esta entre 1 y 100";
         }
     }
     //valida el rfc, el rfc solo puede estar compuesto por Letras mayusculas y numeros
     if (!is_null($rfc)) {
         $e = ValidacionesController::validarLongitudDeCadena($rfc, 1, 30);
         if (!$e) {
             return "El numero de caracteres del rfc (" . $rfc . ") no esta entre 1 y 30";
         }
         if (preg_match('/[^A-Z0-9]/', $rfc)) {
             return "El rfc " . $rfc . " contiene caracteres fuera del rango A-Z y 0-9";
         }
     }
     //valida el curp, el curp solo puede tener letras mayusculas y numeros
     if (!is_null($curp)) {
         $e = ValidacionesController::validarLongitudDeCadena($curp, 1, 30);
         if (!$e) {
             return "El numero de caracteres de la curp (" . $curp . ") no esta entre 1 y 30";
         }
         if (preg_match('/[^A-Z0-9]/', $curp)) {
             return "El curp " . $curp . " contiene caracteres fuera del rango A-Z y 0-9";
         }
     }
     //valida la comision por ventas
     if (!is_null($comision_ventas)) {
         $e = ValidacionesController::validarNumero($comision_ventas, 0, 100);
         if (!$e) {
             return "La comision de ventas (" . $comision_ventas . ") no esta entre 0 y 100";
         }
     }
     //valida el telefono. Los telefonos solo pueden tener numeros, guiones,parentesis,asteriscos y espacios en blanco
     if (!is_null($telefono_personal1)) {
         $e = ValidacionesController::validarLongitudDeCadena($telefono_personal1, 1, 20);
         if (!$e) {
             return "El numero de caracteres del telefono personal (" . $telefono_personal1 . ") no esta entre 1 y 20";
         }
         if (preg_match('/[^0-9\\- \\(\\)\\*]/', $telefono_personal1)) {
             return "El telefono " . $telefono_personal1 . " tiene caracteres fuera del rango 0-9,-,(,),* o espacio vacío";
         }
     }
     //valida el telefono. Los telefonos solo pueden tener numeros, guiones,parentesis,asteriscos y espacios en blanco
     if (!is_null($telefono_personal2)) {
         $e = ValidacionesController::validarLongitudDeCadena($telefono_personal2, 1, 20);
         if (!$e) {
             return "El numero de caracteres del telefono personal alterno (" . $telefono_personal2 . ") no esta entre 1 y 20";
         }
         if (preg_match('/[^0-9\\- \\(\\)\\*]/', $telefono_personal2)) {
             return "El telefono " . $telefono_personal2 . " tiene caracteres fuera del rango 0-9,-,(,),* o espacio vacío";
         }
     }
     //valida el activo. Activo es una variable booleana.
     if (!is_null($activo)) {
         $e = ValidacionesController::validarEntero($activo, 0, 1);
         if (!$e) {
             return "La variable activo (" . $activo . ") no esta entre 0 y 1";
         }
     }
     //valida el limite de credito
     if (!is_null($limite_credito)) {
         $e = ValidacionesController::validarNumero($limite_credito, 0, 1.8E+200);
         if (!$e) {
             return "El limite de credito (" . $limite_credito . ") no esta entre 0 y 1.8e200";
         }
     }
     //valida el descuento. El descuento es un porcentaje y no puede ser mayor a 100
     if (!is_null($descuento)) {
         $e = ValidacionesController::validarNumero($descuento, 0, 100);
         if (!$e) {
             return "El descuento (" . $descuento . ") no esta entre 0 y 100";
         }
     }
     //valida el password, El pasword tiene que tener una longitud mayor o igual a 4
     if (!is_null($password)) {
         $e = ValidacionesController::validarLongitudDeCadena($password, 4, 32);
         if (!$e) {
             return "El numero de caracteres del password (" . $password . ") no esta entre 4 y 32";
         }
     }
     //valida el salario
     if (!is_null($salario)) {
         $e = ValidacionesController::validarNumero($salario, 0, 1.8E+200);
         if (!$e) {
             return "El salario (" . $salario . ") no esta entre 0 y 1.8e200";
         }
     }
     //valida el correo electronico segun las especificaciones de php
     if (!is_null($correo_electronico)) {
         $e = ValidacionesController::validarLongitudDeCadena($correo_electronico, 3, 30);
         if (!$e) {
             return "El numero de caracteres del correo electronico (" . $correo_electronico . ") no esta entre 3 y 30";
         }
         if (!is_string(filter_var($correo_electronico, FILTER_VALIDATE_EMAIL))) {
             return "El correo electronico " . $correo_electronico . " no es valido";
         }
     }
     //valida que una pagina web tenga un formato valido.
     if (!is_null($pagina_web)) {
         $e = ValidacionesController::validarLongitudDeCadena($pagina_web, 2, 30);
         if (!$e) {
             return $e;
         }
         if (!preg_match('/^(http|https|ftp):\\/\\/[a-z0-9]+([\\-\\.]{1}[a-z0-9]+)*\\.[a-z]{2,6}' . '((:[0-9]{1,5})?\\/.*)?$/i', $pagina_web) && !preg_match('/^[a-z0-9]+([\\-\\.]{1}[a-z0-9]+)*\\.[a-z]{2,6}' . '((:[0-9]{1,5})?\\/.*)?$/i', $pagina_web)) {
             return "La direccion web " . $pagina_web . " no cumple el formato valido";
         }
     }
     //valida el saldo del ejercicio
     if (!is_null($saldo_del_ejercicio)) {
         $e = ValidacionesController::validarNumero($saldo_del_ejercicio, -1.8E+200, 1.8E+200);
         if (!$e) {
             return "El saldo del ejercicio (" . $saldo_del_ejercicio . ") no esta entre -1.8e200 y 1.8e200";
         }
     }
     //valida las ventas a credito
     if (!is_null($ventas_a_credito)) {
         $e = ValidacionesController::validarEntero($ventas_a_credito, 0, PHP_INT_MAX);
         if (!$e) {
             return "Las venta a credito no estan entre 0 y " . PHP_INT_MAX;
         }
     }
     //valida el represnetante legal
     if (!is_null($representante_legal)) {
         $e = ValidacionesController::validarLongitudDeCadena($representante_legal, 0, 100);
         if (!$e) {
             return "El numero de caracteres del representante legal (" . $representante_legal . ") no esta entre 0 y 100";
         }
     }
     //valida la facturacion a terceros. Es un boleano
     if (!is_null($facturar_a_terceros)) {
         $e = ValidacionesController::validarEntero($facturar_a_terceros, 0, 1);
         if (!$e) {
             return "La variable facturar a terceros (" . $facturar_a_terceros . ") no esta entre 0 y 1";
         }
     }
     //valida los dias de pago
     if (!is_null($dia_de_pago)) {
         $e = ValidacionesController::validarLongitudDeCadena($dia_de_pago, 19, 19);
         if (!$e) {
             return "La fecha de dia de pago (" . $dia_de_pago . ") es invalida, el formato valido es YYYY-MM-dd HH:mm:ss";
         }
     }
     //valida el boleano mensajeria
     if (!is_null($mensajeria)) {
         $e = ValidacionesController::validarEntero($mensajeria, 0, 1);
         if (!$e) {
             return "La variable mensajeria (" . $mensajeria . ") no esta entre 0 y 1";
         }
     }
     //valida los intereses moratorios
     if (!is_null($intereses_moratorios)) {
         $e = ValidacionesController::validarNumero($intereses_moratorios, 0, 1.8E+200);
         if (!$e) {
             return "Los intereses moratorios (" . $intereses_moratorios . ") no estan entre 0 y 1.8e200";
         }
     }
     //valida la denominacion comercial
     if (!is_null($denominacion_comercial)) {
         $e = ValidacionesController::validarLongitudDeCadena($denominacion_comercial, 0, 100);
         if (!$e) {
             return "El numero de caracteres de la denominacion comercial (" . $denominacion_comercial . ") no esta entre 0 y 100";
         }
     }
     //valida los dias de credito
     if (!is_null($dias_de_credito)) {
         $e = ValidacionesController::validarEntero($dias_de_credito, 0, PHP_INT_MAX);
         if (!$e) {
             return "Los dias de credito (" . $dias_de_credito . ") no estan en el rango de 0 a " . PHP_INT_MAX;
         }
     }
     //valida la cuenta de mensajeria
     if (!is_null($cuenta_de_mensajeria)) {
         $e = ValidacionesController::validarLongitudDeCadena($cuenta_de_mensajeria, 0, 50);
         if (!$e) {
             return "El numero de caracteres de la cuenta de mensajeria (" . $cuenta_de_mensajeria . ") no etsa entre 0 y 50";
         }
     }
     //valida lso dias de revision
     if (!is_null($dia_de_revision)) {
         $e = ValidacionesController::validarLongitudDeCadena($dia_de_revision, 19, 19);
         if (!$e) {
             return "El dia de revision (" . $dia_de_revision . ") no tiene el formato apropiado, el formato valido es YYYY-MM-dd HH:mm:ss";
         }
     }
     //valida el codigo de usuario
     if (!is_null($codigo_usuario)) {
         $e = ValidacionesController::validarLongitudDeCadena($codigo_usuario, 1, 50);
         if (!$e) {
             return "El numero de caracteres del codigo de usuario no esta entre 1 y 50";
         }
         if (preg_match('/[^a-zA-Z0-9]/', $codigo_usuario)) {
             return "El codigo de usuario (" . $codigo_usuario . ") no tiene solo caracteres alfanumericos";
         }
     }
     //valida los dias de embarque
     if (!is_null($dias_de_embarque)) {
         $e = ValidacionesController::validarEntero($dias_de_embarque, 0, PHP_INT_MAX);
         if (!$e) {
             return "Los dias de embarque (" . $dias_de_embarque . ") no esta entre 0 y " . PHP_INT_MAX;
         }
     }
     //valida el tiempo de entrega
     if (!is_null($tiempo_entrega)) {
         $e = ValidacionesController::validarEntero($tiempo_entrega, 0, PHP_INT_MAX);
         if (!$e) {
             return "El tiempo de entrega (" . $tiempo_entrega . ") no esta entre 0 y " . PHP_INT_MAX;
         }
     }
     //valida la cuenta bancaria
     if (!is_null($cuenta_bancaria)) {
         $e = ValidacionesController::validarLongitudDeCadena($cuenta_bancaria, 0, 50);
         if (!$e) {
             return "El numero de caracteres de la cuenta bancaria (" . $cuenta_bancaria . ") no esta entre 0 y 50";
         }
     }
     //valida que la tarifa de compra sea valida
     if (!is_null($id_tarifa_compra)) {
         $tarifa = TarifaDAO::getByPK($id_tarifa_compra);
         if (is_null($tarifa)) {
             return "La tarifa " . $id_tarifa_compra . " no existe";
         }
         if (!$tarifa->getActiva()) {
             return "La tarifa " . $id_tarifa_compra . " no esta activa";
         }
         if ($tarifa->getTipoTarifa() != "compra") {
             return "La tarifa " . $id_tarifa_compra . " no es una tarifa de compra";
         }
     }
     //valida que la tarifa de venta sea valida
     if (!is_null($id_tarifa_venta)) {
         $tarifa = TarifaDAO::getByPK($id_tarifa_venta);
         if (is_null($tarifa)) {
             return "La tarifa " . $id_tarifa_venta . " no existe";
         }
         if (!$tarifa->getActiva()) {
             return "La tarifa " . $id_tarifa_venta . " no esta activa";
         }
         if ($tarifa->getTipoTarifa() != "venta") {
             return "La tarifa " . $id_tarifa_venta . " no es una tarifa de venta";
         }
     }
     //valida que el usuario padre exista y este activo
     if (!is_null($id_usuario_padre)) {
         $usuario_padre = UsuarioDAO::getByPK($id_usuario_padre);
         if (is_null($usuario_padre)) {
             return "El usuario padre " . $id_usuario_padre . " no existe";
         }
         if ($usuario_padre->getActivo()) {
             return "El usuario padre " . $usuario_padre->getNombre() . " no esta activo";
         }
     }
     return true;
 }
function funcion_sucursal($id_sucursal)
{
    return SucursalDAO::getByPK($id_sucursal) ? SucursalDAO::getByPK($id_sucursal)->getRazonSocial() : "------";
}
 private static function cancelarAbonoPrestamo(AbonoPrestamo $abono, $id_caja, $billetes)
 {
     $prestamo = PrestamoDAO::getByPK($abono->getIdPrestamo());
     if (is_null($prestamo)) {
         Logger::error("FATAL!!!! Este abono apunta a un prestamo que no existe!!");
         throw new Exception("FATAL!!!! Este abono apunta a un prestamo que no existe!!");
     }
     //
     //Los solicitantes pueden ser positivos o negativos.
     //Si son positivos, son usuarios, si son negativos, son sucursales.
     //
     //Cuando un usuario cancela su abono a un prestamo, se incrementa su deuda.
     //
     //Cuando una sucursal cancela su abono, solo se afecta el prestamo, pues
     //la cuenta de la sucursal se calcula a partir de todos sus movimientos
     //y es en el prestamo donde se vera reflejado el cambio.
     //
     $id_solicitante = $prestamo->getIdSolicitante();
     if ($id_solicitante > 0) {
         $solicitante = UsuarioDAO::getByPK($id_solicitante);
     } else {
         $solicitante = SucursalDAO::getByPK($id_solicitante * -1);
     }
     if (is_null($solicitante)) {
         Logger::error("FATAL!!!! El prestamo de este abono no tiene un solicitante");
         throw new Exception("FATAL!!!! El prestamo de este abono no tiene un solicitante");
     }
     $monto = $abono->getMonto();
     if ($id_solicitante > 0) {
         $solicitante->setSaldoDelEjercicio($solicitante->getSaldoDelEjercicio() - $monto);
     }
     $prestamo->setSaldo($prestamo->getSaldo() - $monto);
     //
     //Un Prestamo no puede ser cancelado, solo liquidado.
     //
     //Si no hay una caja, se tomara el dinero como ganado.
     //
     if (!is_null($id_caja)) {
         try {
             CajasController::modificarCaja($id_caja, 0, $billetes, $monto);
         } catch (Exception $e) {
             throw $e;
         }
     }
     try {
         self::eliminarCheques($abono->getIdAbonoPrestamo(), null, null, 1);
     } catch (Exception $e) {
         throw $e;
     }
     //
     //Si no ha ocurrido ningun error con los billetes o con la caja, actualizas
     //al usuario y a la compra
     //
     DAO::transBegin();
     try {
         if ($id_solicitante > 0) {
             UsuarioDAO::save($solicitante);
         }
         PrestamoDAO::save($prestamo);
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("No se ha podido actualizar al usuario ni al prestamo: " . $e);
         throw new Exception("No se ha podido actualizar al usuario ni al prestamo");
     }
     DAO::transEnd();
 }
 /**
  *
  *Obtener los detalles de un cliente.
  *
  * @param id_cliente int Id del cliente del cual se listarn sus datos.
  * @return cliente json Arreglo que contendr� la informaci�n del cliente. 
  **/
 public static function Detalle($id_cliente)
 {
     Logger::log("Listando los detalles del cliente");
     //valida que el cliente exista, que sea cliente y que este activo
     /*$validar = self::validarParametrosCliente($id_cliente);
     		if(is_string($validar))
     		{
     			Logger::error($validar);
     			throw new Exception($validar,901);
     		}*/
     //Se regresa un arreglo que contendra en el primer campo el cliente en si, en segundo campo estara
     //su direccion, el tercero sera su direccion alterna, el cuarto sera la sucursal en la que fue dado de alta,
     //la quinta sera el rol que tiene, la sexta sera su clasificacion, la septima la moneda que prefiere.
     $cliente = array();
     $c = UsuarioDAO::getByPK($id_cliente);
     array_push($cliente, $c);
     array_push($cliente, DireccionDAO::getByPK($c->getIdDireccion()));
     array_push($cliente, DireccionDAO::getByPK($c->getIdDireccionAlterna()));
     array_push($cliente, SucursalDAO::getByPK($c->getIdSucursal()));
     array_push($cliente, RolDAO::getByPK($c->getIdRol()));
     array_push($cliente, ClasificacionClienteDAO::getByPK($c->getIdClasificacionCliente()));
     array_push($cliente, MonedaDAO::getByPK($c->getIdMoneda()));
     array_push($cliente, ExtraParamsValoresDAO::getVals("usuarios", $id_cliente));
     return $cliente;
 }
 public function testUltimoCorte3()
 {
     $id = ScenarioMaker::CreateSucursalAndReturnID();
     $this->assertNull(EfectivoController::UltimoCorte(SucursalDAO::getByPK($id)));
 }
    $btn_eliminar = new MenuItem("Desactivar esta caja", null);
    $btn_eliminar->addApiCall("api/sucursal/caja/eliminar", "GET");
    $btn_eliminar->onApiCallSuccessRedirect("sucursales.lista.caja.php");
    $btn_eliminar->addName("eliminar");
    $funcion_eliminar = " function eliminar_caja(btn){" . "if(btn == 'yes')" . "{" . "var p = {};" . "p.id_caja = " . $_GET["cid"] . ";" . "sendToApi_eliminar(p);" . "}" . "}" . "      " . "function confirmar(){" . " Ext.MessageBox.confirm('Desactivar', 'Desea eliminar esta caja?', eliminar_caja );" . "}";
    $btn_eliminar->addOnClick("confirmar", $funcion_eliminar);
    $menu->addMenuItem($btn_eliminar);
    $page->addComponent($menu);
}
//
// Forma de producto
//
$form = new DAOFormComponent($esta_caja);
$form->setEditable(false);
$form->hideField(array("id_caja", "id_cuenta_contable"));
$form->createComboBoxJoin("id_sucursal", "descripcion", SucursalDAO::getAll(), $esta_caja->getIdSucursal());
$form->createComboBoxJoin("activa", "activa", array(array("id" => 0, "caption" => "No"), array("id" => 1, "caption" => "Si")), $esta_caja->getActiva());
$form->createComboBoxJoin("control_billetes", "control_billetes", array(array("id" => 0, "caption" => "No"), array("id" => 1, "caption" => "Si")), $esta_caja->getControlBilletes());
$form->createComboBoxJoin("abierta", "abierta", array(array("id" => 0, "caption" => "No"), array("id" => 1, "caption" => "Si")), $esta_caja->getAbierta());
$page->addComponent($form);
if ($esta_caja->getControlBilletes()) {
    $page->addComponent(new TitleComponent("Billetes en esta caja", 3));
    $tabla = new TableComponent(array("id_billete" => "Billete", "cantidad" => "Cantidad"), BilleteCajaDAO::search(new BilleteCaja(array("id_caja" => $_GET["cid"]))));
    function funcion_billete($id_billete)
    {
        return BilleteDAO::getByPK($id_billete) ? BilleteDAO::getByPK($id_billete)->getNombre() : "------";
    }
    $tabla->addColRender("id_billete", "funcion_billete");
    $tabla->addOnClick("id_billete", "(function(a){window.location = 'efectivo.billete.ver.php?bid='+a;})");
    $page->addComponent($tabla);
}
 /**
  * Crea un pdf con el estado de cuenta de el cliente especificado
  * @param Array $args,  $args['id_cliente'=>12[,'tipo_venta'=> 'credito | contado | saldo'] ], por default obtiene todas las compras del cliente
  */
 public static function imprimirEstadoCuentaCliente($args)
 {
     //verificamos que se haya especificado el id del cliente
     if (!isset($args['id_cliente'])) {
         Logger::log("Error al obtener el estado de cuenta, no se ha especificado un cliente.");
         die('{"success": false, "reason": "Error al obtener el estado de cuenta, no se ha especificado un cliente."}');
     }
     //verificamos que el cliente exista
     if (!($cliente = ClienteDAO::getByPK($args['id_cliente']))) {
         Logger::log("Error al obtener el estado de cuenta, no se tiene registro del cliente {$args['id_cliente']}.");
         die('{"success": false, "reason": "Error al obtener el estado de cuenta, no se tiene registro del cliente ' . $args['id_cliente'] . '"}');
     }
     //obtenemos los datos del emisor
     $estado_cuenta = estadoCuentaCliente($args);
     //buscar los datos del emisor
     if (!($emisor = PosConfigDAO::getByPK('emisor'))) {
         Logger::log("no encuentro los datos del emisor");
         die("no encuentro los datos del emisor");
     }
     $emisor = json_decode($emisor->getValue())->emisor;
     $sucursal = SucursalDAO::getByPK($_SESSION['sucursal']);
     if (!$sucursal) {
         die("Sucursal invalida");
     }
     include_once 'librerias/ezpdf/class.pdf.php';
     include_once 'librerias/ezpdf/class.ezpdf.php';
     $pdf = new Cezpdf();
     $pdf->selectFont('../server/librerias/ezpdf/fonts/Helvetica.afm');
     //margenes de un centimetro para toda la pagina
     $pdf->ezSetMargins(1, 1, 1, 1);
     /*
      * LOGO
      */
     if (!($logo = PosConfigDAO::getByPK('url_logo'))) {
         Logger::log("Verifique la configuracion del pos_config, no se encontro el camṕo 'url_logo'");
         die("Verifique la configuracion del POS, no se encontro el url del logo");
     }
     //addJpegFromFile(imgFileName,x,y,w,[h])
     //detectamos el tipo de imagen del logo
     if (substr($logo->getValue(), -3) == "jpg" || substr($logo->getValue(), -3) == "JPG" || substr($logo->getValue(), -4) == "jpeg" || substr($logo->getValue(), -4) == "JPEG") {
         $pdf->addJpegFromFile($logo->getValue(), puntos_cm(2), puntos_cm(25.5), puntos_cm(3.5));
     } elseif (substr($logo->getValue(), -3) == "png" || substr($logo->getValue(), -3) == "PNG") {
         $pdf->addPngFromFile($logo->getValue(), puntos_cm(2), puntos_cm(25.5), puntos_cm(3.5));
     } else {
         Logger::log("Verifique la configuracion del pos_config, la extension de la imagen del logo no es compatible");
         die("La extension de la imagen usada para el logo del negocio no es valida.");
     }
     /*     * ************************
      * ENCABEZADO
      * ************************* */
     $e = "<b>" . self::readableText($emisor->nombre) . "</b>\n";
     $e .= formatAddress($emisor);
     $e .= "RFC: " . $emisor->rfc . "\n\n";
     //datos de la sucursal
     $e .= "<b>Lugar de expedicion</b>\n";
     $e .= self::readableText($sucursal->getDescripcion()) . "\n";
     $e .= formatAddress($sucursal);
     $datos = array(array("emisor" => $e));
     $pdf->ezSetY(puntos_cm(28.6));
     $opciones_tabla = array();
     $opciones_tabla['showLines'] = 0;
     $opciones_tabla['showHeadings'] = 0;
     $opciones_tabla['shaded'] = 0;
     $opciones_tabla['fontSize'] = 8;
     $opciones_tabla['xOrientation'] = 'right';
     $opciones_tabla['xPos'] = puntos_cm(7.3);
     $opciones_tabla['width'] = puntos_cm(11);
     $opciones_tabla['textCol'] = array(0, 0, 0);
     $opciones_tabla['titleFontSize'] = 12;
     $opciones_tabla['rowGap'] = 3;
     $opciones_tabla['colGap'] = 3;
     $pdf->ezTable($datos, "", "", $opciones_tabla);
     $cajero = UsuarioDAO::getByPK($_SESSION['userid'])->getNombre();
     $datos = array(array("col" => "<b>Cajero</b>"), array("col" => self::readableText($cajero)), array("col" => "<b>Cliente</b>"), array("col" => self::readableText($cliente->getRazonSocial())), array("col" => "<b>Limite de  Credito</b>"), array("col" => FormatMoney($estado_cuenta->limite_credito, DONT_USE_HTML)), array("col" => "<b>Saldo</b>"), array("col" => FormatMoney($estado_cuenta->saldo, DONT_USE_HTML)));
     $pdf->ezSetY(puntos_cm(28.8));
     $opciones_tabla['xPos'] = puntos_cm(12.2);
     $opciones_tabla['width'] = puntos_cm(6);
     $opciones_tabla['showLines'] = 0;
     $opciones_tabla['shaded'] = 2;
     $opciones_tabla['shadeCol'] = array(1, 1, 1);
     //$opciones_tabla['shadeCol2'] = array(0.054901961, 0.756862745, 0.196078431);
     $opciones_tabla['shadeCol2'] = array(0.8984375, 0.95703125, 0.99609375);
     $pdf->ezTable($datos, "", "", $opciones_tabla);
     //roundRect($pdf, puntos_cm(12.2), puntos_cm(28.8), puntos_cm(6), puntos_cm(4.25));
     /**
      * ESTADO DE CUENTA
      */
     $elementos = array(array('id_venta' => 'Venta', 'fecha' => 'Fecha', 'sucursal' => 'Sucursal', 'cajero' => 'Cajero', 'tipo_venta' => 'Tipo', 'tipo_pago' => 'Pago', 'total' => 'Total', 'pagado' => 'Pagado', 'saldo' => 'Saldo'));
     foreach ($estado_cuenta->array_ventas as $venta) {
         $array_venta = array();
         $array_venta['id_venta'] = $venta['id_venta'];
         $array_venta['fecha'] = $venta['fecha'];
         $array_venta['sucursal'] = self::readableText($venta['sucursal']);
         $array_venta['cajero'] = self::readableText($venta['cajero']);
         $array_venta['cancelada'] = self::readableText($venta['cancelada']);
         $array_venta['tipo_venta'] = self::readableText($venta['tipo_venta']);
         $array_venta['tipo_pago'] = self::readableText($venta['tipo_pago']);
         $array_venta['total'] = FormatMoney($venta['total'], DONT_USE_HTML);
         $array_venta['pagado'] = FormatMoney($venta['pagado'], DONT_USE_HTML);
         $array_venta['saldo'] = FormatMoney($venta['saldo'], DONT_USE_HTML);
         array_push($elementos, $array_venta);
     }
     $pdf->ezText("", 8, array('justification' => 'center'));
     $pdf->ezSetY(puntos_cm(24));
     $opciones_tabla['xPos'] = puntos_cm(2);
     $opciones_tabla['width'] = puntos_cm(16.2);
     $pdf->ezTable($elementos, "", "Estado de Cuenta", $opciones_tabla);
     //roundRect($pdf, puntos_cm(2), puntos_cm(24.3), puntos_cm(16.2), puntos_cm(3.2));
     /*     * ************************
      * notas de abajo
      * ************************* */
     $pdf->setLineStyle(1);
     $pdf->setStrokeColor(0.3359375, 0.578125, 0.89453125);
     $pdf->line(puntos_cm(2), puntos_cm(1.3), puntos_cm(18.2), puntos_cm(1.3));
     $pdf->addText(puntos_cm(2), puntos_cm(1.0), 7, "Fecha de impresion: " . date("d/m/y") . " " . date("H:i:s"));
     //addJpegFromFile(imgFileName,x,y,w,[h])
     //$pdf->addJpegFromFile("../www/media/logo_simbolo.jpg", puntos_cm(15.9), puntos_cm(.25), 25);
     $pdf->addText(puntos_cm(16.7), puntos_cm(0.6), 8, "caffeina.mx");
     $pdf->ezStream();
 }
 /**
  *Lista los productos por empresa, almacen y lote
  */
 public static function listarProductosLote($activo = null, $id_almacen = null, $id_empresa = null)
 {
     //objeto que se regresara
     $company = new stdClass();
     //contiene todas las empresas
     $company->empresas = array();
     //obtenemos todas las empresas
     $empresas = EmpresaDAO::getAll();
     //iteramos las empresas para obtener sus almacenes
     foreach ($empresas as $empresa) {
         //insertamos la empresa a la compañia
         $e = new stdClass();
         $e->id_empresa = $empresa->getIdEmpresa();
         $e->nombre = $empresa->getRazonSocial();
         $e->almacenes = array();
         $almacenes = AlmacenDAO::search(new Almacen(array("id_empresa" => $empresa->getIdEmpresa())));
         //iteramos todos los almacenes de la empresa
         foreach ($almacenes as $almacen) {
             $a = new stdClass();
             $a->id_almacen = $almacen->getIdAlmacen();
             $a->nombre = $almacen->getNombre();
             $a->id_sucursal = $almacen->getIdSucursal();
             $a->sucursal = SucursalDAO::getByPK($a->id_sucursal)->getRazonSocial();
             $a->lotes = array();
             //obtenemos todos los lotes del almacen
             $lotes = LoteDAO::search(new Lote(array("id_almacen" => $almacen->getIdAlmacen())));
             //iteramos todos los lotes del almacen
             foreach ($lotes as $lote) {
                 $l = new StdClass();
                 $l->id_lote = $lote->getIdLote();
                 $l->id_almacen = $lote->getIdAlmacen();
                 $l->folio = $lote->getFolio();
                 $l->lotes_producto = array();
                 //obtenemos todos los productos de un lote
                 $lotes_producto = LoteProductoDAO::search(new LoteProducto(array("id_lote" => $lote->getIdLote())));
                 //iteramos lodos los lotes con producto que perteneces al lote
                 foreach ($lotes_producto as $lote_producto) {
                     $producto = ProductoDAO::getByPK($lote_producto->getIdProducto());
                     $lp = new StdClass();
                     $lp->id_lote = $lote_producto->getIdLote();
                     $lp->id_producto = $lote_producto->getIdProducto();
                     $lp->cantidad = $lote_producto->getCantidad();
                     $lp->id_unidad = $lote_producto->getIdUnidad();
                     $lp->unidad = UnidadMedidaDAO::getByPK($lp->id_unidad)->getAbreviacion();
                     //$lp->recalculo = ProductoDAO::ExistenciasTotales($lp->id_producto);
                     $lp->recalculo = ProductoDAO::ExistenciasLote($lp->id_producto, $lp->id_lote, $lp->id_unidad);
                     $lp->nombre = $producto->getNombreProducto();
                     $lp->codigo = $producto->getCodigoProducto();
                     array_push($l->lotes_producto, $lp);
                 }
                 array_push($a->lotes, $l);
             }
             array_push($e->almacenes, $a);
         }
         array_push($company->empresas, $e);
     }
     return $company;
 }
	          ['Alice', 'Mike', ''],
	          ['Bob', 'Jim', 'Bob Sponge'],
	          ['Carol', 'Bob', ''],
			  ['Carol2', 'Bob', '']	
			  */
			
				<?php 
$empresas = EmpresaDAO::getAll();
//iterar empresas
foreach ($empresas as $e) {
    echo "[ { v: '" . $e->getRazonSocial() . "', f: '<div>Empresa</div>" . $e->getRazonSocial() . "' } , '' ],\n ";
    //buscar sucursales de compui
    $id_sucursales = SucursalEmpresaDAO::search(new SucursalEmpresa(array("id_empresa" => $e->getIdEmpresa())));
    //iterear sucursales
    foreach ($id_sucursales as $id_s) {
        $s = SucursalDAO::getByPK($id_s->getIdSucursal());
        echo "/* sucursal, empresa */[  { v: '" . $s->getRazonSocial() . "', f: '<div>Sucursal</div>" . $s->getRazonSocial() . "' } , '" . $e->getRazonSocial() . "' ], \n";
        //iterar almacenes
        $almacenes = AlmacenDAO::search(new Almacen(array("id_almacen")));
        foreach ($almacenes as $a) {
            echo "/* almacen, sucursal */ [ { v: '" . $a->getNombre() . "', f: '<div>Almacen</div>" . $a->getNombre() . "' }, '" . $s->getRazonSocial() . "' ], \n";
            //lotes de esa sucursal
            $lotes = LoteDAO::search(new Lote(array("id_almacen" => $a->getIdAlmacen())));
            foreach ($lotes as $l) {
                echo "/* lote, almacen */[ { v: '" . $l->getFolio() . "', f: '<div>Lote</div>" . $l->getFolio() . "' }, '" . $a->getNombre() . "' ], \n";
            }
        }
        //for-each sucursales
    }
    //for-each id_sucursales
}
 private static function validarParametrosSeguimiento($id_seguimiento_de_servicio = null, $id_orden_de_servicio = null, $id_localizacion = null, $estado = null)
 {
     //valida que el seguimiento exista
     if (!is_null($id_seguimiento_de_servicio)) {
         $seguimiento = SeguimientoDeServicioDAO::getByPK($id_seguimiento_de_servicio);
         if (is_null($seguimiento)) {
             return "El seguimiento " . $id_seguimiento_de_servicio . " no existe";
         }
     }
     //valida que la orden de servicio exista y este activa
     if (!is_null($id_orden_de_servicio)) {
         $orden_de_servicio = OrdenDeServicioDAO::getByPK($id_orden_de_servicio);
         if (is_null($orden_de_servicio)) {
             return "La orden de servicio " . $id_orden_de_servicio . " no existe";
         }
         if (!$orden_de_servicio->getActiva()) {
             return "La orden de servicio " . $id_orden_de_servicio . " esta desactivada";
         }
     }
     //valida que la localizacion sea una sucursal valida o sea un -1 para indicar que esta en movimiento
     if (!is_null($id_localizacion)) {
         $sucursal = SucursalDAO::getByPK($id_localizacion);
         if (is_null($sucursal) && $id_localizacion != -1) {
             return "La localizacion " . $id_localizacion . " no es valida";
         }
     }
     //valida que el estado este en rango
     if (!is_null($estado)) {
         $e = self::validarLongitudDeCadena($estado, 255, "estado");
         if (is_string($e)) {
             return $e;
         }
     }
     //No se encontro error
     return true;
 }
 /**
  * Desactivar Almacen
  */
 public function testDesactivarAlmacen()
 {
     POSController::DropBd();
     $usuario = UsuarioDAO::getAll();
     if (sizeof($usuario) == 0) {
         Logger::error("WHOOOT no hay usuarios en la BD");
         return;
     }
     $id_usuario = $usuario[0]->getIdUsuario();
     @DireccionDAO::save($direccion = new Direccion(array("calle" => "Una Calle", "numero_exterior" => "322", "id_ciudad" => "12", "codigo_postal" => "38000", "ultima_modificacion" => "2012-02-21 22:10:45", "id_usuario_ultima_modificacion" => "2")));
     @EmpresaDAO::save($empresa = new Empresa(array("id_direccion" => $direccion->getIdDireccion(), "rfc" => "RFC_" . time(), "razon_social" => "Empresa_Razon_Social__" . time(), "fecha_alta" => "2012-02-21 22:10:45", "activo" => 1, "direccion_web" => "Dir_" . time())));
     @SucursalDAO::save($sucursal = new Sucursal(array("id_direccion" => $direccion->getIdDireccion(), "razon_social" => "Sucursal_Razon_Social__" . time(), "saldo_a_favor" => 2000, "fecha_apertura" => "2012-02-21 22:10:45", "activa" => 1)));
     $tipo_almacen = AlmacenesController::NuevoTipo("Nuevo_Tipo_Almacen___" . time());
     Logger::log("Nuevo almacen");
     $almacen = AlmacenesController::Nuevo($id_empresa = $empresa->getIdEmpresa(), $id_sucursal = $sucursal->getIdSucursal(), $id_tipo_almacen = $tipo_almacen["id_tipo_almacen"], $nombre = "Almacen_Editar" . time(), $descripcion = "Almacen de prueba_ " . time());
     // Desactivamos el Almacen
     Logger::log("A desactivar almacen recien creado");
     $almacen_desactivado = AlmacenesController::Desactivar($id_almacen = $almacen["id_almacen"]);
     $_almacen = AlmacenDAO::getByPK($almacen["id_almacen"]);
     $this->assertEquals(0, $_almacen->getActivo());
 }
    $btn_eliminar = new MenuItem("Desactivar este almacen", null);
    $btn_eliminar->addApiCall("api/sucursal/almacen/eliminar", "GET");
    $btn_eliminar->onApiCallSuccessRedirect("sucursales.lista.almacen.php");
    $btn_eliminar->addName("eliminar");
    $funcion_eliminar = " function eliminar_almacen(btn){" . "if(btn == 'yes')" . "{" . "var p = {};" . "p.id_almacen = " . $_GET["aid"] . ";" . "sendToApi_eliminar(p);" . "}" . "}" . "      " . "function confirmar(){" . " Ext.MessageBox.confirm('Desactivar', 'Desea eliminar este almacen?', eliminar_almacen );" . "}";
    $btn_eliminar->addOnClick("confirmar", $funcion_eliminar);
    $menu->addMenuItem($btn_eliminar);
    $page->addComponent($menu);
}
//
// Forma de producto
//
$form = new DAOFormComponent($este_almacen);
$form->setEditable(false);
$form->hideField(array("id_almacen"));
$form->createComboBoxJoin("id_sucursal", "razon_social", SucursalDAO::getAll(), $este_almacen->getIdSucursal());
$form->createComboBoxJoin("id_empresa", "razon_social", EmpresaDAO::search(new Empresa(array("activo" => 1))), $este_almacen->getIdEmpresa());
$form->createComboBoxJoin("id_tipo_almacen", "descripcion", TipoAlmacenDAO::getAll(), $este_almacen->getIdTipoAlmacen());
$page->addComponent($form);
$page->addComponent(new TitleComponent("Productos en este almacen"), 3);
$tabla = new TableComponent(array("id_producto" => "Producto", "id_unidad" => "Unidad", "cantidad" => "Cantidad"), ProductoAlmacenDAO::search(new ProductoAlmacen(array("id_almacen" => $_GET["aid"]))));
function funcion_producto($id_producto)
{
    return ProductoDAO::getByPK($id_producto) ? ProductoDAO::getByPK($id_producto)->getNombreProducto() : "--------";
}
function funcion_unidad($id_unidad)
{
    return UnidadDAO::getByPK($id_unidad) ? UnidadDAO::getByPK($id_unidad)->getNombre() : "---------";
}
$tabla->addColRender("id_producto", "funcion_producto");
$tabla->addColRender("id_unidad", "funcion_unidad");
 /**
  *
  *Muestra los productos y/o servicios englobados en este paquete as? como las sucursales y las empresas donde lo ofrecen
  *
  * @param id_paquete int Id del paquete a visualizar sus detalles
  * @return detalle_paquete json Informacion del detalle del paquete
  **/
 public static function Detalle($id_paquete)
 {
     Logger::log("consiguiendo los detalles del paquete");
     //valida que el paquete exista
     $paquete = PaqueteDAO::getByPK($id_paquete);
     if (is_null($paquete)) {
         Logger::error("El paquete " . $id_paquete . " no existe");
         throw new Exception("El paquete " . $id_paquete . " no existe");
     }
     //En el primer campo de un arreglo se almacena el paquete en sí, en el segundo las empresas en las que esta disponible el paquete,
     //en el tercero las sucursales en las que esta disponible, en el cuarto los productos que contiene y en el quinto los servicios
     $detalle_paquete = array();
     array_push($detalle_paquete, $paquete);
     $empresas = array();
     $paquetes_empresa = PaqueteEmpresaDAO::search(new PaqueteEmpresa(array("id_paquete" => $id_paquete)));
     foreach ($paquetes_empresa as $paquete_empresa) {
         array_push($empresas, EmpresaDAO::getByPK($paquete_empresa->getIdEmpresa()));
     }
     array_push($detalle_paquete, $empresas);
     $sucursales = array();
     $paquetes_sucursal = PaqueteSucursalDAO::search(new PaqueteSucursal(array("id_paquete" => $id_paquete)));
     foreach ($paquetes_sucursal as $paquete_sucursal) {
         array_push($sucursales, SucursalDAO::getByPK($paquete_sucursal->getIdSucursal()));
     }
     array_push($detalle_paquete, $sucursales);
     $productos = array();
     $productos_paquete = ProductoPaqueteDAO::search(new ProductoPaquete(array("id_paquete" => $id_paquete)));
     foreach ($productos_paquete as $producto_paquete) {
         array_push($productos, ProductoDAO::getByPK($producto_paquete->getIdProducto()));
     }
     array_push($detalle_paquete, $productos);
     $servicios = array();
     $servicios_paquete = OrdenDeServicioPaqueteDAO::search(new OrdenDeServicioPaquete(array("id_paquete" => $id_paquete)));
     foreach ($servicios_paquete as $servicio_paquete) {
         array_push($servicios, ServicioDAO::getByPK($servicio_paquete->getIdServicio()));
     }
     array_push($detalle_paquete, $servicios);
     Logger::log("Detalle de paquete " . $id_paquete . " conseguido exitosamente con " . count($empresas) . "\n                empresas, " . count($sucursales) . " sucursales, " . count($productos) . " productos y " . count($servicios) . " servicios");
     return $detalle_paquete;
 }
Exemple #17
0
$page->addComponent(new TitleComponent("Editando a " . $este_cliente->getNombre(), 2));
$page->nextTab("General");
$form = new DAOFormComponent($este_cliente);
$form->hideField(array("id_usuario", "id_rol", "id_clasificacion_proveedor", "id_direccion", "id_direccion_alterna", "fecha_asignacion_rol", "comision_ventas", "fecha_alta", "fecha_baja", "activo", "last_login", "salario", "dias_de_embarque", "consignatario", "tiempo_entrega", "cuenta_bancaria", "mensajeria", "token_recuperacion_pass", "ventas_a_credito", "dia_de_pago", "dia_de_revision", "id_clasificacion_cliente"));
$form->renameField(array("id_usuario" => "id_cliente"));
$form->sendHidden("id_cliente");
$form->setValueField("password", "");
$form->createComboBoxJoin("id_moneda", "nombre", MonedaDAO::search(new Moneda(array("activa" => 1))), $este_cliente->getIdMoneda());
$clasificaciones = ContactosController::BuscarCategoria();
$clasificaciones = $clasificaciones['categorias'];
foreach ($clasificaciones as $key => $clasificacion) {
    $clasificacion->caption = $clasificacion->nombre;
    $clasificaciones[$key] = $clasificacion->asArray();
}
$form->createComboBoxJoin('id_categoria_contacto', 'nombre', $clasificaciones);
$form->createComboBoxJoin("id_sucursal", "razon_social", SucursalDAO::search(new Sucursal(array("activa" => 1))), $este_cliente->getIdSucursal());
$form->createComboBoxJoinDistintName("id_tarifa_venta", "id_tarifa", "nombre", TarifaDAO::search(new Tarifa(array("tipo_tarifa" => "venta"))));
$form->createComboBoxJoin("id_tarifa_compra", "nombre", TarifaDAO::search(new Tarifa(array("tipo_tarifa" => "compra"))));
$form->createComboBoxJoin("tarifa_compra_obtenida", "tarifa_compra_obtenida", array("rol", "proveedor", "cliente", "usuario"));
$form->createComboBoxJoin("tarifa_venta_obtenida", "tarifa_venta_obtenida", array("rol", "proveedor", "cliente", "usuario"));
$form->addApiCall("api/cliente/editar/", "POST");
$form->onApiCallSuccessRedirect("clientes.ver.php?cid=" . $_GET["cid"]);
$form->renameField(array("nombre" => "razon_social", "codigo_usuario" => "codigo_cliente", "correo_electronico" => "email", "id_categoria_contacto" => "clasificacion_cliente", "id_moneda" => "moneda_del_cliente", "pagina_web" => "sitio_web", "id_sucursal" => "sucursal"));
$page->addComponent($form);
$page->nextTab("Otros");
//buscar los parametros extra
$out = ExtraParamsValoresDAO::getVals("usuarios", $este_cliente->getIdUsuario());
$epform = new FormComponent();
$epform->setEditable(true);
foreach ($out as $ep) {
    $epform->addField($ep["campo"], $ep["caption"], $ep["tipo"], $ep["val"]);
 /**
      *
      * Ver la lista de productos y sus existencias, se puede filtrar por empresa, sucursal, almac?n, y lote.
       Se puede ordenar por los atributos de producto.
      *
      * @param existencia_mayor_que float Se regresaran los productos cuya existencia sea mayor a la especificada por este valor
      * @param existencia_igual_que float Se regresaran los productos cuya existencia sea igual a la especificada por este valor
      * @param existencia_menor_que float Se regresaran los productos cuya existencia sea menor a la especificada por este valor
      * @param id_empresa int Id de la empresa de la cual se vern los productos.
      * @param id_sucursal int Id de la sucursal de la cual se vern los productos.
      * @param id_almacen	 int Id del almacen del cual se vern los productos.
      * @param activo	 bool Si es true, mostrar solo los productos que estn activos, si es false mostrar solo los productos que no lo sean.
      * @param id_lote int Id del lote del cual se veran los productos en existencia
      * @return existecias json Lista de existencias
      * */
 public static function Existencias($id_almacen = null, $id_empresa = null, $id_producto = null, $id_sucursal = null)
 {
     $e = AlmacenDAO::Existencias();
     return array("resultados" => $e, "numero_de_resultados" => sizeof($e));
     $daoProductos = ProductoDAO::getAll();
     $aOut = array();
     $daoAlmacenes = AlmacenDAO::getAll();
     for ($iProd = 0; $iProd < sizeof($daoProductos); $iProd++) {
         //por cada almacen
         for ($iAl = 0; $iAl < sizeof($daoAlmacenes); $iAl++) {
             //buscar sus lotes
         }
         array_push($aOut, $daoProductos[$iProd]->asArray());
     }
     return array("numero_de_resultados" => sizeof($aOut), "resultados" => $aOut);
     //Si se recibe un id producto, solo se listan las existencias de dicho producto, se puede combinar con
     //los demas parametros. Si no se recibe ningun otro, se realiza un acumulado de este producto en todos los almacenes.
     //
     //Si se recibe un id almacen, solo se listan las existencias de dicho almacen
     //
     //Si se recibe la variable id_empresa o id_sucursal, se listara un acumulado de todos los productos
     //con las cantidades de productos de los diferentes almacenes dentro de ella
     //
     //Cuando se recibe alguno de ellos, primero se consiguen todos los almacenes que le pertencen, despues
     //se consiguen todos los productos de cada almacen y se guardan en un arreglo temporal que despues es ordenado.
     //EL arreglo ordenado es el que se envia.
     //
     //Si no se recibe ningun parametro, se listaran todos los productos existentes en todos los almacenes
     $productos_almacenes = array();
     //Si solo se especifica un producto, se regresa un arreglo con las sucursales donde esta ese producto y
     //la cantidad total en cada una
     if (!is_null($id_producto) && is_null($id_almacen) && is_null($id_empresa) && is_null($id_sucursal)) {
         //Se obtienen todas las sucursales y se llama recursivamente a este metodo
         $sucursales = SucursalDAO::search(new Sucursal(array("activa" => 1)));
         $result = array();
         foreach ($sucursales as $sucursal) {
             $p_a = self::Existencias(null, null, $id_producto, $sucursal->getIdSucursal());
             if ($p_a["numero_de_resultados"] > 0) {
                 foreach ($p_a["resultados"] as $p) {
                     $result["id_sucursal"] = $sucursal->getIdSucursal();
                     $suc = SucursalDAO::getByPK($sucursal->getIdSucursal());
                     $result["nombre_sucursal"] = $suc->getDescripcion();
                     $result["id_producto"] = $p->getIdProducto();
                     $result["id_unidad"] = $p->getIdUnidad();
                     $result["cantidad"] = $p->getCantidad();
                     array_push($productos_almacenes, $result);
                 }
             }
         }
     } else {
         if (!is_null($id_almacen)) {
             //Se buscan los registros de productos que cumplan con el almacen y con el producto recibidos
             $productos_almacenes = LoteProductoDAO::search(new LoteProducto(array("id_almacen" => $id_almacen, "id_producto" => $id_producto)));
         } else {
             if (!is_null($id_empresa)) {
                 //Se obtienen todos los almacenes de la empresa
                 $almacenes_empresa = AlmacenDAO::search(new Almacen(array("id_empresa" => $id_empresa)));
                 $productos_almacenes_empresa = array();
                 //Se recorre cada almacen y se obtiene un arreglo de sus productos, para poder agruparlos, tenemos que seacarlos
                 //de su arreglo y ponerlos en un arreglo general
                 foreach ($almacenes_empresa as $almacen_empresa) {
                     //Se obtiene el arreglo de productos
                     $productos_almacen_empresa = LoteProductoDAO::search(new LoteProducto(array("id_almacen" => $almacen_empresa->getIdAlmacen(), "id_producto" => $id_producto)));
                     //Se vacía el arreglo en uno general
                     foreach ($productos_almacen_empresa as $producto_almacen_empresa) {
                         array_push($productos_almacenes_empresa, $producto_almacen_empresa);
                     }
                 }
                 //Se agrupan los productos iguales
                 $productos_almacenes = self::AgruparProductos($productos_almacenes_empresa);
             } else {
                 if (!is_null($id_sucursal)) {
                     //Se obtienen todos los almacenes de la sucursal
                     $almacenes_sucursal = AlmacenDAO::search(new Almacen(array("id_sucursal" => $id_sucursal)));
                     $productos_almacenes_sucursal = array();
                     //Se recorre cada almacen y se obtiene un arreglo de sus productos, para poder agruparlos, tenemos que sacarlos
                     //de su arreglo y ponerlos en un arreglo general
                     foreach ($almacenes_sucursal as $almacen_sucursal) {
                         //Se obtiene el arreglo de productos
                         $productos_almacen_sucursal = LoteProductoDAO::search(new LoteProducto(array("id_almacen" => $almacen_sucursal->getIdAlmacen(), "id_producto" => $id_producto)));
                         //Se vacía el arreglo en uno general
                         foreach ($productos_almacen_sucursal as $producto_almacen_sucursal) {
                             array_push($productos_almacenes_sucursal, $producto_almacen_sucursal);
                         }
                     }
                     //Se agrupan los productos iguales
                     $productos_almacenes = self::AgruparProductos($productos_almacenes_sucursal);
                 } else {
                     //Se obtienen todos los almacenes
                     $almacenes = AlmacenDAO::getAll();
                     $productos_almacen = array();
                     //Se recorre cada almacen y se obtiene un arreglo de sus productos, para poder agruparlos, tenemos que sacarlos
                     //de su arreglo y ponerlos en un arreglo general
                     foreach ($almacenes as $almacen) {
                         //Se obtiene el arreglo de productos
                         $productos_a = LoteProductoDAO::search(new LoteProducto(array("id_almacen" => $almacen->getIdAlmacen(), "id_producto" => $id_producto)));
                         //Se vacía el arreglo en uno general
                         foreach ($productos_a as $p_a) {
                             array_push($productos_almacen, $p_a);
                         }
                     }
                     //Se agrupan los productos iguales
                     $productos_almacenes = self::AgruparProductos($productos_almacen);
                 }
             }
         }
     }
     Logger::log("Se listan " . count($productos_almacenes) . " registros");
     $existencias = array("resultados" => $productos_almacenes, "numero_de_resultados" => count($productos_almacenes));
     return $existencias;
 }
 /**
  *Detalles($id_empresa)
  *
  *Muestra los detalles de una empresa en especifico. 
  *
  * @author Juan Manuel Garc&iacute;a Carmona <*****@*****.**>
  * @param id_empresa int Id de la empresa
  **/
 public static function Detalles($id_empresa)
 {
     //verificamos si la empresa a consular existe
     if (!($empresa = EmpresaDAO::getByPK($id_empresa))) {
         Logger::error("No se tiene registro de la empresa {$id_empresa}");
         throw new InvalidDataException("No se tiene registro de la empresa {$id_empresa}");
     }
     //extraemos su domicilio fiscal
     if (!($direccion = DireccionDAO::getByPK($empresa->getIdDireccion()))) {
         $direccion = new stdClass();
     }
     //relacionamos a la empresa con la direccion
     $empresa->direccion = $direccion;
     //obtenemos el logo
     $logo = LogoDAO::getByPK($empresa->getIdLogo());
     if ($logo === NULL) {
         $logo = LogoDAO::getByPK(-1);
     }
     $empresa->logo = $logo->getImagen();
     //obtenemos su contabilidad
     $contabilidad = array();
     $contabilidad["moneda_base"] = EmpresaDAO::getMonedaBase($empresa->getIdEmpresa());
     $contabilidad["ejercicio"] = EmpresaDAO::getEjercicioActual($empresa->getIdEmpresa());
     //extraemos sus sucursales
     $sucursales = array();
     $sucursales_empresa = SucursalEmpresaDAO::search(new SucursalEmpresa(array("id_empresa" => $id_empresa)));
     foreach ($sucursales_empresa as $sucursal_empresa) {
         if ($sucursal = SucursalDAO::getByPK($sucursal_empresa->getIdSucursal())) {
             array_push($sucursales, $sucursal);
         }
     }
     //obtenemos todos los impuestos relacionados a la empresa
     $impuestos_empresa = ImpuestoEmpresaDAO::search(new ImpuestoEmpresa(array("id_empresa" => $id_empresa)));
     //extraemos sus impuestos de compra
     $impuestos_compra = array();
     foreach ($impuestos_empresa as $impuesto_compra_empresa) {
         if (!($impuesto = ImpuestoDAO::getByPK($impuesto_compra_empresa->getIdImpuesto()))) {
             Logger::warn("No se tiene registro de un impuesto con id = " . $impuesto_compra_empresa->getIdImpuesto());
             throw new InvalidDataException("No se tiene registro de un impuesto con id = " . $impuesto_compra_empresa->getIdImpuesto());
         }
         if ($impuesto->getAplica() === "compra" || $impuesto->getAplica() === "ambos") {
             array_push($impuestos_compra, $impuesto);
         }
     }
     //extraemos sus impuestos de venta
     $impuestos_venta = array();
     foreach ($impuestos_empresa as $impuesto_venta_empresa) {
         if (!($impuesto = ImpuestoDAO::getByPK($impuesto_venta_empresa->getIdImpuesto()))) {
             Logger::warn("No se tiene registro de un impuesto con id = " . $impuesto_venta_empresa->getIdImpuesto());
             throw new InvalidDataException("No se tiene registro de un impuesto con id = " . $impuesto_venta_empresa->getIdImpuesto());
         }
         if ($impuesto->getAplica() === "venta" || $impuesto->getAplica() === "ambos") {
             array_push($impuestos_venta, $impuesto);
         }
     }
     return array("detalles" => $empresa, "sucursales" => $sucursales, "impuestos_compra" => $impuestos_compra, "impuestos_venta" => $impuestos_venta, "contabilidad" => $contabilidad);
     Logger::log("Detalles de la empresa enviados con exito");
 }
Exemple #20
0
<?php

define("BYPASS_INSTANCE_CHECK", false);
require_once "../../../server/bootstrap.php";
$page = new GerenciaComponentPage();
// Parametros necesarios
$page->requireParam("sid", "GET", "Esta sucursal no existe.");
$esta_sucursal = SucursalDAO::getByPK($_GET["sid"]);
$esta_direccion = DireccionDAO::getByPK($esta_sucursal->getIdDireccion());
// Titulo de la pagina
$page->addComponent(new TitleComponent("Editar sucursal " . $esta_sucursal->getDescripcion(), 2));
//forma de nueva empresa
$sucursal_form = new DAOFormComponent($esta_sucursal);
$sucursal_form->hideField(array("id_sucursal", "id_direccion", "fecha_apertura", "fecha_baja"));
$sucursal_form->renameField(array("id_gerente" => "id_usuario"));
$sucursal_form->createComboBoxJoin("id_usuario", "nombre", UsuarioDAO::getAll(), $esta_sucursal->getIdGerente());
$sucursal_form->createComboBoxJoin("id_tarifa", "nombre", TarifaDAO::getAll(), $esta_sucursal->getIdTarifa());
$sucursal_form->createComboBoxJoin("activa", "activa", array(array("id" => false, "caption" => "No"), array("id" => true, "caption" => "S&iacute;")), $esta_sucursal->getActiva());
$page->addComponent($sucursal_form);
$page->addComponent(new TitleComponent("Direccion", 3));
$direccion_form = new DAOFormComponent($esta_direccion);
$direccion_form->hideField(array("id_direccion", "ultima_modificacion", "id_usuario_ultima_modificacion"));
$direccion_form->createComboBoxJoin("id_ciudad", "nombre", CiudadDAO::getAll(), $esta_direccion->getIdDireccion());
$direccion_form->renameField(array("id_ciudad" => "ciudad"));
$js = "(function(){\n\t\t\t\tPOS.API.POST(\"api/sucursal/editar/\",{\n\t\t\t\t\tid_sucursal\t\t: " . $_GET['sid'] . ",\n\t\t\t\t\tdescripcion\t\t: Ext.get(\"" . $sucursal_form->getGuiComponentId() . "descripcion\").getValue(),\n\t\t\t\t\tid_gerente\t\t: Ext.get(\"" . $sucursal_form->getGuiComponentId() . "id_usuario\").getValue(),\n\t\t\t\t\tid_tarifa\t\t: Ext.get(\"" . $sucursal_form->getGuiComponentId() . "id_tarifa\").getValue(),\n\t\t\t\t\tactivo\t\t\t: Ext.get(\"" . $sucursal_form->getGuiComponentId() . "activa\").getValue(),\n\t\t\t\t\tdireccion : Ext.JSON.encode({\n\t\t\t\t\t\t \tcalle\t\t\t: Ext.get(\"" . $direccion_form->getGuiComponentId() . "calle\").getValue(),\n\t\t\t\t\t\t\tnumero_exterior\t: Ext.get(\"" . $direccion_form->getGuiComponentId() . "numero_exterior\").getValue(),\n\t\t\t\t\t\t    numero_interior\t: Ext.get(\"" . $direccion_form->getGuiComponentId() . "numero_interior\").getValue(),\n\t\t\t\t\t\t    colonia\t\t\t: Ext.get(\"" . $direccion_form->getGuiComponentId() . "colonia\").getValue(),\n\t\t\t\t\t\t    codigo_postal\t: Ext.get(\"" . $direccion_form->getGuiComponentId() . "codigo_postal\").getValue(),\n\t\t\t\t\t\t    telefono1\t\t: Ext.get(\"" . $direccion_form->getGuiComponentId() . "telefono\").getValue(),\n\t\t\t\t\t\t    telefono2\t\t: Ext.get(\"" . $direccion_form->getGuiComponentId() . "telefono2\").getValue(),\n\t\t\t\t\t\t    id_ciudad\t\t: Ext.get(\"" . $direccion_form->getGuiComponentId() . "ciudad\").getValue(),\n\t\t\t\t\t\t    referencia\t\t: Ext.get(\"" . $direccion_form->getGuiComponentId() . "referencia\").getValue()\n\t\t\t\t\t})\n\t\t\t\t},{ callback : function(a,b){\n\t\t\t\t\twindow.onbeforeunload = function(){ return;\t};\n\t\t\t\t\twindow.location = \"sucursales.ver.php?sid=\"+ " . $_GET['sid'] . ";\n\t\t\t\t}});\n\t\t\t})()";
$direccion_form->addOnClick("Editar sucursal", $js);
$page->addComponent($direccion_form);
$page->render();
Exemple #21
0
 * Description:
 *
 *
 * Author:
 *     Manuel Garcia (manuel)
 *     Alan Gonzalez (alan)
 *
 ***/
define("BYPASS_INSTANCE_CHECK", false);
require_once "../../../server/bootstrap.php";
$page = new GerenciaComponentPage();
$page->requireParam("sid", "GET", "Esta sucursal no existe.");
/* ********************************************************************* 
 * Corte
 * ********************************************************************* */
$sucursal = SucursalDAO::getByPK($_GET['sid']);
if (is_null($sucursal)) {
    $page->render();
    exit;
}
$page->addComponent(new TitleComponent("Sucursal " . $sucursal->getDescripcion(), 1));
$table = "<table>";
$cortes = EfectivoController::UltimoCorte($sucursal);
if (!is_null($cortes)) {
    $fecha_inicial = $cortes->getFin();
} else {
    $fecha_inicial = $sucursal->getFechaApertura();
}
$fecha_final = time();
$table .= "  <tr>";
$table .= td("<b>Corte</b>");
 public function testEditar()
 {
     //creamos una sucursal para fines del experimento
     $direccion = array("calle" => "Monte Balcanes", "numero_exterior" => "107", "numero_interior" => null, "colonia" => "Arboledas", "codigo_postal" => "38060", "id_ciudad" => 334, "referencia" => "Calle cerrada", "telefono1" => "4616149974", "telefono2" => "45*451*454");
     $sucursal = SucursalesController::Nueva("Sucursal de phpunit editar " . time(), $direccion, 1, 1, null);
     //para cambiar la moneda
     try {
         $moneda = new Moneda(array("nombre" => "Moneda_" . time(), "simbolo" => "Simbolo_" . time(), "activa" => 1));
         MonedaDAO::save($moneda);
     } catch (Exception $e) {
     }
     //editar basico
     SucursalesController::Editar($id_sucursal = $sucursal["id_sucursal"], $activo = 0, $descripcion = "Descripcion de la sucursal", $direccion = null, $empresas = null, $id_gerente = 1, $id_moneda = $moneda->getIdMoneda(), $razon_social = "Empresa x", $saldo_a_favor = "100000");
     //editar la direccion
     SucursalesController::Editar($id_sucursal = $sucursal["id_sucursal"], $activo = 0, $descripcion = "_EDITADO_" . time(), $direccion = array("calle" => "Monte Balcanes", "numero_exterior" => "107", "colonia" => "Arboledas", "id_ciudad" => 334, "codigo_postal" => "38060", "numero_interior" => null, "texto_extra" => "Calle cerrada", "telefono1" => "4616149974", "telefono2" => "45*451*454"), $empresas = null, $id_gerente = 1, $id_moneda = $moneda->getIdMoneda(), $razon_social = "Empresa x", $saldo_a_favor = "100000");
     //vamos a ver si si se edito esa madre
     $_s = SucursalDAO::getByPK($sucursal["id_sucursal"]);
     $this->assertEquals($descripcion, $_s->getDescripcion());
     $_d = DireccionDAO::getByPK($_s->getIdDireccion());
     $this->assertEquals($_d->getCalle(), "Monte Balcanes");
     $this->assertEquals($_d->getNumeroExterior(), "107");
     $this->assertEquals($_d->getColonia(), "Arboledas");
     $this->assertEquals($_d->getIdCiudad(), 334);
     $this->assertEquals($_d->getCodigoPostal(), "38060");
     //$this->assertEquals($_d->getTextoExtra(),		"Calle cerrada");
 }
 /**
  *
  *
  * Returns:
  *     Object of type CorteDeSucursal which is the last time this happened.
  *     May return null otherwise.
  *
  ***/
 private static function UltimoCorteSucursal($sucursal)
 {
     if (!$sucursal instanceof Sucursal) {
         throw new InvalidDataException("Argument must be instance of Sucursal");
     } else {
         $v_sucursal = SucursalDAO::getByPK($sucursal->getIdSucursal());
     }
     if (is_null($v_sucursal)) {
         throw new InvalidDataException("Sucursal does not exist");
     }
     $cortes = CorteDeSucursalDAO::search(new CorteDeSucursal($v_sucursal->AsArray()), "fin", "desc");
     if (sizeof($cortes) == 0) {
         return null;
     }
     return $cortes[0];
 }
    function renderCmp()
    {
        ?>
		<script>

		Ext.require([
		    'Ext.data.*',
		    'Ext.form.*',
		    'Ext.grid.*',
		    'Ext.util.*',
		    'Ext.state.*'
		]);
		
		
		var grid, unidadMedida;

		/* ********************************************************
	     /\  \         /\  \         /\  \         /\  \          ___        /\  \         /\  \    
	    /::\  \       /::\  \       /::\  \       /::\  \        /\  \       \:\  \       /::\  \   
	   /:/\:\  \     /:/\:\  \     /:/\:\  \     /:/\:\  \       \:\  \       \:\  \     /:/\:\  \  
	  /:/  \:\  \   /::\~\:\  \   /::\~\:\  \   /::\~\:\  \      /::\__\      /::\  \   /:/  \:\  \ 
	 /:/__/ \:\__\ /:/\:\ \:\__\ /:/\:\ \:\__\ /:/\:\ \:\__\  __/:/\/__/     /:/\:\__\ /:/__/ \:\__\
	 \:\  \  \/__/ \/__\:\/:/  / \/_|::\/:/  / \/_|::\/:/  / /\/:/  /       /:/  \/__/ \:\  \ /:/  /
	  \:\  \            \::/  /     |:|::/  /     |:|::/  /  \::/__/       /:/  /       \:\  /:/  / 
	   \:\  \           /:/  /      |:|\/__/      |:|\/__/    \:\__\       \/__/         \:\/:/  /  
	    \:\__\         /:/  /       |:|  |        |:|  |       \/__/                      \::/  /   
	     \/__/         \/__/         \|__|         \|__|                                   \/__/ 
		 * ******************************************************** */
		var actualizar_carrito = function(){

			console.group("ACTUALIZAR CARRITO");

			console.log("Actualizando el carrito...");

			// 
			// Actualizar la tabla de productos 
			// seleccionados
			//
			grid.getView().refresh();

			// 
			// Calcular precios e importes
			//		
			var carrito_store_count = carrito_store.count();
			var subtotal = 0;
			var tarifaActual = 1;

			tarifaActual = Ext.get("tarifa_seleccionada").getValue();
			console.log("la tarifa actual es :" + tarifaActual);


			for (var i=0; i < carrito_store_count; i++) {

				var p = carrito_store.getAt(i);

				var tarifasProducto = p.get("tarifas");

				for (var j=0; j < tarifasProducto.length; j++) {
					if(tarifasProducto[j].id_tarifa == tarifaActual){
							console.log("ya encontre el precio de esta tarifa");
							subtotal += parseFloat( tarifasProducto[j].precio ) * parseFloat( p.get("cantidad") ) ;
							break;
					}
				}
			};



			data  = retriveData();
			
			//subotal sin descuento
			Ext.get("carrito_subtotal").update(Ext.util.Format.usMoney( data.subtotal + data.descuento ));
			
			//total descontado
			Ext.get("carrito_descuento").update( "-" + Ext.util.Format.usMoney( data.descuento ));			
			
			//impuesto 
			Ext.get("carrito_impuesto").update("+"  + Ext.util.Format.usMoney( data.impuesto ));
			
			//total
			Ext.get("carrito_total").update(Ext.util.Format.usMoney( data.subtotal + data.impuesto ));
			


			// 
			// Buscar existencias
			//
			if(sucursal_seleccionada !== null){
				//
				// si hay una sucursal seleccionada
				// podemos calcular si hay existencias
				//
				for (var i=0; i < carrito_store_count; i++) {

					var p = carrito_store.getAt(i);

					var existencias = p.get("existencias");



					var found_existencias = false;

					for (var ei=0; ei < existencias.length; ei++) {
						//
						// buscar la sucursal que
						// tengo seleccionada
						//
						if( existencias[ei].id_sucursal == sucursal_seleccionada ){

							console.log(existencias[ei].id_sucursal,  sucursal_seleccionada)

							found_existencias = true;

							if( p.get("cantidad") > existencias[ei].cantidad ){

								console.warn("se necesitan" + p.get("cantidad") + " pero solo tengo "+ existencias[ei].cantidad);
							}else{
								console.log("quiero " + p.get("cantidad") + " y tengo "+ existencias[ei].cantidad);							
							}
							break;
						}
					}


					if(found_existencias === false){
						console.warn("No hay ningun tipo de existencias");
					}


				};
			}//if(sucursal)

			console.groupEnd();
		}



		/* ****************************************************************************************************************
		      ___           ___                   ___           ___           ___           ___           ___     
		     /\  \         /\__\      ___        /\  \         /\__\         /\  \         /\  \         /\  \    
		    /::\  \       /:/  /     /\  \      /::\  \       /::|  |        \:\  \       /::\  \       /::\  \   
		   /:/\:\  \     /:/  /      \:\  \    /:/\:\  \     /:|:|  |         \:\  \     /:/\:\  \     /:/\ \  \  
		  /:/  \:\  \   /:/  /       /::\__\  /::\~\:\  \   /:/|:|  |__       /::\  \   /::\~\:\  \   _\:\~\ \  \ 
		 /:/__/ \:\__\ /:/__/     __/:/\/__/ /:/\:\ \:\__\ /:/ |:| /\__\     /:/\:\__\ /:/\:\ \:\__\ /\ \:\ \ \__\
		 \:\  \  \/__/ \:\  \    /\/:/  /    \:\~\:\ \/__/ \/__|:|/:/  /    /:/  \/__/ \:\~\:\ \/__/ \:\ \:\ \/__/
		  \:\  \        \:\  \   \::/__/      \:\ \:\__\       |:/:/  /    /:/  /       \:\ \:\__\    \:\ \:\__\  
		   \:\  \        \:\  \   \:\__\       \:\ \/__/       |::/  /     \/__/         \:\ \/__/     \:\/:/  /  
		    \:\__\        \:\__\   \/__/        \:\__\         /:/  /                     \:\__\        \::/  /   
		     \/__/         \/__/                 \/__/         \/__/                       \/__/         \/__/                                                                                                                                                                                                
		   ****************************************************************************************************************  */

		var cliente_seleccionado = null;
		var seleccion_de_cliente = function(a,c){

			cliente_seleccionado = c[0];

			console.log("Cliente seleccionado", cliente_seleccionado);

			Ext.get("buscar_cliente_01").enableDisplayMode('block').hide();
			var pphtml = "<h3 style='margin:0px'>Venta para <a target=\"_blank\" href='clientes.ver.php?cid="+cliente_seleccionado.get("id_usuario")+"'>" + cliente_seleccionado.get("nombre") + "</a></h3>";

			if( cliente_seleccionado.get("rfc") !== null )
				pphtml += "<p>" + cliente_seleccionado.get("rfc") + "</p>";

			pphtml += "<br><div class='POS Boton' onClick='buscar_cliente()'  >Buscar otro cliente</div>";

			Ext.get("buscar_cliente_02").update(pphtml).show();

			actualizar_carrito();	
		};



		/* ********************************************************
	      ___           ___           ___           ___           ___     
	     /\__\         /\  \         /\__\         /\  \         /\  \    
	    /:/  /        /::\  \       /::|  |        \:\  \       /::\  \   
	   /:/  /        /:/\:\  \     /:|:|  |         \:\  \     /:/\:\  \  
	  /:/__/  ___   /::\~\:\  \   /:/|:|  |__       /::\  \   /::\~\:\  \ 
	  |:|  | /\__\ /:/\:\ \:\__\ /:/ |:| /\__\     /:/\:\__\ /:/\:\ \:\__\
	  |:|  |/:/  / \:\~\:\ \/__/ \/__|:|/:/  /    /:/  \/__/ \/__\:\/:/  /
	  |:|__/:/  /   \:\ \:\__\       |:/:/  /    /:/  /           \::/  / 
	   \::::/__/     \:\ \/__/       |::/  /     \/__/            /:/  /  
	    ~~~~          \:\__\         /:/  /                      /:/  /   
	                   \/__/         \/__/                       \/__/ 
		 * ******************************************************** */
		var validar_venta_a_credito = function (clienteStore, carrito){

			if(clienteStore === null){
				//no hay cliente seleccionado
				Ext.get("SeleccionDeCliente").highlight();
				return false;
			}

			var vac = clienteStore.get("limite_credito");

			if((vac === null)||( parseFloat(vac) === 0) ){
				//no tiene ventas a credito
				Ext.MessageBox.alert("Nueva venta", "El cliente "+clienteStore.get("nombre") + " no tiene ventas a credito.");
				return false;			
			}


			return true;
		}



		//
		// Valor default de venta
		// 
		var tipo_de_venta = "contado";

		var seleccion_tipo_de_venta = function(tipo){
			switch(tipo){
				case "credito" :
					console.log("seleccion_tipo_de_venta(credito)");
					validar_venta_a_credito(cliente_seleccionado, carrito_store );
					tipo_de_venta = "credito";
				break;

				case "contado" :
					console.log("seleccion_tipo_de_venta(contado)");			
					tipo_de_venta = "contado";
				break;

				default:
					throw new Exception( "seleccion_tipo_de_venta(): tipo invalido" );
			}
		}

		var buscar_cliente = function(){

			cliente_seleccionado = null;

			Ext.get("buscar_cliente_02").enableDisplayMode('block').hide();

			Ext.get("buscar_cliente_01").show();

			actualizar_carrito();

		}





		var seleccionar_producto = function( a, p ){


			console.group("SELECCION DE PRODUCTO");

			console.log( "Seleccionando producto", p );

			//ponerle cantidad inicial de 1
			console.log("cantidad inicial de 1");

			p[0].set("cantidad", 1);

			//agregar produco al store
			carrito_store.add( p[0] );

			console.groupEnd();

			actualizar_carrito();
		}

		var tipo_de_pago_seleccionado = "efectivo";

		var seleccion_de_tarifa = function(id_tarifa){

			console.log("Tarifa seleccionada:" + id_tarifa);
			actualizar_carrito();
		}

		var carrito_store;

		var retriveData = function(){

				//
				// crear un objeto con los productos
				//
				var detalle_de_venta = [];

				//
				// 
				// 


				var carrito_store_count = carrito_store.count();
				var subtotal = 0;
				var tarifaActual = 1;

				tarifaActual = Ext.get("tarifa_seleccionada").getValue();
				console.log("la tarifa actual es :" + tarifaActual);


				for (var i=0; i < carrito_store_count; i++) {

					var p = carrito_store.getAt(i);

					var tarifasProducto = p.get("tarifas");

					var precio_con_tarifa = -1; 

					for (var j=0; j < tarifasProducto.length; j++) {
						
						if(tarifasProducto[j].id_tarifa == tarifaActual){
								//console.log("ya encontre el precio de esta tarifa");
								precio_con_tarifa = parseFloat( tarifasProducto[j].precio );
								subtotal +=  precio_con_tarifa * parseFloat( p.get("cantidad") ) ;
								break;
						}
						
					}

					detalle_de_venta.push({
						id_producto : p.get("id_producto"),
						cantidad 	: p.get("cantidad"),
						precio		: precio_con_tarifa,
						descuento	: 0,
						impuesto	: 0,
						retencion	: 0,
						id_unidad	: p.get("id_unidad")
					});

				};

				
				var impuesto = 0, descuento = 0;
				
				//descuento esta en 0-100
				descuento = Ext.get("descuento_seleccionado_val").getValue();
				
				//dAplicado es el descuento sin aplicar, lol
				var dAplicado = (descuento/100) * subtotal;

				subtotal = subtotal - dAplicado;
				
				<?php 
        //listar impuestos
        $i = ImpuestosController::Lista();
        $iLista = $i["resultados"];
        $impuestos_to = 0;
        //carrito_impuesto
        foreach ($iLista as $imp) {
            $impuestos_to += $imp->getImporte();
        }
        echo "impuesto = subtotal * " . $impuestos_to . ";";
        ?>
				
				
				
				ventaObj = {
					retencion 			: 0,
					descuento 			: dAplicado,
					impuesto 			: impuesto,
					subtotal			: subtotal,
					total 				: subtotal + impuesto,
					tipo_venta	 		: tipo_de_venta,
					id_sucursal			: null,
					detalle_venta		: Ext.JSON.encode( detalle_de_venta )
				};
				
				
				
				if(cliente_seleccionado == null){
					ventaObj.id_comprador_venta = null;
				}else{
					ventaObj.id_comprador_venta	= cliente_seleccionado.get("id_usuario");
				}

				if(Ext.get("sucursal_seleccionada") !==  undefined){
					ventaObj.id_sucursal = Ext.get("sucursal_seleccionada").getValue();

				}else if( sucursal_seleccionada !== undefined || sucursal_seleccionada != null ){
					ventaObj.id_sucursal = sucursal_seleccionada;

				}	

				return ventaObj;
		}


		var doCotizar = function(){
			
			var ventaObj = retriveData();
			
			ventaObj.es_cotizacion = true;

			//
			// Enviar al API
			// 
			POS.API.POST(
				"api/ventas/nueva/", 
				ventaObj,
				{
					callback : function(r){
						if(r.status === "ok"){
							window.location = "ventas.detalle.php?vid=" + r.id_venta + "&last_action=ok";

						}else{
							console.error(r);
							Ext.MessageBox.alert("Nueva venta", "Algo salio mal.");
						}
					}
				});
		}

		var doVenta = function (){

			var ventaObj = retriveData();
			ventaObj.es_cotizacion = 0;

			if( ventaObj.id_sucursal == null ){
					window.scrollTo(0, Ext.get("SeleccionDeSucursal").getY() - 20);			
					Ext.get("SeleccionDeSucursal").highlight();
					return;
			}	


			//
			// Enviar al API
			// 
			POS.API.POST(
				"api/ventas/nueva/", 
				ventaObj,
				{
					callback : function(r){
						if(r.status === "ok"){
							window.location = "ventas.detalle.php?vid=" + r.id_venta + "&last_action=ok";

						}else{
							console.error(r);
							Ext.MessageBox.alert("Nueva venta", "Algo salio mal.");
						}
					}
				});

		}


		var cellEditing = Ext.create('Ext.grid.plugin.CellEditing', {
		        clicksToEdit: 1,
		        listeners: {
		            edit: function(){
		                // refresh summaries
		                actualizar_carrito();
		            }
		        }
		});


		var sucursal_seleccionada = null;

		var seleccionar_sucursal = function( sucursalStore ){
			//sucursalStore
			console.log(sucursalStore.get("id_sucursal") + " seleccionada...");

			sucursal_seleccionada = sucursalStore.get("id_sucursal");

			actualizar_carrito();
		};




		Ext.onReady(function(){


			<?php 
        $this->printOnReadyJs();
        ?>
		
		
			/** *****************************************************************
			  * CARRITO
			  *
			  * ***************************************************************** */

			   

			    // create the Grid
			    grid = Ext.create('Ext.grid.Panel', {
			        store: carrito_store,
					plugins: [cellEditing],
			        stateful: false,
					bodyCls: 'foo',
			        stateId: 'stateGrid2',
			        columns: [
			            {
			                text     : 'Codigo producto',
			                width    : 95,
			                sortable : false,
			                dataIndex: 'codigo_producto'
			            },
			            {
			                text     : 'Nombre producto',
			                flex     : 1,
			                sortable : true,
			                dataIndex: 'nombre_producto'
			            },
			            {
			                text     : 'Cantidad',
							dataIndex: 'cantidad',
			                sortable : false,
							field: {
				                xtype: 'numberfield',
								decimalPrecision : 4				
				            },
							renderer: function (cantidad, a, storeObj){
								var um = unidadMedida.getById(parseInt( storeObj.get("id_unidad") ) );
								if(um == null){
									alert("Hay un problema con las unidades del producto recien seleccionado. Porfavor verifique que tenga una unidad especificada.");
									return cantidad + " ERROR EN UNIDADES" ;
								}
								
								return cantidad + " " + um.get("descripcion");
							}
			            },	
				/*
						{
			                text     : 'Unidad',
			                width    : 75,
			                dataIndex: 'id_unidad',
				            field : {
				            	xtype : "combobox",
				            	typeAhead: false,
								invalidText : "Invalido",
				                triggerAction: 'all',
				                selectOnTab: true,
				                store: unidadMedida,
				                lazyRender: true,
				                listClass: 'x-combo-list-small',
				                displayField: "abreviacion",
				                listConfig: {
				                	loadingText: 'Buscando...',
				                	
				                	// Custom rendering template for each item
				                	getInnerTpl: function(a,b,c) {
										return "<p style='margin:0px'>{abreviacion}</p>";
				                	}
				            	},
				            }//field
			            },
			*/	
			            {
			                text     : 'Precio',
			                sortable : true,
			                dataIndex: 'tarifas',
							renderer : function(tarifasArray){

								/* ***** **** ***** 
									tarifasArray tiene las tarifas para 
									este producto solo hay que ver que cliente
									esta seleccionado para mostrar la adecuada
								***** **** ***** */
								var tf = Ext.get("tarifa_seleccionada").getValue();

								for (var i=0; i < tarifasArray.length; i++) {
									if(tarifasArray[i].id_tarifa == tf){
										return Ext.util.Format.usMoney( tarifasArray[i].precio );
									}
								}

								return "X";

							}
			            },		
			            {
			                text     : 'Importe',
			                width    : 75,
			                sortable : true,
							renderer : function(a,b,producto){

								var tf =  Ext.get("tarifa_seleccionada").getValue();
								var tarifasArray = producto.get("tarifas");

								for (var i=0; i < tarifasArray.length; i++) {
									if(tarifasArray[i].id_tarifa == tf){
										return Ext.util.Format.usMoney( 
											parseFloat(tarifasArray[i].precio ) * parseFloat(producto.get("cantidad")) );
									}
								};
							}
			            }
			        ],
			        height: 350,
			        width: "100%",
			        renderTo: 'carrito_de_compras_grid',
			        viewConfig: {
			            stripeRows: true
			        }
			    });		

			/** *****************************************************************
			  * CARRITO
			  *
			  * ***************************************************************** */

		}); /* Ext.onReady */


	</script>
				
				
				
			
	<h2>Nueva venta</h2>

	<table border="0" style="width: 100%" class="">
		<tr id="SeleccionDeCliente">
			<td colspan="4">
				<div id="buscar_cliente_01">
					<p style="margin-bottom: 0px;">Buscar cliente</p>
					<div style="margin-bottom: 15px;" id="ShoppingCartComponent_002"><!-- clientes --></div>				
				</div>
				<div id="buscar_cliente_02" style="display:none; margin-bottom: 0px"></div>						
			</td>
		</tr>
		<tr>
			<td id="SeleccionDeSucursal">
				Sucursal:
				<div >
				<?php 
        $sucursales = SucursalDAO::getAll();
        if (sizeof($sucursales) == 0) {
            ?>
<div style="color:gray; font-size:9px">[No hay sucursales]</div><?php 
        } else {
            if (sizeof($sucursales) > 10) {
                $selector_de_suc = new SucursalSelectorComponent();
                $selector_de_suc->addJsCallback("seleccionar_sucursal");
                $selector_de_suc->renderCmp();
            } else {
                ?>
<select id="sucursal_seleccionada" onChange="seleccionar_sucursal(this.value)" ><?php 
                for ($i = 0; $i < sizeof($sucursales); $i++) {
                    echo "<option value=\"" . $sucursales[$i]->getIdSucursal() . "\" >" . $sucursales[$i]->getDescripcion() . "</option>";
                }
                ?>
</select><?php 
            }
        }
        ?>
						
				</div>
			</td>
			<td id="SeleccionDeTipoDeVenta">
				Tipo de venta:
				<div >
					<select onChange="seleccion_tipo_de_venta(this.value)">
						<option value="contado" selected>Contado</option>
						<option value="credito">Credito</option>
					</select>
				</div>
			</td>
			<td id="SeleccionDeImpuestos">
				Tipo de tarifa:
				<div >
					<select id="tarifa_seleccionada" onChange="seleccion_de_tarifa(this.value)" >
						<?php 
        $tarifas = TarifaDAO::obtenerTarifasActuales("venta");
        for ($i = 0; $i < sizeof($tarifas); $i++) {
            echo "<option value=\"" . $tarifas[$i]["id_tarifa"] . "\" >" . $tarifas[$i]["nombre"] . "</option>";
        }
        ?>
					</select>
				</div>
			</td>
			<td id="SeleccionDeTipoDePago">
				Tipo de pago:
				<div >
					<select name="" onChange="tipo_de_pago_seleccionado = this.value">
						<option value="efectivo">efectivo</option>
						<option value="cheque">cheque</option>
					</select>
				</div>
			</td>										
		</tr>
		<tr>
			<td id="SeleccionDeDescuento">
			Descuento:
			<input type="text" id="descuento_seleccionado_val" onchange="actualizar_carrito()" value="0" >
			<select id="descuento_seleccionado_tipo" onChange="actualizar_carrito()">
				<option value="porciento">%</option>
				<!-- <option value="MXN">MXN</option> -->
			</select>
			</td>										
		</tr>

	</table>

	<div id="CartComponent_002"><!-- buscar productos --></div>

	<div id="carrito_de_compras" style="margin: 5px auto;">
		<div id="carrito_de_compras_grid"></div>
	</div>



<div style="border:1px solid #99BBE8;	;box-sizing: border-box;
	-moz-box-sizing: border-box;
	-ms-box-sizing: border-box;
	-webkit-box-sizing: border-box; 
	margin-bottom: 20px">
	

	<table style="margin-bottom: 0px;
	width: 200px;
	margin-right: 0px;
	margin-left: auto;">
		<tr>
			<td>Subtotal</td>
			<td id="carrito_subtotal"></td>
		</tr>

		<tr>
			<td>Descuento</td>
			<td id="carrito_descuento"></td>
		</tr>

		<tr>
			<td>Impuesto</td>
			<td id="carrito_impuesto"></td>
		</tr>
		<tr>
			<td><strong>Total</strong></td>
			<td id="carrito_total"></td>
		</tr>				
	</table>
</div>



	<div class="POS Boton" onClick="cancelarVenta()">Cancelar</div>
	<div class="POS Boton" onClick="doCotizar()">Solo cotizar</div>
	<div class="POS Boton OK" onClick="doVenta()">Vender</div>

	<?php 
    }
 /**
  *
  *Registra una nueva compra fuera de caja, puede usarse para que el administrador haga directamente una compra. El usuario y al sucursal seran tomados de la sesion. La fecha sera tomada del servidor. La empresa sera tomada del almacen del cual fueron tomados los productos.
  *
  * @param descuento float Monto descontado por descuentos
  * @param subtotal float Total de la compra antes de impuestos y descuentos.
  * @param detalle json Objeto que contendr el arreglo de id productos, cantidad,  precio, descuento, id de unidad y procesado que involucran esta compra.
  * @param impuesto float Monto agregado por impuestos
  * @param tipo_compra string Si la compra es a credito o de contado
  * @param retencion float Monto agregado por retenciones
  * @param id_usuario_compra int Id usuario al que se le compra, si es a una sucursal, se pone el id en negativo
  * @param id_empresa int Id de la empresa a nombre de la cual se hace la compra
  * @param total float Total 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
  * @param saldo float Cantidad pagada de la 
  * @param tipo_de_pago string Si el pago sera en efectivo, con cheque o tarjeta
  * @return id_compra int Id autogenerado por la inserci�n de la compra
  **/
 public static function Nueva($descuento, $detalle, $id_empresa, $id_usuario_compra, $impuesto, $retencion, $subtotal, $tipo_compra, $total, $cheques = null, $id_sucursal = null, $saldo = 0, $tipo_de_pago = null)
 {
     Logger::log(" ===== Creando nueva compra... ===== ");
     //validemos al comprador
     $proveedor = UsuarioDAO::getByPK($id_usuario_compra);
     if (is_null($proveedor)) {
         Logger::error("el provedor {$id_usuario_compra} no exite");
         throw new InvalidDataException("El proveedor no existe");
     }
     if ($proveedor->getActivo() == false) {
         throw new BusinessLogicException("No se puede comprar de un proveedor no activo.");
     }
     //validemos la empresa
     $empresa = EmpresaDAO::getByPK($id_empresa);
     if (is_null($empresa)) {
         Logger::error("La empresa {$id_empresa} no existe");
         throw new InvalidDataException("La empresa que compra no existe.");
     }
     if ($empresa->getActivo() == false) {
         throw new BusinessLogicException("Una empresa inactiva no puede hacer compras.");
     }
     //validemos los valores conocidos
     //( 0 >= descuento > 100, subtotal > 0, total >= subtotal, etc etc)
     //validemos sucursal
     $sucursal = null;
     if (!is_null($id_sucursal) && strlen($id_sucursal) > 0) {
         $sucursal = SucursalDAO::getByPK($id_sucursal);
         if (is_null($sucursal)) {
             Logger::error("La sucursal {$id_sucursal} no existe");
             //throw new InvalidDataException("La sucural que se envio no existe.");
         }
     }
     //validemos detalles de compra
     //debe traer
     // 	-id_producto
     //	-cantidad
     //	-precio
     //	-lote
     if (!is_array($detalle)) {
         throw InvalidDataException("El detalle no es un arreglo");
     }
     for ($detalleIterator = 0; $detalleIterator < sizeof($detalle); $detalleIterator++) {
         //por cada producto
         //	-debe existir
         //	-si se lo compro a un proveedor no hay pedo
         // 	 si se lo compro a un cliente, debe de tener comprar_caja = 1
         //	-debe tener cantidad mayor a 0
         //	-que exista el lote a donde va a ir
         $p = $detalle[$detalleIterator];
         if (!isset($p->precio)) {
             throw new InvalidArgumentException("No se envio el precio");
         }
         if (!isset($p->id_producto)) {
             throw new InvalidArgumentException("No se envio el id_producto");
         }
         if (!isset($p->cantidad)) {
             throw new InvalidArgumentException("No se envio la cantidad");
         }
         if (!isset($p->lote)) {
             throw new InvalidArgumentException("No se envio el lote");
         }
         $producto = ProductoDAO::getByPK($p->id_producto);
         if (is_null($producto)) {
             throw new InvalidArgumentException("El producto a comprar no existe");
         }
         if ($p->cantidad <= 0) {
             throw new InvalidArgumentException("No puedes comprar 0 unidades");
         }
     }
     $s = SesionController::getCurrentUser();
     //terminaron las validaciones
     $compra = new Compra();
     $compra->setIdVendedorCompra($id_usuario_compra);
     $compra->setTipoDeCompra($tipo_compra);
     $compra->setFecha(time());
     $compra->setSubtotal($subtotal);
     $compra->setImpuesto($impuesto);
     $compra->setDescuento($descuento);
     $compra->setTotal($subtotal + $impuesto);
     $compra->setIdUsuario($s->getIdUsuario());
     $compra->setIdEmpresa($id_empresa);
     $compra->setSaldo(0);
     $compra->setCancelada(false);
     $compra->setTipoDePago($tipo_de_pago);
     $compra->setRetencion(0);
     try {
         DAO::transBegin();
         CompraDAO::save($compra);
     } catch (Exception $e) {
         DAO::transRollback();
         throw InvalidDatabaseOperationException($e);
     }
     for ($detalleIterator = 0; $detalleIterator < sizeof($detalle); $detalleIterator++) {
         //por cada producto
         //	--- procesos ---
         //	-insertar en productoempresa
         //	-insertar en loteproducto
         //	-insertar en entradalote
         //	-si el tipo de precio de venta es costo, actualizar
         //	-insertar compra producto
         $p = $detalle[$detalleIterator];
         try {
             ProductoEmpresaDAO::save(new ProductoEmpresa(array("id_empresa" => $id_empresa, "id_producto" => $p->id_producto)));
             if (is_null($p->lote)) {
                 throw new InvalidDataException("No selecciono a que lote ira el producto " . $p->id_producto);
             }
             if (strlen($p->lote) == 0) {
                 throw new InvalidDataException("No selecciono a que lote ira el producto " . $p->id_producto);
             }
             //busquemos el id del lote
             $l = LoteDAO::search(new Lote(array("folio" => $p->lote)));
             $l = $l[0];
             //busquemos la unidad que nos mandaron
             $uAbreviacion = $p->id_unidad;
             $uResults = UnidadMedidaDAO::search(new UnidadMedida(array("abreviacion" => $uAbreviacion, "activa" => 1)));
             if (sizeof($uResults) != 1) {
                 throw new InvalidDataException("La unidad de medida `" . $p->id_unidad . "` no existe, o no esta activa.");
             } else {
                 $p->id_unidad = $uResults[0]->getIdUnidadMedida();
             }
             //busequemos si este producto ya existe en este lote
             $lp = LoteProductoDAO::getByPK($l->getIdLote(), $p->id_producto);
             if (is_null($lp)) {
                 //no existe, insertar
                 $loteProducto = new LoteProducto(array("id_lote" => $l->getIdLote(), "id_producto" => $p->id_producto, "cantidad" => $p->cantidad, "id_unidad" => $p->id_unidad));
                 LoteProductoDAO::save($loteProducto);
             } else {
                 //ya existe, sumar
                 //revisemos si es de la misma unidad
                 if ($lp->getIdUnidad() == $p->id_unidad) {
                     //es igual, solo hay que sumar
                     $lp->setCantidad($lp->getCantidad() + $p->cantidad);
                 } else {
                     //no es igual, hay que convertir
                     try {
                         $r = UnidadMedidaDAO::convertir($p->id_unidad, $lp->getIdUnidad(), $p->cantidad);
                     } catch (BusinessLogicException $ide) {
                         //no se pudo convertir porque son de
                         //diferentes categorias
                         throw $ide;
                         //mostrar una excpetion mas fresona
                     }
                     $lp->setCantidad($lp->getCantidad() + $r);
                 }
                 //$lp->setCantidad( $lp->getCantidad() + $p->cantidad );
                 LoteProductoDAO::save($lp);
             }
             $loteEntrada = new LoteEntrada(array("id_lote" => $l->getIdLote(), "id_usuario" => $s->getIdUsuario(), "fecha_registro" => time(), "motivo" => "Compra a Proveedor"));
             LoteEntradaDAO::save($loteEntrada);
             LoteEntradaProductoDAO::save(new LoteEntradaProducto(array("id_lote_entrada" => $loteEntrada->getIdLoteEntrada(), "id_producto" => $p->id_producto, "id_unidad" => $p->id_unidad, "cantidad" => $p->cantidad)));
             $compraProducto = new CompraProducto(array("id_compra" => $compra->getIdCompra(), "id_producto" => $p->id_producto, "cantidad" => $p->cantidad, "precio" => $p->precio, "descuento" => 0, "impuesto" => 0, "id_unidad" => $p->id_unidad, "retencion" => 0));
             CompraProductoDAO::save($compraProducto);
         } catch (InvalidDataException $e) {
             Logger::error($e);
             DAO::transRollback();
             throw $e;
         } catch (exception $e) {
             Logger::error($e);
             DAO::transRollback();
             throw new InvalidDatabaseOperationException($e);
         }
     }
     //for
     try {
         DAO::transEnd();
     } catch (Exception $e) {
         throw InvalidDatabaseOperationException($e);
     }
     Logger::log("===== COMPRA " . $compra->getIdCompra() . " EXITOSA ===== ");
     return array("id_compra" => $compra->getIdCompra());
 }
require_once "../../../server/bootstrap.php";
$page = new GerenciaComponentPage();
//
// Titulo de la pagina
//
$page->addComponent(new TitleComponent("Editar gerencia", 2));
//
// Forma de usuario
//
$form = new DAOFormComponent(new Sucursal());
$form->hideField(array("id_direccion", "fecha_apertura", "fecha_baja", "activa", "rfc", "razon_social", "descripcion", "saldo_a_favor", "margen_utilidad", "descuento"));
$form->addApiCall("api/sucursal/gerencia/editar/", "GET");
//                $form->addField("id_producto", "Productos", "text","","productos");
//                $form->createListBoxJoin("id_producto", "nombre_producto", ProductoDAO::search( new Producto( array( "activo" => 1 ) ) ));
//
$form->createComboBoxJoin("id_sucursal", "razon_social", SucursalDAO::search(new Sucursal(array("activa" => 1))));
$form->createComboBoxJoinDistintName("id_gerente", "id_usuario", "nombre", UsuarioDAO::search(new Usuario(array("id_rol" => 2))));
//                $form->createComboBoxJoin( "id_rol", "nombre", RolDAO::getAll(), $este_usuario->getIdRol() );
//
//                $form->createComboBoxJoin( "id_moneda", "nombre", MonedaDAO::search( new Moneda( array( "activa" => 1 ) ) ),$este_usuario->getIdMoneda() );
//
//                $form->createComboBoxJoin( "id_clasificacion_cliente", "nombre", ClasificacionClienteDAO::getAll(), $este_usuario->getIdClasificacionCliente() );
//
//                $form->createComboBoxJoin( "id_clasificacion_proveedor", "nombre", ClasificacionProveedorDAO::search( new ClasificacionProveedor( array( "activa" => 1 ) ) ), $este_usuario->getIdClasificacionProveedor() );
//$form->createComboBoxJoin("id_tipo_almacen", "descripcion", array_diff(TipoAlmacenDAO::getAll(), TipoAlmacenDAO::search( new TipoAlmacen( array( "id_tipo_almacen" => 2 ) ) ) ), $este_almacen->getIdTipoAlmacen() );
//                $form->renameField( array(
//                    "id_ciudad" => "municipio"
//		));
$form->makeObligatory(array("id_sucursal", "id_gerente"));
$page->addComponent($form);
$page->render();
 public static function Corte($fecha_final, $id_sucursal, $total_efectivo)
 {
     if ($fecha_final > time()) {
         throw new BusinessLogicException("You must give a time in the past.");
     }
     if ($fecha_final == 0) {
         $fecha_final = time();
     }
     $suc = SucursalDAO::getByPK($id_sucursal);
     if (is_null($suc)) {
         throw new InvalidDataException("'Sucursal' does not exist");
     }
     $corte = EfectivoController::UltimoCorte($suc);
     if (is_null($corte)) {
         //'CordeDeSucursal' has never happende,
         //use the opening date.
         $start_date = $suc->getFechaApertura();
     } else {
         $start_date = $corte->getFin();
     }
     //ASSERT( $fecha_final . "<=" . $start_date );
     $ingresos_por_tipo = array("BANCO" => 0.0, "CAJA" => 0.0);
     $ventas = VentasController::Lista($start_date, $fecha_final);
     //esto regresa, total, subtotal, impuesto
     $ventasTotal = VentaDAO::TotalVentasNoCanceladasAContadoDesdeHasta($start_date, $fecha_final);
     //$abonosTotal = AbonoVenta::TotalAbonosNoCanceladosDesdeHasta( $start_date, $fecha_final );
     /*
     foreach( $ventas as $v ){
     
         switch( $v->tipo_de_pago ){
             cash :      $ingresos[ cash ] += $v->getTotal();
             banco :     $ingresos[ banco ] += $v->getTotal()
             cheque :
             default: throw new Exception();
     
         }
     }
     */
     $cu = SesionController::Actual();
     $corte = new CorteDeSucursal();
     $corte->setIdSucursal($id_sucursal);
     $corte->setIdUsuario($cu["id_usuario"]);
     $corte->setInicio($start_date);
     $corte->setFin($fecha_final);
     $corte->setFechaCorte(time());
     try {
         CorteDeSucursalDAO::save($corte);
     } catch (Exception $e) {
         throw new InvalidDatabaseException($e);
     }
     return array("id_corte_sucursal" => $corte->getIdCorteSucursal());
 }
<?php

define("BYPASS_INSTANCE_CHECK", false);
require_once "../../../server/bootstrap.php";
$page = new GerenciaComponentPage();
//titulos
$page->addComponent(new TitleComponent("Nueva caja"));
//forma de nueva caja
$form = new DAOFormComponent(array(new Caja()));
$form->hideField(array("id_caja", "abierta", "saldo", "activa", "id_cuenta_contable"));
$form->addApiCall("api/sucursal/caja/nueva/");
$form->onApiCallSuccessRedirect("sucursales.lista.caja.php");
$form->makeObligatory(array("token", "descripcion", "id_sucursal"));
$form->createComboBoxJoin("control_billetes", "control_billetes", array(array("id" => 1, "caption" => "Llevar control"), array("id" => 0, "caption" => "No llevar control")));
$form->createComboBoxJoin("id_sucursal", "descripcion", SucursalDAO::search(new Sucursal(array("activa" => 1))));
$page->addComponent($form);
//render the page
$page->render();
 /**
  *
  *Creara un nuevo almacen en una sucursal, este almacen contendra lotes.
  *
  * @param id_empresa int Id de la empresa a la que pertenecen los productos de este almacen
  * @param id_sucursal int El id de la sucursal a la que pertenecera este almacen.
  * @param id_tipo_almacen int Id del tipo de almacen 
  * @param nombre string nombre del almacen
  * @param descripcion string Descripcion extesa del almacen
  * @return id_almacen int el id recien generado
  **/
 static function Nuevo($id_empresa, $id_sucursal, $id_tipo_almacen, $nombre, $descripcion = null)
 {
     //verificamos que exista la empresa
     if (!is_null($id_empresa) && !($empresa = EmpresaDAO::getByPK($id_empresa))) {
         throw new Exception("No se tiene registro de la empresa {$id_empresa}");
     }
     //verificamos que exista la sucursal
     if (!is_null($id_sucursal) && !($sucursal = SucursalDAO::getByPK($id_sucursal))) {
         throw new Exception("No se tiene registro de la sucursal {$id_sucursal}");
     }
     //verificamos que exista el tipo de almacen
     if (!is_null($id_tipo_almacen) && !($almacen = TipoAlmacenDAO::getByPK($id_tipo_almacen))) {
         throw new Exception("No se tiene registro del tipo de almacen {$id_tipo_almacen}");
     }
     //verificamos que se haya especificado el nombre
     if (!ValidacionesController::validarLongitudDeCadena(trim($nombre), 2, 100)) {
         throw new Exception("El nombre debe ser una cadena entre 2 y 100 caracteres, se encontro \"" . trim($nombre) . "\" ");
     }
     //Se valida si hay un almacen con ese mimso nombre en esta sucursal
     $almacenes = AlmacenDAO::search(new Almacen(array("id_sucursal" => $id_sucursal)));
     foreach ($almacenes as $almacen) {
         if ($almacen->getNombre() == trim($nombre) && $almacen->getActivo()) {
             Logger::log("El nombre (" . $nombre . ") ya esta siendo usado por el almacen: " . $almacen->getIdAlmacen());
             throw new Exception("El nombre ya esta en uso");
         }
     }
     //Si se recibe un tipo de almacen de consignacion, se manda una excepcion, pues no se puede crear un almacen
     //de consignacion con este metodo.
     if ($id_tipo_almacen == 2) {
         Logger::error("No se puede crear un almacen de consignacion con este metodo");
         throw new Exception("No se puede crear un almacen de consignacion con este metodo");
     }
     //Solo puede haber un almacen por tipo por cada empresa en una sucursal.
     $almacenes = AlmacenDAO::search(new Almacen(array("id_sucursal" => $id_sucursal, "id_empresa" => $id_empresa, "id_tipo_almacen" => $id_tipo_almacen)));
     if (!empty($almacenes)) {
         Logger::error("Ya existe un almacen (" . $almacenes[0]->getIdAlmacen() . ") de este tipo (" . $id_tipo_almacen . ") en esta sucursal (" . $id_sucursal . ") para esta empresa (" . $id_empresa . ")");
         throw new Exception("Ya existe un almacen de este tipo en esta sucursal para esta empresa");
     }
     //Se inicializa el registro a guardar con los datos obtenidos.
     $almacen = new Almacen();
     $almacen->setNombre(trim($nombre));
     $almacen->setDescripcion($descripcion);
     $almacen->setIdSucursal($id_sucursal);
     $almacen->setIdEmpresa($id_empresa);
     $almacen->setIdTipoAlmacen($id_tipo_almacen);
     $almacen->setActivo(1);
     DAO::transBegin();
     try {
         AlmacenDAO::save($almacen);
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("No se pudo crear el nuevo almacen");
         throw new Exception("No se pudo crear el nuevo almacen");
     }
     DAO::transEnd();
     Logger::log("Almacen " . $almacen->getIdAlmacen() . " creado exitosamente");
     return array("id_almacen" => (int) $almacen->getIdAlmacen());
 }