Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
emT3web
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Mac Stephens
emT3web
Commits
e56dc151
Commit
e56dc151
authored
Nov 09, 2026
by
Mac Stephens
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'dev'
parents
21727feb
236fcdca
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
450 additions
and
89 deletions
+450
-89
.gitignore
.gitignore
+1
-0
ConnectionModule.pas
emT3Web/ConnectionModule.pas
+1
-1
View.TaskItems.dfm
emT3Web/View.TaskItems.dfm
+13
-0
View.TaskItems.html
emT3Web/View.TaskItems.html
+1
-0
View.TaskItems.pas
emT3Web/View.TaskItems.pas
+54
-0
View.TimeEntries.dfm
emT3Web/View.TimeEntries.dfm
+4
-4
View.TimeEntries.html
emT3Web/View.TimeEntries.html
+16
-3
View.TimeEntries.pas
emT3Web/View.TimeEntries.pas
+0
-0
time-entries.css
emT3Web/css/time-entries.css
+15
-0
emT3web.dproj
emT3Web/emT3web.dproj
+3
-3
uTaskPickerOffCanvas.pas
emT3Web/uTaskPickerOffCanvas.pas
+0
-0
Api.Database.dfm
emT3XDataServer/Source/Api.Database.dfm
+97
-46
Api.Database.pas
emT3XDataServer/Source/Api.Database.pas
+5
-3
TaskItem.Service.pas
emT3XDataServer/Source/TaskItem.Service.pas
+1
-0
TaskItem.ServiceImpl.pas
emT3XDataServer/Source/TaskItem.ServiceImpl.pas
+62
-0
TimeEntry.Service.pas
emT3XDataServer/Source/TimeEntry.Service.pas
+14
-4
TimeEntry.ServiceImpl.pas
emT3XDataServer/Source/TimeEntry.ServiceImpl.pas
+153
-16
emT3XDataServer.ini
emT3XDataServer/bin/emT3XDataServer.ini
+8
-6
emT3XDataServer.dproj
emT3XDataServer/emT3XDataServer.dproj
+2
-3
No files found.
.gitignore
View file @
e56dc151
...
@@ -13,6 +13,7 @@ emT3XDataServer/bin/static/
...
@@ -13,6 +13,7 @@ emT3XDataServer/bin/static/
emT3XDataServer/Source/__history/
emT3XDataServer/Source/__history/
emT3XDataServer/Source/__recovery/
emT3XDataServer/Source/__recovery/
emT3XDataServer/Win32/
emT3XDataServer/Win32/
.validation/
*.exe
*.exe
*.local
*.local
...
...
emT3Web/ConnectionModule.pas
View file @
e56dc151
...
@@ -22,7 +22,7 @@ type
...
@@ -22,7 +22,7 @@ type
public
public
currentTaskId
:
string
;
currentTaskId
:
string
;
currentTimeEntryDate
:
string
;
currentTimeEntryDate
:
string
;
const
clientVersion
=
'0.9.
3
'
;
const
clientVersion
=
'0.9.
4.0
'
;
procedure
InitApp
(
SuccessProc
:
TSuccessProc
;
procedure
InitApp
(
SuccessProc
:
TSuccessProc
;
UnauthorizedAccessProc
:
TUnauthorizedAccessProc
);
UnauthorizedAccessProc
:
TUnauthorizedAccessProc
);
procedure
SetClientConfig
(
Callback
:
TVersionCheckCallback
);
procedure
SetClientConfig
(
Callback
:
TVersionCheckCallback
);
...
...
emT3Web/View.TaskItems.dfm
View file @
e56dc151
...
@@ -58,6 +58,19 @@ object FTaskItems: TFTaskItems
...
@@ -58,6 +58,19 @@ object FTaskItems: TFTaskItems
WidthPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
OnClick = btnInsertRowClick
OnClick = btnInsertRowClick
end
end
object btnCopyRow: TWebButton
Left = 78
Top = 210
Width = 96
Height = 25
Caption = 'Copy Row'
Enabled = False
ElementID = 'btn_copy_row'
ElementFont = efCSS
HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
OnClick = btnCopyRowClick
end
object btnTextColor: TWebButton
object btnTextColor: TWebButton
Left = 282
Left = 282
Top = 197
Top = 197
...
...
emT3Web/View.TaskItems.html
View file @
e56dc151
...
@@ -27,6 +27,7 @@
...
@@ -27,6 +27,7 @@
<button
id=
"btn_add_row"
class=
"btn btn-sm btn-success text-nowrap"
>
Add Row
</button>
<button
id=
"btn_add_row"
class=
"btn btn-sm btn-success text-nowrap"
>
Add Row
</button>
<button
id=
"btn_insert_row"
class=
"btn btn-sm btn-success text-nowrap"
>
Insert Row
</button>
<button
id=
"btn_insert_row"
class=
"btn btn-sm btn-success text-nowrap"
>
Insert Row
</button>
<button
id=
"btn_copy_row"
class=
"btn btn-sm btn-primary text-nowrap"
disabled
>
Copy Row
</button>
<button
id=
"btn_delete_row"
class=
"btn btn-sm btn-danger text-nowrap"
>
Delete Row
</button>
<button
id=
"btn_delete_row"
class=
"btn btn-sm btn-danger text-nowrap"
>
Delete Row
</button>
<button
id=
"btn_reload"
class=
"btn btn-sm btn-primary text-nowrap"
>
Reload
</button>
<button
id=
"btn_reload"
class=
"btn btn-sm btn-primary text-nowrap"
>
Reload
</button>
</div>
</div>
...
...
emT3Web/View.TaskItems.pas
View file @
e56dc151
...
@@ -31,6 +31,7 @@ type
...
@@ -31,6 +31,7 @@ type
xdwdsTaskstaskItemId
:
TIntegerField
;
xdwdsTaskstaskItemId
:
TIntegerField
;
btnDeleteRow
:
TWebButton
;
btnDeleteRow
:
TWebButton
;
btnInsertRow
:
TWebButton
;
btnInsertRow
:
TWebButton
;
btnCopyRow
:
TWebButton
;
btnTextColor
:
TWebButton
;
btnTextColor
:
TWebButton
;
btnFmtBold
:
TWebButton
;
btnFmtBold
:
TWebButton
;
btnFmtItalic
:
TWebButton
;
btnFmtItalic
:
TWebButton
;
...
@@ -40,6 +41,7 @@ type
...
@@ -40,6 +41,7 @@ type
procedure
WebFormCreate
(
Sender
:
TObject
);
procedure
WebFormCreate
(
Sender
:
TObject
);
[
async
]
procedure
btnDeleteRowClick
(
Sender
:
TObject
);
[
async
]
procedure
btnDeleteRowClick
(
Sender
:
TObject
);
[
async
]
procedure
btnInsertRowClick
(
Sender
:
TObject
);
[
async
]
procedure
btnInsertRowClick
(
Sender
:
TObject
);
[
async
]
procedure
btnCopyRowClick
(
Sender
:
TObject
);
procedure
btnTextColorClick
(
Sender
:
TObject
);
procedure
btnTextColorClick
(
Sender
:
TObject
);
procedure
btnFmtBoldClick
(
Sender
:
TObject
);
procedure
btnFmtBoldClick
(
Sender
:
TObject
);
procedure
btnFmtItalicClick
(
Sender
:
TObject
);
procedure
btnFmtItalicClick
(
Sender
:
TObject
);
...
@@ -61,6 +63,8 @@ type
...
@@ -61,6 +63,8 @@ type
FActiveRichEditorId
:
string
;
FActiveRichEditorId
:
string
;
FLastSelectionRange
:
JSValue
;
FLastSelectionRange
:
JSValue
;
FNameManager
:
TNameManager
;
FNameManager
:
TNameManager
;
FCopyingRow
:
Boolean
;
[
async
]
function
CopyTaskRow
:
Boolean
;
[
async
]
procedure
LoadTasks
(
const
ATaskId
:
string
);
[
async
]
procedure
LoadTasks
(
const
ATaskId
:
string
);
procedure
RenderTable
;
procedure
RenderTable
;
procedure
BindTableEditors
;
procedure
BindTableEditors
;
...
@@ -134,6 +138,8 @@ begin
...
@@ -134,6 +138,8 @@ begin
FStatusOptions
:=
TJSArray
.
new
;
FStatusOptions
:=
TJSArray
.
new
;
FSelectedTaskItemId
:=
0
;
FSelectedTaskItemId
:=
0
;
FSelectedTaskId
:=
0
;
FSelectedTaskId
:=
0
;
FCopyingRow
:=
False
;
btnCopyRow
.
Enabled
:=
False
;
FNameManager
:=
TNameManager
.
Create
(
FNameManager
:=
TNameManager
.
Create
(
function
(
const
AFieldName
:
string
):
TJSArray
function
(
const
AFieldName
:
string
):
TJSArray
...
@@ -465,6 +471,53 @@ begin
...
@@ -465,6 +471,53 @@ begin
end
;
end
;
end
;
end
;
[
async
]
procedure
TFTaskItems
.
btnCopyRowClick
(
Sender
:
TObject
);
begin
if
FCopyingRow
or
(
FSelectedTaskItemId
<=
0
)
then
Exit
;
FCopyingRow
:=
True
;
btnCopyRow
.
Enabled
:=
False
;
Utils
.
ShowSpinner
(
'spinner'
);
try
if
await
(
CopyTaskRow
)
then
begin
CaptureTableScroll
;
await
(
LoadTasks
(
FTaskId
));
end
;
finally
FCopyingRow
:=
False
;
btnCopyRow
.
Enabled
:=
FSelectedTaskItemId
>
0
;
Utils
.
HideSpinner
(
'spinner'
);
end
;
end
;
[
async
]
function
TFTaskItems
.
CopyTaskRow
:
Boolean
;
var
response
:
TXDataClientResponse
;
sourceTaskItemId
:
Integer
;
begin
Result
:=
False
;
sourceTaskItemId
:=
FSelectedTaskItemId
;
try
response
:=
await
(
xdwcTasks
.
RawInvokeAsync
(
'ITaskItemService.CopyTaskRow'
,
[
FTaskId
,
sourceTaskItemId
]));
console
.
log
(
'CopyTaskRow: response='
+
string
(
TJSJSON
.
stringify
(
response
.
Result
)));
FSelectedTaskItemId
:=
StrToIntDef
(
string
(
TJSObject
(
response
.
Result
)[
'value'
]),
0
);
FPendingFocusTaskItemId
:=
FSelectedTaskItemId
;
FPendingFocusField
:=
'application'
;
Result
:=
True
;
except
on
E
:
EXDataClientRequestException
do
begin
console
.
log
(
'CopyTaskRow ERROR: '
+
E
.
ErrorResult
.
ErrorMessage
);
Utils
.
ShowErrorModal
(
E
.
ErrorResult
.
ErrorMessage
);
end
;
end
;
end
;
procedure
TFTaskItems
.
RowClick
(
Event
:
TJSEvent
);
procedure
TFTaskItems
.
RowClick
(
Event
:
TJSEvent
);
var
var
rowEl
:
TJSHTMLElement
;
rowEl
:
TJSHTMLElement
;
...
@@ -488,6 +541,7 @@ end;
...
@@ -488,6 +541,7 @@ end;
procedure
TFTaskItems
.
ApplySelectedRowState
;
procedure
TFTaskItems
.
ApplySelectedRowState
;
begin
begin
btnCopyRow
.
Enabled
:=
(
FSelectedTaskItemId
>
0
)
and
not
FCopyingRow
;
asm
asm
const
selectedTaskItemId
=
this
.
FSelectedTaskItemId
;
const
selectedTaskItemId
=
this
.
FSelectedTaskItemId
;
document
.
querySelectorAll
(
'.task-row-selectable'
).
forEach
(
function
(
row
)
{
document
.
querySelectorAll
(
'.task-row-selectable'
).
forEach
(
function
(
row
)
{
...
...
emT3Web/View.TimeEntries.dfm
View file @
e56dc151
...
@@ -99,10 +99,10 @@ object FTimeEntries: TFTimeEntries
...
@@ -99,10 +99,10 @@ object FTimeEntries: TFTimeEntries
OnClick = btnSearchRangeClick
OnClick = btnSearchRangeClick
end
end
object btnCopyEntry: TWebButton
object btnCopyEntry: TWebButton
Left =
440
Left =
88
Top = 1
2
2
Top = 1
5
2
Width =
96
Width =
79
Height =
25
Height =
31
Caption = 'Copy'
Caption = 'Copy'
ChildOrder = 7
ChildOrder = 7
ElementID = 'btn_copy_entry'
ElementID = 'btn_copy_entry'
...
...
emT3Web/View.TimeEntries.html
View file @
e56dc151
...
@@ -3,6 +3,7 @@
...
@@ -3,6 +3,7 @@
<h5
class=
"mb-0 text-nowrap"
id=
"lbl_time_entries_title"
></h5>
<h5
class=
"mb-0 text-nowrap"
id=
"lbl_time_entries_title"
></h5>
<div
class=
"d-flex align-items-center gap-2 ms-auto flex-nowrap"
>
<div
class=
"d-flex align-items-center gap-2 ms-auto flex-nowrap"
>
<div
id=
"lbl_time_total_hours"
class=
"me-2 text-nowrap fw-semibold"
>
Total Hours: 0
</div>
<div
id=
"lbl_time_total_rows"
class=
"me-2 text-nowrap"
></div>
<div
id=
"lbl_time_total_rows"
class=
"me-2 text-nowrap"
></div>
<div
class=
"d-flex align-items-center gap-2 flex-nowrap"
>
<div
class=
"d-flex align-items-center gap-2 flex-nowrap"
>
...
@@ -72,12 +73,24 @@
...
@@ -72,12 +73,24 @@
<div
id=
"task_picker_status"
class=
"alert alert-danger py-1 px-2 mb-3 d-none small"
></div>
<div
id=
"task_picker_status"
class=
"alert alert-danger py-1 px-2 mb-3 d-none small"
></div>
<div
class=
"d-flex justify-content-end gap-2"
>
<div
class=
"d-flex align-items-center gap-2"
>
<div
class=
"d-flex align-items-center gap-2 me-auto"
>
<input
class=
"form-check-input m-0"
type=
"checkbox"
id=
"task_picker_add_focus"
/>
<label
class=
"form-check-label mb-0"
for=
"task_picker_add_focus"
>
Focused Task
</label>
</div>
<button
type=
"button"
class=
"btn btn-outline-secondary btn-sm"
data-bs-dismiss=
"offcanvas"
>
<button
type=
"button"
class=
"btn btn-outline-secondary btn-sm"
data-bs-dismiss=
"offcanvas"
>
Cancel
Cancel
</button>
</button>
<button
type=
"button"
class=
"btn btn-primary btn-sm"
id=
"btn_task_picker_save"
disabled
>
Save
<button
type=
"button"
class=
"btn btn-outline-success btn-sm"
id=
"btn_task_picker_save"
disabled
>
Save
</button>
<button
type=
"button"
class=
"btn btn-primary btn-sm"
id=
"btn_task_picker_select"
disabled
>
Select
</button>
</button>
</div>
</div>
</div>
</div>
...
...
emT3Web/View.TimeEntries.pas
View file @
e56dc151
This diff is collapsed.
Click to expand it.
emT3Web/css/time-entries.css
View file @
e56dc151
...
@@ -49,4 +49,18 @@
...
@@ -49,4 +49,18 @@
.time-dd-toggle.is-invalid
{
.time-dd-toggle.is-invalid
{
border-color
:
var
(
--bs-danger
)
!important
;
border-color
:
var
(
--bs-danger
)
!important
;
padding-right
:
calc
(
1.5em
+
.75rem
);
padding-right
:
calc
(
1.5em
+
.75rem
);
}
.time-row-saved
>
td
{
animation
:
time-row-saved-flash
900ms
ease-out
;
}
@keyframes
time-row-saved-flash
{
from
{
box-shadow
:
inset
0
0
0
999px
rgba
(
25
,
135
,
84
,
0.25
);
}
to
{
box-shadow
:
inset
0
0
0
999px
rgba
(
25
,
135
,
84
,
0
);
}
}
}
\ No newline at end of file
emT3Web/emT3web.dproj
View file @
e56dc151
...
@@ -94,15 +94,15 @@
...
@@ -94,15 +94,15 @@
<DCC_RemoteDebug>false</DCC_RemoteDebug>
<DCC_RemoteDebug>false</DCC_RemoteDebug>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=0.9.
3
.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=0.9.8.0;Comments=;LastCompiledTime=2018/08/27 15:18:29</VerInfo_Keys>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=0.9.
4
.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=0.9.8.0;Comments=;LastCompiledTime=2018/08/27 15:18:29</VerInfo_Keys>
<AppDPIAwarenessMode>PerMonitor</AppDPIAwarenessMode>
<AppDPIAwarenessMode>PerMonitor</AppDPIAwarenessMode>
<VerInfo_MajorVer>0</VerInfo_MajorVer>
<VerInfo_MajorVer>0</VerInfo_MajorVer>
<VerInfo_MinorVer>9</VerInfo_MinorVer>
<VerInfo_MinorVer>9</VerInfo_MinorVer>
<VerInfo_Release>4</VerInfo_Release>
<TMSWebBrowser>1</TMSWebBrowser>
<TMSWebBrowser>1</TMSWebBrowser>
<TMSUseJSDebugger>2</TMSUseJSDebugger>
<TMSUseJSDebugger>2</TMSUseJSDebugger>
<VerInfo_Release>3</VerInfo_Release>
<TMSWebOutputPath>..\emT3XDataServer\bin\static</TMSWebOutputPath>
<TMSWebSingleInstance>1</TMSWebSingleInstance>
<TMSWebSingleInstance>1</TMSWebSingleInstance>
<TMSWebOutputPath>..\emT3XDataServer\bin\static</TMSWebOutputPath>
</PropertyGroup>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
...
...
emT3Web/uTaskPickerOffCanvas.pas
View file @
e56dc151
This diff is collapsed.
Click to expand it.
emT3XDataServer/Source/Api.Database.dfm
View file @
e56dc151
...
@@ -7,10 +7,10 @@ object ApiDatabase: TApiDatabase
...
@@ -7,10 +7,10 @@ object ApiDatabase: TApiDatabase
ProviderName = 'MySQL'
ProviderName = 'MySQL'
Database = 'eTask'
Database = 'eTask'
Username = 'root'
Username = 'root'
Server = '192.168.
102.133
'
Server = '192.168.
90.131
'
LoginPrompt = False
LoginPrompt = False
Left = 43
5
Left = 43
9
Top = 3
59
Top = 3
63
EncryptedPassword = '9AFF92FF8CFF86FF8CFFCFFFCEFF'
EncryptedPassword = '9AFF92FF8CFF86FF8CFFCFFFCEFF'
end
end
object MySQLUniProvider1: TMySQLUniProvider
object MySQLUniProvider1: TMySQLUniProvider
...
@@ -265,6 +265,60 @@ object ApiDatabase: TApiDatabase
...
@@ -265,6 +265,60 @@ object ApiDatabase: TApiDatabase
Value = nil
Value = nil
end>
end>
end
end
object uqCopyTaskItem: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'insert into task_items ('
' TASK_ID,'
' ITEM_NUM,'
' APPLICATION,'
' APP_VERSION,'
' TASK_DATE,'
' STATUS_DATE,'
' REPORTED_BY,'
' ASSIGNED_TO,'
' STATUS,'
' FIXED_VERSION,'
' FORM_SECTION,'
' ISSUE,'
' NOTES'
')'
'select'
' TASK_ID,'
' :ITEM_NUM,'
' APPLICATION,'
' APP_VERSION,'
' TASK_DATE,'
' STATUS_DATE,'
' REPORTED_BY,'
' ASSIGNED_TO,'
' STATUS,'
' FIXED_VERSION,'
' FORM_SECTION,'
' ISSUE,'
' NOTES'
'from task_items'
'where TASK_ID = :TASK_ID'
' and TASK_ITEM_ID = :TASK_ITEM_ID')
Left = 708
Top = 302
ParamData = <
item
DataType = ftInteger
Name = 'ITEM_NUM'
Value = nil
end
item
DataType = ftString
Name = 'TASK_ID'
Value = nil
end
item
DataType = ftInteger
Name = 'TASK_ITEM_ID'
Value = nil
end>
end
object uqTaskHeader: TUniQuery
object uqTaskHeader: TUniQuery
Connection = ucETaskApi
Connection = ucETaskApi
SQL.Strings = (
SQL.Strings = (
...
@@ -565,7 +619,8 @@ object ApiDatabase: TApiDatabase
...
@@ -565,7 +619,8 @@ object ApiDatabase: TApiDatabase
'update task_items'
'update task_items'
'set ITEM_NUM = ITEM_NUM + 1'
'set ITEM_NUM = ITEM_NUM + 1'
'where TASK_ID = :TASK_ID'
'where TASK_ID = :TASK_ID'
' and ITEM_NUM > :INSERT_AFTER_ITEM_NUM')
' and ITEM_NUM > :INSERT_AFTER_ITEM_NUM'
'order by ITEM_NUM desc')
Left = 538
Left = 538
Top = 76
Top = 76
ParamData = <
ParamData = <
...
@@ -798,7 +853,7 @@ object ApiDatabase: TApiDatabase
...
@@ -798,7 +853,7 @@ object ApiDatabase: TApiDatabase
'where target_task.TASK_ID = :TASK_ID'
'where target_task.TASK_ID = :TASK_ID'
'order by tia.NAME')
'order by tia.NAME')
Left = 58
Left = 58
Top = 31
4
Top = 31
6
ParamData = <
ParamData = <
item
item
DataType = ftUnknown
DataType = ftUnknown
...
@@ -1224,50 +1279,47 @@ object ApiDatabase: TApiDatabase
...
@@ -1224,50 +1279,47 @@ object ApiDatabase: TApiDatabase
SQL.Strings = (
SQL.Strings = (
'select distinct'
'select distinct'
' c.CUSTOMER_ID,'
' c.CUSTOMER_ID,'
' c.
SHORT_NAME as CUSTOMER_SHORT
_NAME'
' c.
NAME as CUSTOMER
_NAME'
'from
user_project up
'
'from
customers c
'
'join project p on p.
PROJECT_ID = up.PROJECT
_ID'
'join project p on p.
CUSTOMER_ID = c.CUSTOMER
_ID'
'
join customers c on c.CUSTOMER_ID = p.CUSTOMER_ID'
'
where p.STATUS = '#39'ACTIVE'#39
'
where up.USER_ID = :USER_ID
'
'
order by c.NAME
'
'
order by c.SHORT_NAME
')
'')
Left = 40
2
Left = 40
4
Top = 494
Top = 494
ParamData = <
item
DataType = ftUnknown
Name = 'USER_ID'
Value = nil
end>
object uqTaskPickerCustomersCUSTOMER_ID: TStringField
object uqTaskPickerCustomersCUSTOMER_ID: TStringField
FieldName = 'CUSTOMER_ID'
FieldName = 'CUSTOMER_ID'
Size = 7
Size = 7
end
end
object uqTaskPickerCustomersCUSTOMER_
SHORT_
NAME: TStringField
object uqTaskPickerCustomersCUSTOMER_NAME: TStringField
FieldName = 'CUSTOMER_
SHORT_
NAME'
FieldName = 'CUSTOMER_NAME'
Size =
1
0
Size =
3
0
end
end
end
end
object uqTaskPickerProjects: TUniQuery
object uqTaskPickerProjects: TUniQuery
Connection = ucETaskApi
Connection = ucETaskApi
SQL.Strings = (
SQL.Strings = (
'select
distinct
'
'select'
' p.PROJECT_ID,'
' p.PROJECT_ID,'
' p.NAME as PROJECT_NAME'
' p.NAME as PROJECT_NAME,'
'from user_project up'
' p.CUSTOMER_ID'
'join project p on p.PROJECT_ID = up.PROJECT_ID'
'from project p '
'where up.USER_ID = :USER_ID'
'join customers c on c.CUSTOMER_ID = p.CUSTOMER_ID'
' and p.CUSTOMER_ID = :CUSTOMER_ID'
'where p.STATUS = '#39'ACTIVE'#39
'order by p.NAME')
'and (:CUSTOMER_ID = '#39#39' or p.CUSTOMER_ID = :CUSTOMER_ID)'
'order by p.NAME'
''
''
''
''
''
''
'')
Left = 544
Left = 544
Top = 494
Top = 494
ParamData = <
ParamData = <
item
item
DataType = ftUnknown
DataType = ftUnknown
Name = 'USER_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'CUSTOMER_ID'
Name = 'CUSTOMER_ID'
Value = nil
Value = nil
end>
end>
...
@@ -1280,13 +1332,17 @@ object ApiDatabase: TApiDatabase
...
@@ -1280,13 +1332,17 @@ object ApiDatabase: TApiDatabase
FieldName = 'PROJECT_NAME'
FieldName = 'PROJECT_NAME'
Size = 30
Size = 30
end
end
object uqTaskPickerProjectsCUSTOMER_ID: TStringField
FieldName = 'CUSTOMER_ID'
Size = 7
end
end
end
object uqTaskPickerTasks: TUniQuery
object uqTaskPickerTasks: TUniQuery
Connection = ucETaskApi
Connection = ucETaskApi
SQL.Strings = (
SQL.Strings = (
'select distinct'
'select distinct'
' t.TASK_ID,'
' t.TASK_ID,'
' c.SHORT_NAME as CUSTOMER_
SHORT_
NAME,'
' c.SHORT_NAME as CUSTOMER_NAME,'
' p.NAME as PROJECT_NAME,'
' p.NAME as PROJECT_NAME,'
' t.TASK_NUM_1,'
' t.TASK_NUM_1,'
' t.TASK_NUM_2,'
' t.TASK_NUM_2,'
...
@@ -1298,9 +1354,8 @@ object ApiDatabase: TApiDatabase
...
@@ -1298,9 +1354,8 @@ object ApiDatabase: TApiDatabase
'from tasks t'
'from tasks t'
'join project p on p.PROJECT_ID = t.PROJECT_ID'
'join project p on p.PROJECT_ID = t.PROJECT_ID'
'join customers c on c.CUSTOMER_ID = p.CUSTOMER_ID'
'join customers c on c.CUSTOMER_ID = p.CUSTOMER_ID'
'join user_project up on up.PROJECT_ID = p.PROJECT_ID'
' where t.PROJECT_ID = :PROJECT_ID'
'where up.USER_ID = :USER_ID'
' and p.STATUS = '#39'ACTIVE'#39
' and t.PROJECT_ID = :PROJECT_ID'
'order by'
'order by'
' t.TASK_NUM_1,'
' t.TASK_NUM_1,'
' t.TASK_NUM_2,'
' t.TASK_NUM_2,'
...
@@ -1308,17 +1363,13 @@ object ApiDatabase: TApiDatabase
...
@@ -1308,17 +1363,13 @@ object ApiDatabase: TApiDatabase
' t.TASK_NUM_4,'
' t.TASK_NUM_4,'
' t.TASK_NUM_5,'
' t.TASK_NUM_5,'
' t.TASK_NUM_6,'
' t.TASK_NUM_6,'
' t.SUBJECT')
' t.SUBJECT'
'')
Left = 676
Left = 676
Top = 502
Top = 502
ParamData = <
ParamData = <
item
item
DataType = ftUnknown
DataType = ftUnknown
Name = 'USER_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'PROJECT_ID'
Name = 'PROJECT_ID'
Value = nil
Value = nil
end>
end>
...
@@ -1327,10 +1378,10 @@ object ApiDatabase: TApiDatabase
...
@@ -1327,10 +1378,10 @@ object ApiDatabase: TApiDatabase
Required = True
Required = True
Size = 7
Size = 7
end
end
object uqTaskPickerTasksCUSTOMER_
SHORT_
NAME: TStringField
object uqTaskPickerTasksCUSTOMER_NAME: TStringField
FieldName = 'CUSTOMER_
SHORT_
NAME'
FieldName = 'CUSTOMER_NAME'
ReadOnly = True
ReadOnly = True
Size =
1
0
Size =
3
0
end
end
object uqTaskPickerTasksPROJECT_NAME: TStringField
object uqTaskPickerTasksPROJECT_NAME: TStringField
FieldName = 'PROJECT_NAME'
FieldName = 'PROJECT_NAME'
...
...
emT3XDataServer/Source/Api.Database.pas
View file @
e56dc151
...
@@ -19,6 +19,7 @@ type
...
@@ -19,6 +19,7 @@ type
uqSaveTaskRow
:
TUniQuery
;
uqSaveTaskRow
:
TUniQuery
;
uqTaskItems
:
TUniQuery
;
uqTaskItems
:
TUniQuery
;
uqAddTaskRow
:
TUniQuery
;
uqAddTaskRow
:
TUniQuery
;
uqCopyTaskItem
:
TUniQuery
;
uqTaskItemsTASK_ID
:
TStringField
;
uqTaskItemsTASK_ID
:
TStringField
;
uqTaskItemsITEM_NUM
:
TShortintField
;
uqTaskItemsITEM_NUM
:
TShortintField
;
uqTaskItemsAPPLICATION
:
TStringField
;
uqTaskItemsAPPLICATION
:
TStringField
;
...
@@ -93,12 +94,11 @@ type
...
@@ -93,12 +94,11 @@ type
uqTaskPickerCustomers
:
TUniQuery
;
uqTaskPickerCustomers
:
TUniQuery
;
uqTaskPickerProjects
:
TUniQuery
;
uqTaskPickerProjects
:
TUniQuery
;
uqTaskPickerTasks
:
TUniQuery
;
uqTaskPickerTasks
:
TUniQuery
;
uqTaskPickerCustomersCUSTOMER_ID
:
TStringField
;
uqTaskPickerCustomersCUSTOMER_SHORT_NAME
:
TStringField
;
uqTaskPickerProjectsPROJECT_ID
:
TStringField
;
uqTaskPickerProjectsPROJECT_ID
:
TStringField
;
uqTaskPickerProjectsPROJECT_NAME
:
TStringField
;
uqTaskPickerProjectsPROJECT_NAME
:
TStringField
;
uqTaskPickerProjectsCUSTOMER_ID
:
TStringField
;
uqTaskPickerTasksTASK_ID
:
TStringField
;
uqTaskPickerTasksTASK_ID
:
TStringField
;
uqTaskPickerTasksCUSTOMER_
SHORT_
NAME
:
TStringField
;
uqTaskPickerTasksCUSTOMER_NAME
:
TStringField
;
uqTaskPickerTasksPROJECT_NAME
:
TStringField
;
uqTaskPickerTasksPROJECT_NAME
:
TStringField
;
uqTaskPickerTasksTASK_NUM_1
:
TIntegerField
;
uqTaskPickerTasksTASK_NUM_1
:
TIntegerField
;
uqTaskPickerTasksTASK_NUM_2
:
TIntegerField
;
uqTaskPickerTasksTASK_NUM_2
:
TIntegerField
;
...
@@ -107,6 +107,8 @@ type
...
@@ -107,6 +107,8 @@ type
uqTaskPickerTasksTASK_NUM_5
:
TIntegerField
;
uqTaskPickerTasksTASK_NUM_5
:
TIntegerField
;
uqTaskPickerTasksTASK_NUM_6
:
TIntegerField
;
uqTaskPickerTasksTASK_NUM_6
:
TIntegerField
;
uqTaskPickerTasksTASK_SUBJECT
:
TStringField
;
uqTaskPickerTasksTASK_SUBJECT
:
TStringField
;
uqTaskPickerCustomersCUSTOMER_ID
:
TStringField
;
uqTaskPickerCustomersCUSTOMER_NAME
:
TStringField
;
procedure
DataModuleCreate
(
Sender
:
TObject
);
procedure
DataModuleCreate
(
Sender
:
TObject
);
procedure
uqUsersCalcFields
(
DataSet
:
TDataSet
);
procedure
uqUsersCalcFields
(
DataSet
:
TDataSet
);
private
private
...
...
emT3XDataServer/Source/TaskItem.Service.pas
View file @
e56dc151
...
@@ -120,6 +120,7 @@ type
...
@@ -120,6 +120,7 @@ type
[
HttpGet
]
function
GetTaskItems
(
taskId
:
string
):
TTaskItemsResponse
;
[
HttpGet
]
function
GetTaskItems
(
taskId
:
string
):
TTaskItemsResponse
;
[
HttpPost
]
function
AddTaskRow
(
taskId
:
string
;
insertAfterItemNum
:
Integer
):
Boolean
;
[
HttpPost
]
function
AddTaskRow
(
taskId
:
string
;
insertAfterItemNum
:
Integer
):
Boolean
;
[
HttpPost
]
function
CopyTaskRow
(
taskId
:
string
;
sourceTaskItemId
:
Integer
):
Integer
;
[
HttpPost
]
function
AddAssignedName
(
taskId
:
string
;
name
:
string
):
TTaskUserOptionsResponse
;
[
HttpPost
]
function
AddAssignedName
(
taskId
:
string
;
name
:
string
):
TTaskUserOptionsResponse
;
[
HttpPost
]
function
RenameAssignedName
(
taskId
:
string
;
oldName
:
string
;
newName
:
string
):
TTaskUserOptionsResponse
;
[
HttpPost
]
function
RenameAssignedName
(
taskId
:
string
;
oldName
:
string
;
newName
:
string
):
TTaskUserOptionsResponse
;
...
...
emT3XDataServer/Source/TaskItem.ServiceImpl.pas
View file @
e56dc151
...
@@ -19,6 +19,7 @@ type
...
@@ -19,6 +19,7 @@ type
function
FindAssignedOptionId
(
const
taskId
,
name
:
string
):
string
;
function
FindAssignedOptionId
(
const
taskId
,
name
:
string
):
string
;
function
FindAssignedOptionName
(
const
taskId
,
name
:
string
):
string
;
function
FindAssignedOptionName
(
const
taskId
,
name
:
string
):
string
;
function
AddTaskRow
(
taskId
:
string
;
insertAfterItemNum
:
Integer
):
Boolean
;
function
AddTaskRow
(
taskId
:
string
;
insertAfterItemNum
:
Integer
):
Boolean
;
function
CopyTaskRow
(
taskId
:
string
;
sourceTaskItemId
:
Integer
):
Integer
;
function
BuildAssignedOptionsResponse
(
const
taskId
:
string
):
TTaskUserOptionsResponse
;
function
BuildAssignedOptionsResponse
(
const
taskId
:
string
):
TTaskUserOptionsResponse
;
function
AddAssignedName
(
taskId
:
string
;
name
:
string
):
TTaskUserOptionsResponse
;
function
AddAssignedName
(
taskId
:
string
;
name
:
string
):
TTaskUserOptionsResponse
;
function
RenameAssignedName
(
taskId
:
string
;
oldName
:
string
;
newName
:
string
):
TTaskUserOptionsResponse
;
function
RenameAssignedName
(
taskId
:
string
;
oldName
:
string
;
newName
:
string
):
TTaskUserOptionsResponse
;
...
@@ -50,6 +51,7 @@ implementation
...
@@ -50,6 +51,7 @@ implementation
procedure
TTaskItemService
.
AfterConstruction
;
procedure
TTaskItemService
.
AfterConstruction
;
begin
begin
inherited
;
inherited
;
Logger
.
Log
(
4
,
'TaskItemService.AfterConstruction->TApiDatabase.Create(nil)'
);
apiDB
:=
TApiDatabase
.
Create
(
nil
);
apiDB
:=
TApiDatabase
.
Create
(
nil
);
Logger
.
Log
(
4
,
'TaskItemService.AfterConstruction - apiDB created'
);
Logger
.
Log
(
4
,
'TaskItemService.AfterConstruction - apiDB created'
);
end
;
end
;
...
@@ -272,6 +274,66 @@ begin
...
@@ -272,6 +274,66 @@ begin
end
;
end
;
function
TTaskItemService
.
CopyTaskRow
(
taskId
:
string
;
sourceTaskItemId
:
Integer
):
Integer
;
var
q
:
TUniQuery
;
sourceItemNum
:
Integer
;
begin
Logger
.
Log
(
4
,
Format
(
'TaskItemService.CopyTaskRow - TASK_ID="%s" SOURCE_TASK_ITEM_ID="%d"'
,
[
taskId
,
sourceTaskItemId
]));
apiDB
.
uqGetTaskRowPosition
.
Close
;
apiDB
.
uqGetTaskRowPosition
.
ParamByName
(
'TASK_ID'
).
AsString
:=
taskId
;
apiDB
.
uqGetTaskRowPosition
.
ParamByName
(
'TASK_ITEM_ID'
).
AsInteger
:=
sourceTaskItemId
;
apiDB
.
uqGetTaskRowPosition
.
Open
;
if
apiDB
.
uqGetTaskRowPosition
.
IsEmpty
then
begin
Logger
.
Log
(
2
,
Format
(
'TaskItemService.CopyTaskRow - row not found TASK_ID="%s" TASK_ITEM_ID="%d"'
,
[
taskId
,
sourceTaskItemId
]));
raise
Exception
.
Create
(
'Task row not found.'
);
end
;
sourceItemNum
:=
apiDB
.
uqGetTaskRowPositionITEM_NUM
.
AsInteger
;
q
:=
TUniQuery
.
Create
(
nil
);
try
q
.
Connection
:=
apiDB
.
ucETaskApi
;
apiDB
.
ucETaskApi
.
StartTransaction
;
try
apiDB
.
uqShiftTaskRowsForInsert
.
Close
;
apiDB
.
uqShiftTaskRowsForInsert
.
ParamByName
(
'TASK_ID'
).
AsString
:=
taskId
;
apiDB
.
uqShiftTaskRowsForInsert
.
ParamByName
(
'INSERT_AFTER_ITEM_NUM'
).
AsInteger
:=
sourceItemNum
;
apiDB
.
uqShiftTaskRowsForInsert
.
ExecSQL
;
apiDB
.
uqCopyTaskItem
.
Close
;
apiDB
.
uqCopyTaskItem
.
ParamByName
(
'TASK_ID'
).
AsString
:=
taskId
;
apiDB
.
uqCopyTaskItem
.
ParamByName
(
'TASK_ITEM_ID'
).
AsInteger
:=
sourceTaskItemId
;
apiDB
.
uqCopyTaskItem
.
ParamByName
(
'ITEM_NUM'
).
AsInteger
:=
sourceItemNum
+
1
;
apiDB
.
uqCopyTaskItem
.
ExecSQL
;
if
apiDB
.
uqCopyTaskItem
.
RowsAffected
<>
1
then
raise
Exception
.
Create
(
'Unable to copy the selected task row.'
);
q
.
SQL
.
Text
:=
'select LAST_INSERT_ID() as TASK_ITEM_ID'
;
q
.
Open
;
Result
:=
q
.
FieldByName
(
'TASK_ITEM_ID'
).
AsInteger
;
apiDB
.
ucETaskApi
.
Commit
;
Logger
.
Log
(
4
,
Format
(
'TaskItemService.CopyTaskRow - OK TASK_ID="%s" SOURCE_TASK_ITEM_ID="%d" TASK_ITEM_ID="%d" ITEM_NUM="%d"'
,
[
taskId
,
sourceTaskItemId
,
Result
,
sourceItemNum
+
1
]));
except
on
E
:
Exception
do
begin
if
apiDB
.
ucETaskApi
.
InTransaction
then
apiDB
.
ucETaskApi
.
Rollback
;
Logger
.
Log
(
2
,
'TaskItemService.CopyTaskRow - ERROR: '
+
E
.
Message
);
raise
;
end
;
end
;
finally
q
.
Free
;
end
;
end
;
procedure
TTaskItemService
.
MoveTaskRow
(
const
taskId
:
Integer
;
const
taskItemId
:
Integer
;
const
newItemNum
:
Integer
);
procedure
TTaskItemService
.
MoveTaskRow
(
const
taskId
:
Integer
;
const
taskItemId
:
Integer
;
const
newItemNum
:
Integer
);
var
var
oldItemNum
:
Integer
;
oldItemNum
:
Integer
;
...
...
emT3XDataServer/Source/TimeEntry.Service.pas
View file @
e56dc151
...
@@ -73,11 +73,11 @@ type
...
@@ -73,11 +73,11 @@ type
value
:
string
;
value
:
string
;
end
;
end
;
type
TTaskPickerOption
=
class
TTaskPickerOption
=
class
public
public
value
:
string
;
value
:
string
;
display
:
string
;
display
:
string
;
customerId
:
string
;
end
;
end
;
TTaskPickerOptionsResponse
=
class
TTaskPickerOptionsResponse
=
class
...
@@ -87,6 +87,13 @@ type
...
@@ -87,6 +87,13 @@ type
destructor
Destroy
;
override
;
destructor
Destroy
;
override
;
end
;
end
;
TTaskPickerTaskContext
=
class
public
taskId
:
string
;
projectId
:
string
;
customerId
:
string
;
end
;
[
ServiceContract
,
Model
(
API_MODEL
)]
[
ServiceContract
,
Model
(
API_MODEL
)]
ITimeEntryService
=
interface
(
IInvokable
)
ITimeEntryService
=
interface
(
IInvokable
)
[
'{B18BCD1E-B19A-4D25-BBA9-50A24FC4C690}'
]
[
'{B18BCD1E-B19A-4D25-BBA9-50A24FC4C690}'
]
...
@@ -95,9 +102,12 @@ type
...
@@ -95,9 +102,12 @@ type
[
HttpPost
]
function
SaveTimeEntry
(
Item
:
TTimeEntrySave
):
string
;
[
HttpPost
]
function
SaveTimeEntry
(
Item
:
TTimeEntrySave
):
string
;
[
HttpPost
]
function
SaveTimeEntryField
(
Item
:
TTimeEntryFieldSave
):
Boolean
;
[
HttpPost
]
function
SaveTimeEntryField
(
Item
:
TTimeEntryFieldSave
):
Boolean
;
[
HttpPost
]
function
DeleteTimeEntry
(
userId
:
string
;
entryId
:
Integer
):
Boolean
;
[
HttpPost
]
function
DeleteTimeEntry
(
userId
:
string
;
entryId
:
Integer
):
Boolean
;
function
GetTaskPickerCustomers
(
userId
:
string
):
TTaskPickerOptionsResponse
;
[
HttpPost
]
function
AddTaskToFocus
(
userId
,
taskId
:
string
):
Boolean
;
function
GetTaskPickerProjects
(
userId
,
customerId
:
string
):
TTaskPickerOptionsResponse
;
[
HttpPost
]
function
RemoveTaskFromFocus
(
userId
,
taskId
:
string
):
Boolean
;
function
GetTaskPickerTasks
(
userId
,
projectId
:
string
):
TTaskPickerOptionsResponse
;
function
GetTaskPickerCustomers
:
TTaskPickerOptionsResponse
;
function
GetTaskPickerProjects
(
customerId
:
string
):
TTaskPickerOptionsResponse
;
function
GetTaskPickerTasks
(
projectId
:
string
):
TTaskPickerOptionsResponse
;
function
GetTaskPickerTaskContext
(
taskId
:
string
):
TTaskPickerTaskContext
;
end
;
end
;
implementation
implementation
...
...
emT3XDataServer/Source/TimeEntry.ServiceImpl.pas
View file @
e56dc151
...
@@ -34,10 +34,13 @@ type
...
@@ -34,10 +34,13 @@ type
function
AddTimeEntry
(
userId
,
taskDate
:
string
):
string
;
function
AddTimeEntry
(
userId
,
taskDate
:
string
):
string
;
function
SaveTimeEntry
(
Item
:
TTimeEntrySave
):
string
;
function
SaveTimeEntry
(
Item
:
TTimeEntrySave
):
string
;
function
SaveTimeEntryField
(
Item
:
TTimeEntryFieldSave
):
Boolean
;
function
SaveTimeEntryField
(
Item
:
TTimeEntryFieldSave
):
Boolean
;
function
GetTaskPickerCustomers
(
userId
:
string
):
TTaskPickerOptionsResponse
;
function
GetTaskPickerCustomers
:
TTaskPickerOptionsResponse
;
function
GetTaskPickerProjects
(
userId
,
customerId
:
string
):
TTaskPickerOptionsResponse
;
function
GetTaskPickerProjects
(
customerId
:
string
):
TTaskPickerOptionsResponse
;
function
GetTaskPickerTasks
(
userId
,
projectId
:
string
):
TTaskPickerOptionsResponse
;
function
GetTaskPickerTasks
(
projectId
:
string
):
TTaskPickerOptionsResponse
;
function
GetTaskPickerTaskContext
(
taskId
:
string
):
TTaskPickerTaskContext
;
function
DeleteTimeEntry
(
userId
:
string
;
entryId
:
Integer
):
Boolean
;
function
DeleteTimeEntry
(
userId
:
string
;
entryId
:
Integer
):
Boolean
;
function
AddTaskToFocus
(
userId
,
taskId
:
string
):
Boolean
;
function
RemoveTaskFromFocus
(
userId
,
taskId
:
string
):
Boolean
;
end
;
end
;
implementation
implementation
...
@@ -50,7 +53,9 @@ uses
...
@@ -50,7 +53,9 @@ uses
procedure
TTimeEntryService
.
AfterConstruction
;
procedure
TTimeEntryService
.
AfterConstruction
;
begin
begin
inherited
;
inherited
;
Logger
.
Log
(
4
,
'TTimeEntryService.AfterConstruction->TApiDatabase.Create(nil)'
);
apiDB
:=
TApiDatabase
.
Create
(
nil
);
apiDB
:=
TApiDatabase
.
Create
(
nil
);
Logger
.
Log
(
4
,
'TTimeEntryService.AfterConstruction - apiDB created'
)
end
;
end
;
...
@@ -130,7 +135,7 @@ var
...
@@ -130,7 +135,7 @@ var
leftText
:
string
;
leftText
:
string
;
taskText
:
string
;
taskText
:
string
;
begin
begin
customerText
:=
FieldText
(
AQuery
,
'CUSTOMER_
SHORT_
NAME'
);
customerText
:=
FieldText
(
AQuery
,
'CUSTOMER_NAME'
);
projectText
:=
FieldText
(
AQuery
,
'PROJECT_NAME'
);
projectText
:=
FieldText
(
AQuery
,
'PROJECT_NAME'
);
taskNumberText
:=
BuildTaskNumber
(
AQuery
);
taskNumberText
:=
BuildTaskNumber
(
AQuery
);
subjectText
:=
FieldText
(
AQuery
,
'TASK_SUBJECT'
);
subjectText
:=
FieldText
(
AQuery
,
'TASK_SUBJECT'
);
...
@@ -210,7 +215,7 @@ begin
...
@@ -210,7 +215,7 @@ begin
' ti.CATEGORY, '
+
' ti.CATEGORY, '
+
' cat.CODE_DESC as CATEGORY_DESC, '
+
' cat.CODE_DESC as CATEGORY_DESC, '
+
' ti.SUMMARY, '
+
' ti.SUMMARY, '
+
' c.SHORT_NAME as CUSTOMER_
SHORT_
NAME, '
+
' c.SHORT_NAME as CUSTOMER_NAME, '
+
' p.NAME as PROJECT_NAME, '
+
' p.NAME as PROJECT_NAME, '
+
' t.TASK_NUM_1, '
+
' t.TASK_NUM_1, '
+
' t.TASK_NUM_2, '
+
' t.TASK_NUM_2, '
+
...
@@ -290,7 +295,7 @@ begin
...
@@ -290,7 +295,7 @@ begin
tasksQuery
.
SQL
.
Text
:=
tasksQuery
.
SQL
.
Text
:=
'select distinct '
+
'select distinct '
+
' t.TASK_ID, '
+
' t.TASK_ID, '
+
' c.SHORT_NAME as CUSTOMER_
SHORT_
NAME, '
+
' c.SHORT_NAME as CUSTOMER_NAME, '
+
' p.NAME as PROJECT_NAME, '
+
' p.NAME as PROJECT_NAME, '
+
' t.TASK_NUM_1, '
+
' t.TASK_NUM_1, '
+
' t.TASK_NUM_2, '
+
' t.TASK_NUM_2, '
+
...
@@ -764,15 +769,14 @@ begin
...
@@ -764,15 +769,14 @@ begin
end
;
end
;
function
TTimeEntryService
.
GetTaskPickerCustomers
(
userId
:
string
)
:
TTaskPickerOptionsResponse
;
function
TTimeEntryService
.
GetTaskPickerCustomers
:
TTaskPickerOptionsResponse
;
begin
begin
Logger
.
Log
(
4
,
Format
(
'TimeEntryService.GetTaskPickerCustomers - USER_ID="%s"'
,
[
userId
])
);
Logger
.
Log
(
4
,
'TimeEntryService.GetTaskPickerCustomers Start'
);
Result
:=
TTaskPickerOptionsResponse
.
Create
;
Result
:=
TTaskPickerOptionsResponse
.
Create
;
TXDataOperationContext
.
Current
.
Handler
.
ManagedObjects
.
Add
(
Result
);
TXDataOperationContext
.
Current
.
Handler
.
ManagedObjects
.
Add
(
Result
);
apiDB
.
uqTaskPickerCustomers
.
Close
;
apiDB
.
uqTaskPickerCustomers
.
Close
;
apiDB
.
uqTaskPickerCustomers
.
ParamByName
(
'USER_ID'
).
AsString
:=
userId
;
apiDB
.
uqTaskPickerCustomers
.
Open
;
apiDB
.
uqTaskPickerCustomers
.
Open
;
try
try
while
not
apiDB
.
uqTaskPickerCustomers
.
Eof
do
while
not
apiDB
.
uqTaskPickerCustomers
.
Eof
do
...
@@ -780,7 +784,7 @@ begin
...
@@ -780,7 +784,7 @@ begin
AddTaskPickerOption
(
AddTaskPickerOption
(
Result
,
Result
,
FieldText
(
apiDB
.
uqTaskPickerCustomers
,
'CUSTOMER_ID'
),
FieldText
(
apiDB
.
uqTaskPickerCustomers
,
'CUSTOMER_ID'
),
FieldText
(
apiDB
.
uqTaskPickerCustomers
,
'CUSTOMER_
SHORT_
NAME'
)
FieldText
(
apiDB
.
uqTaskPickerCustomers
,
'CUSTOMER_NAME'
)
);
);
apiDB
.
uqTaskPickerCustomers
.
Next
;
apiDB
.
uqTaskPickerCustomers
.
Next
;
...
@@ -791,15 +795,14 @@ begin
...
@@ -791,15 +795,14 @@ begin
end
;
end
;
function
TTimeEntryService
.
GetTaskPickerProjects
(
userId
,
customerId
:
string
):
TTaskPickerOptionsResponse
;
function
TTimeEntryService
.
GetTaskPickerProjects
(
customerId
:
string
):
TTaskPickerOptionsResponse
;
begin
begin
Logger
.
Log
(
4
,
Format
(
'TimeEntryService.GetTaskPickerProjects -
USER_ID="%s" CUSTOMER_ID="%s"'
,
[
userId
,
customerId
]));
Logger
.
Log
(
4
,
Format
(
'TimeEntryService.GetTaskPickerProjects -
CUSTOMER_ID="%s"'
,
[
customerId
]));
Result
:=
TTaskPickerOptionsResponse
.
Create
;
Result
:=
TTaskPickerOptionsResponse
.
Create
;
TXDataOperationContext
.
Current
.
Handler
.
ManagedObjects
.
Add
(
Result
);
TXDataOperationContext
.
Current
.
Handler
.
ManagedObjects
.
Add
(
Result
);
apiDB
.
uqTaskPickerProjects
.
Close
;
apiDB
.
uqTaskPickerProjects
.
Close
;
apiDB
.
uqTaskPickerProjects
.
ParamByName
(
'USER_ID'
).
AsString
:=
userId
;
apiDB
.
uqTaskPickerProjects
.
ParamByName
(
'CUSTOMER_ID'
).
AsString
:=
customerId
;
apiDB
.
uqTaskPickerProjects
.
ParamByName
(
'CUSTOMER_ID'
).
AsString
:=
customerId
;
apiDB
.
uqTaskPickerProjects
.
Open
;
apiDB
.
uqTaskPickerProjects
.
Open
;
try
try
...
@@ -811,6 +814,9 @@ begin
...
@@ -811,6 +814,9 @@ begin
FieldText
(
apiDB
.
uqTaskPickerProjects
,
'PROJECT_NAME'
)
FieldText
(
apiDB
.
uqTaskPickerProjects
,
'PROJECT_NAME'
)
);
);
Result
.
options
[
Result
.
options
.
Count
-
1
].
customerId
:=
apiDB
.
uqTaskPickerProjectsCUSTOMER_ID
.
AsString
;
apiDB
.
uqTaskPickerProjects
.
Next
;
apiDB
.
uqTaskPickerProjects
.
Next
;
end
;
end
;
finally
finally
...
@@ -819,15 +825,14 @@ begin
...
@@ -819,15 +825,14 @@ begin
end
;
end
;
function
TTimeEntryService
.
GetTaskPickerTasks
(
userId
,
projectId
:
string
):
TTaskPickerOptionsResponse
;
function
TTimeEntryService
.
GetTaskPickerTasks
(
projectId
:
string
):
TTaskPickerOptionsResponse
;
begin
begin
Logger
.
Log
(
4
,
Format
(
'TimeEntryService.GetTaskPickerTasks -
USER_ID="%s" PROJECT_ID="%s"'
,
[
userId
,
projectId
]));
Logger
.
Log
(
4
,
Format
(
'TimeEntryService.GetTaskPickerTasks -
PROJECT_ID="%s"'
,
[
projectId
]));
Result
:=
TTaskPickerOptionsResponse
.
Create
;
Result
:=
TTaskPickerOptionsResponse
.
Create
;
TXDataOperationContext
.
Current
.
Handler
.
ManagedObjects
.
Add
(
Result
);
TXDataOperationContext
.
Current
.
Handler
.
ManagedObjects
.
Add
(
Result
);
apiDB
.
uqTaskPickerTasks
.
Close
;
apiDB
.
uqTaskPickerTasks
.
Close
;
apiDB
.
uqTaskPickerTasks
.
ParamByName
(
'USER_ID'
).
AsString
:=
userId
;
apiDB
.
uqTaskPickerTasks
.
ParamByName
(
'PROJECT_ID'
).
AsString
:=
projectId
;
apiDB
.
uqTaskPickerTasks
.
ParamByName
(
'PROJECT_ID'
).
AsString
:=
projectId
;
apiDB
.
uqTaskPickerTasks
.
Open
;
apiDB
.
uqTaskPickerTasks
.
Open
;
try
try
...
@@ -847,6 +852,39 @@ begin
...
@@ -847,6 +852,39 @@ begin
end
;
end
;
function
TTimeEntryService
.
GetTaskPickerTaskContext
(
taskId
:
string
):
TTaskPickerTaskContext
;
var
q
:
TUniQuery
;
begin
Logger
.
Log
(
4
,
Format
(
'TimeEntryService.GetTaskPickerTaskContext - TASK_ID="%s"'
,
[
taskId
]));
Result
:=
TTaskPickerTaskContext
.
Create
;
TXDataOperationContext
.
Current
.
Handler
.
ManagedObjects
.
Add
(
Result
);
Result
.
taskId
:=
taskId
;
// Read-only lookup; an unknown task returns blank ids so the picker opens empty
q
:=
TUniQuery
.
Create
(
nil
);
try
q
.
Connection
:=
apiDB
.
ucETaskApi
;
q
.
SQL
.
Text
:=
'select t.PROJECT_ID, p.CUSTOMER_ID '
+
'from tasks t '
+
'join project p on p.PROJECT_ID = t.PROJECT_ID '
+
'where t.TASK_ID = :TASK_ID'
;
q
.
ParamByName
(
'TASK_ID'
).
AsString
:=
taskId
;
q
.
Open
;
if
not
q
.
Eof
then
begin
Result
.
projectId
:=
FieldText
(
q
,
'PROJECT_ID'
);
Result
.
customerId
:=
FieldText
(
q
,
'CUSTOMER_ID'
);
end
;
finally
q
.
Free
;
end
;
end
;
function
TTimeEntryService
.
DeleteTimeEntry
(
userId
:
string
;
entryId
:
Integer
):
Boolean
;
function
TTimeEntryService
.
DeleteTimeEntry
(
userId
:
string
;
entryId
:
Integer
):
Boolean
;
var
var
q
:
TUniQuery
;
q
:
TUniQuery
;
...
@@ -890,6 +928,105 @@ begin
...
@@ -890,6 +928,105 @@ begin
end
;
end
;
end
;
end
;
function
TTimeEntryService
.
AddTaskToFocus
(
userId
,
taskId
:
string
):
Boolean
;
var
q
:
TUniQuery
;
begin
Logger
.
Log
(
4
,
Format
(
'TimeEntryService.AddTaskToFocus - USER_ID="%s" TASK_ID="%s"'
,
[
userId
,
taskId
]
));
q
:=
TUniQuery
.
Create
(
nil
);
try
q
.
Connection
:=
apiDB
.
ucETaskApi
;
q
.
Connection
.
StartTransaction
;
try
q
.
SQL
.
Text
:=
'select TASK_ID from task_assigned_user '
+
'where USER_ID = :USER_ID and TASK_ID = :TASK_ID'
;
q
.
ParamByName
(
'USER_ID'
).
AsString
:=
userId
;
q
.
ParamByName
(
'TASK_ID'
).
AsString
:=
taskId
;
q
.
Open
;
if
q
.
IsEmpty
then
begin
q
.
Close
;
q
.
SQL
.
Text
:=
'insert into task_assigned_user '
+
'(USER_ID, TASK_ID, FOCUSED_TASK) '
+
'values (:USER_ID, :TASK_ID, ''T'')'
;
end
else
begin
q
.
Close
;
q
.
SQL
.
Text
:=
'update task_assigned_user '
+
'set FOCUSED_TASK = ''T'' '
+
'where USER_ID = :USER_ID and TASK_ID = :TASK_ID'
;
end
;
q
.
ParamByName
(
'USER_ID'
).
AsString
:=
userId
;
q
.
ParamByName
(
'TASK_ID'
).
AsString
:=
taskId
;
q
.
ExecSQL
;
q
.
Connection
.
Commit
;
Result
:=
True
;
except
on
E
:
Exception
do
begin
if
q
.
Connection
.
InTransaction
then
q
.
Connection
.
Rollback
;
Logger
.
Log
(
2
,
'TimeEntryService.AddTaskToFocus - ERROR: '
+
E
.
Message
);
raise
;
end
;
end
;
finally
q
.
Free
;
end
;
end
;
function
TTimeEntryService
.
RemoveTaskFromFocus
(
userId
,
taskId
:
string
):
Boolean
;
var
q
:
TUniQuery
;
begin
Logger
.
Log
(
4
,
Format
(
'TimeEntryService.RemoveTaskFromFocus - USER_ID="%s" TASK_ID="%s"'
,
[
userId
,
taskId
]
));
// Only clears the flag; the task_assigned_user row is kept and never inserted here
q
:=
TUniQuery
.
Create
(
nil
);
try
q
.
Connection
:=
apiDB
.
ucETaskApi
;
q
.
Connection
.
StartTransaction
;
try
q
.
SQL
.
Text
:=
'update task_assigned_user '
+
'set FOCUSED_TASK = ''F'' '
+
'where USER_ID = :USER_ID and TASK_ID = :TASK_ID'
;
q
.
ParamByName
(
'USER_ID'
).
AsString
:=
userId
;
q
.
ParamByName
(
'TASK_ID'
).
AsString
:=
taskId
;
q
.
ExecSQL
;
q
.
Connection
.
Commit
;
Result
:=
True
;
except
on
E
:
Exception
do
begin
if
q
.
Connection
.
InTransaction
then
q
.
Connection
.
Rollback
;
Logger
.
Log
(
2
,
'TimeEntryService.RemoveTaskFromFocus - ERROR: '
+
E
.
Message
);
raise
;
end
;
end
;
finally
q
.
Free
;
end
;
end
;
initialization
initialization
RegisterServiceType
(
TTimeEntryService
);
RegisterServiceType
(
TTimeEntryService
);
...
...
emT3XDataServer/bin/emT3XDataServer.ini
View file @
e56dc151
[Settings]
[Settings]
MemoLogLevel
=
4
MemoLogLevel
=
5
FileLogLevel
=
4
FileLogLevel
=
5
webClientVersion
=
0.9.
3
webClientVersion
=
0.9.
4.0
LogFileNum
=
2
45
LogFileNum
=
2
18
[Database]
[Database]
Server
=
192.168.102.133
--Server
=
192.168.102.131
--Server
=
192.168.116.131
--Server
=
192.168.116.128
--Server
=
192.168.102.131
--Server
=
192.168.159.10
--Server
=
192.168.159.10
Server
=
192.168.90.12
Database
=
eTask
Database
=
eTask
Username
=
root
Username
=
root
Password
=
emsys01
Password
=
emsys01
...
...
emT3XDataServer/emT3XDataServer.dproj
View file @
e56dc151
...
@@ -114,12 +114,11 @@
...
@@ -114,12 +114,11 @@
<VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_ExeOutput>.\bin</DCC_ExeOutput>
<DCC_ExeOutput>.\bin</DCC_ExeOutput>
<DCC_UnitSearchPath>C:\RADTOOLS\FastMM4;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<DCC_UnitSearchPath>C:\RADTOOLS\FastMM4;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<VerInfo_Keys>CompanyName=EM Systems;FileDescription=$(MSBuildProjectName);FileVersion=0.9.
3.1
;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=0.9.11;Comments=</VerInfo_Keys>
<VerInfo_Keys>CompanyName=EM Systems;FileDescription=$(MSBuildProjectName);FileVersion=0.9.
4.0
;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=0.9.11;Comments=</VerInfo_Keys>
<VerInfo_MajorVer>0</VerInfo_MajorVer>
<VerInfo_MajorVer>0</VerInfo_MajorVer>
<VerInfo_MinorVer>9</VerInfo_MinorVer>
<VerInfo_MinorVer>9</VerInfo_MinorVer>
<VerInfo_AutoIncVersion>true</VerInfo_AutoIncVersion>
<VerInfo_AutoIncVersion>true</VerInfo_AutoIncVersion>
<VerInfo_Build>1</VerInfo_Build>
<VerInfo_Release>4</VerInfo_Release>
<VerInfo_Release>3</VerInfo_Release>
</PropertyGroup>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment