Showing posts with label kwamoja. Show all posts
Showing posts with label kwamoja. Show all posts

Tuesday 3 September 2013

KwaMoja as it is used in African hospitals

People always talk about the use of +KwaMoja  in manufacturing, and distribution businesses, but +KwaMoja  also plays a big part in the administration of several hospitals.

We have written some extensions to +KwaMoja  that enable it to link seamlessly with an open source health information system project Care2x. All the financial and inventory transactions are delegated to +KwaMoja , and Care2x deals with the clinical information side.

When a patient is admitted in Care2x, +KwaMoja  Care2x will send this information to +KwaMoja  and if the patient is not already setup as a customer they will be setup. The interface with Care2x uses customer branches to indicate who will be paying the bill. If the patient pays in cash then they will get a branch with a code of CASH setup. If they are an insurance customer then they get a branch with an identical code to the customer code for that insurance company.

When any transaction occurs in Care2x which affects the financial status of the hospital then that information is sent to +KwaMoja.

So, when as in this example the doctor prescribes drugs for a patient in Care2x the transaction will be sent to +KwaMoja.

The cashier, who uses +KwaMoja will search for this patient and will be shown a list of all unpaid transactions for that patient, as can be seen here.

Once the items are paid for then the cashier will give the patient a receipt, which they can then exchange for the drugs, or test, or whatever the item is for.

If the item is a physical item, such as drugs as in this case +KwaMoja will automatically deduct the amount from the stock held. +KwaMoja will also do all the double entry bookkeeping for this transaction behind the scenes.

At the end of the cashiers shift, they can produce a report of all monies that they have taken, which should tally with the physical amount of money they have. This is transferred both physically and within +KwaMoja to a central cash account.

Using +KwaMoja the hospital can gain greater efficiency. It can also gain greater security against fraud, and as +KwaMoja is web based if there are remote funders of the hospital, such as a western charity, or central government, they get greater visibility on how the hospital is performing. All this leads to better health care for the people, and +KwaMoja is playing a central part in this.

Sunday 25 August 2013

Using regex patterns for verifying input

We have recently been using HTML 5 and JavaScript to do form verification, as Fahad blogged about here

I have just added pattern matching to this for email and telephone number verification. Thanks to +Exson Qu  for the regex ju-ju. 

HTML5 allows form elements of type "tel" and "email". We want to add in a regular expression to each of these types to verify the element as it is typed. The regular expressions we have used are "[0-9 +s()]*" for the telephone numbers, and "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$" for email addresses. Neither of these are 100% as it is not possible to deal with every method in the world of writing telephone numbers, and every method of constructing emails addresses, however these will do a good job on most.

It is feasible to add html in the form:

<input type="tel" name="Telephone" pattern="[0-9 +s()]*" value="" />

However this would need to be done wherever there is a telephone or fax number to be entered into KwaMoja. Then if we decide to improve the regex we would need to go through all these entries again. This can get messy.

It would be better to do this via JavaScript. We have a function called initial() that gets called when the page has been loaded. This function iterates through all the form elements in the page that has just been loaded and appends the regex pattern any with a type "tel" or a type "email". Here is the function:

function initial() {
    var n = document.getElementsByTagName("input");
    for (i = 0; i < n.length; i++) {
        if (n[i].type == "tel") n[i].pattern = "[0-9 +s()]*";
        if (n[i].type == "email") n[i].pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$";
    }
}


We also use this function to assign other properties to form elements.

Saturday 17 August 2013

Warehouse management - Part 1

I have been giving a lot of thought recently to how we should implement warehouse management. Just using row/bay/bin is too restrictive. 

If we have a warehouse structured like this :


it will not fit well to a rigid system of warehouse management.
 

What I propose a system where we have just one table for areas that can contain stock items. The best name would be "Locations" but that has already been taken, so I will for the moment call them "Containers". All containers can have parent containers. The above warehouse now looks like this:

As you can see the warehouse now can be modeled as a tree diagram. Each container can be set as to whether it can contain items, or just act as a container for child containers.







Each container has details of its physical position in the warehouse, and it's size. Also properties as to what it can contain (refrigeration unit for instance). Whether the contents are liquid etc.


Starting to implement this is easy, as each warehouse can be defined as a container. We just need a new table to hold the container information.

Sunday 28 July 2013

Customer Relationship Management

I am starting to code up CRM in @KwaMoja. In the past CRM has largely been ignored in webERP.

For this I have firstly added the ability to have sub areas. So for instance we could have the following setup:

                                             East African Community
                                                                |
                                                                |
                         ________________________|
                         |                         |             
                     Kenya               Uganda           
                         |
   ______________|____________
   |               |              |          |
             Coastal   Central
                   |
           Mombasa

As you can see its now possible to have multilayer sales regions. 

Next I have added the sales area to the sales person record. So now a sales person can be allocated to a particular area. In the above diagram our sales person can be allocated to any of the areas. So they could cover the whole of Kenya, or they could just cover the area of Mombasa.

Also I have added a flag to the sales person record to record whether they are an area manager. Each Area can have only one area manager. 

So it is possible to have a regional manager for Kenya, and also an area manager for each of the regions, Coastal, Central, etc.

This has already been coded and committed to the development code. Now we need to look at configuring the sales cycle.

Saturday 27 July 2013

When censorsip goes mad

This page is written in response to the lies that +Phil Daintree has written about me, and spread on the internet. Despite years of searching he has been unable to find anything I have written that is untrue, and he has had to resort to vague generalities, faked emails, and badly fabricated screenshots (you can see the joins if you zoom in using any bit mapped image editor). +Phil Daintree is welcome to make any comments to these pages, as he has done in the past. If I agree with what he says I will amend my writings, if I do not agree I have allowed his comments to stand next to mine so that people can make their own judgements. I have every confidence in the intelligence of readers to make a sensible judgement based on the facts. +Phil Daintree will not allow me the right of reply to any of the lies he has told about me. It seems to me significant that he realises that if people see both sides of the argument they will see through his lies.

In a recent discussion on the webERP mailing list +Phil Daintree was writing about the new confirm boxes I did for +KwaMoja . This is the email he wrote:
Tim has also made some improvements to the confirm boxes but probably
unnecessary really, especially since it adds significantly to the size
of the file. 
 I then wrote back:
It only adds 996 bytes to the file, and this could be shortened further with the use of smaller variable names. To my mind they give a more consistent and professional feel across all browsers.
Phil refused to allow this email on the mailing list (for proof of this see previous blog entries), but I posted it to the nabble forums anyway as I thought it might be interesting to people. I then went away and played with this JavaScript a bit more, and managed to reduce the size of this function a bit more, so I posted the following:
Just for interest I reduced this to 921 bytes (0.899Kb) by using shorter variable names.
I tried this to the mailing list, but as usual it was rejected, so I posted it to the nabble forums. To my surprise it got deleted from there. I re-posted it and it got deleted from there again. It has now been deleted seven times by +Phil Daintree or one of his cohorts.

Now can anybody work out why a short post about reducing the size of a JavaScript function to 922 bytes should be considered so offensive that the readers of the nabble forums and the mailing lists need to be protected from reading it?
The only thing that I can imagine is that a recurring theme in his hate pages about me, is how much better a programmer he is than me, and maybe he thinks this email doesn't help that claim. I can't think of another reason.

Philippians 4:8

Amendment 3/1/2014:  I have since been informed  by +Exson Qu and +Phil Daintree that the reasons for deleting the above postings was that commenting on the length of a JavaScript function constituted a personal attack on +Phil Daintree. I have asked for clarification from either +Exson Qu or +Phil Daintree as to why this was, but have received no reply. My best guess is that +Phil Daintree had already said that including the function "adds significantly to the size of the file", and so my pointing out that it was actually quite small was contradicting him and so constituted a personal attack. Personally I think it constitutes valid technical discussion but I include it here as I have always said I am happy to put both sides of the discussion forward and allow readers to make their own minds up.











 

Monday 8 July 2013

Sorting html tables

I have just committed the code to sort HTML tables. So far this applies to only certain scripts, but to add it to any is easy, and should be done in all by tomorrow.

Here is the result of searching for stock items in SelectProduct.php


Now by clicking at the top of the Description column the table is automatically sorted and shows
and the items are sorted by item description. Clicking on that column again shows:

and the order of the items is reversed. This also holds true for the code column. I have also done the SelectCustomer.php script and the SelectSupplier.php script.

All this is done with one simple JavaScript function and minimal changes to the scripts.

This and the changes committed by Fahad earlier today means a huge leap forward for usability in KwaMoja. Hope you enjoy this new code.

Tuesday 25 June 2013

Lot's of great new functionality

KwaMoja has just gained lots of new functionality.

We now have a maintenance module for fixed assets. This allows you to set specific maintenance tasks for individual fixed assets, set up a schedule for these tasks to be done, and to email the person responsible with reminders when the tasks are becoming due.

Electronic bank statements in the MT940 format can now be imported and analysed directly into the KwaMoja general ledger.

Many thanks must go to Phil Daintree for this excellent contribution.

Phil has also setup a demo mode, which will stop whoever it is with an IP address in Wellington, New Zealand that has too much time on their hands and too little to occupy themselves. This person keeps trying to come up with new ways to wreck our demo. Thanks Phil for helping to stop them.

Also KwaMoja now links to Phil's new web shop, and it can be administered directly through KwaMoja. This web shop is commercial software, and not open source, so it is hard for us to test and verify, so caution  needs to be observed on the security side of this as it stores information about your customers payment methods. Nevertheless a great contribution, thanks Phil.

We now also have the ability to import general ledger journals, payments, and receipts directly from a csv file.

Also there is now a flag setting in the user setup that can restrict a user to only access their default location. Thanks Jerry for sponsoring this work.

All this new functionality can be tried out at the KwaMoja demo.




Wednesday 5 June 2013

How to keep a stable KwaMoja/webERP installation updated

There has been a lot of discussion recently on the webERP forums about how to keep a stable version of your implementation, so I thought it might be a good moment to write an article on how to do this.

Firstly Web ERP Africa Ltd keeps a stable branch of the webERP code. This takes the last release (4.10.1 at the moment I write this) and then just adds in any bug fixes that have been applied to the main line. Obviously this does not include any bug fix to any new functionality, as that functionality does not exist in the stable branch. We also apply our regression tests to these fixes, to ensure that they are not re-introducing any previous bugs. This branch should then get progressively more stable, but anybody  who wants the latest features can use the main trunk. I have made this stable branch publicly available from my github repository and can be found here. You can download a zip file containing this code from here. This zip file is automatically updated when a new bug fix is applied.

Exactly the same is true for KwaMoja, it's stable branch can be found by using the master branch here.

So if you are using a KwaMoja/webERP that has no customisations in it then all you have to do, is to keep an eye on this repository, and download new versions as and when it is updated.

However there are potential problems when you have customised scripts in your installation. I will assume that if the user has the knowledge to change the files then they will have a small knowledge of IT, and you will need the application Git installed.
 
What we wish is to avoid the code being over written when updating from the stable branch. I have created a small git repository here to represent the stable branch, and have uploaded the following script to it, calling it HelloWorld.php:

<?php
include('includes/session.inc');
$Title = _('Hello World');
include('includes/header.inc');
echo '<p class="page_title_text noPrint" ><img src="'.$RootPath.'/css/'.$Theme.'/images/user.png" width="24px" title="' . _('Hello World') . '" alt="" />' . _('Hello World') . '</p>';
if (isset($_POST['Submit'])) {
    /* Get clients IP address */
    $IPAddress = $_SERVER['REMOTE_ADDR'];

    /* Has user been here before? */
    $SQL = "SELECT count(name) as names
                FROM helloworld
                WHERE name='" . $_POST['Name'] . "'
                    AND ipaddress='" . $IPAddress . "'";
    $Result = DB_query($SQL, $db);
    $MyRow = DB_fetch_array($Result);
    if ($MyRow['names'] > 0) {
        prnMsg( _('Welcome back') . ' ' . $_POST['Name'], 'info');
    } else {
        $SQL = "INSERT INTO helloworld (ipaddress,
                                        name)
                                    VALUES (
                                        '" . $IPAddress . "',
                                        '" . $_POST['Name'] . "'
                                    )";
        $Result = DB_query($SQL, $db);
        prnMsg( _('Hi') . ' ' . $_POST['Name'], 'info');
    }
} else {
    echo '<div class="page_help_text noPrint">' . _('Enter your name in the box below.') . '</div>';
    echo '<form enctype="multipart/form-data" action="' . htmlspecialchars($_SERVER['PHP_SELF'],ENT_QUOTES,'UTF-8') . '" method="post" class="noPrint">';
    echo '<input type="hidden" name="FormID" value="' . $_SESSION['FormID'] . '" />';
    echo '<div class="centre">
            <input type="text" name="Name" />
        </div>
        <div class="centre">
            <input type="submit" name="Submit" value="Submit" />
        </div>';
    echo '</form>';
}
include('includes/footer.inc');

