Internal system – Toolkit

I have been using a web based product called ActiveCollab for sometime now …

https://activecollab.com

I have been using ActiveCollab since version 4. When ActiveCollab 5 was introduced it had a complete redesign, less features and a more slick user interface.

More features have been introduced to ActiveCollab 5 though since it was first released.

ActiveCollab is a project management system that also handles Time Tracking and Invoicing plus more.

I will continue using ActiveCollab for projects / task management however for other areas of my business I have created my own internal tool which I have named “Toolkit”.

I built my own system because I wanted a system that would do the following …

Estimate earnings
Fixed fee and retainer projects are entered into the Toolkit. The Toolkit can then estimate monthly and yearly earnings based on the projects entered. The projects also includes a way for me to manage all the projects I am working on.

Incomings
The Toolkit has an area in which all incomings can be entered. The incomings can then be exported in a format appropriate for my accountant.

Outgoings
The Toolkit has an area in which all outgoings can be entered. The outgoings can then be exported in a format appropriate for my accountant.

Mileage
The Toolkit has an area in which all mileages can be entered. The mileages can then be exported in a format appropriate for my accountant.

Leads
The Toolkit has an area in which leads can be managed. I actually pulled this area out of the Neptune – Lead Tracker – http://www.neptuneleadtracker.com software system.

CRM
The Toolkit includes an area in which all the companies and people I have worked for can be managed. ActiveCollab does actually include this feature but the Toolkit version allows more advanced search features and has fields on the create / update forms to match my exact needs.

Timetracking
The Toolkit includes an area in which all time entries can be tracked. ActiveCollab does have this feature.

Invoicing
The Toolkit includes an area in which invoices can be created. Invoices can also be generated from time entries. ActiveCollab does include this feature but the Toolkit version matches my exact needs precisely.

Notes
The Toolkit includes an area to keep notes. ActiveCollab does include this feature.

Files
The Toolkit includes an area to upload files. ActiveCollab does include this feature.

ActiveCollab has a more slick, beautiful user interface but in terms of functionality built specifically for myself obviously the Toolkit wins.

The Toolkit is primarily made up of CRUD screens, no fancy UI / Ajax heavy screens here. Just datagrids and buttons.

I am in the process of live testing the Toolkit I have built and will be moving various functions of my business over to the Toolkit.

Work and not work

An event jogged my memory a couple of days ago and provided the inspiration for this blog article. A number of years ago whilst freelancing I rang a web agency to see if they hired freelancers and whether they had a project I could work on.

I told the person in the conversation about my education, my previous work, my company but I also mentioned that I study programming as a hobby also. Immedietly in a raised voice “we are not doing this as a hobby, we do this as a profession, this is not just some hobby!”. At the time I was shocked, what kind of response is this?

I came to the conclusion that this person obviously cannot conceive that programming can be studied as a profession “and” as a hobby i.e. studied in spare time outside of working hours. The reason the person cannot conceive of this is because this is something the person has never done. This person has never worked on a programming project in his spare time outside of work.

The idea that someone could dedicate extra time outside of professional work to programming something they enjoy is inconceivable to him because he does not enjoy it. Surely anybody who enjoys programming and the greatest programmers out there will know that the programmers who also study programming as a hobby are more likely to be more committed to programming than those who only do it for their profession.

This sort of response can be seen across the whole working spectrum, the more the person takes the work “seriously” the less he is interested in doing work. He takes work “seriously” because he does not really want to work, he gets no enjoyment from doing the work so he cannot conceive that anyone else can enjoy doing work.

In reality he does not work take work seriously at all … “we are not doing this as a hobby, we do this as a profession, this is not just some hobby!” has no real meaning. It says nothing as to the quality of the work he is producing, supposing my code as a hobby is of a greater quality than his code as a profession? His statement says nothing, it is just an empty statement stated with the tone of someone trying to be serious but cannot be taken seriously.

