Integration Sample Script to vWorkApp

Integration Sample Script to vWorkApp

vWorkApp is a thrid party schedulling application for job management. 

http://www.vworkapp.com/dispatch-and-scheduling.html

Below is an scripting example of Job output to vWorkApp

This is a basic script that can be amended to suit your requirements:

 

{vWork sample for version 2.0 vWork API}

{vWork api docs here: http://api.vworkapp.com/_index.html}

 

var

  XMLDoc, XMLResult: TNativeXML;

  IdNode: TXMLNode;

  OrderNumber, VWorkID, ExistingVWorkID, ReturnString: String;

  Qry_JobHeader, Qry_JobTasks : TpFIBQuery;

  DebugList: TStringList;

const

  APIKey = 'H9XQxBXLi9DfyMkjdZZH'; //put your vWork API Key here

  APIPath = 'http://api.vworkapp.com/2.0/';

 

begin

  DebugList := TStringList.Create;

  XMLDoc :=  TNativeXML.Create(nil);

  XMLResult :=  TNativeXML.Create(nil);

  OrderNumber := GetSourceFieldValue('ORDERNUMBER','HEADER');

  Qry_JobHeader := SQLToTpFIBQuery('Select * from JOBHEADER where ORDERNUMBER=''' + OrderNumber + '''');

  Qry_JobTasks := SQLToTpFIBQuery('Select TASKNAME, TASKDESCRIPTION from JOBTASKS where ORDERNUMBER=''' + OrderNumber + ''' order by TASKSEQUENCE');

  if trim(OrderNumber) = '' then exit;

  ExistingVWorkID := trim(GetSourceFieldValue('ADDITIONALFIELD_1','HEADER'));

  {If using ADDITIONALFIELD_1 for VWorkID then can check it first}

  {Could/Should also have a check here to see if the order still exists in vwork by using: [GET] /api/2.0/jobs/[id].xml?[arguments]}

  if ExistingVWorkID <> '' then

  begin

    if MessageDlg('A VWork Job exists for this Job Order, Yes to update or No to Quit',mtInformation,mbYes+mbNo,0) <> mrYes then

      exit;

  end;

  ShowWaiting('Sending to vWork...');

  try

   {Root Element}

   XMLDoc.XmlFormat := xfReadable;

   XMLDoc.Root.Name := 'job';

    with XMLDoc.Root.NodeNew('customer_name') do begin

      Value := Qry_JobHeader.FN('CUSTOMER').AsString;

    end;

    with XMLDoc.Root.NodeNew('template_name') do begin

      Value := '';

    end;

    with XMLDoc.Root.NodeNew('worker_id') do begin

      Value := '';

    end;

    with XMLDoc.Root.NodeNew('planned_duration') do begin

      if Qry_JobHeader.FN('ESTIMATEDDURATION').IsNull then

         Value := '0'

      else

      if Qry_JobHeader.FN('DURATIONSCALE').AsString = 'Hours' then

         Value := (floattostr((Qry_JobHeader.FN('ESTIMATEDDURATION').Value * 60) * 60))

      else {minutes}

         Value := (floattostr(Qry_JobHeader.FN('ESTIMATEDDURATION').Value * 60));

    end;

    with XMLDoc.Root.NodeNew('steps') do begin

      AttributeAdd('type','array');

      while not Qry_JobTasks.Eof do

      begin

        {Step}

        with NodeNew('Step') do begin

          WriteString('Name',(Qry_JobTasks.FN('TASKNAME').AsString + ': ' + Qry_JobTasks.FN('TASKDESCRIPTION').AsString));

          with NodeNew('location') do begin

            with NodeNew('formatted_address') do begin

              Value := Qry_JobHeader.FN('ORDERADDRESS1').AsString

                + ',' + Qry_JobHeader.FN('ORDERADDRESS2').AsString

                  + ',' + Qry_JobHeader.FN('ORDERADDRESS3').AsString;

            end;

            WriteString('lat','30');

            WriteString('lng','40');

          end;

        end;

        Qry_JobTasks.Next;

      end;

    end;

 

    {Custom Fields}

    with XMLDoc.Root.NodeNew('custom_fields') do begin

      AttributeAdd('type','array');

      with NodeNew('custom_field') do begin

        WriteString('name','Job No.');

        WriteString('value',OrderNumber);

      end;

      with NodeNew('custom_field') do begin

        WriteString('name','Notes');

        WriteString('value',Qry_JobHeader.FN('ORDERNOTES').AsString);

      end;

    end;

 

    {Debug/view XML: uncomment this}

    {DebugList.Text := XMLDoc.WriteToString;

    DebugList.SaveToFile(OstendoPath + 'vworkxml.txt');

    run(OstendoPath + 'vworkxml.txt');

    exit;}

 

    {other http script functions available are HttpDelete and HttpGet to see use F2}

    if ExistingVWorkID <> '' then

      ReturnString := HttpPut(APIPath + 'jobs/' + ExistingVWorkID + '.xml?api_key=' + APIKey, XMLDoc.WriteToString, 'application/xml; charset=UTF-8')

    else

      ReturnString := HttpPost(APIPath + 'jobs.xml?api_key=' + APIKey, XMLDoc.WriteToString,'application/xml; charset=UTF-8');

    {End progress before showmessage}

    EndProgress;

    if ExistingVWorkID <> '' then

      Showmessage('VWork-ID: ' + ExistingVWorkID + ' was updated')

    else

    begin

      {Debug/view Return XML: uncomment this}

      {showmessage(ReturnString);

      DebugList.text := ReturnString;

      DebugList.SaveToFile(OstendoPath + 'vworkxml.xml');

      run(OstendoPath + 'vworkxml.xml');

      exit;}

 

      {Process Results}

      XMLResult.ReadFromString(ReturnString);

      IdNode := XMLResult.Root.FindNode('id');

      if IdNode <> nil then

        VWorkID := IdNode.Value;

      {Prob you would save this to the job header additional field so there is a link between Ostendo and VWork}

      ExecuteSQL('update JOBHEADER set ADDITIONALFIELD_1=''' + VWorkID + ''' where ORDERNUMBER=''' + OrderNumber + '''');

      Showmessage('VWork-ID: ' + VWorkID + ' was created');

      RelatedScreenRefreshData;

    end;

  finally

    {Ensure progress is ended}

    EndProgress;

    DebugList.Free;

    XMLResult.Free;

    XMLDoc.Free;

  end;

end.

    • Related Articles

    • ACCTSWVERSION - Used by Software Integration Script

      This constant is managed automatically by the Ostendo Accounting Integration script. Each time the accounting posting script is run, it checks the actual Accounting Software Product and Version and updates this User Defined Constant if it has changed ...
    • Moneyworks Integration

      Integration Document http://www.ostendo.info/downloads/ostendo/OSTENDO_MONEYWORKS_INTEGRATION.pdf
    • MYOB AR Live Integration

      Integration Documentation http://www.ostendo.info/downloads/ostendo/OSTENDO_MYOB_AR_LIVE_INTEGRATION.pdf
    • QBO Integration Guide

      http://www.ostendo.info/downloads/ostendo/OSTENDO_QBO_INTEGRATION.pdf
    • Simple XML Order Example Script

      The attached script provides a simple example of coding using the Ostrendo XML functions to export data from a Purchase Order and import that data into a Sales Order.