?>

Now you can pull this code to your own machine by issuing the command:

git clone git@github.com:timschofield/Example1.git

Now we make a local change to our code. We will change the word 'Hi' to 'Hello'. Now if we wish to update our code to the latest from the repository we would issue the command:

git pull git@github.com:timschofield/Example1.git

and this will update any changes - if there were any new bug fixes applied for instance. However you will notice that Git is smart enough not to try and overwrite your code that you changed locally.

So by using Git we can update our code to the latest stable branch, whilst keeping our local changes in place.

Monday 27 May 2013

ABC inventory ranking system is completed

As detailed in this blog post we have been working on a system for ranking inventory items by the standard ABC classification system.

I am happy to announce that this new system has just been uploaded to the KwaMoja repositories and those who wish to try it can download our development snapshot from here.

The only change from the original blog post was a suggestion from Francis that we use a consumption value system as our default ranking method rather than the proposed sales value method - thanks Francis.

The next step in warehouse management system is to setup the warehouse storage definitions as outlined in the excellent document prepared by Buz and Mary Beth (sorry I don't know more details of these people) that can be downloaded from here. Then we are into the cycle count code.

This code was offered to Phil Daintree at webERP but appears to have been rejected.

Wednesday 22 May 2013

New Work Order Entry script

I have never liked the old method of entering work orders in webERP and now I am no longer allowed to help people on the mailing lists and forums I have more time to devote to correcting it.

The old script didn't follow the normal webERP conventions, for instance it allocated a work order number, as soon as user clicked on that menu option, even if they didn't go on to enter an order, and this meant tracking order numbers was impossible. Sales and purchase orders both use a class to hold the order details in but Work orders didn't. The code was messy, and didn't abide by the coding guidelines.

In fact I am surprised it was ever allowed to corrupt the code base. I have just uploaded a revised script, which has more functionality, but in a lot less code. "Do more with less" is a good motto for these types of things.

Unfortunately I am not allowed to push this new functionality to the webERP svn repository, so you need to get it from here https://github.com/timschofield/KwaMoja/archive/develop.zip if you wish to test it. Hopefully someone who is still allowed to commit to svn will push it to webERP.

Any issues or bugs please let me know.




Tuesday 14 May 2013

ABC analysis of stock items.

One of the most important methods of keeping accurate stock levels - though by no means the most widely used, especially in Africa - is cyclical stock checking. That is the constant checking of the stock throughout a financial period, rather than leaving stock checks to the period end.

This has two big advantages in the control of an organisations stock. Firstly the stock levels are kept in a much more accurate state as they are checked more frequently, and secondly any variances are far easier to track down if the period between checking the item is much shorter.

A necessary prerequisite of cyclical stock checking is an ABC analysis of the organisations stock. By ABC analysis I mean to rank the items by:

A - The most important items to the organisation
B - Important to the organisation but not critical
C - Slow moving or non important stock items.

At the moment we have no ABC analysis. This is a proposal to rectify that.

ABC classification is a way of grouping your stock items. There are a few different ways to set up an ABC Ranking, such as Velocity (times sold), Quantity sold/Consumed or by Margin. But the most common method is the Annual Sales Volume ranking. This method will allow you to identify the small number of items that usually account for most of your sales value (think 80/20 rule).

My plan is to first implement Annual Sales Volume Ranking method, but to do it in such a way as to make adding other methods easy in the future. To do this I propose to setup a table to hold the methods to be used. This table will have the following structure:

CREATE TABLE `abcmethods` (
     `methodid` TINYINT NOT NULL DEFAULT 0,
     `methodname` VARCHAR(40) NOT NULL DEFAULT '',
     PRIMARY KEY (`methodid`)
);

Initially this will have just one record in, 
methodid=>0 
methodname=>Annual Sales Volume Ranking

The next table will contain the groups that are being used. This will specify the criteria used. Each method can have several groups. I propose the following table:

CREATE TABLE `abcgroups`(
     `groupid` INT(11) NOT NULL DEFAULT 0,
     `groupname` VARCHAR(40) NOT NULL DEFAULT '',
     `methodid` TINYINT NOT NULL DEFAULT 0,
     `apercentage` TINYINT NOT NULL DEFAULT 0,
     `bpercentage` TINYINT NOT NULL DEFAULT 0,
     `cpercentage` TINYINT NOT NULL DEFAULT 0,
     `zerousage` CHAR(1) NOT NULL DEFAULT 'D',
     `months` TINYINT NOT NULL DEFAULT 12,
     PRIMARY KEY (`groupid`),
     CONSTRAINT `abcgroups_ibfk_1` FOREIGN KEY (`methodid`) REFERENCES `abcmethods` (`methodid`) 
);

The zerousage field is intended to hold the category into which items that have no usage at all should be put. This would normally be C or D. The months field is the number of prior months movements that should be analysed.
Finally I propose a separate table to hold the ABC category for each item and group. This would look like:

CREATE TABLE `abcstock` (
     `groupid` INT(11) NOT NULL DEFAULT 0,
     `stockid` VARCHAR(20) NOT NULL DEFAULT '',
     `abccategory` CHAR(1) NOT NULL DEFAULT 'C',
     PRIMARY KEY (`groupid`, `stockid`), 
     CONSTRAINT `abcstock_ibfk_1` FOREIGN KEY (`groupid`) REFERENCES `abcgroups` (`groupid`),
     CONSTRAINT `abcstock_ibfk_2` FOREIGN KEY (`stockid`) REFERENCES `stockmaster` (`stockid`) 
);   

Using these three tables should provide for a very flexible system, easily changed in the future.

The function to actually assign the categories would work something like this:


1.  Calculate the 12 month value usage for all of the stock items.
2.  Rank the items in descending order by value.
3.  The "A" items are the top 80%.
4.  The "B" items make up the next 15%.
5The "C" items are the remaining items that have any usage in the period being looked at.
6.  Label zero-usage items as "D".


Comments and constructive (yes Phil I am looking at you!) criticisms would be very much appreciated.







Wednesday 8 May 2013

The anatomy of a KwaMoja plugin

As promised in my previous post regarding KwaMoja plugins, here is a tutorial on constructing a plugin.

Each plugin is a zip file. For this tutorial we will use the demo plugin that is available from http://www.kwamoja.com/demo_plugin.zip.

This demo takes the form of a standard "Hello World" type application, as used in most programming tutorials. The plugin will present the user with a text box asking for the users name. If that user has not used the plugin before from that IP address they will get a message saying "Hello John" or "Hello Jane" or whatever his or her name is. If they are returning, they will get a welcome back message.

If you unzip this file you will see it contains 5 files:

HelloWorld.php
HelloWorldDB.php
HelloWorldDBRemoval.php
HelloWorldLinks.txt
summary.xml

ALL KwaMoja plugins must have a summary.xml file. This is the file that tells KwaMoja how to install the plugin. Here is the xml contained in this examples summary.xml:

<plugin>
    <name>Demo Plugin</name>
    <installed>0</installed>
    <license>gpl</license>
    <scripts>
        <script>
            <name>HelloWorld.php</name>
            <pagesecurity>1</pagesecurity>
        </script>
    </scripts>
    <menulinks>HelloWorldLinks.txt</menulinks>
    <dbupdates>HelloWorldDB.php</dbupdates>
    <dbremoval>HelloWorldDBRemoval.php</dbremoval>
</plugin>


The first attribute is a descriptive name for the plugin. I have just called this one "Demo Plugin" .

The next attribute shows whether the plugin has been installed. KwaMoja will automatically set this to 1 when the plugin is installed. This should be set to zero when writing the plugin, and then never manually changed.

Then there follows the name of the license that this plugin is covered by. In this case, the GPL.

Next is an array of scripts that will be installed and a security token for each script. HelloWorld.php is a KwaMoja script. The plugin can contain any number of these scripts. In this simple example we only need the one, and I have given it a security token of one meaning any user can use it. I will go through this script and how to write a KwaMoja script in my next post.

The next attribute is called "menulinks" and contains the name of the file containing details of what new menu items are required to be added, and if any new modules are to be added to the menus. The full contents of this file for our example are:

$ModuleLink[] = 'Test';
$ReportList['Test'] = 'test';
$ModuleList[] = 'Test';

$MenuItems['Test']['Transactions']['Caption'][] = 'Hello World';
$MenuItems['Test']['Transactions']['URL'][] = '/HelloWorld.php';


The first three items on the list will setup a new module called "Test" to appear on the main menu. This is not obligatory. For instance if your plugin fits best in the Manufacturing module, then there is no need to have these lines. The next two lines are necessary for every script that you want the user to have access too via the main menu. These take the form of $MenuItems[Module][Section][Caption] and $MenuItems[Module][Section][URL] where "Module" is the name of the module, either one that you have just created or from the following list:

'orders', 

'AR', 
'AP', 
'PO', 
'stock', 
'manuf',  
'GL', 
'FA', 
'PC', 
'system', 
'Utilities'

The section is either "Transactions", "Reports", or "Maintenance" and determines whether the item appears in the left, centre, or right section of the menu. The Caption is the string that will appear in the menu, and the URL is the path to that menu, which must include a "/" at the beginning, as in "/HelloWorld.php".

Penultimately there is an attribute called dbupdates. This provides a link to a file containing the following:

<?php
CreateTable('helloworld',
"CREATE TABLE helloworld (
ipaddress char(13),
name varchar(30),
PRIMARY KEY  (`ipaddress`, `name`)
)", $db);

$SQL = "UPDATE www_users SET modulesallowed=modulesallowed+'1, WHERE userid='" . $_SESSION['UserID'] . "'";
executeSQL($SQL, $db);
?>


These are commands used to make any necessary changes to the database for your plugin to work. If it doesn't need any changes there should still be a file that just contains the <?php ?> tags in it. KwaMoja comes with an api to allow you to access the database, and facilitates the use of different DBMS's. You can find the functions here. The first call is to the CreateTable() function. Secondly there is some sql to update the users modulesallowed field and finally there is a call to the executeSQL() function to run this SQL.


The final attribute in the summary.xml file is called dbremoval. This is a reference to the file that contains the commands required to remove the database changes when the user uninstalls the plugin. Our demo file contains the following:

<?php
DropTable('helloworld', 'name', $db);

$SQL = "SELECT modulesallowed FROM www_users WHERE userid='" . $_SESSION['UserID'] . "'";
$Result = DB_query($SQL, $db);
$MyRow = DB_fetch_array($Result);

$SQL = "UPDATE www_users SET modulesallowed='" . substr($MyRow['modulesallowed'], 0, strlen($MyRow['modulesallowed'])-2) . "' WHERE userid='" . $_SESSION['UserID'] . "'";
executeSQL($SQL, $db);

?>
As you can see above, both the dbupdates and the dbremoval files can contain php code to verify information before updating the database.




So that is a simple KwaMoja plugin. This zip file can be imported into KwaMoja, and you can see and use this plugin directly from the menu.
The next post will cover actually writing the script.


Sunday 5 May 2013

KwaMoja now has a plugin architecture!

Yesterday Munir blogged about the new KwaMoja plugin architecture. As he says in his post this will enable both open source and commercial plugins to be written for KwaMoja. The code with this system in can be found here, and a demo plugin can be downloaded from here.

This is an exciting new development as it means that specialist areas, such as health and education, to name but two, can now have full KwaMoja support. Previously code for this sort of area would not have been part of the main line, as it would be too specific to be included.

It also provides an opportunity for third party developers to make money from the KwaMoja ecosystem.

KwaMoja plugins come as zip files, they must be uploaded to the KwaMoja installation from the browser interface, and then unpacked and installed via the same interface.

There are three scripts that have been added to KwaMoja: PluginUpload.php to load the plugin to the installation, PluginInstall.php to unpack and install the plugin and PluginUnInstall.php to remove the plugin.

Later today I hope to post a tutorial on how to create your own plugins.

This code could be adapted to work in webERP if Phil Daintree wanted to work with us on doing that. From his recent behaviour I suspect he wont.

Friday 3 May 2013

Where did you say the truth was Phil?

This page is written in response to the lies that +Phil Daintree has written about me, and spread on the internet. Despite years of searching he has been unable to find anything I have written that is untrue, and he has had to resort to vague generalities, faked emails, and badly fabricated screenshots (you can see the joins if you zoom in using any bit mapped image editor). +Phil Daintree  is welcome to make any comments to these pages, as he has done in the past. If I agree with what he says I will apologise and amend my writings, if I do not agree I have allowed his comments to stand next to mine so that people can make their own judgements. I have every confidence in the intelligence of readers to make a sensible judgement based on the facts. +Phil Daintree will not allow me the right of reply to any of the lies he has told about me. It seems to me significant that he realises that if people see both sides of the argument they will see through his lies.


Phil Daintree has recently started to say that the truth is at the web site he hijacked from a project that was started by an Indian gentleman as a result of this exchange on here:

http://weberp-accounting.1478800.n4.nabble.com/Add-all-into-Shipment-td4655643.html#a4655738

However let us ignore the ethics of stealing another projects domain name to use to attack a developer in your own project, but rather let us put to rest what is really the truth once and for all.

Writing "Hate Pages" about fellow developers and then denying them the right to reply has always been Phil Daintree's weapon of choice when trying to bully developers out of the project. Back on 11 September 2007 when Phil was trying to bully most of the early webERP developers out of the project, he wrote to me telling me he had written one of his hate pages about them and was going to publish it on weberp.org. At the time I dissuaded him from this action. He again brought the subject on the following day, and again I had to dissuade him. Unfortunately when he came to writing his "hate page" about me there was nobody left to dissuade him.

Phil starts off by saying that the page is a defense against things I have said in this blog. However as anybody associated with the project for long can tell you Phil has been putting up hate pages about me for several years now, as can be seen rightv back in this thread: http://weberp-accounting.1478800.n4.nabble.com/AP-checks-td4019909.html#a4040317 All my blog posts are date stamped, so this is a lie.

Phil then says that anybody who opposes him must be me in disguise and says all their messages come from the same IP address. Where is your proof of this silly statement Phil? Oh there is none, because it is a lie! This from a man who poses on the internet as somebody called Anthony to attack me!!

Phil then goes on to say that the fixed asset module I wrote did not work. Yes it did, and is still in use at one of Uganda's biggest retailers (Bata shoes). Where is the link to these bugs Phil? Oh there is none because it is a lie.

Phil says he then removed me as admin. I have linked to the posts where he removed me as admin in an earlier blog post. The real reason was that he was upset that we had an argument over retaining the purchase order history. Where is your proof that this when you removed me Phil? Oh there is none because it is a lie!

Amendment 2712/2013:

Phil has now sent me evidence that he withdrew my svn access before the discussion on purchase ordering. This may or may not prove that he also withdrew my admin at this point, but he certainly didn't have the courage to tell me this either publicly or privately until after he had his ego dented by the PO conversation.

Phil then claims credit for some changes done to purchase ordering. As I have linked to in an earlier post the changes were written by me. As I had at that point had my access to svn removed, I posted the changes to a different repository. As demonstrated in the earlier post, Phil took my commit and then posted it the following day (these commits are date stamped by sourceforge) claiming it as his own work!! What is more incredible is that he now claims I "bitterly opposed" my own changes. Phil where is your proof of any of this? Oh there is none because it is a lie.

Phil says he originally removed my svn access because I was overwriting his changes. Does he post any links to this? No he doesn't because there are none. It is just another of his lies.

Amendment 27/12/2013

Phil has now sent me a commit where I had accidentally over written some changes that he had done. I apologised for this almost immediately after, as our commits had crossed. I was in Africa at the time on a very slow internet connection and hadn't had time to update. The commit only overwrote some case changes to variable names. Hardly the crime of the century. Certainly not as bad as his recent commit forcing many users off webERP. My​ reaction was to immediately apologise to Phil , and explain. His reaction was to remove my SVN access.

Phil says I wanted to do the database upgrades in a new language of my own invention calle "pseudo sql" In fact the language was PHP as can be seen here:
https://sourceforge.net/p/weberp/code/9402/ Where is the proof of this new language Phil? Oh there is none because it is a lie!

Phil then claims I was "violently" opposed to his number formatting system. All I suggested was that we used the functionality that PHP provides for doing this instead of inventing his own functionality. No violence used whatsoever!! Phil's solution also requires that the locale be installed, as has been discovered by him since. Where is your proof of this "violence" Phil? Oh there is none because it is another lie!

Phil then goes into a long diatribe on his attempt to claim the copyright to the whole codebase. This contradicts itself at every twist and turn, in his desperate attempts to deny it. As far as I can make out the latest story is that saying that the copyright is owned by weberp.org is a secret code for saying that the copyright is actually owned by the individual authors. Really Phil? In that case why the need for a secret code? Why the need for subterfuge? If thats what you mean just say it and be clear! Or is it just another lie?

He then goes on to say that my access to the mailing list is only moderated! Not so as anyone can see from the messages to that nabble forum. For instance here:
http://weberp-accounting.1478800.n4.nabble.com/BOMExtendedQTY-php-does-not-properly-handle-PO-Quantities-td4656253.html As anyone can see Bob's postings to the nabble forum are allowed through to the mailing lists mine are not. Are these postings in any way abusive? No, it is just another of Phil's lies.

On the subject of abuse as anybody can see by reading the archives, more often than not the abuse was started by Phil, as a result of him losing a technical discussion.

Phil says he took away my svn access because I was no longer making a useful contribution. Strange that he has continued to take my code and commit it, just claiming it as his own code!! Does he post any links to where my contribution was not useful? No he doesn't.

Phil then goes into a long quote purportedly written by me. Does he post a link to this post? No he doesn't. Can he find it in googles cache? No he can't. In fact can he find it anywhere? No can you as a reader? I have tried searching for it by using some phrases from it, and the only person who appears to have written it is Phil Daintree. Oh dear another lie Phil?

He then prints a reply to his own comment. I shall ignore most of this as commenting on his own comment is just silly.

Then he tries to justify a different method of calculating a developers contribution to the code. All I can do is point people to his original comment here: http://weberp-accounting.1478800.n4.nabble.com/Copyright-notices-and-License-statements-tt1487216.html#a1487221 How bitter do you have to be to keep changing these things to try and show that you are a bigger and more important person??

+Phil Daintree  says in his hate pages:
 

"http://sourceforge.net/p/web-erp/code/5834
 
contained references to his Kwamoja fork.
I asked him to review and fix it... he refused."
 
Strange because http://sourceforge.net/p/web-erp/code/5836/ clearly shows me 
removing these references to KwaMoja immediately +Phil Daintree  pointed out my mistake - An 
accidental mistake I apologised to him about straight away. He then goes on to fabricate
an email where I apparently say I wasn't going to remove these references, even
though sourceforges SVN clearly shows I already had!!  
 
+Phil Daintree says that I am not a member of the ICAEW. Quite right I am not, but when did I claim to be?
What I have said is that I am a UK qualified accountant. Phil is very careful in his choice of language
here because he implies that I am not a qualified accountant without actually saying so. 
He knows what my qualifications are because I have shown them to him so he resorts to such
innuendo in the hope people won't read too deeply into what he says. This is another reason why
+Phil Daintree  is so frightened of allowing me a right to reply to his lies.

+Phil Daintree has said I overwrote some of his work on purchase ordering and has
linked to some commits on this subject. Yes I fixed some bugs as Phil's work didn't  
deal with cancelled orders. I notice these bug fixes are still in the webERP code 
today!! Strange that exactly 5 years on Phil hasn't got around to removing this
code if it is so bad!! It is typical of the man that he tells these lies and doesn't have the 
honesty to allow me to link to the evidence showing that all that he says about me
is just lies, lies, and yet more lies! 

+Phil Daintree says in his hate pages that the reason he removed my ability to commit to the webERP project was that I misspelled  the name of a CSS class in one of my commits. As anybody who understands HTML/CSS programming can tell him if a web browser finds a css class it doesn't know it just ignores it. There was no performance loss or harm to the user interface. Compare this to some of the really bad commits he and others have done! Interestingly a css class of the exact same name was soon added to webERP meaning that +Phil Daintree  himself now commits code with this identical css class in it!!

So that's it? No comments on what I have said in this blog at all, despite that being what it was titled as. Just lies and nasty innuendos about my coding and my character that he cannot prove because they are just lies.

I will leave it to the reader to judge what is the truth. I have always been content to put the facts before the community and let them judge. I see no need for censorship or banning. So why does Phil believe in censorship and banning to avoid criticism?

ps Phil, can you stop sending the hate mail that pollutes my inbox every day?