Another situation might be the boss who does not let his employees work from home. This can be well rationalized “we do not like our code on other peoples computers it is a sercurity risk” etc. In reality the boss does not let his employees work from home because the boss cannot concieve of an employee who can actually do work when the boss is not watching. You have to be there so the boss can see that the work is being done.

Again this ties into the enjoyment aspect of it. You cannot possibly enjoy work that much that you would go home and work when he is not watching because he does not enjoy doing the work that much and it is not something he would do. It is the joy aspect that is being targetted.

There have been a couple of occasions in the past where I have been working on a programming task in an office and I have looked up to notice a collegue staring at me. One of the collegues was staring at me in joy with a smile on his face, one of the collegues was also staring at me in joy with a smile on his face and he made the statement “you thought you where being clever there didnt you”.

I never thought much of this at the time but the more I thought about it the more it made sense, in those collegues eyes I must have looked similar to this …

https://www.youtube.com/watch?v=laG5XawvtqA&t=980

No I am not claiming to be some super genius, but what they saw was probably something similar to that in their own eyes. What they where actually seeing was the “aliveness” of myself actually enjoying working on a programming task.

This can also be seen when asked to struggle with a programming task. Say a new developer is being introduced to a new codebase …

Myself …

This is how I implemented file uploads.
This is how I implemented error handling.
I put these methods in this Model here and they do this and help with that.
I created this helper class to deal with this.

General developer in the industry …

Yea, just look through the code and struggle with it, mate.

A little bit of struggle is not wrong. Sometimes I already more-a-less knew the answer I was asking I just needed confirmation. Sometimes the struggle can create the “fire” to actually do the work.

I am not saying there should be no struggle I am just saying there should be a balance. In this industry I see far more of the “struggle” path than the opposite, even to the point of asking a question no longer gets an answer but the developer is expected to struggle for 2 hours to get an answer to a question that would have taken 30 seconds to answer. I mean how is this sort of struggle productive? In my opinion, it is counter productive.

The “struggle” path developer rationalization to this is always, “well if I had given you the answer I may as well of been doing the work for you”. Yes in some situations this could be valid but in a lot of the situations I have encountered this it was clearly not valid. It is just an excuse for the “struggle” path developers own lack of effort.

In my own opinion all questions should be answered no matter how simple the answer may be. It may not be simple for the developer who is just starting out. Answering the question helps relieve a blockage in the production.

The next arguement could be “how I am suppose to get my own work done if I am answering questions all day” this could be valid, but then it is a management problem, the manager should account for the fact that the more settled in developers will need to answer the new developers questions.

I personally think all “lead developers” job roles should consist of helping / answering developers questions and maintaining the consistency of the codebase / architecture of the code.

That is all the lead developer need to be doing, the lead developer should act as a “leader” to the none lead developers and as a person who ensures the cohesion of the codebase as a whole releaving blockages in the production by helping the none lead developers.

The lead developer should not have a huge number (if any) tasks on his plate at all and his / her sole focus should be on the none lead developers, leading them. In reality what generally happens is the lead developer has just as much work as the none lead developers have to do.

What happens? No help is given to the none lead developers, tasks take longer by not getting answers to questions, none lead developers look incompetent, lead developers looks good because his work is getting done and generally everything just takes longer.

Developer asks a lead developer a question, answer it. Developer is stuck on writing a block of code, pair programmme with the developer for 30 minutes, relieve the blockage. Lead developer checks the code commits for the day and finds mistakes, point out the mistakes and ask the developer to correct them. Lead developer checks the code commits for the day and finds inconsistencies in the code which would not fit well with the rest of the code, architectural inconsistencies, point out the inconsistencies and ask the developer to amend them.

The lead developers role in my ideal basically consists of leading and empowering the none lead developers. In most companies the lead developer is merely the developer who has been at the company the longest, not really leading anyone at all. The lead developer does the same job as the none lead developers and to some extent is expected to do more than the none lead developers.

What is worse is that the lead developer is given “first dibs” on most projects, this means the lead developers code 90% of the codebase and then it is passed onto the none lead developers to amend and maintain.

Manager …

Ohh I will give Lead Developer X this project to do, like I did with the last one and the one before that because he knows what he is doing and he gets the work done within the deadlines. Of course he knows what he is doing, he started from a blank canvas. He makes the manager look good.

Once the project completed and passed on the lead developer is then working on his next project which he got “first dibs” on, so he is now “too busy” to answer the questions of the none lead developers even though he is the only person who can really answer the questions as he wrote most of the code in the whole business.

This kind of position is somewhat of a nice setup for a lead developer, even though the lead developer may be writing more code than the average none lead developer.

A solution? Each developer is given his / her own project or set of projects to build and maintain. If the project is absolutely a huge project that requires multiple developers, then the lead developer is the “leader” and the none lead developers are the “developers” doing most of the work.

Is University important?

There are lots and lots of developers in the industry who never went to University and some never went to College either. Well I went to both University and College (Sixth Form) and in my opinion it was definitly worth it.

To start with before University I never had any interest in programming and I would for the most part say it is only because of University that I became a programmer. At University I was given a series of lectures and practical lessons. The lectures and practical lessons form the equivalent of a part time week. In the other half of the week you are expected to be self learning the subject discussed in the lectures and practical lessons.

None of this is mandatory, you do not have to turn up to lectures or practical lessons but seen as though you are paying for the lectures and practical lessons it would be a waste of money not to. University treated me more like an adult than any other educational organisation I had been to prior to University. You are actually a customer of the University.

A certain opinion on University in terms of the programming world are that Universities do not prepare you for the “real world” of development. To some extent this is true, University certainly gives you the ideal programming world. A world in which your profession is respected and you are given ample time to conduct your research.

I once worked for a company where one of the developers stated on a task I was working on “its not rocket science is it”. For the most part the developer was quite right, it was not the hardest task in the world to be working on. However that is besides the point, what does it say when a developer makes such a comment? This developer degrades his own profession by making the claim that the work is simple and easy.

You would not hear such comments at University as far as I am aware because the lecturers respect their profession and they create that same feeling of respect in their own students. You are a computer scientist working to solve real world problems.

A lot of companies are formed by people who never went to University and a lot of companies have developers working at the company that never went to University. For anyone who preaches “University does not prepare students for the real world of development” this is probably the reason why.

The people at the above companies never went to University and never had that same sense of respect instilled in them for their profession. Let us not degrade our own profession by debasing ourselves and making comments like everything is simple and easy, even if it is. In other words the degraded “real world” of development is at odds with the Universities respectable “real world” of development or rather there are so many people joining this bandwagon that it has somewhat become the “real world” because of themselves.

When you go to a University you have the fundamentals of programming explained to you in the lectures. The correct terminology is used to explain everything and it is explained in a professional manner. The feeling this creates in you makes you want to be apart of the latest innovations, discoveries and technologies.

Looking back after a number of years in development I would say that University teaches the foundations of each subject on the course you have taken on. I would agree that there is a lot of self learning to do in your own time but that is to be expected of University is it not? Maybe the people who are saying “University does not prepare for the real world” have been dealing with people who never did any self learning in their free time whilst at University.

Looking back there was a lot of people who only seemed to go to the lectures and practical lessons when they could be bothered. Never seeming to learn anything outside of the lectures and practical lessons. It is quite possible that they still managed to scrape a pass on their degree and maybe that is the reason for the skewed perception.

I would argue that the people who did that are probably in the same category as those people who could not be bothered to go to University at all. They are probably the same people now complaining that “University does not prepare you for the real world”. Ultimately though everyone is a individual whether they went to University or not and it is all about the investment they have made in the programming studies.

I think University does introduce programming students to some concepts they may not have readily picked up outside of going to University. Take “recursion” for example. I have worked on codebases that had parts of code written in ways that could have really used recursion and should have used recursion.

It seemed to me that the programmer had struggled to write the piece of code because he was unfamiliar with the concept of recursion. Not that he could not do recursion but that he was not even aware of recursions existence. This would have been covered at University so at least the programmer would know recursion existed. Had the programmer known recursion existed it would have most likely been used.

