runtimerevolution/citizenship

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# Citizenship

[![Join the chat at https://gitter.im/runtimerevolution/citizenship](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/runtimerevolution/citizenship?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)

[![Gem Version](https://badge.fury.io/rb/citizenship.svg)](http://badge.fury.io/rb/citizenship)
[![Build Status](https://travis-ci.org/runtimerevolution/citizenship.svg?branch=master)](https://travis-ci.org/runtimerevolution/citizenship)
[![Code Climate](https://codeclimate.com/github/runtimerevolution/citizenship/badges/gpa.svg)](https://codeclimate.com/github/runtimerevolution/citizenship)
[![Dependency Status](https://gemnasium.com/runtimerevolution/citizenship.svg)](https://gemnasium.com/runtimerevolution/citizenship)
[![security](https://hakiri.io/github/runtimerevolution/citizenship/master.svg)](https://hakiri.io/github/runtimerevolution/citizenship/master)
[![Coverage Status](https://coveralls.io/repos/runtimerevolution/citizenship/badge.svg)](https://coveralls.io/r/runtimerevolution/citizenship)

Citizenship provides a set of easy validations on personal documents, addresses, bank account numbers and other personal information, of Portuguese citizens or of citizens living in Portugal ;)

It supports validation of:

- NIB (i.e. "banking account number")
- NIF (i.e. "fiscal number")
- local phone numbers
- identification card ('bilhetes de identidade'), were the old id Portuguese id documents. They are no longer issue, but many haven't yet expired, so are still used alongside the Citizen Card.
- citizen card ('cartão do cidadão'), are the new ID cards currently in use
- zip code (partial validation)
- e-mail (well, just because :) )


## Installation

Add this line to your Rails application's Gemfile:

    gem 'citizenship'

And then execute:

    $ bundle

Or install it yourself as:

    $ gem install citizenship

and use it standalone.

## Validations

### NIB

```ruby 
result=Citizenship.valid_nib?("003503730000539151280") # returns true
result=Citizenship.valid_nib?('0035.03730000539.1512.80') # returns true
result=Citizenship.valid_nib?('38476129847') # returns false (since it fails proper size and CRC)
result=Citizenship.valid_nib?('0035.03730000539.1512.80', strict: true) # returns false
Citizenship.valid_nib!(nib) # raises Citizenship::Error if invalid
```

### NIF

```ruby 
result=Citizenship.valid_nif?("123456789") # returns true
Citizenship.valid_nif!(nif) # raises Citizenship::Error if invalid
nif=Citizenship.valid_nif!("123456789") # returns "123456789"
result=Citizenship.valid_nif?(' 123456789', strict: true) # returns false (strict validation disallows whitespaces and others)
```

### Phone Number

```ruby 
phone=Citizenship.valid_phone!('+351 96 933 2233', only_prefixes: ['93', '96']) # returns "+351 96 933 2233"
phone=Citizenship.valid_phone!('262-999-666') # returns "262-999-666"
result=Citizenship.valid_phone?('262999666', strict: true) # returns true
result=Citizenship.valid_phone?('+351 93 933 2233', allow_country_prefix: false) # returns false (since country prefix was used)
phone=Citizenship.valid_phone!('+351 93 933 2233') # returns "+351 93 933 2233"
```

### Identification Card

```ruby 
result=Citizenship.valid_identification_card?('156 944 80', '4') # returns true
id=Citizenship.valid_identification_card!('156 944 8', '8') # returns '156 944 8'
```

### Citizen Card

```ruby 
result=Citizenship.valid_citizen_card?('00000000 0 ZZ 4') # returns true
id=Citizenship.valid_citizen_card('00000000-0-ZZ-4') # returns '00000000-0-ZZ-4'
```

### Zip Code

```ruby 
result=Citizenship.valid_zip_code?('1000-100') # returns true
```

### E-mail

```ruby 
result=Citizenship.valid_email?("user@example.org") # returns true
result=Citizenship.valid_email?("  user@example.org ") # returns false (due to whitespaces)
result=Citizenship.valid_email?("@example.org") # returns false (due to missing user)
```

## Rails Validators

We provide a useful range of Rails validators that you can include in your models, namely:

* NifValidator ("nif")
* NibValidator ("nib")
* PhoneValidator ("phone")
* EmailValidator ("email")
* ZipCodeValidator ("zip_code")

### Example


    class User < ActiveRecord::Base
      validates :fiscal_number, nif: true
      validates :mobile, phone: { allow_country_prefix: false }
      ...
    end
 

## Future Developments

* Support full zip code validation
* Support IBAN
* Support validating documents for other EU countries

## References

* [NIB](http://pt.wikipedia.org/wiki/N%C3%BAmero_de_Identifica%C3%A7%C3%A3o_Banc%C3%A1ria)
* [NIF](http://pt.wikipedia.org/wiki/N%C3%BAmero_de_identifica%C3%A7%C3%A3o_fiscal)
* [Citizen Card](http://www.cartaodecidadao.pt/images/stories/Algoritmo_Num_Documento_CC.pdf)
* [(old) Identification Card](http://geramat.blogs.sapo.pt/13528.html)
* [ZIP codes](http://pt.wikipedia.org/wiki/N%C3%BAmero_de_Identifica%C3%A7%C3%A3o_Banc%C3%A1ria)



## Contributing

1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request

## License
Copyright © 2015 [Runtime Revolution](http://www.runtime-revolution.com), released under the MIT license.

## About Runtime Revolution

![Runtime Revolution](http://webpublishing.s3.amazonaws.com/runtime_small_logo.png)

Citizenship is maintained by [Runtime Revolution](http://www.runtime-revolution.com).
See our [other projects](https://github.com/runtimerevolution/) and check out our [blog](http://www.runtime-revolution.com/runtime/blog) for the latest updates.