baumi's blog

baumi's personal blog … Linux, OS X, Windows, Random things, …

Billings OSX sqlite3 cheat sheet

Usecase: import multiple entries into “Billings OSX”. We are using sqlite3 (as Billings OSX saves all its data into a Sqlite3 Database). This is just my very personal cheatsheet but anayone who’s interested might just use it for learning purposes.

sqlite3 "/Users/user/Library/Application Support/Billings/Database/billings.bid"
.table   # OR: .tables
.schema Invoice

--
.mode list
.separator ", "  # OR:  .separator |
--
.mode line
--
.mode column
--

.fullschema
PRAGMA table_info(Invoice);
.dump
.quit


SELECT * FROM Client;
SELECT * FROM Invoice;
select i.invoiceNumber, strftime('%Y-%m-%d', i.invoiceDate/86400.0 + 2440587.5) as invdate, i.totalCached, c.company, c.firstName, c.lastName, c.addressStreet, c.addressZIP, c.addressCity, c.addressCountry FROM Invoice i left join Client c on c._rowid=i.clientID WHERE invdate LIKE '2016%';


SELECT * FROM Project;
SELECT * FROM Timeslip;

--
.mode line
SELECT * FROM Project WHERE name LIKE '%InterSSL%';
# _rowid = 13100
# clientID = 4400
# createDate = 1442221820.36794
# uuid = ACEF1208-B9A6-433D-92E0-6C1A9C94D3FD
# name = InterSSL/RapidSSL Zertifikate (Gutschrift für InterSSL)
--
# _rowid = 13000
# clientID = 4400
# createDate = 1442221820.36794
# uuid = 78635FBA-E58A-4F74-AB2A-CDA591F25EED
# name = InterSSL/RapidSSL Zertifikate
--

# InterSSL/RapidSSL Zertifikate
SELECT * FROM TimeSlip WHERE projectID = 13000; 
# InterSSL/RapidSSL Zertifikate (Gutschrift für InterSSL)
SELECT * FROM TimeSlip WHERE projectID = 13100;


SELECT * FROM EO_PK WHERE tableName='TimeSlip';
#   _rowid = 26
#tableName = TimeSlip
# nextPKey = 243500

# To increment the Counter (Billings seems to use setps of 100's):
UPDATE EO_PK SET nextPKey=(nextPKey+100) WHERE tableName='TimeSlip';




Konkretes Beispiel:
sqlite> SELECT * FROM TimeSlip WHERE projectID = 13000;
        activeForTiming = 1
             categoryID = 
                 userID = 1
                comment = 
   compoundSecondaryTax = 
      consolidatedTaxID = 4
             createDate = 1467809266.69955
               discount = 0.0
               distance = 0.0
                dueDate = 
               duration = 0.0
            endDateTime = 
   foreignAppEntityName = 
     foreignAppImportID = 
foreignAppLastTouchDate = 
         foreignAppName = 
         foreignAppUser = 
                iCalUID = 
              invoiceID = 
           invoicedDate = 
                 markup = 0.0
            mileageType = 1
             modifyDate = 1467809529.16966
                   name = test
                 nature = 101
              projectID = 13000
                   rate = 90.0
              roundTime = 15
          startDateTime = 
                   tax1 = 
               tax1Name = 
                   tax2 = 
               tax2Name = 
                 _rowid = 243300
          timeSlipRefID = 
                  total = 0.0
                 typeID = 1
                  units = 0.0
                useTax1 = 
                useTax2 = 
                   uuid = 28DCAA24-B0B3-4406-8E65-FDDAE3201532
      invoicedProjectID = 
            totalCached = 351.0
         durationCached = 11700
       geoLocationStart = 
         geoLocationEnd = 




Full Insert Example - How to Get the _rowid:
---
sqlite3 "/Users/user/Library/Application Support/Billings/Database/billings.bid"
.mode line
SELECT name, _rowid FROM Project WHERE name LIKE '%InterSSL%';

The UUIDs for inserting into table TimeSlip are created from scratch (random). When using type 2 (=fixed) no entries in TimeEntry are required. Otherwise you will also need to add entries there. Full Insert Example (this has been produced by some PHP script of mine):
--
INSERT INTO TimeSlip (_rowid, activeForTiming, userID, consolidatedTaxID, createDate, discount, distance, duration, markup, mileageType, modifyDate, name, nature, projectID, rate, roundTime, total, typeID, units, uuid, totalCached, durationCached) VALUES ((SELECT nextPKey FROM EO_PK WHERE tableName='TimeSlip'), 1, 1, 4, '1467809266.69955', 0.0, 0.0, 60.0, 0.0, 1, '1467809266.69955', 'InterSSL #YYYY vom 11.01.2016 www.somedomain.at', 101, 13000, 14.99, 15, 0.0, 2, 0.0, 'D40119D7-3E55-472A-9887-2BAD45470ECE', 14.99, 3600); 
UPDATE EO_PK SET nextPKey=(nextPKey+100) WHERE tableName='TimeSlip';
INSERT INTO TimeSlip (_rowid, activeForTiming, userID, consolidatedTaxID, createDate, discount, distance, duration, markup, mileageType, modifyDate, name, nature, projectID, rate, roundTime, total, typeID, units, uuid, totalCached, durationCached) VALUES ((SELECT nextPKey FROM EO_PK WHERE tableName='TimeSlip'), 1, 1, 4, '1467809266.69955', 0.0, 0.0, 60.0, 0.0, 1, '1467809266.69955', 'Gutschrift zu InterSSL #XXXX vom 11.01.2016 www.anotherdomain.at', 101, 13100, 14.99, 15, 0.0, 2, 0.0, 'D40119D7-3E55-472A-9887-2BAD45470ECE', 14.99, 3600); 
UPDATE EO_PK SET nextPKey=(nextPKey+100) WHERE tableName='TimeSlip'; 

.
.
.
UPDATE Project SET totalCached=359.65 WHERE _rowid=13000; 
UPDATE Project SET totalCached=359.65 WHERE _rowid=13100;

Here’s the UUID generator (found it somewhere on the web – can’t remember where, sorry about that):

function gen_uuid() 
{
    return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
        // 32 bits for "time_low"
        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),

        // 16 bits for "time_mid"
        mt_rand( 0, 0xffff ),

        // 16 bits for "time_hi_and_version",
        // four most significant bits holds version number 4
        mt_rand( 0, 0x0fff ) | 0x4000,

        // 16 bits, 8 bits for "clk_seq_hi_res",
        // 8 bits for "clk_seq_low",
        // two most significant bits holds zero and one for variant DCE1.1
        mt_rand( 0, 0x3fff ) | 0x8000,

        // 48 bits for "node"
        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
    );
}

Comments are currently closed.