Пример #1
0
 /**
  *
  *Edita los datos de una sucursal
  *
  * @author Juan Manuel Garc&iacute;a Carmona <*****@*****.**>
  * @param id_sucursal int Id de la sucursal a modificar
  * @param id_tarifa int Id de la tarifa por default de la sucursal
  * @param activo bool Indica si esta sucursal estar activa
  * @param descripcion string Descripcion de la sucursal
  * @param direccion json Objeto que contiene la informacin sobre al direccion
  * @param id_gerente int Id del gerente de la sucursal
  **/
 public static function Editar($id_sucursal, $activo = null, $descripcion = null, $direccion = null, $id_gerente = null, $id_tarifa = null)
 {
     DAO::transBegin();
     //Se obtiene la sucursal a editar y se valida que exista
     if (!($sucursal = SucursalDAO::getByPK($id_sucursal))) {
         Logger::error("La sucursal con id : {$id_sucursal} no existe");
         throw new InvalidDataException("La sucursal con id : {$id_sucursal} no existe");
     }
     //verificamos si la sucursal esta activa en caso de no estarlo solo permitira activarla
     if ($activo !== NULL) {
         $val = null;
         if ($activo == 1) {
             $val = true;
         } elseif ($activo == "") {
             $val = false;
         }
         $sucursal->setActiva($val);
     }
     //editamos solo la direccion
     if (!is_null($direccion)) {
         if (!is_array($direccion)) {
             $direccion = object_to_array($direccion);
         }
         //varificamos si la direccion que tiene la sucursal existe si no creamos una
         if (!($_direccion = DireccionDAO::getByPK($sucursal->getIdDireccion()))) {
             //no existe, etonces creamos una nueva direccion
             DireccionController::NuevaDireccion(isset($direccion['calle']) ? $direccion['calle'] : "", isset($direccion['numero_exterior']) ? $direccion['numero_exterior'] : "", isset($direccion['colonia']) ? $direccion['colonia'] : "", isset($direccion['id_ciudad']) ? $direccion['id_ciudad'] : "", isset($direccion['codigo_postal']) ? $direccion['codigo_postal'] : "", isset($direccion['numero_interior']) ? $direccion['numero_interior'] : "", isset($direccion['referencia']) ? $direccion['referencia'] : "", isset($direccion['telefono1']) ? $direccion['telefono1'] : "", isset($direccion['telefono2']) ? $direccion['telefono2'] : "");
         } else {
             //la direccion existe, hay que editarla
             $_direccion->setCalle(isset($direccion['calle']) ? $direccion['calle'] : "");
             $_direccion->setNumeroExterior(isset($direccion['numero_exterior']) ? $direccion['numero_exterior'] : "");
             $_direccion->setNumeroInterior(isset($direccion['numero_interior']) ? $direccion['numero_interior'] : "");
             $_direccion->setReferencia(isset($direccion['referencia']) ? $direccion['referencia'] : "");
             $_direccion->setColonia(isset($direccion['colonia']) ? $direccion['colonia'] : "");
             $_direccion->setIdCiudad(isset($direccion['id_ciudad']) ? $direccion['id_ciudad'] : "");
             $_direccion->setCodigoPostal(isset($direccion['codigo_postal']) ? $direccion['codigo_postal'] : "");
             $_direccion->setTelefono(isset($direccion['telefono1']) ? $direccion['telefono1'] : "");
             $_direccion->setTelefono2(isset($direccion['telefono2']) ? $direccion['telefono2'] : "");
             try {
                 DireccionDAO::save($_direccion);
             } catch (Exception $e) {
                 DAO::transRollback();
                 Logger::error("Error al modificar la direccion : {$e}");
                 throw new Exception("Ocurrio un error al modificar la direccion");
             }
         }
     }
     //verificamos si cambio el gerente
     if (!is_null($id_gerente)) {
         $usuario_gerente = UsuarioDAO::getByPK($id_gerente);
         if (!$usuario_gerente) {
             Logger::error("No se tiene registro del gerente con id : {$id_gerente}");
             throw new Exception("No se tiene registro del gerente con id : {$id_gerente}");
         } else {
             $sucursal->setIdGerente($usuario_gerente->getIdUsuario());
         }
     }
     //
     if (!is_null($id_tarifa) && !($tarifa = TarifaDAO::getByPK($id_tarifa))) {
         Logger::error("No se tiene registro de la tarifa con id : {$id_gerente}");
         throw new Exception("No se tiene registro de la tarifa indicada");
     } else {
         $sucursal->setIdTarifa($id_tarifa);
     }
     //verificamos si cambio la descripcion
     $descripcion = trim($descripcion);
     if ($descripcion !== $sucursal->getDescripcion()) {
         //verificamos si hay una sucursal con esa misma descripcion
         $sucursales = SucursalDAO::search(new Sucursal(array("descripcion" => $descripcion)));
         if (!empty($sucursales)) {
             DAO::transRollback();
             Logger::error("Ya existe una sucursal con esa descripcion");
             throw new Exception("Ya existe una sucursal con esa descripcion");
         } else {
             $sucursal->setDescripcion($descripcion);
         }
     }
     try {
         SucursalDAO::save($sucursal);
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("No se pudo actualizar la sucursal: " . $e);
         if ($e->getCode() == 901) {
             throw new Exception("No se pudo actualizar la sucursal: " . $e->getMessage(), 901);
         }
         throw new Exception("No se pudo actualizar la sucursal", 901);
     }
     DAO::transEnd();
     Logger::log("Sucursal actualizada exitosamente");
 }
 /**
  *
  *Insertar un nuevo usuario. El usuario que lo crea sera tomado de la sesion actual y la fecha sera tomada del servidor. Un usuario no puede tener mas de un rol en una misma sucursal de una misma empresa.
  *
  * @param password string Password del usuario
  * @param id_rol int Id del rol del usuario en la instnacia
  * @param nombre string Nombre del usuario
  * @param codigo_usuario string Codigo interno del usuario
  * @param facturar_a_terceros bool Si el usuario puede facturar a terceros
  * @param id_sucursal int Id de la sucursal donde fue creado el usuario o donde labora
  * @param mensajeria bool Si el cliente tiene una cuenta de mensajeria
  * @param mpuestos json Objeto que contendra los impuestos que afectan a este usuario
  * @param dia_de_pago string Fecha de pago del cliente
  * @param cuenta_bancaria string Cuenta bancaria del usuario
  * @param representante_legal string Nombre del representante legal del usuario
  * @param saldo_del_ejercicio float Saldo del ejercicio del cliente
  * @param salario float Si el usuario contara con un salario especial no especificado por el rol
  * @param intereses_moratorios float Intereses moratorios del cliente
  * @param ventas_a_credito int Ventas a credito del cliente
  * @param telefono_personal1 string Telefono personal del usuario
  * @param descuento float El porcentaje de descuento que se le hara al usuario al venderle
  * @param pagina_web string Pagina web del usuario
  * @param limite_credito float El limite de credito del usuario
  * @param telefno_personal2 string Telefono personal del usuario
  * @param telefono1_2 string Telefono de la direccion alterna del usuario
  * @param codigo_postal string Codigo postal del Agente
  * @param telefono2_2 string Telefono 2 de la direccion al terna del usuario
  * @param codigo_postal_2 string Codigo postal de la direccion alterna del usuario
  * @param texto_extra_2 string Texto extra para ubicar la direccion alterna del usuario
  * @param numero_interior_2 string Numero interior de la direccion alterna del usuario
  * @param id_ciudad int ID de la ciudad donde vive el agente
  * @param colonia_2 string Colonia de la direccion alterna del usuario
  * @param calle string Calle donde vive el agente
  * @param numero_interior string Numero interior del agente
  * @param id_ciudad_2 int Id de la ciudad de la direccion alterna del usuario
  * @param correo_electronico string Correo Electronico del agente
  * @param texto_extra string Comentario sobre la direccion del agente
  * @param telefono2 string Otro telefono del agente
  * @param denominacion_comercial string Denominacion comercial del cliente
  * @param dias_de_credito int Dias de credito del cliente
  * @param calle_2 string Calle de la direccion alterna del usuario
  * @param numero_exterior_2 string Numero exterior de la direccion alterna del usuario
  * @param telefono1 string Telefono principal del agente
  * @param dias_de_embarque int Dias de embarque del proveedor ( Lunes, Miercoles, Viernes, etc)
  * @param numero_exterior string Numero exterior del agente
  * @param id_clasificacion_cliente int Id de la clasificacion del cliente
  * @param curp string CURP del agente
  * @param dia_de_revision string Fecha de revision del cliente
  * @param cuenta_mensajeria string Cuenta de mensajeria del usuario
  * @param comision_ventas float El porcentaje de la comision que ganara este usuario especificamente por ventas
  * @param rfc string RFC del agente
  * @param id_clasificacion_proveedor int Id de la clasificacion del proveedor
  * @param colonia string Colonia donde vive el agente
  * @param retenciones json Ids de las retenciones que afectan a este usuario
  * @return id_usuario int Id generado por la inserci�n del usuario
  **/
 public static function NuevoUsuario($codigo_usuario, $id_rol, $nombre, $password, $comision_ventas = 0, $correo_electronico = null, $cuenta_bancaria = null, $cuenta_mensajeria = null, $curp = null, $denominacion_comercial = null, $descuento = null, $dias_de_credito = null, $dias_de_embarque = null, $dia_de_pago = null, $dia_de_revision = null, $direcciones = null, $facturar_a_terceros = null, $id_clasificacion_cliente = null, $id_clasificacion_proveedor = null, $id_moneda = null, $id_sucursal = null, $id_tarifa_compra = null, $id_tarifa_venta = null, $id_usuario_padre = null, $impuestos = null, $intereses_moratorios = null, $limite_credito = 0, $mensajeria = null, $pagina_web = null, $representante_legal = null, $retenciones = null, $rfc = null, $salario = null, $saldo_del_ejercicio = null, $telefono_personal1 = null, $telefono_personal2 = null, $tiempo_entrega = null, $ventas_a_credito = null)
 {
     Logger::log("Creando nuevo usuario `{$nombre}` ...");
     /*
     $validar = self::validarParametrosUsuario(
     					null,
     					null,
     					$id_sucursal,
     					$id_rol,
     				$id_clasificacion_cliente,
     					$id_clasificacion_proveedor,
     					$id_moneda,
     				null,
     					$nombre,
     					$rfc,
     					$curp,
     					$comision_ventas,
     					$telefono_personal1,
     				$telefono_personal2,
     					$limite_credito,
     					$descuento,
     					$password,
     					$salario,
     				$correo_electronico,
     					$pagina_web,
     					$saldo_del_ejercicio,
     					$ventas_a_credito,
     				$representante_legal,
     					$facturar_a_terceros,
     					$dia_de_pago,
     					$mensajeria,
     				$intereses_moratorios,
     					$denominacion_comercial,
     					$dias_de_credito,
     				$cuenta_mensajeria,
     					$dia_de_revision,
     					$codigo_usuario,
     					$dias_de_embarque,
     					$tiempo_entrega,
     					$cuenta_bancaria,
     				$id_tarifa_compra,
     					$id_tarifa_venta,
     					$id_usuario_padre);
     
     //se verifica que la validacion haya sido correcta
     if(is_string($validar))
     {
     		Logger::error("Imposible crear a nuevo usuario: " . $validar);
     		throw new Exception($validar, 901);
     }
     */
     //Se verifica que las direcciones recibidas sean un arreglo
     if (!is_null($direcciones)) {
         if (!is_array($direcciones)) {
             Logger::error("Las direcciones recibidas no son un arreglo");
             throw new Exception("Las direcciones recibidas no son un arreglo", 901);
         }
     }
     //se verifica que el codigo de usuario no sea repetido
     if (!is_null($codigo_usuario)) {
         $usuarioscod = UsuarioDAO::search(new Usuario(array("codigo_usuario" => $codigo_usuario)));
         if (sizeof($usuarioscod) > 0) {
             throw new Exception("El codigo de usuario " . $codigo_usuario . " ya esta en uso", 901);
         }
     }
     //se verifica que el rfc no sea repetido
     if (!is_null($rfc)) {
         $usuariosrfc = UsuarioDAO::search(new Usuario(array("rfc" => $rfc, "activo" => 1)));
         if (sizeof($usuariosrfc) > 0) {
             $rfc = null;
             Logger::error("El rfc " . $rfc . " ya existe");
             //throw new BusinessLogicException("El rfc ".$rfc." ya existe");
         }
     }
     //se verifica que la curp no sea repetida
     if (!is_null($curp)) {
         $usuarios = UsuarioDAO::search(new Usuario(array("curp" => $curp, "activo" => 1)));
         if (sizeof($usuarios) > 0) {
             Logger::error("La curp " . $curp . " ya existe");
         }
     }
     //se verifica que los telefonos no sean iguales
     if (!is_null($telefono_personal1) && $telefono_personal1 == $telefono_personal2) {
         Logger::error("El telefono personal es igual al telefno personal alterno: " . $telefono_personal1 . "  " . $telefono_personal2);
         //throw new Exception("El telefono personal es igual al telefno personal alterno: ".$telefono_personal1."  ".$telefono_personal2,901);
     }
     //se verifica que el correo electronico no se repita y que sea valido
     if (!is_null($correo_electronico)) {
         if (!filter_var($correo_electronico, FILTER_VALIDATE_EMAIL)) {
             $correo_electronico = null;
             Logger::error("El correo electronico " . $correo_electronico . " es invalido");
             throw new InvalidDatabaseOperationException("El correo electronico es invalido");
         } else {
             $usuariose = UsuarioDAO::search(new Usuario(array("correo_electronico" => $correo_electronico, "activo" => 1)));
             if (sizeof($usuariose) > 0) {
                 throw new BusinessLogicException("El correo " . $correo_electronico . " ya esta en uso");
                 $correo_electronico = null;
             }
         }
     }
     //se verifica como medida de seguridad que el password no sea igual al codigo de usaurio ni al correo electronico
     if (!is_null($password)) {
         if ($password == $codigo_usuario || $password == $correo_electronico) {
             Logger::error("El password (" . $password . ") no puede ser igual al codigo de usuario (" . $codigo_usuario . ") ni al correo electronico (" . $correo_electronico . ")");
             throw new BusinessLogicException("El password (" . $password . ") no puede ser igual al codigo de usuario (" . $codigo_usuario . ") ni al correo electronico (" . $correo_electronico . ")", 901);
         }
     } else {
         $password = "******" . rand(1, 9) . rand(1, 9);
     }
     //se ponen los valores por default en limite de credito y saldo del ejercicio
     if (is_null($limite_credito)) {
         $limite_credito = 0;
     }
     if (is_null($saldo_del_ejercicio)) {
         $saldo_del_ejercicio = 0;
     }
     //Si la tarifa de compra o de venta es nula, entonces se tomaran las del clasificaciond el cliente, del proveedor o del rol
     // segun esten disponibles
     $origen_compra = "usuario";
     $origen_venta = "usuario";
     //Si la tarifa de venta sigue siendo nula, se toma la default
     if (is_null($id_tarifa_venta)) {
         $id_tarifa_venta = 1;
     }
     //Si la tarifa de compra sigue siendo nula, se toma la default
     if (is_null($id_tarifa_compra)) {
         $id_tarifa_compra = 2;
     }
     if (is_null($id_clasificacion_cliente)) {
         $id_categoria_contacto = $id_clasificacion_proveedor;
     } else {
         $id_categoria_contacto = $id_clasificacion_cliente;
     }
     //se crea el objeto usuario con todos los parametros
     $usuario = new Usuario(array("id_sucursal" => $id_sucursal, "id_rol" => $id_rol, "id_perfil" => 1, "id_clasificacion_cliente" => $id_clasificacion_cliente, "id_clasificacion_proveedor" => $id_clasificacion_proveedor, "id_categoria_contacto" => $id_categoria_contacto, "id_moneda" => $id_moneda, "fecha_asignacion_rol" => time(), "nombre" => $nombre, "rfc" => $rfc, "curp" => $curp, "comision_ventas" => $comision_ventas, "telefono_personal1" => $telefono_personal1, "telefono_personal2" => $telefono_personal2, "fecha_alta" => time(), "activo" => 1, "limite_credito" => $limite_credito, "descuento" => $descuento, "password" => hash("md5", $password), "salario" => $salario, "correo_electronico" => $correo_electronico, "pagina_web" => $pagina_web, "saldo_del_ejercicio" => $saldo_del_ejercicio, "ventas_a_credito" => $ventas_a_credito, "representante_legal" => $representante_legal, "facturar_a_terceros" => $facturar_a_terceros, "mensajeria" => $mensajeria, "intereses_moratorios" => $intereses_moratorios, "denominacion_comercial" => $denominacion_comercial, "dias_de_credito" => $dias_de_credito, "cuenta_de_mensajeria" => $cuenta_mensajeria, "codigo_usuario" => $codigo_usuario, "dias_de_embarque" => $dias_de_embarque, "tiempo_entrega" => $tiempo_entrega, "cuenta_bancaria" => $cuenta_bancaria, "consignatario" => 0, "id_tarifa_compra" => $id_tarifa_compra, "id_tarifa_venta" => $id_tarifa_venta, "tarifa_compra_obtenida" => $origen_compra, "tarifa_venta_obtenida" => $origen_venta, "id_usuario_padre" => $id_usuario_padre));
     DAO::transBegin();
     try {
         //Se crean las direcciones recibidas
         if (!is_null($direcciones)) {
             foreach ($direcciones as $d) {
                 if (!is_array($d)) {
                     $d = object_to_array($d);
                 }
                 if (!is_array($d)) {
                     throw new InvalidDataException("Las direcciones deben ser un arreglo de arreglos.");
                 }
                 $address_id = DireccionController::NuevaDireccion($calle = isset($d["calle"]) ? $d["calle"] : null, $numero_exterior = isset($d["numero_exterior"]) ? $d["numero_exterior"] : null, $colonia = isset($d["colonia"]) ? $d["colonia"] : null, $id_ciudad = isset($d["id_ciudad"]) ? $d["id_ciudad"] : null, $codigo_postal = isset($d["codigo_postal"]) ? $d["codigo_postal"] : null, $numero_interior = isset($d["numero_interior"]) ? $d["numero_interior"] : null, $referencia = isset($d["referencia"]) ? $d["referencia"] : null, $telefono = isset($d["telefono1"]) ? $d["telefono1"] : null, $telefono2 = isset($d["telefono2"]) ? $d["telefono2"] : null);
                 $usuario->setIdDireccion($address_id);
             }
         }
         //Se guarda el usuario creado.
         UsuarioDAO::save($usuario);
         //si se pasaron impuestos, se validan y se agregan a la tabla impuesto_usuario
         if (!is_null($impuestos)) {
             $impuestos = object_to_array($impuestos);
             if (!is_array($impuestos)) {
                 throw new Exception("Los impuestos no fueron recibidos correctamente", 901);
             }
             foreach ($impuestos as $id_impuesto) {
                 $validar = self::validarParametrosImpuestoUsuario($id_impuesto);
                 if (is_string($validar)) {
                     throw new Exception($validar, 901);
                 }
                 ImpuestoUsuarioDAO::save(new ImpuestoUsuario(array("id_impuesto" => $id_impuesto, "id_usuario" => $usuario->getIdUsuario())));
             }
         }
         //si se pasaron retenciones, se validan y se agregan a la tabla retencion_usuario
         if (!is_null($retenciones)) {
             $retenciones = object_to_array($retenciones);
             if (!is_array($retenciones)) {
                 throw new Exception("Las retenciones no fueron recibidas correctamente", 901);
             }
             foreach ($retenciones as $id_retencion) {
                 $validar = self::validarParametrosRetencionUsuario($id_retencion);
                 if (is_string($validar)) {
                     throw new Exception($validar, 901);
                 }
                 RetencionUsuarioDAO::save(new RetencionUsuario(array("id_retencion" => $id_retencion, "id_usuario" => $usuario->getIdUsuario())));
             }
         }
         //Se buscan los permisos de este rol y se le asignan a este usuario
         $permisos_rol = PermisoRolDAO::search(new PermisoRol(array("id_rol" => $id_rol)));
         foreach ($permisos_rol as $permiso_rol) {
             PermisoUsuarioDAO::save(new PermisoUsuario(array("id_usuario" => $usuario->getIdUsuario(), "id_permiso" => $permiso_rol->getIdPermiso())));
         }
     } catch (BusinessLogicExceptoin $ble) {
         throw $ble;
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("No se pudo crear al usuario: " . $e);
         if ($e->getCode() == 901) {
             throw new Exception("No se pudo crear al usuario: " . $e->getMessage(), 901);
         }
         throw new Exception("No se pudo crear al usuario, consulte a su administrador de sistema", 901);
     }
     DAO::transEnd();
     Logger::log("Usuario creado exitosamente con id" . $usuario->getIdUsuario());
     return array("id_usuario" => $usuario->getIdUsuario());
 }
Пример #3
0
 /**
  *
  * Un administrador puede editar una sucursal, incuso si hay puntos de venta con sesiones activas que pertenecen a esa empresa. 
  *
  * @author Juan Manuel Garc&iacute;a Carmona <*****@*****.**>
  * @param id_empresa int Id de la empresa a modificar
  * @param cuentas_bancarias json Arreglo que contiene los id de las cuentas bancarias
  * @param direccion json {    "tipo": "fiscal",    "calle": "Francisco I Madero",    "numero_exterior": "1009A",    "numero_interior": 12,    "colonia": "centro",    "codigo_postal": "38000",    "telefono1": "4611223312",    "telefono2": "",       "id_ciudad": 3,    "referencia": "El local naranja"}
  * @param direccion_web string Direccion del sitio de la empresa
  * @param email string Correo electronico de la empresa
  * @param id_moneda string Id de la moneda base que manejaran las sucursales
  * @param impuestos_compra json Impuestos de compra por default que se heredan a las sucursales y estas a su vez a los productos
  * @param impuestos_venta json Impuestos de venta por default que se heredan a las sucursales y estas a su vez a los productos
  * @param mensaje_morosos string mensaje enviado a los clientes (email) cuando un pago es demorado
  * @param razon_social string El nombre de la nueva empresa.
  * @param representante_legal string El nombre del representante legal de la nueva empresa.
  * @param rfc string RFC de la empresa
  * @param uri_logo string url del logo de la empresa
  **/
 public static function Editar($id_empresa, $cuentas_bancarias = null, $direccion = null, $direccion_web = null, $email = null, $id_moneda = "0", $impuestos_compra = null, $impuestos_venta = null, $mensaje_morosos = null, $razon_social = null, $representante_legal = null, $rfc = null, $uri_logo = null)
 {
     //se guarda el registro de la empresa y se verifica que este activa
     $empresa = EmpresaDAO::getByPK($id_empresa);
     if (!$empresa->getActivo()) {
         Logger::error("La empresa no esta activa, no se puede editar una empresa desactivada");
         throw new Exception("La empresa no esta activa, no se puede editar una empresa desactivada", 901);
     }
     $empresa->setDireccionWeb($direccion_web);
     //TODO : Por que carajos no esta el campo email!!
     //$empresa->setEmail($email);
     //TODO : No se debe de editar
     //$empresa->setIdMoneda($id_moneda);
     $empresa->setMensajeMorosos($mensaje_morosos);
     $empresa->setRazonSocial($razon_social);
     $empresa->setRepresentanteLegal($representante_legal);
     $empresa->setRfc($rfc);
     //editamos el id del logo
     if (!empty($uri_logo)) {
         //varificamos si cambio el logo
         $_logo = LogoDAO::getByPK($empresa->getIdLogo());
         if ($uri_logo !== $_logo->getImagen()) {
             $logo = new Logo(array("imagen" => $uri_logo, "tipo" => "-"));
             try {
                 LogoDAO::save($logo);
             } catch (Exception $e) {
                 DAO::transRollback();
                 Logger::error("No se pudo crear la empresa, error al crear el logo: " . $e->getMessage());
                 throw new Exception("No se pudo crear la empresa, consulte a su administrador de sistema", 901);
             }
             $id_logo = $logo->getIdLogo();
             $empresa->setIdLogo($id_logo);
         }
     }
     //lógica para manejar la edicion o agregado de una direccion verificamos si se cambiaron las direcciones
     if (!is_null($direccion)) {
         if (!is_array($direccion)) {
             //Logger::error("Verifique el formato de los datos de las direcciones, se esperaba un array ");
             //throw new Exception("Verifique el formato de los datos de las empresas, se esperaba un array ");
             $direccion = object_to_array($direccion);
         }
         $_direccion = new Direccion($direccion);
         $d = DireccionDAO::getByPK($empresa->getIdDireccion());
         //verificamos si se va a editar una direccion o se va a crear una nueva
         if (isset($d->id_direccion)) {
             //se edita la direccion
             if (!($_direccion = DireccionDAO::getByPK($d->id_direccion))) {
                 DAO::transRollback();
                 Logger::error("No se tiene registro de la dirección con id : {$direccion->id_direccion}");
                 throw new InvalidDataException("No se tiene registro de la dirección con id : {$direccion->id_direccion}");
             }
             $_direccion->setIdDireccion($d->id_direccion);
             //bandera que indica si cambia algun parametro de la direccion
             $cambio_direccion = false;
             //calle
             if (isset($d->calle)) {
                 $cambio_direccion = true;
                 $_direccion->setCalle($direccion['calle']);
             }
             //numero_exterior
             if (isset($d->numero_exterior)) {
                 $cambio_direccion = true;
                 $_direccion->setNumeroExterior($direccion['numero_exterior']);
             }
             //numero_interior
             if (isset($d->numero_interior)) {
                 $cambio_direccion = true;
                 $_direccion->setNumeroInterior($direccion['numero_interior']);
             }
             //referencia
             if (isset($d->referencia)) {
                 $cambio_direccion = true;
                 $_direccion->setReferencia($direccion['referencia']);
             }
             //colonia
             if (isset($d->colonia)) {
                 $cambio_direccion = true;
                 $_direccion->setColonia($direccion['colonia']);
             }
             //id_ciudad
             if (isset($d->id_ciudad)) {
                 $cambio_direccion = true;
                 $_direccion->setIdCiudad($direccion['id_ciudad']);
             }
             //codigo_postal
             if (isset($d->codigo_postal)) {
                 $cambio_direccion = true;
                 $_direccion->setCodigoPostal($direccion['codigo_postal']);
             }
             //telefono
             if (isset($d->telefono)) {
                 $cambio_direccion = true;
                 $_direccion->setTelefono($direccion['telefono1']);
             }
             //telefono2
             if (isset($d->telefono2)) {
                 $cambio_direccion = true;
                 $_direccion->setTelefono2($direccion['telefono2']);
             }
             //Si cambio algun parametro de direccion, se actualiza el usuario que modifica y la fecha
             if ($cambio_direccion) {
                 DireccionController::EditarDireccion($_direccion);
             } else {
                 DireccionController::NuevaDireccion($calle = isset($d->calle) ? $d->calle : "", $numero_exterior = isset($d->numero_exterior) ? $d->numero_exterior : "", $colonia = isset($d->colonia) ? $d->colonia : "", $id_ciudad = isset($d->id_ciudad) ? $d->id_ciudad : "", $codigo_postal = isset($d->codigo_postal) ? $d->codigo_postal : "", $numero_interior = isset($d->numero_interior) ? $d->numero_interior : "", $referencia = isset($d->referencia) ? $d->referencia : "", $telefono = isset($d->telefono) ? $d->telefono : "", $telefono2 = isset($d->telefono2) ? $d->telefono2 : "");
             }
         }
     }
     DAO::transBegin();
     try {
         //Se guardan los cambios hechos en la empresa
         EmpresaDAO::save($empresa);
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("No se pudo modificar la empresa: " . $e);
         throw new Exception("No se pudo modificar la empresa");
     }
     $impuestos_empresa = ImpuestoEmpresaDAO::search(new ImpuestoEmpresa(array("id_empresa" => $empresa->getIdEmpresa())));
     //quitamos los impuestos que no estan actualmente
     foreach ($impuestos_empresa as $impuesto_empresa) {
         $exist_ic = false;
         foreach ($impuestos_compra as $impuesto_compra) {
             if ($impuesto_compra->getIdImpuesto() == $impuesto_empresa->getIdImpuesto()) {
                 $exist_ic = true;
             }
         }
         if (!$exist_ic) {
             try {
                 ImpuestoEmpresaDAO::delete($impuesto_empresa);
             } catch (Exception $e) {
                 Logger::warn("Error al eliminar impuesto : " . $e->getMessage());
             }
         }
     }
     $impuestos_empresa = ImpuestoEmpresaDAO::search(new ImpuestoEmpresa(array("id_empresa" => $empresa->getIdEmpresa())));
     foreach ($impuestos_empresa as $impuesto_empresa) {
         $exist_iv = false;
         foreach ($impuestos_venta as $impuesto_venta) {
             if ($impuesto_venta->getIdImpuesto() == $impuesto_venta->getIdImpuesto()) {
                 $exist_iv = true;
             }
         }
         if (!$exist_iv) {
             try {
                 ImpuestoEmpresaDAO::delete($impuesto_empresa);
             } catch (Exception $e) {
                 Logger::warn("Error al eliminar impuesto : " . $e->getMessage());
             }
         }
     }
     //agregamos los impuestos de compra que no existen
     $impuestos_empresa = ImpuestoEmpresaDAO::search(new ImpuestoEmpresa(array("id_empresa" => $empresa->getIdEmpresa())));
     if ($impuestos_compra != NULL) {
         foreach ($impuestos_compra as $impuesto_compra) {
             $exist_ic = false;
             foreach ($impuestos_empresa as $impuesto_empresa) {
                 if ($impuesto_compra->getIdImpuesto() == $impuesto_empresa->getIdImpuesto()) {
                     $exist_ic = true;
                 }
             }
             if (!$exist_ic) {
                 try {
                     ImpuestoEmpresaDAO::save(new ImpuestoEmpresa(array("id_empresa" => $empresa->getIdEmpresa(), "id_impuesto" => $impuesto_compra->getIdImpuesto())));
                 } catch (Exception $e) {
                     Logger::warn("Error al guardar un impuesto compra : " . $e->getMessage());
                 }
             }
         }
     }
     //agregamos los impuestos de venta que no existen
     $impuestos_empresa = ImpuestoEmpresaDAO::search(new ImpuestoEmpresa(array("id_empresa" => $empresa->getIdEmpresa())));
     if ($impuestos_venta != NULL) {
         foreach ($impuestos_venta as $impuesto_venta) {
             $exist_iv = false;
             foreach ($impuestos_venta as $impuesto_venta) {
                 if ($impuesto_venta->getIdImpuesto() == $impuesto_venta->getIdImpuesto()) {
                     $exist_iv = true;
                 }
             }
             if (!$exist_iv) {
                 try {
                     ImpuestoEmpresaDAO::save(new ImpuestoEmpresa(array("id_empresa" => $empresa->getIdEmpresa(), "id_impuesto" => $impuesto_venta->getIdImpuesto())));
                 } catch (Exception $e) {
                     Logger::warn("Error al guardar un impuesto venta : " . $e->getMessage());
                 }
             }
         }
     }
     if ($cuentas_bancarias != NULL) {
         foreach ($cuentas_bancarias as $cuenta_bancarias) {
             //Pendiente hasta que se haga el SPEC de cuentas bancarias
         }
     }
     DAO::transEnd();
     Logger::log("Empresa editada con exito");
 }