Commit 7068c939 by Cam Hayes

cleaned up some code, and added a change log into view home.

parent c15c23b4
...@@ -223,7 +223,6 @@ procedure TFViewAddCustomer.SendAddressToServer; ...@@ -223,7 +223,6 @@ procedure TFViewAddCustomer.SendAddressToServer;
// Creates an Address JSON and then sends it to the server for the address to be // Creates an Address JSON and then sends it to the server for the address to be
// Added or edited. // Added or edited.
var var
Field: TField;
AddressJSON: TJSONObject; AddressJSON: TJSONObject;
Response: TXDataClientResponse; Response: TXDataClientResponse;
notification: TJSObject; notification: TJSObject;
...@@ -516,8 +515,6 @@ procedure TFViewAddCustomer.GetCustomer; ...@@ -516,8 +515,6 @@ procedure TFViewAddCustomer.GetCustomer;
var var
xdcResponse: TXDataClientResponse; xdcResponse: TXDataClientResponse;
customer, RepUsers : TJSObject; customer, RepUsers : TJSObject;
items: TJSObject;
ship_block: TStringList;
begin begin
xdcResponse := await(XDataWebClient1.RawInvokeAsync('ILookupService.GetCustomer', [customerID])); xdcResponse := await(XDataWebClient1.RawInvokeAsync('ILookupService.GetCustomer', [customerID]));
customer := TJSObject(xdcResponse.Result); customer := TJSObject(xdcResponse.Result);
......
...@@ -109,7 +109,6 @@ procedure TFSelectCustomer.getCustomers(); ...@@ -109,7 +109,6 @@ procedure TFSelectCustomer.getCustomers();
var var
xdcResponse: TXDataClientResponse; xdcResponse: TXDataClientResponse;
customerList: TJSObject; customerList: TJSObject;
i: integer;
begin begin
try try
Utils.ShowSpinner('spinner'); Utils.ShowSpinner('spinner');
......
...@@ -49,8 +49,6 @@ type ...@@ -49,8 +49,6 @@ type
PageNumber: integer; PageNumber: integer;
PageSize: integer; PageSize: integer;
TotalPages: integer; TotalPages: integer;
info: string;
public public
{ Public declarations } { Public declarations }
end; end;
...@@ -93,8 +91,6 @@ Procedure TFViewCustomers.WebFormCreate(Sender: TObject); ...@@ -93,8 +91,6 @@ Procedure TFViewCustomers.WebFormCreate(Sender: TObject);
// PageNumber: What page number the user is on IE 1: 1-10, 2: 11-20 etc // PageNumber: What page number the user is on IE 1: 1-10, 2: 11-20 etc
// TotalPages: Total number of pages returned from the search. // TotalPages: Total number of pages returned from the search.
// PageSize: Number of entries per page. // PageSize: Number of entries per page.
var
today: TDateTime;
begin begin
DMConnection.ApiConnection.Connected := True; DMConnection.ApiConnection.Connected := True;
PageNumber := 1; PageNumber := 1;
...@@ -163,7 +159,6 @@ end; ...@@ -163,7 +159,6 @@ end;
procedure TFViewCustomers.HideNotification; procedure TFViewCustomers.HideNotification;
begin begin
pnlMessage.ElementHandle.hidden := True; pnlMessage.ElementHandle.hidden := True;
info := '';
end; end;
......
object FViewHome: TFViewHome object FViewHome: TFViewHome
Width = 640 Width = 640
Height = 480 Height = 480
OnCreate = WebFormCreate
object WebLabel1: TWebLabel object WebLabel1: TWebLabel
Left = 24 Left = 24
Top = 43 Top = 43
...@@ -12,7 +13,7 @@ object FViewHome: TFViewHome ...@@ -12,7 +13,7 @@ object FViewHome: TFViewHome
Transparent = False Transparent = False
WidthPercent = 100.000000000000000000 WidthPercent = 100.000000000000000000
end end
object WebMemo1: TWebMemo object mmoNotes: TWebMemo
Left = 24 Left = 24
Top = 62 Top = 62
Width = 471 Width = 471
...@@ -20,10 +21,19 @@ object FViewHome: TFViewHome ...@@ -20,10 +21,19 @@ object FViewHome: TFViewHome
ElementID = 'view.home.notesmemo' ElementID = 'view.home.notesmemo'
HeightPercent = 100.000000000000000000 HeightPercent = 100.000000000000000000
Lines.Strings = ( Lines.Strings = (
'KG Orders Alpha Version') 'Change Log:'
'1) Setting a status now autofills due dates.'
'2) Fixed order dates displaying on 3 lines rather than 2.'
'3) Adjusted pdfs so that special instructions would have enough ' +
'space.'
'4) Fixed issue with PDF generation.'
'5) Removed ability to put 0 or a negative number for price and q' +
'uantity on order entry fields.')
ReadOnly = True ReadOnly = True
SelLength = 0 SelLength = 0
SelStart = 25 SelStart = 323
WidthPercent = 100.000000000000000000 WidthPercent = 100.000000000000000000
end end
end end
...@@ -5,12 +5,12 @@ interface ...@@ -5,12 +5,12 @@ interface
uses uses
System.SysUtils, System.Classes, WEBLib.Graphics, WEBLib.Forms, WEBLib.Dialogs, System.SysUtils, System.Classes, WEBLib.Graphics, WEBLib.Forms, WEBLib.Dialogs,
Vcl.Controls, Vcl.StdCtrls, WEBLib.StdCtrls, WEBLib.Controls, WEBLib.Grids, Vcl.Controls, Vcl.StdCtrls, WEBLib.StdCtrls, WEBLib.Controls, WEBLib.Grids,
XData.Web.Client, WEBLib.ExtCtrls, DB; XData.Web.Client, WEBLib.ExtCtrls, DB, JS;
type type
TFViewHome = class(TWebForm) TFViewHome = class(TWebForm)
WebLabel1: TWebLabel; WebLabel1: TWebLabel;
WebMemo1: TWebMemo; mmoNotes: TWebMemo;
procedure WebFormCreate(Sender: TObject); procedure WebFormCreate(Sender: TObject);
end; end;
...@@ -20,7 +20,7 @@ var ...@@ -20,7 +20,7 @@ var
implementation implementation
uses uses
JS, XData.Model.Classes, XData.Model.Classes,
ConnectionModule; ConnectionModule;
{$R *.dfm} {$R *.dfm}
...@@ -28,7 +28,7 @@ uses ...@@ -28,7 +28,7 @@ uses
procedure TFViewHome.WebFormCreate(Sender: TObject); procedure TFViewHome.WebFormCreate(Sender: TObject);
begin begin
WebLabel1.Caption := 'Please select a menu option to continue!'; mmoNotes.Lines.Insert(0, 'Welcome to KG Orders Version ' + TDMConnection.clientVersion);
end; end;
end. end.
...@@ -125,10 +125,9 @@ procedure TFViewMain.lblHomeClick(Sender: TObject); ...@@ -125,10 +125,9 @@ procedure TFViewMain.lblHomeClick(Sender: TObject);
begin begin
if ( not ( change ) ) then if ( not ( change ) ) then
begin begin
ShowToast('Home page is not currently implemented', 'info'); ShowForm(TFViewHome);
//ShowForm(TFViewHome); lblAppTitle.Caption := 'Koehler-Gibson Home';
//lblAppTitle.Caption := 'Koehler-Gibson Home'; setActive('Home');
//setActive('Home');
end end
else else
ShowToast('Please Save or Cancel your changes', 'danger'); ShowToast('Please Save or Cancel your changes', 'danger');
......
...@@ -777,10 +777,7 @@ var ...@@ -777,10 +777,7 @@ var
tempString, strColorList: string; tempString, strColorList: string;
colorObject: TJSObject; colorObject: TJSObject;
colorList: TJSArray; colorList: TJSArray;
colorLength: integer;
color: TJSObject; color: TJSObject;
colorJSON: TJSONObject;
colorListJSON: TJSONArray;
items: TJSObject; items: TJSObject;
begin begin
Utils.ShowSpinner('spinner'); Utils.ShowSpinner('spinner');
...@@ -840,7 +837,6 @@ procedure TFOrderEntryWeb.SetNewOrderInfo(customerID: string); ...@@ -840,7 +837,6 @@ procedure TFOrderEntryWeb.SetNewOrderInfo(customerID: string);
var var
xdcResponse: TXDataClientResponse; xdcResponse: TXDataClientResponse;
customer : TJSObject; customer : TJSObject;
address: string;
items: TJSObject; items: TJSObject;
begin begin
xdcResponse := await(XDataWebClient1.RawInvokeAsync('ILookupService.GetCustomer', xdcResponse := await(XDataWebClient1.RawInvokeAsync('ILookupService.GetCustomer',
...@@ -1031,7 +1027,7 @@ end; ...@@ -1031,7 +1027,7 @@ end;
function TFOrderEntryWeb.VerifyQBOrder: Boolean; function TFOrderEntryWeb.VerifyQBOrder: Boolean;
var var
msg, SQL: string; msg: string;
begin begin
Result := True; Result := True;
msg := 'To add an order to QuickBooks, the following must be present:' + sLineBreak; msg := 'To add an order to QuickBooks, the following must be present:' + sLineBreak;
......
...@@ -476,12 +476,12 @@ var ...@@ -476,12 +476,12 @@ var
begin begin
newform := TFSetStatus.CreateNew; newform := TFSetStatus.CreateNew;
newform.Caption := 'Input Search Options'; newform.Caption := 'Set Status';
newForm.Popup := True; newForm.Popup := True;
newForm.Border := fbDialog; newForm.Border := fbDialog;
newForm.Position := poScreenCenter; newForm.Position := poScreenCenter;
newForm.OrderID := statusOrderID; newForm.OrderID := statusOrderID;
newForm.JobName := wdbtcOrders.Cells[3, row]; newForm.JobName := wdbtcOrders.Cells[4, row];
if wdbtcOrders.Cells[15, row] <> '' then if wdbtcOrders.Cells[15, row] <> '' then
newForm.ShipDue := StrToDateTime(wdbtcOrders.Cells[15, row]) newForm.ShipDue := StrToDateTime(wdbtcOrders.Cells[15, row])
else else
......
...@@ -48,7 +48,7 @@ object FSetStatus: TFSetStatus ...@@ -48,7 +48,7 @@ object FSetStatus: TFSetStatus
WidthPercent = 100.000000000000000000 WidthPercent = 100.000000000000000000
end end
object WebLabel3: TWebLabel object WebLabel3: TWebLabel
Left = 174 Left = 90
Top = 14 Top = 14
Width = 57 Width = 57
Height = 14 Height = 14
...@@ -184,7 +184,7 @@ object FSetStatus: TFSetStatus ...@@ -184,7 +184,7 @@ object FSetStatus: TFSetStatus
object edtOrderID: TWebEdit object edtOrderID: TWebEdit
Left = 16 Left = 16
Top = 34 Top = 34
Width = 145 Width = 63
Height = 22 Height = 22
HelpType = htKeyword HelpType = htKeyword
TabStop = False TabStop = False
...@@ -204,9 +204,9 @@ object FSetStatus: TFSetStatus ...@@ -204,9 +204,9 @@ object FSetStatus: TFSetStatus
WidthPercent = 100.000000000000000000 WidthPercent = 100.000000000000000000
end end
object edtJobName: TWebEdit object edtJobName: TWebEdit
Left = 174 Left = 90
Top = 34 Top = 34
Width = 145 Width = 229
Height = 22 Height = 22
HelpType = htKeyword HelpType = htKeyword
TabStop = False TabStop = False
......
...@@ -170,7 +170,13 @@ procedure TFSetStatus.SetDueDates(); ...@@ -170,7 +170,13 @@ procedure TFSetStatus.SetDueDates();
begin begin
if OrderType = 'corrugated plate' then if OrderType = 'corrugated plate' then
begin begin
if wlcbStatus.DisplayText = 'Art Done' then if wlcbStatus.DisplayText = 'Proof Done' then
begin
dtpPlateDue.Date := plateDue;
dtpMountDue.Date := mountDue;
dtpShipDue.Date := shipDue;
end
else if wlcbStatus.DisplayText = 'Art Done' then
begin begin
dtpPlateDue.Date := getNextDate(dtpDate.Date); dtpPlateDue.Date := getNextDate(dtpDate.Date);
dtpMountDue.Date := getNextDate(dtpPlateDue.Date); dtpMountDue.Date := getNextDate(dtpPlateDue.Date);
...@@ -178,29 +184,60 @@ begin ...@@ -178,29 +184,60 @@ begin
end end
else if wlcbStatus.DisplayText = 'Plate Done' then else if wlcbStatus.DisplayText = 'Plate Done' then
begin begin
dtpPlateDue.Date := plateDue;
dtpMountDue.Date := getNextDate(dtpDate.Date); dtpMountDue.Date := getNextDate(dtpDate.Date);
dtpShipDue.Date := getNextDate(dtpMountDue.Date); dtpShipDue.Date := getNextDate(dtpMountDue.Date);
end end
else if wlcbStatus.DisplayText = 'Mount Done' then else if wlcbStatus.DisplayText = 'Mount Done' then
begin
dtpPlateDue.Date := plateDue;
dtpMountDue.Date := mountDue;
dtpShipDue.Date := getNextDate(dtpDate.Date); dtpShipDue.Date := getNextDate(dtpDate.Date);
end end
else if wlcbStatus.DisplayText = 'Ship Done' then
begin
dtpPlateDue.Date := plateDue;
dtpMountDue.Date := mountDue;
dtpShipDue.Date := shipDue;
end;
end
else if OrderType = 'web plate' then else if OrderType = 'web plate' then
begin begin
if wlcbStatus.DisplayText = 'Art Done' then if wlcbStatus.DisplayText = 'Proof Done' then
begin
dtpPlateDue.Date := plateDue;
dtpShipDue.Date := shipDue;
end
else if wlcbStatus.DisplayText = 'Art Done' then
begin begin
dtpPlateDue.Date := getNextDate(dtpDate.Date); dtpPlateDue.Date := getNextDate(dtpDate.Date);
dtpShipDue.Date := getNextDate(dtpMountDue.Date); dtpShipDue.Date := getNextDate(dtpPlateDue.Date);
end end
else if wlcbStatus.DisplayText = 'Plate Done' then else if wlcbStatus.DisplayText = 'Plate Done' then
begin begin
dtpShipDue.Date := getNextDate(dtpMountDue.Date); dtpPlateDue.Date := plateDue;
dtpShipDue.Date := getNextDate(dtpDate.Date);
end end
else if wlcbStatus.DisplayText = 'Ship Done' then
begin
dtpPlateDue.Date := plateDue;
dtpShipDue.Date := shipDue;
end;
end end
else else
begin begin
if wlcbStatus.DisplayText = 'Art Done' then if wlcbStatus.DisplayText = 'Proof Done' then
begin
dtpShipDue.Date := shipDue;
end
else if wlcbStatus.DisplayText = 'Art Done' then
begin begin
dtpShipDue.Date := getNextDate(dtpDate.Date); dtpShipDue.Date := getNextDate(dtpDate.Date);
end
else if wlcbStatus.DisplayText = 'Ship Done' then
begin
dtpShipDue.Date := shipDue;
end; end;
end; end;
end; end;
......
...@@ -10,6 +10,45 @@ object AuthDatabase: TAuthDatabase ...@@ -10,6 +10,45 @@ object AuthDatabase: TAuthDatabase
FetchRows = 100 FetchRows = 100
Left = 162 Left = 162
Top = 45 Top = 45
object uqUSER_ID: TIntegerField
FieldName = 'USER_ID'
end
object uqUSER_NAME: TStringField
FieldName = 'USER_NAME'
Required = True
Size = 56
end
object uqPASSWORD: TStringField
FieldName = 'PASSWORD'
Size = 128
end
object uqNAME: TStringField
FieldName = 'NAME'
Size = 40
end
object uqSTATUS: TStringField
FieldName = 'STATUS'
Size = 7
end
object uqEMAIL: TStringField
FieldName = 'EMAIL'
Size = 50
end
object uqACCESS_TYPE: TStringField
FieldName = 'ACCESS_TYPE'
Size = 5
end
object uqSYSTEM_RIGHTS: TIntegerField
FieldName = 'SYSTEM_RIGHTS'
end
object uqPERSPECTIVE_ID: TStringField
FieldName = 'PERSPECTIVE_ID'
Size = 128
end
object uqQB_ID: TStringField
FieldName = 'QB_ID'
Size = 45
end
end end
object uqMisc: TUniQuery object uqMisc: TUniQuery
FetchRows = 100 FetchRows = 100
...@@ -18,6 +57,7 @@ object AuthDatabase: TAuthDatabase ...@@ -18,6 +57,7 @@ object AuthDatabase: TAuthDatabase
end end
object ucKG: TUniConnection object ucKG: TUniConnection
ProviderName = 'MySQL' ProviderName = 'MySQL'
Database = 'kg_order_entry'
LoginPrompt = False LoginPrompt = False
Left = 67 Left = 67
Top = 131 Top = 131
......
...@@ -14,6 +14,16 @@ type ...@@ -14,6 +14,16 @@ type
uqMisc: TUniQuery; uqMisc: TUniQuery;
ucKG: TUniConnection; ucKG: TUniConnection;
MySQLUniProvider1: TMySQLUniProvider; MySQLUniProvider1: TMySQLUniProvider;
uqUSER_ID: TIntegerField;
uqUSER_NAME: TStringField;
uqPASSWORD: TStringField;
uqNAME: TStringField;
uqSTATUS: TStringField;
uqEMAIL: TStringField;
uqACCESS_TYPE: TStringField;
uqSYSTEM_RIGHTS: TIntegerField;
uqPERSPECTIVE_ID: TStringField;
uqQB_ID: TStringField;
procedure DataModuleCreate(Sender: TObject); procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject); procedure DataModuleDestroy(Sender: TObject);
private private
......
...@@ -18,15 +18,6 @@ type ...@@ -18,15 +18,6 @@ type
strict private strict private
authDB: TAuthDatabase; authDB: TAuthDatabase;
private private
userName: string;
userFullName: string;
userId: string;
userPerspectiveID: string;
userQBID: string;
userAccessType: string;
userEmail: string;
userStatus: string;
qbEnabled: boolean;
function CheckUser(const user, password: string): Integer; function CheckUser(const user, password: string): Integer;
public public
function Login(const user, password: string): string; function Login(const user, password: string): string;
...@@ -110,6 +101,7 @@ var ...@@ -110,6 +101,7 @@ var
userState: Integer; userState: Integer;
iniFile: TIniFile; iniFile: TIniFile;
JWT: TJWT; JWT: TJWT;
qbEnabled: boolean;
begin begin
Logger.Log(3, Format( 'AuthService.Login - User: "%s"', [User])); Logger.Log(3, Format( 'AuthService.Login - User: "%s"', [User]));
try try
......
...@@ -64,6 +64,13 @@ begin ...@@ -64,6 +64,13 @@ begin
Logger.Log(1, '-- jwtTokenSecret: ' + serverConfig.jwtTokenSecret + IfThen(serverConfig.jwtTokenSecret = 'super_secret0123super_secret4567', ' [default]', ' [from config]')); Logger.Log(1, '-- jwtTokenSecret: ' + serverConfig.jwtTokenSecret + IfThen(serverConfig.jwtTokenSecret = 'super_secret0123super_secret4567', ' [default]', ' [from config]'));
Logger.Log(1, '-- webAppFolder: ' + serverConfig.webAppFolder + IfThen(serverConfig.webAppFolder = 'static', ' [default]', ' [from config]')); Logger.Log(1, '-- webAppFolder: ' + serverConfig.webAppFolder + IfThen(serverConfig.webAppFolder = 'static', ' [default]', ' [from config]'));
Logger.Log(1, '-- serverConfig.reportsFolder: ' + serverConfig.reportsFolder); Logger.Log(1, '-- serverConfig.reportsFolder: ' + serverConfig.reportsFolder);
if not DirectoryExists(serverConfig.reportsFolder + 'reports\') then
begin
ForceDirectories(serverConfig.reportsFolder + 'reports\');
Logger.Log(1, '-- Reports directory created: ' + serverConfig.reportsFolder + 'reports\');
end;
Logger.Log(1, '--LoadServerConfig - end'); Logger.Log(1, '--LoadServerConfig - end');
end; end;
...@@ -78,7 +85,8 @@ begin ...@@ -78,7 +85,8 @@ begin
adminPassword := 'whatisthisusedfor'; adminPassword := 'whatisthisusedfor';
jwtTokenSecret := 'super_secret0123super_secret4567'; jwtTokenSecret := 'super_secret0123super_secret4567';
webAppFolder := 'static'; webAppFolder := 'static';
reportsFolder := 'static/'; reportsFolder := 'static\';
ServerConfigStr := Bcl.Json.TJson.Serialize(ServerConfig); ServerConfigStr := Bcl.Json.TJson.Serialize(ServerConfig);
Logger.Log(1, '--ServerConfigSerialize: ' + ServerConfigStr); Logger.Log(1, '--ServerConfigSerialize: ' + ServerConfigStr);
Logger.Log(1, '--TServerConfig.Create - end'); Logger.Log(1, '--TServerConfig.Create - end');
......
...@@ -127,15 +127,15 @@ begin ...@@ -127,15 +127,15 @@ begin
Logger.Log(1, '--- Settings ---'); Logger.Log(1, '--- Settings ---');
iniStr := iniFile.ReadString( 'Settings', 'MemoLogLevel', '' ); iniStr := iniFile.ReadString( 'Settings', 'MemoLogLevel', '' );
if iniStr.IsEmpty then if iniStr.IsEmpty then
Logger.Log( 1, '--Settings->memoLogLevel: Entry not found - default: 3' ) Logger.Log( 1, '--Settings->MemoLogLevel: Entry not found - default: 3' )
else else
Logger.Log( 1, '--Settings->memoLogLevel: ' + iniStr ); Logger.Log( 1, '--Settings->MemoLogLevel: ' + iniStr );
iniStr := iniFile.ReadString( 'Settings', 'FileLogLevel', '' ); iniStr := iniFile.ReadString( 'Settings', 'FileLogLevel', '' );
if iniStr.IsEmpty then if iniStr.IsEmpty then
Logger.Log( 1, '--Settings->fileLogLevel: Entry not found - default: 4' ) Logger.Log( 1, '--Settings->FileLogLevel: Entry not found - default: 4' )
else else
Logger.Log( 1, '--Settings->fileLogLevel: ' + iniStr ); Logger.Log( 1, '--Settings->FileLogLevel: ' + iniStr );
Logger.Log( 1, '' ); Logger.Log( 1, '' );
iniStr := iniFile.ReadString( 'Settings', 'LogFileNum', '' ); iniStr := iniFile.ReadString( 'Settings', 'LogFileNum', '' );
...@@ -144,6 +144,12 @@ begin ...@@ -144,6 +144,12 @@ begin
else else
Logger.Log( 1, '--Settings->LogFileNum: ' + IntToStr(StrToInt(iniStr) - 1) ); Logger.Log( 1, '--Settings->LogFileNum: ' + IntToStr(StrToInt(iniStr) - 1) );
iniStr := iniFile.ReadString( 'Settings', 'WebClientVersion', '' );
if iniStr.IsEmpty then
Logger.Log( 1, '--Settings->WebClientVersion: Entry not found - ERROR: ini entry required!!!')
else
Logger.Log( 1, '--Settings->WebClientVersion: ' + iniStr );
Logger.Log(1, '--- Database ---'); Logger.Log(1, '--- Database ---');
iniStr := IniFile.ReadString( 'Database', 'Server', '' ); iniStr := IniFile.ReadString( 'Database', 'Server', '' );
if iniStr.IsEmpty then if iniStr.IsEmpty then
......
unit QBService;
interface
uses
XData.Service.Common,
Aurelius.Mapping.Attributes,
System.JSON,
System.Generics.Collections,
System.Classes;
type
[ServiceContract]
IQBService = interface(IInvokable)
['{D119A273-0644-484B-B75E-B6FE57BB422C}']
[HttpGet] function getCustomers(): TJSONArray;
end;
implementation
initialization
RegisterServiceType(TypeInfo(IQBService));
end.
unit QBServiceImplementation;
interface
uses
XData.Server.Module,
XData.Service.Common,
Api.Database, Data.DB, frxClass, frxExportPDF, JS, System.Hash, System.JSON,
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, MemDS, DBAccess, Uni,
hyiedefs, hyieutils, iexBitmaps, iesettings, iexLayers, iexRulers,
iexToolbars, iexUserInteractions, imageenio, imageenproc, QuickRpt, QRCtrls,
dbimageen, Vcl.ExtCtrls, ieview, imageenview, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdFTP,
iexProcEffects, frCoreClasses, Common.Logging,
DateUtils, QBService, WEBLib.REST, WEBLib.WebTools,System.Net.HttpClient,
System.Net.URLClient, System.Net.HttpClientComponent, System.netencoding,
IdHTTP, IdSSLOpenSSL, IdSSLOpenSSLHeaders, System.IniFiles, REST.Client, REST.Types;
type
[ServiceImplementation]
TQBService = class(TInterfacedObject, IQBService)
private
procedure SaveTokens(AccessToken, RefreshToken: string);
function getCustomers(): TJSONArray;
function refreshAccessToken(): string;
var
AccessToken,RefreshToken,CompanyID,Client,Secret: string;
LastRefresh: TDateTime;
end;
implementation
function TQBService.getCustomers: TJSONArray;
var
restClient: TRESTClient;
restRequest: TRESTRequest;
restResponse: TRESTResponse;
param: TRESTRequestParameter;
res: string;
jsValue: TJSONValue;
Customer: TJSONValue;
jsObj: TJSONObject;
CustomerList: TJSONArray;
pair: TJSONPair;
begin
restClient := TRESTClient.Create(nil);
restClient.BaseURL := 'https://sandbox-quickbooks.api.intuit.com';
restRequest := TRESTRequest.Create(nil);
restRequest.Client := restClient;
restResponse := TRESTResponse.Create(nil);
restRequest.Response := restResponse;
if MinutesBetween(Now, LastRefresh) > 58 then
begin
RefreshAccessToken();
end;
restRequest.Method := rmGET;
//GET /v3/company/<realmId>/customer/<customerId>
res := '/v3/company/' + companyid + '/customer/58';
restRequest.Resource := res;
param := restRequest.Params.AddItem;
param.Name := 'Authorization';
param.Kind := pkHTTPHEADER;
param.Options := param.Options + [TRESTRequestParameterOption.poDoNotEncode];
param.Value := 'Bearer ' + AccessToken;
restRequest.Execute;
jsValue := restResponse.JSONValue;
jsObj := TJSONObject(jsValue);
CustomerList := TJSONArray( TJSONObject( jsObj.GetValue('QueryResponse') ).GetValue('Customer')) ;
result := CustomerList;
// LoadJSONArray( CustomerList );
restClient.Free;
restRequest.Free;
restResponse.Free;
end;
function TQBService.RefreshAccessToken: string;
// Refresh Token changes so make sure to save refresh token.
var
IdHTTP: TIdHTTP;
SSLIO: TIdSSLIOHandlerSocketOpenSSL;
RequestStream: TStringStream;
EncodedAuth, EncodedAuth2, PostData, response: string;
f: TStringList;
fi: string;
JSObj: TJSONObject;
Encoder: TBase64Encoding;
begin
// 1. Encode credentials (same as working Postman request)
// TNetEncoding.Base64.Encode adds a new line every 72 chars, this stops that
Encoder := TBase64Encoding.Create(0);
if( (Client = '') or (Secret = '') ) then
begin
Exit();
end;
EncodedAuth := Encoder.Encode(Client + ':' + Secret);
if RefreshToken = '' then
begin
Exit();
end;
// 2. Prepare POST data (EXACTLY as in Postman)
PostData := 'grant_type=refresh_token&refresh_token=' + RefreshToken;
// 3. Configure HTTP client
IdHTTP := TIdHTTP.Create(nil);
SSLIO := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
try
// Force TLS 1.2
SSLIO.SSLOptions.Method := sslvTLSv1_2;
SSLIO.SSLOptions.SSLVersions := [sslvTLSv1_2];
IdHTTP.IOHandler := SSLIO;
// Set headers
IdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
IdHTTP.Request.Accept := 'application/json';
IdHTTP.Request.CustomHeaders.AddValue('Authorization', 'Basic ' + EncodedAuth);
// 4. Create and send request
RequestStream := TStringStream.Create(PostData, TEncoding.UTF8);
try
// Execute POST
try
response := IdHTTP.Post('https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer', RequestStream);
JSObj := TJSONObject.ParseJSONValue(response) as TJSONObject;
RefreshToken := JSObj.GetValue('refresh_token').ToString.Trim(['"']);
AccessToken := JSObj.GetValue('access_token').ToString.Trim(['"']);
SaveTokens(AccessToken, RefreshToken);
Result := AccessToken;
except
on E: EIdHTTPProtocolException do
// Memo2.Lines.Add('Error: ' + E.Message + #13#10 + 'Response: ' + E.ErrorMessage);
end;
finally
RequestStream.Free;
end;
finally
SSLIO.Free;
IdHTTP.Free;
end;
end;
procedure TQBService.SaveTokens(AccessToken, RefreshToken: string);
var
f: TStringList;
iniFile: TIniFile;
begin
iniFile := TIniFile.Create( ExtractFilePath(Application.ExeName) + 'kgOrdersServer.ini' );
try
iniFile.WriteString('Quickbooks', 'RefreshToken', RefreshToken);
LastRefresh := Now;
finally
IniFile.Free;
end;
f := TStringList.Create;
// Save to file (overwrites existing file)
f.SaveToFile('QB.txt');
f.Free;
end;
initialization
RegisterServiceType(TQBService);
end.
...@@ -133,7 +133,7 @@ implementation ...@@ -133,7 +133,7 @@ implementation
{$R *.dfm} {$R *.dfm}
uses uses
uLibrary, Common.Config; uLibrary, Common.Config, XData.Sys.Exceptions;
procedure TrptOrderCorrugated.DataModuleCreate(Sender: TObject); procedure TrptOrderCorrugated.DataModuleCreate(Sender: TObject);
begin begin
...@@ -200,12 +200,6 @@ var ...@@ -200,12 +200,6 @@ var
begin begin
ReportDir := ServerConfig.reportsFolder; ReportDir := ServerConfig.reportsFolder;
if not DirectoryExists(ReportDir + 'reports\') then
begin
ForceDirectories(ReportDir + 'reports\');
Logger.Log(1, 'Reports directory created: ' + ReportDir + 'reports\');
end;
reportURL := 'reports/' + FormatDateTime('yyyymmdd_hhnnss', Now) + '.pdf'; reportURL := 'reports/' + FormatDateTime('yyyymmdd_hhnnss', Now) + '.pdf';
ReportFileName := reportDir + reportUrl; ReportFileName := reportDir + reportUrl;
...@@ -216,10 +210,13 @@ begin ...@@ -216,10 +210,13 @@ begin
frxOrderCorrugated.PrepareReport; frxOrderCorrugated.PrepareReport;
frxOrderCorrugated.Export(frxPDFExport1); frxOrderCorrugated.Export(frxPDFExport1);
//frxOrders.ShowPreparedReport; //frxOrders.ShowPreparedReport;
finally finally
frxOrderCorrugated.Clear; // Clears the report to avoid memory bloat frxOrderCorrugated.Clear; // Clears the report to avoid memory bloat
end; end;
Logger.Log(5, 'PDF saved to: ' + ReportFileName); Logger.Log(5, 'PDF saved to: ' + ReportFileName);
result := reportURL; result := reportURL;
end; end;
......
...@@ -60,7 +60,7 @@ var ...@@ -60,7 +60,7 @@ var
implementation implementation
uses uses
uLibrary, Common.Config; uLibrary, Common.Config, XData.Sys.Exceptions;
{%CLASSGROUP 'Vcl.Controls.TControl'} {%CLASSGROUP 'Vcl.Controls.TControl'}
...@@ -98,12 +98,6 @@ var ...@@ -98,12 +98,6 @@ var
begin begin
ReportDir := ServerConfig.reportsFolder; ReportDir := ServerConfig.reportsFolder;
if not DirectoryExists(ReportDir + 'reports\') then
begin
ForceDirectories(ReportDir + 'reports\');
Logger.Log(1, 'Reports directory created: ' + ReportDir + 'reports\');
end;
reportURL := 'reports\' + FormatDateTime('yyyymmdd_hhnnss', Now) + '.pdf'; reportURL := 'reports\' + FormatDateTime('yyyymmdd_hhnnss', Now) + '.pdf';
ReportFileName := reportDir + reportUrl; ReportFileName := reportDir + reportUrl;
......
...@@ -59,7 +59,7 @@ var ...@@ -59,7 +59,7 @@ var
implementation implementation
uses uses
uLibrary, Common.Config; uLibrary, Common.Config, XData.Sys.Exceptions;
{%CLASSGROUP 'Vcl.Controls.TControl'} {%CLASSGROUP 'Vcl.Controls.TControl'}
...@@ -201,12 +201,6 @@ var ...@@ -201,12 +201,6 @@ var
begin begin
ReportDir := ServerConfig.reportsFolder; ReportDir := ServerConfig.reportsFolder;
if not DirectoryExists(ReportDir + 'reports\') then
begin
ForceDirectories(ReportDir + 'reports\');
Logger.Log(1, 'Reports directory created: ' + ReportDir + 'reports\');
end;
reportURL := 'reports/' + FormatDateTime('yyyymmdd_hhnnss', Now) + '.pdf'; reportURL := 'reports/' + FormatDateTime('yyyymmdd_hhnnss', Now) + '.pdf';
ReportFileName := reportDir + reportUrl; ReportFileName := reportDir + reportUrl;
......
...@@ -132,7 +132,7 @@ implementation ...@@ -132,7 +132,7 @@ implementation
{$R *.dfm} {$R *.dfm}
uses uses
uLibrary, Common.Config; uLibrary, Common.Config, XData.Sys.Exceptions;
procedure TrptOrderWeb.DataModuleCreate(Sender: TObject); procedure TrptOrderWeb.DataModuleCreate(Sender: TObject);
begin begin
...@@ -200,12 +200,6 @@ var ...@@ -200,12 +200,6 @@ var
begin begin
ReportDir := ServerConfig.reportsFolder; ReportDir := ServerConfig.reportsFolder;
if not DirectoryExists(ReportDir + 'reports\') then
begin
ForceDirectories(ReportDir + 'reports\');
Logger.Log(1, 'Reports directory created: ' + ReportDir + 'reports\');
end;
reportURL := 'reports\' + FormatDateTime('yyyymmdd_hhnnss', Now) + '.pdf'; reportURL := 'reports\' + FormatDateTime('yyyymmdd_hhnnss', Now) + '.pdf';
ReportFileName := reportDir + reportUrl; ReportFileName := reportDir + reportUrl;
......
[Settings] [Settings]
MemoLogLevel=0 MemoLogLevel=5
FileLogLevel=0 FileLogLevel=5
webClientVersion=0.9.11 webClientVersion=0.9.11
LogFileNum=187 LogFileNum=205
[Database] [Database]
--Server=192.168.116.132 --Server=192.168.116.132
......
...@@ -158,8 +158,8 @@ end; ...@@ -158,8 +158,8 @@ end;
var var
iniFile: TIniFile; iniFile: TIniFile;
memoLogLevel: Integer; MemoLogLevel: Integer;
fileLogLevel: Integer; FileLogLevel: Integer;
begin begin
ReportMemoryLeaksOnShutdown := True; ReportMemoryLeaksOnShutdown := True;
...@@ -168,12 +168,12 @@ begin ...@@ -168,12 +168,12 @@ begin
Application.CreateForm(TFMain, FMain); Application.CreateForm(TFMain, FMain);
iniFile := TIniFile.Create( ExtractFilePath(Application.ExeName) + 'kgOrdersServer.ini' ); iniFile := TIniFile.Create( ExtractFilePath(Application.ExeName) + 'kgOrdersServer.ini' );
try try
memoLogLevel := iniFile.ReadInteger( 'Settings', 'memoLogLevel', 3 ); MemoLogLevel := iniFile.ReadInteger( 'Settings', 'MemoLogLevel', 3 );
fileLogLevel := iniFile.ReadInteger( 'Settings', 'memoLogLevel', 4 ); FileLogLevel := iniFile.ReadInteger( 'Settings', 'FileLogLevel', 4 );
finally finally
iniFile.Free; iniFile.Free;
end; end;
Logger.AddAppender(TMemoLogAppender.Create( memoLogLevel, FMain.memoinfo )); Logger.AddAppender(TMemoLogAppender.Create( MemoLogLevel, FMain.memoinfo ));
Logger.AddAppender(TFileLogAppender.Create( fileLogLevel, 'kgOrdersServer' )); Logger.AddAppender(TFileLogAppender.Create( FileLogLevel, 'kgOrdersServer' ));
Application.Run; Application.Run;
end. end.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment