Transnode is a web app that manages all aspects of a multinational shipping company. It manages Taxes, Exchange Rates, Countries, States, Cities, Carriers, Customers, Invoices, Credit notes, among others.
Transnode is a web app that manages all aspects of a multinational shipping company. It manages Taxes, Exchange Rates, Countries, States, Cities, Carriers, Customers, Invoices, Credit notes, among others.
We did not design a specific UI for this project but rathered implemented a basic Bootstrap style and concentrated more on the development.
On the Frontend side Transnode was built using technologies such as Dart and Angular Dart. These are new generation languages created by Google. Transnode is integrated with Amazon AWS and we are currently working on an integration with Google Apps for email client management and user logins. On the backend side we are using Ruby on Rails with automated tests to guarantee the right functioning of the app.
Dart applications can only be accessed by using Google Chromium browser.
class Contact < ActiveRecord::Base include Searchable include Filterable include BranchManager belongs_to :location has_one :user has_many :emails, as: :of has_many :phones, as: :of accepts_nested_attributes_for :emails, allow_destroy: true accepts_nested_attributes_for :phones, allow_destroy: true enum type_user: {salesRep: 0, accountant: 1} scope :sales_rep, -> {where(:type_user => ContactType::SALESREP)} validates_presence_of :name, :type_user, :emails, :phones def self.for_select all.pluck(:id,:name) end def self.sales_rep_for_select sales_rep.for_select end def email ( emails.empty? )? "n/h" : emails.first.email; end def roles_for_users (location)? location.roles : [] end end
require 'spec_helper' describe Contact, :type => :model do let(:email){ build(:email) } let(:phone){ build(:phone) } let(:contact){ build(:contact, emails: [email], phones: [phone]) } subject{ contact } it{ is_expected.to respond_to(:name)} it{ is_expected.to respond_to(:title)} it{ is_expected.to respond_to(:role)} it{ is_expected.to respond_to(:type_user)} it{ is_expected.to respond_to(:birthday)} it{ is_expected.to respond_to(:status)} it{ is_expected.to respond_to(:created_at)} it{ is_expected.to respond_to(:updated_at)} it{ expect(contact.emails).to include(email)} it{ expect(contact.phones).to include(phone)} describe 'validation' do it{ is_expected.to validate_presence_of(:name) } it{ is_expected.to validate_presence_of(:type_user) } it{ is_expected.to validate_presence_of(:emails) } it{ is_expected.to validate_presence_of(:phones) } end context 'with optional relation' do let(:location){ build(:location) } let(:user){ build(:user) } describe 'location' do before{ contact.location = location } it{ expect(contact.location).to be(location) } end describe 'user' do before{ contact.user = user } it{ expect(contact.user).to be(user) } end end context 'create' do describe 'multiple roles' do let(:attributes){ attributes_for(:contact) } it do expect{create(:contact, attributes ) }.to change(Contact, :count).by(1) end end describe 'accepts_nested_attributes' do describe 'contacts' do let(:attributes){attributes_for(:contact, emails:[],phones:[],emails_attributes: [attributes_for(:email)] ,phones_attributes: [attributes_for(:phone)])} it { expect{Contact.new(attributes)}.to_not raise_error } end end end end
Don't take our word for it. We run Transnode through Code Climate, and this third party app rates our code and gives us recommendations in how to improve it.
Every Monday we send a report on what the team was able to accomplish the prior week and what the plan is for the upcoming week.
We detail in cards all stories that need to happen in the project. When completed, each card shows an Acceptance Criteria, Pull Request to Github, and Test coverage.
A Sr Developer will conduct Code Reviews and accept or reject the story. When approved a member of the Q/A team tests the story in the production environment.
We do weekly deploys to the project and push all new features to production.
Every week Transnode's team get together, reviews a module of the app and send feedback to our team with how to improve it according to their use needs.
We will still need your feedback in this process to tell us whether it meets the needs or needs further tweaking. Ultimatelly the story must be accepted by you.