University gives you the ideal development world view and I assume the very top companies in the programming world share similarities with this world view. I can only assume this is the case because it all depends on the people working for the said companies.

So was University important? From the learning programming standpoint, perhapes not so much. However from instilling respect in your choosen profession, very much so.

What is happening? – general update

I thought I would dedicate this post to informing you of what I am doing right now …

Work
I am currently in a contract with a client at the moment with a rolling end date which means the contract extends indefinitly until I am not needed anymore by the client.

The company I am working with is an agency that creates web based software for their clients. I am currently designated to working on 1 of their projects with another developer who is also a contractor.

I remember when I first started there was a lot of “scare” factor about freelance dry periods and how work can be hard to come by. Looking back over the number of years I have been freelancing I can safely say this has never been a problem.

Yes there has been short dry periods between contracts but another contract always comes along in the end. I treat the short dry periods as my holiday time like regular employees would book their holidays off I have my short dry periods.

It must be mentioned though that in the dry periods I also dedicate a couple of hours each day to looking for new work. Generally what happens is after a number of days a pool is formed of potential leads which gets filtered down into potential actual contracts I could take on.

Like I say, getting work has never been much of a problem. Getting high paying / decent work is a little harder but still not much of a problem.

Infact I was thinking the other week that if I had someone looking for work on a full time basis rather than just me doing it a few hours a week in my dry periods. There would actually be enough work generated not only for me but enough work to grow my business.

The reason I have not done this yet is because I would want the person who is finding the work i.e. my potential business partner to be well known by me and most of my well known collegues already have jobs and they would not be willing to take this chance with me.

Secondly although I am a one man business I am actually quite alright just as I am. I can get the work for myself and provide myself with a reasonable income.

To all the new freelancers out there I would say do not be afraid of finding new work but note that the work might not always be with direct clients.

Sometimes to get work you may need to go to other agencies that act as middle men and sometimes you might need to consider taking up “real” contract jobs i.e. short jobs that are advertised on job boards by job agencies related to your area of expertise that pay a high day rate.

Contract jobs can be treated like projects. If a business is willing to pay you a high day rate for a period of time. Take the day rate and times it by the number of days you are contracted for, that is the value of the project.

Neptune – Lead Tracker
So whats the deal with Neptune? A number of months ago I posted some posts about the Neptune project and the progress I was making on it. Then I released a post telling everyone Neptune was released.

Neptune can be found at …

http://www.neptuneleadtracker.com

Neptune was originally released as a paid product due to lack of sign ups and a need for a user base to use the product and provide feedback I decided to get rid of the paid plans and just have a free plan. Anyone can now sign up and use Neptune for free.

In short, Neptune is currently in a holding area at the moment. It is functioning product that allows you and your team (it is multiuser) to keep track of any leads you might have. My intent is to have people sign up to the free plan and use the product.

This initial user base can provide feedback on the product and have some say as to the direction Neptune will take in terms of its next features / functionality.

I could keep adding features and improving Neptune myself to turn it into a fully featured product however my thoughts are if people do not use the basic version why would they use the none basic version.

Potentially I know it is possible people would use the fully featured but not use the basic product however it is a big time investment to build the fully featured and then not have people use it.

So I have decided to stick with the basic product for now and see if people use it. If people start using it then I can dedicate more time to it as needed.

Czech Character Code Converter
I created the Czech Character Code Converter because a client of mine had a Czech language version of its flagship product. I was given blocks of text in Czech that needed to implemented within the system.

The blocks of text needed to have the Czech characters converted to their respective characters codes to be implemented into the system so rather than convert each character manually by hand I built a small script to do it. I then gave the script a user interface and uploaded the script online.

Czech Character Code Converter can be found at …

http://www.czechcharactercodeconverter.com

The script saved me a lot of time. Although the script is small and simple I have no intention of expanding the script any further and it is considered a completed project. If anyone has any ideas on how to improve it I may consider implementing the ideas but other than that no improvements will come of it solely from my perspective.

King of Adem
King of Adem the latest project to hit the project list and born out of my wanting to learn IOS development. This is a huge project and I only have part time hours to dedicate to all my side projects. King of Adem along with learning IOS could take up to a year to build and in truth the King of Adem project was probably too large a project to attempt to learn IOS development.

I want to build King of Adem and I want to learn IOS development. Both of these can be done seperately or they can be done as one project. I could learn IOS development and do a simpler project whilst still building King of Adem in the background. Alternatively I could incorporate my IOS development learning into the King of Adem project because part of the King of Adem project requires an IOS application.

Most likely to happen is the following …

I will learn IOS development as my primary goal and develop King of Adem as my secondary goal. I will learn IOS development by following the video tutorial course I have downloaded and taking on a simpler IOS project to enhance my development. The King of Adem will take a secondary position to the IOS development learning until the IOS development learning is complete then King of Adem will take the primary position.

Essentially both projects will still be happening at the same time but the IOS development will have more time dedicated to it at the start until complete then the King of Adem will get the most time dedicated to it until complete. As a rule it I will split it 75% / 25% in other words 75% will be spent on the IOS development learning project and 25% on the King of Adem project. After the IOS learning project is complete King of Adem can have 100%.

That sums up what is happening in my business right now. I hope this article ties up any loose ends anyone might have about the projects I am working on. It has certainly helped me clarify where I am with each project and what I intend to do with each project.

King of Adem – progress update – building queue

Progress has been made on the King of Adem project. For those of you not familiar with this project please read the original King of Adem post at …

http://www.jamesbarnsley.com/site/2017/08/13/king-of-adem/

Since the update I have been primarily working on the building queue. The building queue is the queue which buildings get inserted into when a player wishes to construct a building in one of his / her regions.

To get to the construct building screen the user has to be in one of his / her regions so those areas to get to that screen had to be part built.

The areas part built are namely user, game, region and building. Once on the construct building screen the user can select from a list of buildings that can be constructed.

Each building is validated on a case by case basis and if it does not pass the validations the building cannot be constructed, here are some of the validations so far …

Check fund available
The player must have the correct amount of fund available to construct the building. The amount of funds available is the players start of turn funds subtracting any funds that have been used in the current turn.

For example player may have started with 1000 coins, if a player constructs a building for 300 coins then the program gets the players start of turn funds but substracts 300 coins because it knows a building worth 300 coins was requested to be constructed this current turn.

Check building queue full
The building queue may only allow so many buildings to be in the queue at any one time for each region. Currently this number is set at 5 and the number is stored in a config file.

Check building already built
Check if the building has already been constructed in the region. Each building has a “constructionLimitPerRegion” variable which stores the number of times that particular building may be constructed in each region.

Check dependent buildings constructed
Each building can have what are called dependent buildings. These are buildings which need to be constructed first before you can build the current building.

Also the validation knows whether a building is an upgrade of an existing building or a completely different building that just happens to depend on another building being constructed.

All kinds of checking had to be implemented for this validation, whether building is an upgrade / dependant or just dependant, whether advanced tier buildings already exist for lower dependant buildings, whether lower dependant buildings already exist etc.

Check advanced tier building exists
Check if an advanced tier building already exists for the current building wanting to be constructed. If the advanced tier building already exists then there is no reason to build the current building.

Again this needs to take into account that some buildings can be constructed more than once so in some instances it may need to allow the building to be constructed even though the lower building has already been constructed.

The above validations are run everytime a user issues the command to insert a building into the building queue for a particular region. These validations are run from the “Building” Model. Each building is also given its own Model, the hierachy is like as follows …

\yii\db\ActiveRecord -> \app\components\ActiveRecord -> \app\models\Building -> \app\models\BuildingTownBarracks

Or …

\yii\db\ActiveRecord -> \app\components\ActiveRecord -> \app\models\Building -> \app\models\BuildingPort

etc.

I can run special validations for specific buildings by placing those validations in the specific building class. Those validations will only run for the specific building and not all buildings.

That is as far as I have got so far. Still a long, long way to go, more updates to come soon.

King of Adem

The latest personal project I am working on which also happens to be the largest personal project I have worked on so far.

King of Adem is a game for tabletop minature wargamers. Players manage their kingdom through the app. Kingdoms consist of a number of a territories, each player starts with one.

In each territory there is a capital city in which buildings can be constructed. Buildings provide benefits like more money or the ability to recruit armies.

When 2 armies collide by moving into each other the players can then resolve the battle as normal by playing their normal game of tabletop minatures.

The game takes place on an island called Adem. Adem is a recently discovered island where each player is fighting for control. You fight to become the “King of Adem” by conquering the whole island.

Although Adem is stated as “recently” discovered, this only means “recently” in the grand scheme of things. Adem actually has a number of Kings / Factions already on the island and each Kingdom has some infrastructure.

The project is currently divided into 3 parts …

King of Adem Diagram

Part 1 – Game Server
The Game Server is currently in construction and is being developed using the Yii 2 framework written in PHP. The database is MySQL. The server takes view requests and command requests from the client application.

View requests provide data to the client in JSON format. This data has everything needed to render views for the game for example, building, army, territory data.

Command requests provide data to the server about interactions happening in the client application. For example move commands, construct building commands etc.

The decision to use View / Command requests was chosen instead of opening the server up entirely.

Essentially one option could have been for each Data model on the server to have a view, insert, update, delete request to use for either commands, views or both.

This would give the client more freedom at the cost of putting more logic onto the client.

As the first client is being developed using IOS and IOS uses a view per screen type of structure then View requests make sense. Giving the client the exact data the client needs in order to render the view.

Part 2 – Game Test Client
The Game Test Client is currently being developed alongside the Game Server and serves as a testing ground for the development of the server.

The Game Test Client can send View requests to the server and read / present the data from the server in a user friendly way. The Game Test Client can send command requests to the server.

The Game Test Client is being developed using the Yii 2 framework written in PHP. The Game Test Client is my own personal client for testing the server and is not the actual client the end user / player will be using.

Part 3 – IOS Game Client
The IOS Game Client is the actual client the end user / player will be using to play King of Adem. The IOS Game Client as you might have guessed will be an IPhone application. There may also be the ability to run the application on the IPad as well.

I decided to develop the IOS Game Client because I wanted the game to be portable and it cannot get much more portable than having the game on your phone.

I also choose the game to be an IOS application because I want to improve my IOS skills and offer IOS development as part of the everyday services I offer to my clients.

Once these 3 parts are complete the game will be playable and released to the public. Part 1 and 2 are already in construction, Part 3 will be constructed after parts 1 and 2 and completed.

After the game has been released to the public, a number of other client applications could potentially be developed including an Android version and a full game client developed in Unity3D or similar.

The IOS client will be more management like as opposed to a graphical game. The IOS application could include graphics etc, but it will not be at the level of a full game like experience. This is why I suggest a later developed Unity3D or similar game engine development.

I will be keeping everyone informed of the development of this game through the blog so keep checking back for further updates.

Yii / Yii2 checking controller params at the access control level

One of the areas I notice in a lot of Yii / Yii 2 web applications is the checking of parameter variables in what I consider the wrong areas.

Here is an example of one of my controller methods for saving a Book …

So what stands out about this method? No load Model method? No checking to see whether the Book has a valid ID? How will we know whether the Book has a valid ID, how will we know whether the Book is suppose to be accessed by the particular user that is logged into the system?

The answer is, the access rules and bizrules of the web software application. All controller methods should be assigned to an access rule. If the controller method contains parameters then the controller method should be assigned to an access rule as well as a bizrule.

For smaller / less complex applications you can actually emulate the bizrule by using “matchCallback” which is spoken about in this article I wrote previously …

http://www.jamesbarnsley.com/site/2017/06/13/yii-2-user-permission-using-matchcallback/

You can also read my previous article on what I think of the Yii / Yii2 load Model method …

http://www.jamesbarnsley.com/site/2015/04/22/yii-loadmodel-method/

All controller parameters should be checked and validated in the bizrule, by the time the parameter reaches the controller method there should no need to have any checking in the controller method at all for the controller parameters.

If the Book does not exist or the Book is not accessible by the current logged in user then that will be handled before any controller method code gets executed in the first place.

There is no reason to have this level of checking in the controller method itself. Doing it the way I have described also keeps the controller more clean as extra code is not needed to check the controller parameters.

Retaining great employees

There is talk on the web about retaining great employees and the way some of the articles are written about the subject you would think a lot of companies have a real struggle to get and keep great employees.

Not sure what makes the employees “great” employees other than the fact that if they are the ones leaving the company they obviously have options elsewhere.

So what would I do if I had a company with employees and I wanted to retain them without going over the top and paying them huge salaries obviously …

Allow home working

If your company is in a position to do this, allow the employees to work from home as and when they choose to.

Less hours in work day

Expect 5 hours “in the zone” work from each employee each day but pay them for 7.5 / 8 hours.

Allow the employee to revise skills, have breaks / lunch, collaborate with coworkers, work on personal projects, exercise or even depending on your limits allow the employee to occasionally take the rest of the day off in the 2.5 / 3 hours spare.

Alternatively if the employee really wants to, the employee can carry on with his / her workload. It is up to the employee what he / she spends the 3 hours doing each day.

Companies bill work out at huge hourly rates, contract employees get paid rates that for the most part are 3 or 4 times higher than a standard employee.

If your employee earns £30,000 a year that equates to around £15 an hour at 8 hours work per day, at 5 hours work per day it equates to £24 an hour. What difference do these kinds of low figures make when you are billing clients out at £75+ an hour?

You are still making a huge profit on the employees hourly rate, do you really need to squeeze them for the full 8 hours to get your moneys worth?

Lets see …

Company 80 billable hours per day …

80 hours * £75 = £6000.

Employees cost per day …

80 hours per day at 10 (8 hour) employees at £1200 per day.
80 hours per day at 16 (5 hour) employees at £1920 per day.

The difference in money is £720 per day to offer the above system of working. Yes you have to provide for another 6 employees as well however at least you can gain the satisfaction of having a larger workforce.

The biggest bill is going to be the wages the rest of the payments for employee equipment etc is going to be far less.

Yes the system does cost money but it is the difference between making £4800 and £4080 per day.

Please note if its contract jobs we are talking about, then I would expect the employee to work the full hours quoted as contract employees are on a high hourly rate, the above only applies to standard employees.

Another alternative to the above “5 hour workday” would be to implement the “4 day work week” essentially the employee works 4 days a week but gets paid for 5 days.

Also note that none of the above ideas are an excuse to compress more or the same amount of work into less time. If that happens then the above advantage has obviously been nullified.

More holidays

20 to 21 days holiday entitlement a year? Increase it. I think for every 8 weeks worked an employee should be able to get around 5 days off work. This will double the holiday entitlement bill from around £2400 a year to £4800 a year on a £120 per day employee.

That would increase the cost from £6 per day to £12 per day for each employee that is an extra £6 per day for each employee. With 10 employees that would cost an extra £60 per day, with 16 employees that would cost an extra £96 per day.

Lunch around a big table together

The whole company should eat lunch together every working day preferably around a big table or multiple tables if needed.

Once a month meal

Once a month take the employees out for a meal, paid for by the company.

A lot of these points do eat into the profits however as stated if each employee is making a significant profit per day i.e. employee costs £15 an hour and is billed out at £75+. Then really a company should be able to afford some of the above described perks. This does however assume that each companies employee is booked out enough to make a profit.

In my multi person company this would not be a problem as I would only employee new employees as the work expands, for example I start out with 30 billable hours per week provided by 1 client. That would be just enough work for myself.

Later on I have 3 clients and 100 billable hours per week that would be enough to employee 2 additional employees as well as myself. If the work subsided then I would downsize the company. It would never be a problem as each employee would be generating a lot more money per hour than what I would paying the employee per hour.

These are the points I would implement in my business if I owned a multi employee business. Not all the points have to be implemented but the more points the better. Obviously if the workplace is toxic then none of the above points apply and employees will leave anyway but that is a different topic of discussion.

Should you reveal your budget?

Should you reveal your budget to a potential web development company / web development freelancer? I am presuming most web development companies and freelancers would say yes.

In my business I work on a day rate so to me it does not really matter whether the budget is revealed or not. If you spend £12,000 you will get a £12,000 web software product, if you spend £36,000 you will get a £36,000 web software product. It does not matter to me exactly what the total budget is, you pay me by the day, when you stop paying the work stops.

Having said that knowing the budget can be important. If you have an idea of what it is you want to create it is important to make sure the budget is really there. There is no point in expecting a £36,000 web software product for £12,000.

I generally try to make sure that the “must have” requirements can be fufilled within the expected budget. After the “must haves” have been taken care of the remaining budget can be used to provide extra “goodies” that would otherwise not be there. Design improvements, extra features, additional reports, sidebar information giving the product the extra polish it would otherwise not have.

An ideal scenario might go like this …

  1. You have an idea of the features you want in the web software product.
  2. We have discussion on those features to make sure anything has not been missed.
  3. I take a look at the budget and decide whether I think I can get the work done within budget.
  4. I break the first couple of features down into tasks and add them to the project management system.
  5. I complete the first couple of features, we have a review and see whether we are on track and budget.
  6. More features are added to the project management system until all features are complete.
  7. At this point we discover that one third of the budget still remains.
  8. The additional budget is used to provide extra goodies.

Please note that the way this article is written can give a wrong impression almost edging to a fixed fee kind of feel. I always work on a day rate and any agreements about what can be done in the time allocated are estimates only.

Generally a £36,000 budget will be broken up over the course of months or a year and will act like a retaineer agreement. Generally in such an agreement the overall budget is never discussed, the contractor is paid for a number of days per month to complete work. This is how I work. However that does not mean that an overall “background” budget does not exist.

So, should you reveal your budget to a potential web development company / web development freelancer? Well in my business the answer would be yes, if you want my “opinion” / “estimate” on whether the proposed feature set will fit within the budget.

As we work with each other you will get a feel of what can be accomplished, at what cost and in what timeframe.

Solution for using DatePickers on forms in Yii2

Sometimes in web software applications we need to collect dates such as a start date or end date using forms. In this article I will be using the Kartik DatePicker widget which can be found here …

http://demos.krajee.com/widget-details/datepicker

For the purposes of this article a master Model will need to be created. I discussed how to create master Models and Controllers in the following article …

Create a master Model and Controller in Yii2

So based on the master Model now being created the article can continue. Add the field to the form using code similar to this. Include the plugin in the form …

Add the field to the form …

In the master Model 2 methods needed to be created …

And …

These methods can be called to save the “date” data to the database from any of the child Models. The best place to call the methods would be in the “beforeSave” and “afterFind” methods as follows …

And …

Depending on how you have setup the validations for the “date” attribute you may need to run the “saveDateFormat” and “dateFormat” methods in the “beforeValidate” and “afterValidate” methods as well as the “beforeSave” and “afterFind”.

This depends on whether your validations are formatting the date as the date would be saved to the database or validating against the format the date appears on the form.

If your validations validate against the format the date saves to the database then calling “saveDateFormat” and “dateFormat” methods in the “beforeValidate” and “afterValidate” methods will not be needed.

I generally setup my validations so I do not need to run the “saveDateFormat” and “dateFormat” methods in the “beforeValidate” and “afterValidate” methods only through the “beforeSave” and “afterFind” methods.

Using the above code you can implement multiple datepickers on the same form or across different forms. Follow the same logic, add the field or fields to the form and call the “saveDateFormat” and “dateFormat” methods from the child Model.