The new
version of POS should resolve several issues I had with the first version:
- Smaller application size - 402 kB is quite a lot when my code is just 78kB
- Admin part should work on iPhone - as I wrote previously, this looks like Durandal issue
- Resolve token expiration
- Resolve the mysterious double transactions
Plus I
wanted to try new stuff:
- Azure Mobile Services with .NET backend
- Gulp, Browserify
- Mocha, Chai and Sinon for JS testing
The above
basically means to rewrite the app from scratch.
Smaller application size, iPhone
To
decrease application size, I decided to remove Durandal and jQuery and go with
just Knockout. Communication among view
models/modules is done via knockout-postbox
- a simple pub/sub library. Other libraries I use are Underscore.js and Moment.js. The final size is 220kB - almost a
half of the first version. The biggest part is of course AMS client library
with 134kB.
Removing
Durandal also removed sign-in issue on iPhone so my neighbor can finally use
his phone to check daily sales.
Resolve token expiration
In
the end, I've implemented the easier solution. Application remembers when the
login token was acquired and it
signs out kiosk user after 25 days as soon as there is no opened shift. Because
credentials are stored in the browser, it's just one more click for the
cashier.
Resolve the mysterious double transactions
Of course
it was my
fault! When I performed deep analysis of duplicated transactions, I've
found out they are single-item transactions within sequence of single-item
transactions. And then it struck me - I
don't check whether save is in progress when saving new transaction. As the
transactions from local storage are sent in FIFO order, the same transaction
was sent several times to the server when cashier created multiple transactions
in row. Some of the duplications were caught by the server check for the
transaction duplication but some slipped through as saving data on server is
asynchronous.
The new
version of course have the save in progress check and I have not seen any
duplicate transactions.
Azure Mobile Services with .NET backend
Using
.NET backend in AMS server part is much easier for me then using JS backend.
One can use local server for development with local database so new
functionality development and testing is simpler. Also adding custom endpoints
is easy as it is almost normal Web Api application. I was hacking CRUD
endpoints in JS backend in past.
The
backend uses Entity Framework to communicate with SQL server. I don't like EF
much. It's a black box to me - I don't know how it creates SQL queries and what
should I do to optimize them. So I rather use pure SQL queries for all custom
endpoints functionality (get data for reports).
Gulp, Browserify, Mocha, Chai, Sinon
I find Gulp easier to work with than working with Grunt. It's probably because I prefer to write
what I want to do then to define a configuration. Configuration is fine for
simple cases but for anything else, the list of commands to do is better.
I use Browserify to manage module dependencies and
create the final package. I found example how to use Browserify with Mocha so I switched to Mocha from Jasmine. It really does not matter which
test library one use as long as you test your code.
No comments:
Post a Comment