public function testExtraParamsOutOfSync()
 {
     //create user A
     $userA = ClientesController::Nuevo("userA" . time());
     Logger::log("Create client A  [userid=" . $userA["id_cliente"] . "]");
     //create extra param
     $extraParamStruct = new ExtraParamsEstructura();
     $extraParamStruct->setTabla("usuarios");
     $extraParamStruct->setCampo("campo" . time());
     $extraParamStruct->setTipo("string");
     $extraParamStruct->setEnum(NULL);
     $extraParamStruct->setLongitud(128);
     $extraParamStruct->setObligatorio(FALSE);
     $extraParamStruct->setCaption("caption" . time());
     $extraParamStruct->setDescripcion("description" . time());
     ExtraParamsEstructuraDAO::save($extraParamStruct);
     Logger::log("Extra params " . $extraParamStruct->getIdExtraParamsEstructura() . " created");
     //create user B
     $userB = ClientesController::Nuevo("userB" . time());
     Logger::log("Create client B  [userid=" . $userB["id_cliente"] . "]");
     //user B should have extra param
     Logger::log("Looking for extra params in clientB");
     $userBExtraParams = ExtraParamsValoresDAO::getVals("usuarios", $userB["id_cliente"]);
     $found = false;
     for ($i = 0; $i < sizeof($userBExtraParams); $i++) {
         if ($userBExtraParams[$i]["campo"] == $extraParamStruct->getCampo()) {
             $found = true;
         }
     }
     $this->assertTrue($found, "ClientB should have the new extra param campo=" . $extraParamStruct->getCampo());
     ExtraParamsValoresDAO::actualizarRegistros("usuarios");
     //user A should have extra param
     $userAExtraParams = ExtraParamsValoresDAO::getVals("usuarios", $userA["id_cliente"]);
     $found = false;
     for ($i = 0; $i < sizeof($userAExtraParams); $i++) {
         if ($userAExtraParams[$i]["campo"] == $extraParamStruct->getCampo()) {
             $found = true;
         }
     }
     $this->assertTrue($found, "When adding new extraparams old users should get updated" . $extraParamStruct->getCampo());
 }
 /**
  *
  *Crear un nuevo cliente. Para los campos de Fecha_alta y Fecha_ultima_modificacion se usar?a fecha actual del servidor. El campo Agente y Usuario_ultima_modificacion ser?tomados de la sesi?ctiva. Para el campo Sucursal se tomar?a sucursal activa donde se est?reando el cliente. 
  * Al crear un cliente se le creara un usuario para la interfaz de cliente y pueda ver sus facturas y eso, si tiene email. Al crearse se le enviara un correo electronico con el url.
  *
  * @param razon_social string Nombre o razon social del cliente.
  * @param password string Password del cliente
  * @param codigo_cliente string Codigo interno del cliente
  * @param codigo_postal string Codigo postal del cliente
  * @param direccion_web string Direccin web del cliente.
  * @param rfc string RFC del cliente.
  * @param clasificacion_cliente int Id de la clasificacin del cliente.
  * @param calle string Calle del cliente
  * @param curp string CURP del cliente.
  * @param telefono2 string Segundo telfono del cliente.
  * @param mensajeria bool Si el cliente cuenta con un cliente de mensajera y paquetera.
  * @param numero_exterior string Nmero exterior del cliente
  * @param cuenta_de_mensajeria string Este parmetro se vuelve obligatorio si el parmetro Mensajera es true. Especifica la cuenta de mensajera instantanea del cliente.
  * @param denominacion_comercial string Nombre comercial del cliente.
  * @param representante_legal string Nombre del representante legal del cliente.
  * @param colonia string Colonia del cliente
  * @param numero_interior string Nmero interior del cliente.
  * @param moneda_del_cliente int Moneda que maneja el cliente.
  * @param telefono1 string Telefono del cliente
  * @param id_ciudad int id de la ciudad
  * @param retenciones json Objeto que contendra los ids de las retenciones que afectan a este cliente
  * @param impuestos json Objeto que contendra los impuestos que afectan a este cliente
  * @param email string E-mail del cliente
  * @param texto_extra string Comentario sobre la direccin del cliente.
  * @return id_cliente int Id autogenerado del cliente que se insert�
  **/
 public static function Nuevo($razon_social, $clasificacion_cliente = null, $codigo_cliente = null, $cuenta_de_mensajeria = null, $curp = null, $denominacion_comercial = null, $descuento_general = "0", $direcciones = null, $email = null, $extra_params = null, $id_cliente_padre = null, $id_moneda = 1, $id_tarifa_compra = null, $id_tarifa_venta = null, $limite_credito = "0", $password = null, $representante_legal = null, $rfc = null, $sitio_web = null, $telefono_personal1 = null, $telefono_personal2 = null)
 {
     //Se toma la sucursal actual para asignarsela al cliente
     $actual = SesionController::Actual();
     if (is_null($clasificacion_cliente)) {
         $clasificacion_cliente = 1;
     }
     if (!is_null($codigo_cliente)) {
         $res = UsuarioDAO::search(new Usuario(array("codigo_usuario" => $codigo_cliente)));
         if (sizeof($res) >= 1) {
             throw new InvalidDataException("El codigo de cliente ya esta en uso");
         }
     }
     //se crea la cliente utilizando el metodo Nuevo usuario, este se encarga de la validacion
     //y se toma como rol de cliente el 5
     if (strlen($rfc) == 0) {
         $rfc = null;
     }
     if (strlen($curp) == 0) {
         $curp = null;
     }
     if (strlen($email) == 0) {
         $email = null;
     }
     if (is_null($direcciones)) {
         $direcciones = array(new Direccion());
     }
     if (is_null($password)) {
         $password = "******" . rand(1, 9) . rand(1, 9);
     }
     try {
         $cliente = PersonalYAgentesController::NuevoUsuario(null, 5, $razon_social, $password, null, $email, null, $cuenta_de_mensajeria, $curp, $denominacion_comercial, $descuento_general, null, null, null, null, $direcciones, 0, $clasificacion_cliente, null, $id_moneda, $actual["id_sucursal"], $id_tarifa_compra, $id_tarifa_venta, $id_cliente_padre, null, null, $limite_credito, null, $sitio_web, $representante_legal, null, $rfc, null, null, null, $telefono_personal1, $telefono_personal2);
         ExtraParamsValoresDAO::setVals("usuarios", $extra_params, $cliente["id_usuario"]);
         $clienteObj = UsuarioDAO::getByPK($cliente["id_usuario"]);
         $clienteObj->setCodigoUsuario($codigo_cliente);
         UsuarioDAO::save($clienteObj);
         //guardar el codigo cliente
     } catch (Exception $e) {
         Logger::error($e);
         throw new InvalidDataException($e->getMessage());
     }
     ExtraParamsValoresDAO::actualizarRegistros("usuarios");
     return array("id_cliente" => (int) $cliente["id_usuario"]);
 }