Files
rar-autopass/legacy-vfp/rar-forms.prg
Claude Agent 5a8787bbc4 chore(legacy): muta proiectul Visual FoxPro in legacy-vfp/
Codul VFP original (ROAAUTO) era doar de testare/proba si nu se mai dezvolta.
Mutat in legacy-vfp/ (sursa .prg, proiect .pjx/.PJT, date .DBF/.CDX/.FPT,
test-comenzi.xml). Actualizat caile DBF default in tools/import_dbf.py si
referinta din tests/test_import_dbf.py. Adaugat legacy-vfp/README.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 06:51:21 +00:00

1297 lines
31 KiB
Plaintext
Raw Blame History

* rar_forms.prg
#Define C_FORM_WIDTH 800
#Define C_FORM_HEIGHT 600
#Define C_BTN_WIDTH 120
#Define C_BTN_HEIGHT 30
#Define C_API_TIMEOUT 30
Close Databases All
Set Century On
Set Exact On
Set Ansi On
Set Deleted On
Set Date Dmy
Set Hours To 24
Set Notify Off
Set Safety Off
lcPath = Justpath(Sys(16,0))
Set Default To (m.lcPath)
Set Procedure To rar_autopass Additive
Set Procedure To nfjsonread Additive
Do Main
* Form principal pentru managementul RAR AutoPass
Define Class RarAutoPassForm As Form
Caption = "RAR AutoPass Manager"
Width = C_FORM_WIDTH
Height = C_FORM_HEIGHT
AutoCenter = .T.
MaxButton = .F.
WindowType = 1
BackColor = Rgb(240,240,240)
* Membri privati
Hidden oRar
Hidden nTimerHandle
Hidden cLastXmlPath
ErrorMsg = ""
* Adaugam PageFrame-ul ?i paginile sale
Add Object PageFrame1 As PageFrame With ;
Left = 10, ;
Top = 10, ;
Width = C_FORM_WIDTH - 20, ;
Height = C_FORM_HEIGHT - 80, ;
PageCount = 4, ;
Visible = .T.
Function Init
Local loRar, llSuccess, llTestMode
llSuccess = .F.
llTestMode = .T.
Try
* Adaugam controalele pentru fiecare pagina
This.SetupPage1() && Procesare
This.SetupPage2() && Mapari
This.SetupPage3() && Monitorizare
This.SetupPage4() && Prezentari
* Initializare RAR AutoPass
This.oRar = Createobject("RarAutoPass")
If !This.oRar.SetCredentials(m.llTestMode)
Messagebox("Eroare setare credentiale: " + This.oRar.ErrorMsg, 16, "Eroare")
llSuccess = .F.
Return llSuccess
Endif
* Deschidem tabelele necesare
Use mapare_prestatii In 0 Shared
Use rar_log In 0 Shared
Use prestatii_rar In 0 Shared
Create Cursor xml_preview ;
(nr_comanda C(20), ;
data D, ;
vin C(20), ;
nr_inm C(10), ;
km_final N(10), ;
km_init N(10), ;
observatii M)
This.SetupGridMapari()
This.SetupGridLog()
This.SetupLogFilter()
This.nTimerHandle = 0
This.cLastXmlPath = ""
llSuccess = .T.
Catch To loError
Messagebox("Eroare la initializarea formularului: " + ;
loError.Message, 16, "Eroare")
llSuccess = .F.
Endtry
Return llSuccess
Endfunc
* Setup pentru Page1 (Procesare Comenzi)
Function SetupPage1
Local llSuccess
llSuccess = .F.
Try
With This.PageFrame1.Page1
.Caption = "Procesare Comenzi"
.AddObject("lblXmlPath", "Label")
With .lblXmlPath
.Caption = "Fisier XML:"
.Left = 20
.Top = 20
.Visible = .T.
Endwith
.AddObject("txtXmlPath", "TextBox")
With .txtXmlPath
.Left = 100
.Top = 20
.Width = 500
.Visible = .T.
Endwith
.AddObject("btnBrowse", "CommandButton")
With .btnBrowse
.Caption = "..."
.Left = 610
.Top = 20
.Width = 30
.Height = C_BTN_HEIGHT
.Visible = .T.
Endwith
* Ata?am handler-ul pentru evenimentul Click
Bindevent(.btnBrowse, "Click", This, "OnBrowseClick")
.AddObject("btnProcess", "CommandButton")
With .btnProcess
.Caption = "Proceseaza"
.Left = 20
.Top = 60
.Width = C_BTN_WIDTH
.Height = C_BTN_HEIGHT
.Visible = .T.
Endwith
* Ata?am handler-ul pentru evenimentul Click
Bindevent(.btnProcess, "Click", This, "OnProcessClick")
.AddObject("chkAutoProcess", "CheckBox")
With .chkAutoProcess
.Caption = "Procesare automata"
.Left = 160
.Top = 65
.AutoSize = .T.
.Visible = .T.
Endwith
* Ata?am handler pentru AutoProcess
Bindevent(.chkAutoProcess, "InteractiveChange", This, "OnAutoProcessChange")
.AddObject("txtInterval", "TextBox")
With .txtInterval
.Left = 300
.Top = 65
.Width = 50
.Value = "5"
.Visible = .T.
Endwith
.AddObject("lblMinute", "Label")
With .lblMinute
.Caption = "minute"
.Left = 360
.Top = 65
.Visible = .T.
Endwith
.AddObject("edtStatus", "EditBox")
With .edtStatus
.Left = 20
.Top = 100
.Width = 700
.Height = 200
.ReadOnly = .T.
.ScrollBars = 2
.Visible = .T.
Endwith
.AddObject("grdPreview", "Grid")
With .grdPreview
.Left = 20
.Top = 320
.Width = 700
.Height = 200
.ReadOnly = .T.
.Visible = .F.
.ColumnCount = 7
.Column1.Header1.Caption = "Nr. Comanda"
.Column1.Width = 100
.Column2.Header1.Caption = "Data"
.Column2.Width = 80
.Column3.Header1.Caption = "VIN"
.Column3.Width = 120
.Column4.Header1.Caption = "Nr. Inmatriculare"
.Column4.Width = 100
.Column5.Header1.Caption = "KM Final"
.Column5.Width = 80
.Column6.Header1.Caption = "KM Initial"
.Column6.Width = 80
.Column7.Header1.Caption = "Observatii"
.Column7.Width = 140
Endwith
.AddObject("lblPreview", "Label")
With .lblPreview
.Caption = "Preview comenzi din XML:"
.Left = 20
.Top = 300
.Visible = .F.
Endwith
Endwith
llSuccess = .T.
Catch To loError
Messagebox("Eroare la setup Page1: " + loError.Message, 16, "Eroare")
llSuccess = .F.
Endtry
Return llSuccess
Endfunc
* Continuare din partea anterioara...
* Setup pentru Page2 (Mapare Operatii)
Function SetupPage2
Local llSuccess
llSuccess = .F.
Try
With This.PageFrame1.Page2
.Caption = "Mapare Operatii"
.AddObject("Grid1", "Grid")
With .Grid1
.Left = 20
.Top = 20
.Width = 700
.Height = 300
.AllowAddNew = .T.
.DeleteMark = .F.
.Visible = .T.
Endwith
.AddObject("btnSaveMapari", "CommandButton")
With .btnSaveMapari
.Caption = "Salveaza"
.Left = 20
.Top = 330
.Width = C_BTN_WIDTH
.Height = C_BTN_HEIGHT
.Visible = .T.
Endwith
.AddObject("btnRefreshNomenclator", "CommandButton")
With .btnRefreshNomenclator
.Caption = "Actualizare Nomenclator"
.Left = 150
.Top = 330
.Width = 150
.Height = C_BTN_HEIGHT
.Visible = .T.
Endwith
Bindevent(.btnSaveMapari, "Click", This, "OnSaveMappingsClick")
Bindevent(.btnRefreshNomenclator, "Click", This, "OnRefreshNomenclatorClick")
Endwith
llSuccess = .T.
Catch To loError
Messagebox("Eroare la setup Page2: " + loError.Message, 16, "Eroare")
llSuccess = .F.
Endtry
Return llSuccess
Endfunc
* Setup pentru Page3 (Monitorizare)
Function SetupPage3
Local llSuccess
llSuccess = .F.
Try
With This.PageFrame1.Page3
.Caption = "Monitorizare"
.AddObject("Grid2", "Grid")
With .Grid2
.Left = 20
.Top = 50
.Width = 700
.Height = 300
.Visible = .T.
Endwith
.AddObject("cboLogFilter", "ComboBox")
With .cboLogFilter
.Left = 20
.Top = 20
.Width = 150
.Style = 2
.Visible = .T.
.AddItem("Toate")
.AddItem("Succes")
.AddItem("Erori")
.ListIndex = 1
Endwith
.AddObject("btnRefreshLog", "CommandButton")
With .btnRefreshLog
.Caption = "Refresh"
.Left = 180
.Top = 20
.Width = C_BTN_WIDTH
.Height = C_BTN_HEIGHT
.Visible = .T.
Endwith
.AddObject("btnAdvSearch", "CommandButton")
With .btnAdvSearch
.Caption = "Cautare avansata"
.Left = 320
.Top = 20
.Width = C_BTN_WIDTH
.Height = C_BTN_HEIGHT
.Visible = .T.
Endwith
.AddObject("btnExportExcel", "CommandButton")
With .btnExportExcel
.Caption = "Export Excel"
.Left = 450
.Top = 20
.Width = C_BTN_WIDTH
.Height = C_BTN_HEIGHT
.Visible = .T.
Endwith
* Ata?am event handlers
Bindevent(.cboLogFilter, "InteractiveChange", This, "OnLogFilterChange")
Bindevent(.btnRefreshLog, "Click", This, "OnRefreshLogClick")
Bindevent(.btnAdvSearch, "Click", This, "OnAdvSearchClick")
Bindevent(.btnExportExcel, "Click", This, "OnExportExcelClick")
Endwith
llSuccess = .T.
Catch To loError
Messagebox("Eroare la setup Page3: " + loError.Message, 16, "Eroare")
llSuccess = .F.
Endtry
Return llSuccess
Endfunc
* Setup pentru Page4 (Prezentari Finalizate)
Function SetupPage4
Local llSuccess
llSuccess = .F.
Try
With This.PageFrame1.Page4
.Caption = "Prezentari Finalizate"
* Grid pentru prezentari
.AddObject("grdPrezentari", "Grid")
With .grdPrezentari
.Left = 20
.Top = 50
.Width = 700
.Height = 300
.ReadOnly = .T.
.DeleteMark = .F.
.Visible = .T.
.ColumnCount = 7
.Column1.Header1.Caption = "ID"
.Column1.Width = 60
.Column2.Header1.Caption = "Data Presta?ie"
.Column2.Width = 100
.Column3.Header1.Caption = "VIN"
.Column3.Width = 120
.Column4.Header1.Caption = "Nr. <20>nmatriculare"
.Column4.Width = 100
.Column5.Header1.Caption = "Km Final"
.Column5.Width = 80
.Column6.Header1.Caption = "Status"
.Column6.Width = 80
.Column7.Header1.Caption = "Observa?ii"
.Column7.Width = 160
Endwith
* Buton refresh prezentari
.AddObject("btnRefreshPrez", "CommandButton")
With .btnRefreshPrez
.Caption = "Actualizeaza"
.Left = 20
.Top = 20
.Width = C_BTN_WIDTH
.Height = C_BTN_HEIGHT
.Visible = .T.
Endwith
* Buton anulare prezentare
.AddObject("btnAnulare", "CommandButton")
With .btnAnulare
.Caption = "Anuleaza Prezentare"
.Left = 150
.Top = 20
.Width = C_BTN_WIDTH
.Height = C_BTN_HEIGHT
.Visible = .T.
Endwith
* Ata?am event handlers
Bindevent(.btnRefreshPrez, "Click", This, "OnRefreshPrezentariClick")
Bindevent(.btnAnulare, "Click", This, "OnAnularePrezentareClick")
Endwith
* Cream cursor pentru prezentari
If Used("prezentari_fin")
Use In prezentari_fin
Endif
Create Cursor prezentari_fin ;
(Id I, ;
data_prestatie D, ;
vin C(20), ;
nr_inmatriculare C(10), ;
odometru_final N(10), ;
status C(20), ;
observatii M)
* Setam sursa pentru grid
This.PageFrame1.Page4.grdPrezentari.RecordSource = "prezentari_fin"
With This.PageFrame1.Page4.grdPrezentari
.Column1.ControlSource = "prezentari_fin.id"
.Column2.ControlSource = "prezentari_fin.data_prestatie"
.Column3.ControlSource = "prezentari_fin.vin"
.Column4.ControlSource = "prezentari_fin.nr_inmatriculare"
.Column5.ControlSource = "prezentari_fin.odometru_final"
.Column6.ControlSource = "prezentari_fin.status"
.Column7.ControlSource = "prezentari_fin.observatii"
Endwith
llSuccess = .T.
Catch To loError
Messagebox("Eroare la setup Page4: " + loError.Message, 16, "Eroare")
llSuccess = .F.
Endtry
Return llSuccess
Endfunc
* Event Handlers pentru Page1
Function OnBrowseClick
Local lcFile
lcFile = Getfile("XML", "Alege fisier XML", "Deschide", 0)
If !Empty(lcFile)
This.PageFrame1.Page1.txtXmlPath.Value = lcFile
This.AddStatus("Fisier selectat: " + lcFile)
This.ParseXMLToPreview(lcFile)
Endif
Endfunc
Function OnProcessClick
Local lcFile
lcFile = This.PageFrame1.Page1.txtXmlPath.Value
If Empty(lcFile)
Messagebox("Selecta?i un fisier XML!", 16, "Aten?ie")
Return
Endif
This.ProcessXML(lcFile)
Endfunc
Function OnAutoProcessChange
Local loControl
loControl = This.PageFrame1.Page1.chkAutoProcess
If loControl.Value
This.StartAutoProcessing()
Else
This.StopAutoProcessing()
Endif
Endfunc
* Event Handlers pentru Page3 (Monitorizare)
Function OnLogFilterChange
Lparameters toControl
Local lcFilter
Do Case
Case toControl.ListIndex = 1 && Toate
lcFilter = ""
Case toControl.ListIndex = 2 && Succes
lcFilter = "status = 'SUCCESS'"
Case toControl.ListIndex = 3 && Erori
lcFilter = "status = 'ERROR'"
Endcase
This.ApplyLogFilter(lcFilter)
Endfunc
Function OnRefreshLogClick
Select rar_log
Use In rar_log
Use rar_log In 0 Shared
Go Top
This.PageFrame1.Page3.Grid2.Refresh()
This.AddStatus("Log actualizat.")
Endfunc
Function OnAdvSearchClick
Do Form search_log
This.PageFrame1.Page3.Grid2.Refresh()
Endfunc
* Event Handlers pentru Page4 (Prezentari)
Function OnRefreshPrezentariClick
This.RefreshPrezentari()
Endfunc
Function OnAnularePrezentareClick
This.AnularePrezentare(prezentari_fin.id)
Endfunc
* Func?ii utilitare
Function AddStatus
Lparameters tcMessage
With This.PageFrame1.Page1.edtStatus
.Value = .Value + Ttoc(Datetime()) + ": " + tcMessage + Chr(13) + Chr(10)
.SelStart = Len(.Value)
Endwith
Endfunc
Function ApplyLogFilter
Parameter tcFilter
Select rar_log
If !Empty(tcFilter)
Set Filter To &tcFilter
Else
Set Filter To
Endif
Go Top
This.PageFrame1.Page3.Grid2.Refresh()
Endfunc
* Func?ii pentru procesare XML
Function ParseXMLToPreview
Parameters tcXMLFile
Local loXML As MSXML2.DOMDocument.6.0
Local loNodes As MSXML2.IXMLDOMNodeList
Local loNode As MSXML2.IXMLDOMNode
Local llSuccess, lcData
llSuccess = .F.
Try
loXML = Createobject("MSXML2.DOMDocument.6.0")
loXML.Async = .F.
If !loXML.Load(tcXMLFile)
This.ErrorMsg = "Eroare incarcare XML: " + loXML.parseError.reason
This.AddStatus(This.ErrorMsg)
llSuccess = .F.
Return llSuccess
Endif
* Obtinem toate nodurile de comenzi
loNodes = loXML.selectNodes("/comenzi/comanda")
If Used("xml_preview")
Select xml_preview
Delete All
Endif
For Each loNode In loNodes
lcData = loNode.selectSingleNode("data").Text
ldData = This.Data2Date(m.lcData)
Insert Into xml_preview ;
(nr_comanda, ;
data, ;
vin, ;
nr_inm, ;
km_final, ;
km_init, ;
observatii) ;
VALUES ;
(loNode.selectSingleNode("nr_comanda").Text, ;
M.ldData, ;
loNode.selectSingleNode("vin").Text, ;
loNode.selectSingleNode("nr_inmatriculare").Text, ;
VAL(loNode.selectSingleNode("km_final").Text), ;
VAL(loNode.selectSingleNode("km_initial").Text), ;
NVL(loNode.selectSingleNode("observatii").Text, ""))
Endfor
Go Top
This.PageFrame1.Page1.grdPreview.Refresh()
This.PageFrame1.Page1.grdPreview.Visible = .T.
This.PageFrame1.Page1.lblPreview.Visible = .T.
This.AddStatus("XML citit cu succes: " + Transform(Reccount()) + " comenzi")
llSuccess = .T.
Catch To loError
This.ErrorMsg = "Eroare parsare XML: " + loError.Message
This.AddStatus(This.ErrorMsg)
llSuccess = .F.
Endtry
Return llSuccess
Endfunc
* Func?ii pentru prezentari
Function RefreshPrezentari
Local llSuccess
llSuccess = .F.
This.AddStatus("Actualizare prezentari...")
Try
If !This.oRar.Login()
This.AddStatus("Eroare login: " + This.oRar.ErrorMsg)
Return .F.
Endif
This.oRar.loXMLHTTP.Open("GET", This.oRar.lcUrl + "/prezentari/getAllPrezentariFinalizate", .F.)
This.oRar.loXMLHTTP.setRequestHeader("Authorization", "Bearer " + This.oRar.lcToken)
This.oRar.loXMLHTTP.Send()
If This.oRar.loXMLHTTP.Status != 200
This.ErrorMsg = "Eroare obtinere prezentari: " + This.oRar.loXMLHTTP.responseText
This.AddStatus(This.ErrorMsg)
Return .F.
Endif
loJson = nfjsonread(This.oRar.loXMLHTTP.responseText)
If Type('loJson.data.content') == 'O'
Select prezentari_fin
Delete All
For Each loItem In loJson.Data.content
ldData = This.Data2Date(loItem.dataPrestatie)
Insert Into prezentari_fin ;
(Id, ;
data_prestatie, ;
vin, ;
nr_inmatriculare, ;
odometru_final, ;
status, ;
observatii) ;
VALUES ;
(loItem.Id, ;
M.ldData, ;
loItem.vin, ;
loItem.nrInmatriculare, ;
loItem.odometruFinal, ;
loItem.Status, ;
loItem.obs)
Endfor
Go Top
This.PageFrame1.Page4.grdPrezentari.Refresh()
This.AddStatus("Prezentari actualizate cu succes.")
llSuccess = .T.
Endif
Catch To loError
This.ErrorMsg = "Eroare actualizare prezentari: " + loError.Message
This.AddStatus(This.ErrorMsg)
llSuccess = .F.
Endtry
Return llSuccess
Endfunc
* Anulare prezentare
Function AnularePrezentare
Parameters tnIdPrezentare
Local llSuccess
llSuccess = .F.
If !This.oRar.Login()
Return .F.
Endif
Try
* Facem request de tip PATCH pentru anulare
This.oRar.loXMLHTTP.Open("PATCH", ;
THIS.oRar.lcUrl + "/prezentari/markPrezentareAnulataById/" + ALLTRIM(Transform(tnIdPrezentare)), ;
.F.)
This.oRar.loXMLHTTP.setRequestHeader("Authorization", "Bearer " + This.oRar.lcToken)
This.oRar.loXMLHTTP.Send()
This.oRar.LastResponse = This.oRar.loXMLHTTP.responseText
* Parsam raspunsul JSON pentru a verifica statusul
loResponse = nfjsonread(This.oRar.LastResponse)
Do Case
Case This.oRar.loXMLHTTP.Status != 200
This.ErrorMsg = "Eroare la anularea prezentarii: " + This.oRar.LastResponse
This.AddStatus(This.ErrorMsg)
llSuccess = .F.
Case Type('loResponse.STATUS_ANULATA') = 'C'
* Anulare reusita
This.AddStatus('Anulare reusita ID: ' + ALLTRIM(TRANSFORM(tnIdPrezentare)))
llSuccess = .T.
This.oRar.LogPrezentare(Ttoc(Date()), ;
"", ; && nr_comanda
"", ; && vin
"", ; && nr_inm
0, ; && km_final
0, ; && km_initial
"", ; && prestatii
"ANULATA", ; && status
loResponse.STATUS_ANULATA) && mesaj succes
This.AddStatus('Prezentare anulata')
Case Type('loResponse.EROARE_STATUS_ANULARE') = 'C'
This.ErrorMsg = loResponse.EROARE_STATUS_ANULARE
This.oRar.LogPrezentare(Ttoc(Date()), ;
"", ;
"", ;
"", ;
0, ;
0, ;
"", ;
"ERROR", ;
THIS.ErrorMsg)
This.AddStatus(This.ErrorMsg)
llSuccess = .F.
Otherwise
This.ErrorMsg = "Raspuns neasteptat: " + This.oRar.LastResponse
This.AddStatus(This.ErrorMsg)
llSuccess = .F.
Endcase
Catch To loEx
This.ErrorMsg = "Eroare anulare prezentare: " + loEx.Message
This.AddStatus(This.ErrorMsg)
llSuccess = .F.
Endtry
* Actualizam statusul in log daca exista inregistrarea
If Used("rar_log")
Select rar_log
Locate For Id = tnIdPrezentare
If Found()
Replace Status With Iif(llSuccess, "ANULATA", "ERROR"), ;
error_msg With Iif(!llSuccess, This.ErrorMsg, ""), ;
data_trim With Datetime()
Endif
Endif
Return llSuccess
Endfunc
* Func?ii pentru procesare automata
Function StartAutoProcessing
Local lnInterval
If !Empty(This.nTimerHandle)
Return
Endif
lnInterval = Val(This.PageFrame1.Page1.txtInterval.Value)
If lnInterval <= 0
Messagebox("Interval invalid!", 16, "Eroare")
This.PageFrame1.Page1.chkAutoProcess.Value = .F.
Return
Endif
* Convertim intervalul din minute <20>n milisecunde
lnInterval = lnInterval * 60 * 1000
This.nTimerHandle = _Screen.AddProperty("Timer" + Sys(2015), ;
NEWOBJECT("Timer"))
With _Screen.&("Timer" + Sys(2015))
.Interval = lnInterval
Bindevent(.Timer, This, "OnAutoProcessTimer")
.Enabled = .T.
Endwith
This.AddStatus("Procesare automata pornita. Interval: " + ;
TRANSFORM(Val(This.PageFrame1.Page1.txtInterval.Value)) + " minute")
Endfunc
Function StopAutoProcessing
If !Empty(This.nTimerHandle)
_Screen.RemoveObject("Timer" + Sys(2015))
This.nTimerHandle = 0
This.AddStatus("Procesare automata oprita.")
Endif
Endfunc
Function OnAutoProcessTimer
Local lcFile
lcFile = This.PageFrame1.Page1.txtXmlPath.Value
If !Empty(lcFile) And File(lcFile)
This.ProcessXML(lcFile)
Else
This.AddStatus("EROARE: Fi?ier XML invalid sau lipsa!")
This.StopAutoProcessing()
This.PageFrame1.Page1.chkAutoProcess.Value = .F.
Endif
Endfunc
* Event Handlers pentru Page2 (Mapari)
Function OnSaveMappingsClick
Local llSuccess
llSuccess = .F.
Try
Select mapare_prestatii
Tableupdate(.T.)
Messagebox("Mapari salvate cu succes!", 64, "Succes")
llSuccess = .T.
This.AddStatus("Mapari actualizate cu succes.")
Catch To loError
Messagebox("Eroare salvare mapari: " + loError.Message, 16, "Eroare")
This.AddStatus("EROARE salvare mapari: " + loError.Message)
llSuccess = .F.
Endtry
Return llSuccess
Endfunc
Function OnRefreshNomenclatorClick
Local llSuccess
llSuccess = .F.
Wait Window "Actualizare nomenclator <20>n curs..." Nowait
Try
If !This.oRar.UpdateNomenclator(.T.)
Messagebox("Eroare actualizare nomenclator: " + This.oRar.ErrorMsg, 16, "Eroare")
This.AddStatus("EROARE actualizare nomenclator: " + This.oRar.ErrorMsg)
llSuccess = .F.
Else
Messagebox("Nomenclator actualizat cu succes!", 64, "Succes")
This.AddStatus("Nomenclator actualizat cu succes.")
llSuccess = .T.
* Re<52>mprospatam grid-ul cu mapari
Select mapare_prestatii
Go Top
This.PageFrame1.Page2.Grid1.Refresh()
Endif
Catch To loError
Messagebox("Eroare actualizare nomenclator: " + loError.Message, 16, "Eroare")
This.AddStatus("EROARE actualizare nomenclator: " + loError.Message)
llSuccess = .F.
Finally
Wait Clear
Endtry
Return llSuccess
Endfunc
* Functii pentru procesare XML
Function ProcessXML
Parameters tcXMLFile
Local llSuccess
llSuccess = .F.
This.AddStatus("Procesare " + tcXMLFile + "...")
Try
If !This.oRar.ProcessXMLComenzi(tcXMLFile)
This.AddStatus("EROARE: " + This.oRar.ErrorMsg)
Messagebox(This.oRar.ErrorMsg, 16, "Eroare")
llSuccess = .F.
Else
This.AddStatus("Procesare finalizata cu succes!")
Messagebox("Procesare finalizata cu succes!", 64, "Succes")
llSuccess = .T.
Endif
Catch To loError
This.AddStatus("EROARE: " + loError.Message)
Messagebox(loError.Message, 16, "Eroare")
llSuccess = .F.
Endtry
Return llSuccess
Endfunc
* Handler pentru activare/dezactivare procesare automata
Function OnAutoProcessChange
Local loControl
loControl = This.PageFrame1.Page1.chkAutoProcess
If loControl.Value
This.StartAutoProcessing()
Else
This.StopAutoProcessing()
Endif
Endfunc
* Handler pentru timer procesare automata
Function OnAutoProcessTimer
Local lcFile
lcFile = This.PageFrame1.Page1.txtXmlPath.Value
If !Empty(lcFile) And File(lcFile)
This.ProcessXML(lcFile)
Else
This.AddStatus("EROARE: Fi?ier XML invalid sau lipsa!")
This.StopAutoProcessing()
This.PageFrame1.Page1.chkAutoProcess.Value = .F.
Endif
Endfunc
* Export Excel pentru log
Function OnExportExcelClick
Local lcFile, loExcel, loWorkbook, loWorksheet
Local lnRow, lnCol
lcFile = Putfile("Excel files|*.xlsx", "RAR_Log_Export.xlsx", "", 0)
If Empty(lcFile)
Return
Endif
This.AddStatus("Export Excel <20>n " + lcFile + "...")
Try
loExcel = Createobject("Excel.Application")
loExcel.Visible = .F.
loWorkbook = loExcel.Workbooks.Add()
loWorksheet = loWorkbook.Sheets(1)
* Setam headerele
With loWorksheet
.Cells(1,1).Value = "Data prezentare"
.Cells(1,2).Value = "Nr. comanda"
.Cells(1,3).Value = "VIN"
.Cells(1,4).Value = "Nr. <20>nmatriculare"
.Cells(1,5).Value = "Km final"
.Cells(1,6).Value = "Km initial"
.Cells(1,7).Value = "Status"
.Cells(1,8).Value = "Eroare"
.Cells(1,9).Value = "Data trimitere"
* Formatare header
.Range(.Cells(1,1), .Cells(1,9)).Font.Bold = .T.
.Range(.Cells(1,1), .Cells(1,9)).Interior.Color = Rgb(200,200,200)
Endwith
* Populam datele
Select rar_log
lnRow = 2
Scan
loWorksheet.Cells(lnRow, 1).Value = Dtoc(data_prez)
loWorksheet.Cells(lnRow, 2).Value = nr_comanda
loWorksheet.Cells(lnRow, 3).Value = vin
loWorksheet.Cells(lnRow, 4).Value = nr_inm
loWorksheet.Cells(lnRow, 5).Value = Transform(km_final)
loWorksheet.Cells(lnRow, 6).Value = Transform(km_init)
loWorksheet.Cells(lnRow, 7).Value = Status
loWorksheet.Cells(lnRow, 8).Value = error_msg
loWorksheet.Cells(lnRow, 9).Value = Ttoc(data_trim)
* Coloram randurile cu erori in rosu deschis
If Status = "ERROR"
loWorksheet.Range(loWorksheet.Cells(lnRow,1), ;
loWorksheet.Cells(lnRow,9)).Interior.Color = Rgb(255,200,200)
Endif
lnRow = lnRow + 1
Endscan
* Auto-fit coloane
loWorksheet.Range("A:I").Columns.AutoFit()
* Salvam si inchidem
loWorkbook.SaveAs(lcFile)
loWorkbook.Close()
loExcel.Quit()
This.AddStatus("Export Excel finalizat cu succes")
* Deschidem fisierul
Run /N "explorer.exe" &lcFile
Catch To loError
This.AddStatus("EROARE la export Excel: " + loError.Message)
Messagebox("Eroare la export Excel: " + loError.Message, 16, "Eroare")
Try
loWorkbook.Close()
loExcel.Quit()
Catch
Endtry
Endtry
Endfunc
* Refresh pentru grid-ul de log
Function OnRefreshLogClick
Select rar_log
Use In rar_log
Use rar_log In 0 Shared
Go Top
This.PageFrame1.Page3.Grid2.Refresh()
This.AddStatus("Log actualizat.")
Endfunc
* Cautare avansata <20>n log
Function OnAdvSearchClick
Local loSearch
loSearch = Createobject("SearchLogForm")
loSearch.Show(1)
This.PageFrame1.Page3.Grid2.Refresh()
Endfunc
* Handler pentru filtrul de log
Function OnLogFilterChange
Lparameters toControl
Local lcFilter
Do Case
Case toControl.ListIndex = 1 && Toate
lcFilter = ""
Case toControl.ListIndex = 2 && Succes
lcFilter = "status = 'SUCCESS'"
Case toControl.ListIndex = 3 && Erori
lcFilter = "status = 'ERROR'"
Endcase
This.ApplyLogFilter(lcFilter)
Endfunc
* Aplicare filtru pentru log
Function ApplyLogFilter
Parameter tcFilter
Select rar_log
If !Empty(tcFilter)
Set Filter To &tcFilter
Else
Set Filter To
Endif
Go Top
This.PageFrame1.Page3.Grid2.Refresh()
Endfunc
* Helper pentru procesare automata
Function StartAutoProcessing
Local lnInterval
If !Empty(This.nTimerHandle)
Return
Endif
lnInterval = Val(This.PageFrame1.Page1.txtInterval.Value)
If lnInterval <= 0
Messagebox("Interval invalid!", 16, "Eroare")
This.PageFrame1.Page1.chkAutoProcess.Value = .F.
Return
Endif
* Convertim intervalul din minute <20>n milisecunde
lnInterval = lnInterval * 60 * 1000
This.nTimerHandle = _Screen.AddProperty("Timer" + Sys(2015), ;
NEWOBJECT("Timer"))
With _Screen.&("Timer" + Sys(2015))
.Interval = lnInterval
Bindevent(.Timer, This, "OnAutoProcessTimer")
.Enabled = .T.
Endwith
This.AddStatus("Procesare automata pornita. Interval: " + ;
TRANSFORM(Val(This.PageFrame1.Page1.txtInterval.Value)) + " minute")
Endfunc
Function StopAutoProcessing
If !Empty(This.nTimerHandle)
_Screen.RemoveObject("Timer" + Sys(2015))
This.nTimerHandle = 0
This.AddStatus("Procesare automata oprita.")
Endif
Endfunc
Function SetupLogFilter
Local llSuccess
llSuccess = .F.
Try
With This.PageFrame1.Page3.cboLogFilter
.Clear()
.AddItem("Toate")
.AddItem("Succes")
.AddItem("Erori")
.ListIndex = 1
Endwith
* Aplicam filtrul ini?ial (fara filtru)
This.ApplyLogFilter("")
llSuccess = .T.
Catch To loError
Messagebox("Eroare la setup filtru log: " + loError.Message, 16, "Eroare")
llSuccess = .F.
Endtry
Return llSuccess
Endfunc
* Gestionare grid-uri
Function SetupGridMapari
Local llSuccess
llSuccess = .F.
Try
With This.PageFrame1.Page2.Grid1
.RecordSource = "mapare_prestatii"
.ColumnCount = 4
.Column1.Header1.Caption = "Cod Operatie"
.Column1.ControlSource = "mapare_prestatii.cod_op"
.Column1.Width = 150
.Column2.Header1.Caption = "Descriere"
.Column2.ControlSource = "mapare_prestatii.descr_op"
.Column2.Width = 250
.Column3.Header1.Caption = "Cod RAR"
.Column3.ControlSource = "mapare_prestatii.cod_rar"
.Column3.Width = 100
.Column4.Header1.Caption = "Auto Send"
.Column4.ControlSource = "mapare_prestatii.auto_send"
.Column4.Width = 80
.SetAll("ReadOnly", .F., "Column")
.Refresh()
Endwith
llSuccess = .T.
Catch To loError
Messagebox("Eroare la setup grid mapari: " + loError.Message, 16, "Eroare")
llSuccess = .F.
Endtry
Return llSuccess
Endfunc
Function SetupGridLog
Local llSuccess
llSuccess = .F.
Try
With This.PageFrame1.Page3.Grid2
.RecordSource = "rar_log"
.ColumnCount = 6
.Column1.Header1.Caption = "Data"
.Column1.ControlSource = "rar_log.data_prez"
.Column1.Width = 100
.Column2.Header1.Caption = "Comanda"
.Column2.ControlSource = "rar_log.nr_comanda"
.Column2.Width = 100
.Column3.Header1.Caption = "VIN"
.Column3.ControlSource = "rar_log.vin"
.Column3.Width = 150
.Column4.Header1.Caption = "Status"
.Column4.ControlSource = "rar_log.status"
.Column4.Width = 80
.Column5.Header1.Caption = "Eroare"
.Column5.ControlSource = "rar_log.error_msg"
.Column5.Width = 200
.Column6.Header1.Caption = "Data Trimitere"
.Column6.ControlSource = "rar_log.data_trim"
.Column6.Width = 150
.SetAll("ReadOnly", .T., "Column")
.Refresh()
Endwith
llSuccess = .T.
Catch To loError
Messagebox("Eroare la setup grid log: " + loError.Message, 16, "Eroare")
llSuccess = .F.
Endtry
Return llSuccess
Endfunc
* Convertim din YYYY-MM-DD <20>n data VFP
Function Data2Date
Lparameters lcData
Local lnAn, lnLuna, lnZi, ldData
lnAn = Val(Getwordnum(lcData,1,'-'))
lnLuna = Val(Getwordnum(lcData,2,'-'))
lnZi = Val(Getwordnum(lcData,3,'-'))
ldData = Date(lnAn,lnLuna,lnZi)
Return m.ldData
Endfunc
Function Destroy
This.StopAutoProcessing()
* <20>nchidem toate tabelele
If Used("mapare_prestatii")
Use In mapare_prestatii
Endif
If Used("rar_log")
Use In rar_log
Endif
If Used("prestatii_rar")
Use In prestatii_rar
Endif
If Used("prezentari_fin")
Use In prezentari_fin
Endif
If Used("xml_preview")
Use In xml_preview
Endif
DoDefault()
Endfunc
Enddefine
Enddefine
Function Main
Local loForm, llSuccess
llSuccess = .F.
Try
loForm = Createobject("RarAutoPassForm")
loForm.Show(1)
llSuccess = .T.
Catch To loError
Messagebox("Eroare la lansare aplicatie: " + loError.Message, 16, "Eroare")
llSuccess = .F.
Endtry
Return llSuccess
Endfunc