sync SVN r18211
This commit is contained in:
3
.archon/scripts/raport_context.ps1
Normal file
3
.archon/scripts/raport_context.ps1
Normal file
@@ -0,0 +1,3 @@
|
||||
# Raport context + timp per nod pentru un run roa-fix (fara parametru = ultimul run)
|
||||
param([string]$RunId = '')
|
||||
& "C:\Program Files\Git\bin\bash.exe" -lc "cd /d/roa/roacont && perl .archon/scripts/raport_context.pl $RunId"
|
||||
32
.archon/scripts/urmareste.ps1
Normal file
32
.archon/scripts/urmareste.ps1
Normal file
@@ -0,0 +1,32 @@
|
||||
# Ce face acum agentul Archon: ultima sesiune activa (Pi sau Claude), de cand tace, ultimii pasi.
|
||||
# Folosire: urmareste.ps1 [-N 8] [-Watch] (-Watch = reimprospateaza la 15s, Ctrl+C iese)
|
||||
param([int]$N = 8, [switch]$Watch)
|
||||
$dirs = 'C:\Users\mmari\.pi\agent\sessions\--D--ROA-ROACONT--', 'C:\Users\mmari\.claude\projects\D--ROA-ROACONT'
|
||||
|
||||
function Scurt($s, $max = 160) { $s = ("$s" -replace '\s+', ' ').Trim(); if ($s.Length -gt $max) { $s.Substring(0, $max) + '...' } else { $s } }
|
||||
|
||||
function Arata {
|
||||
$f = Get-ChildItem $dirs -Filter *.jsonl -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Descending |
|
||||
Where-Object { $_.FullName -like '*\.pi\*' -or (Select-String -Path $_.FullName -Pattern '"entrypoint":"sdk-ts"' -SimpleMatch -Quiet) } | Select-Object -First 1 # doar sesiunile Archon (sdk), nu Claude Code interactiv
|
||||
if (-not $f) { 'Nicio sesiune gasita.'; return }
|
||||
$tace = [int]((Get-Date) - $f.LastWriteTime).TotalSeconds
|
||||
$tip = if ($f.FullName -like '*\.pi\*') { 'Pi/DeepSeek' } else { 'Claude' }
|
||||
"=== $tip $($f.Name)"
|
||||
"=== ultima scriere: $($f.LastWriteTime.ToString('HH:mm:ss')) (tace de ${tace}s)" + $(if ($tace -gt 600) { ' <-- POSIBIL BLOCAT' } else { '' })
|
||||
$pasi = foreach ($l in (Get-Content $f.FullName -Tail 200 -Encoding UTF8)) {
|
||||
try { $e = $l | ConvertFrom-Json } catch { continue }
|
||||
$m = $e.message; if (-not $m) { continue }
|
||||
$ora = if ($e.timestamp) { ([datetime]$e.timestamp).ToLocalTime().ToString('HH:mm:ss') } else { '' }
|
||||
foreach ($c in @($m.content)) {
|
||||
switch ($c.type) {
|
||||
'toolCall' { "$ora > $($c.name): $(Scurt ($c.arguments.command, $c.arguments.path, ($c.arguments | ConvertTo-Json -Compress) | Where-Object { $_ } | Select-Object -First 1))" }
|
||||
'tool_use' { "$ora > $($c.name): $(Scurt ($c.input.command, $c.input.file_path, $c.input.pattern, ($c.input | ConvertTo-Json -Compress) | Where-Object { $_ } | Select-Object -First 1))" }
|
||||
'text' { if ($m.role -eq 'assistant') { "$ora $(Scurt $c.text)" } elseif ($m.role -eq 'toolResult') { "$ora < $(if ($m.isError) { 'EROARE ' })$(Scurt $c.text 120)" } }
|
||||
'tool_result' { $t = if ($c.content -is [string]) { $c.content } else { @($c.content)[0].text }; "$ora < $(if ($c.is_error) { 'EROARE ' })$(Scurt $t 120)" }
|
||||
}
|
||||
}
|
||||
}
|
||||
$pasi | Select-Object -Last $N
|
||||
}
|
||||
|
||||
do { if ($Watch) { Clear-Host }; Arata; if ($Watch) { Start-Sleep 15 } } while ($Watch)
|
||||
@@ -15,6 +15,9 @@ param(
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-Location $ProjectRoot
|
||||
|
||||
# -Files explicit => comportamentul istoric (fara fisier de verificat, exit 0)
|
||||
$explicitFiles = $PSBoundParameters.ContainsKey('Files')
|
||||
|
||||
if (-not $Files -or $Files.Count -eq 0) {
|
||||
$tracked = git diff --name-only HEAD 2>$null
|
||||
$untracked = git ls-files --others --exclude-standard 2>$null
|
||||
@@ -24,8 +27,12 @@ if (-not $Files -or $Files.Count -eq 0) {
|
||||
}
|
||||
|
||||
if (-not $Files -or $Files.Count -eq 0) {
|
||||
Write-Output "Niciun fisier modificat - nimic de verificat."
|
||||
exit 0
|
||||
if ($explicitFiles) {
|
||||
Write-Output "Niciun fisier modificat - nimic de verificat."
|
||||
exit 0
|
||||
}
|
||||
Write-Output "Niciun fisier modificat - implementarea nu a produs diff."
|
||||
exit 1
|
||||
}
|
||||
|
||||
$failures = @()
|
||||
|
||||
@@ -140,11 +140,27 @@ nodes:
|
||||
|
||||
Aprobi implementarea conform acestui plan?
|
||||
|
||||
# ============================================================
|
||||
# b2. SNAPSHOT BASELINE (bash, 0 tokeni) - starea git INAINTE de implement,
|
||||
# ca `verifica`/`verifica2` sa poata detecta "diff gol" fara sa confunde
|
||||
# fisiere deja modificate (WIP neatins de implement, ex. docs/todos.txt)
|
||||
# cu munca reala a nodului. worktree.enabled: false -> toate nodurile
|
||||
# lucreaza pe acelasi working copy, deci fara acest instantaneu un
|
||||
# checkout deja murdar ar face "diff gol" nedetectabil (26.09.2026).
|
||||
# ============================================================
|
||||
- id: snapshot_baseline
|
||||
depends_on: [aprobare_plan]
|
||||
bash: |
|
||||
mkdir -p "$ARTIFACTS_DIR"
|
||||
cd D:/roa/roacont
|
||||
{ git status --porcelain; git -C COMUN status --porcelain | sed 's/^/COMUN: /'; } > "$ARTIFACTS_DIR/baseline_status.txt"
|
||||
echo "Baseline: $(wc -l < "$ARTIFACTS_DIR/baseline_status.txt") linii modificate/netracked inainte de implement."
|
||||
|
||||
# ============================================================
|
||||
# c. IMPLEMENT (Pi / DeepSeek V4.1 Flash, prin abonamentul opencode go)
|
||||
# ============================================================
|
||||
- id: implement
|
||||
depends_on: [aprobare_plan]
|
||||
depends_on: [snapshot_baseline]
|
||||
provider: pi
|
||||
model: opencode-go/deepseek-v4.1-flash
|
||||
idle_timeout: 900000
|
||||
@@ -210,15 +226,50 @@ nodes:
|
||||
|
||||
# ============================================================
|
||||
# d. VERIFICA (bash, 0 tokeni) - primul rand
|
||||
# Garda diff-gol/stop_reason=length (26.09.2026, run aca8c771): un
|
||||
# implement care nu scrie nimic (sau se opreste trunchiat cu
|
||||
# stop_reason=length) trecea aici cu OK ("nimic de verificat" din
|
||||
# verifica_vfp_text.ps1 -> exit 0), sarind direct la `review` in loc de
|
||||
# `implement_retry`. Cele doua verificari noi sunt independente de
|
||||
# verifica_vfp_text.ps1 si se aplica peste rezultatul lui.
|
||||
# IMPORTANT: `when: "$verifica.output == 'FAIL'"` cere ca $verifica.output
|
||||
# sa fie STRICT literalul "OK"/"FAIL" (egalitate exacta pe tot stdout-ul
|
||||
# nodului, nu pe ultima linie - confirmat din codul `archon.exe`, functiile
|
||||
# `ly7`/`ny7`: `.output` fara sub-camp returneaza stdout-ul brut integral).
|
||||
# `cat`-ul vechi al log-ului inainte de OK/FAIL facea `$verifica.output`
|
||||
# mereu multi-linie -> `implement_retry`/`escaladare` NU se declansau
|
||||
# niciodata in executie reala (doar testele dry-run cu stub literal
|
||||
# "FAIL" pareau sa functioneze). Confirmat empiric 26.09.2026: dry-run
|
||||
# --exec-code cu implement stubbat (fara scriere) a dat "...FAIL" pe
|
||||
# ultima linie, dar `implement_retry` a fost "skipped: when_condition_false".
|
||||
# Fix: stdout-ul nodului e STRICT tokenul OK/FAIL; detaliile merg in
|
||||
# $ARTIFACTS_DIR/verifica_log.txt (deja citit explicit de implement_retry).
|
||||
# ============================================================
|
||||
- id: verifica
|
||||
depends_on: [implement]
|
||||
bash: |
|
||||
mkdir -p "$ARTIFACTS_DIR"
|
||||
powershell -ExecutionPolicy Bypass -File D:/roa/roacont/.archon/scripts/verifica_vfp_text.ps1 -ProjectRoot D:\roa\roacont > "$ARTIFACTS_DIR/verifica_log.txt" 2>&1
|
||||
cd D:/roa/roacont
|
||||
LOG="$ARTIFACTS_DIR/verifica_log.txt"
|
||||
powershell -ExecutionPolicy Bypass -File D:/roa/roacont/.archon/scripts/verifica_vfp_text.ps1 -ProjectRoot D:\roa\roacont > "$LOG" 2>&1
|
||||
RC=$?
|
||||
cat "$ARTIFACTS_DIR/verifica_log.txt"
|
||||
if [ $RC -eq 0 ]; then echo OK; else echo FAIL; fi
|
||||
FAIL=0
|
||||
if [ $RC -ne 0 ]; then FAIL=1; fi
|
||||
|
||||
{ git status --porcelain; git -C COMUN status --porcelain | sed 's/^/COMUN: /'; } > "$ARTIFACTS_DIR/status_after_implement.txt"
|
||||
if diff -q "$ARTIFACTS_DIR/baseline_status.txt" "$ARTIFACTS_DIR/status_after_implement.txt" > /dev/null 2>&1; then
|
||||
echo "DIFF_GOL: implement nu a modificat niciun fisier fata de inceputul rularii." >> "$LOG"
|
||||
FAIL=1
|
||||
fi
|
||||
|
||||
SQLITE="D:/roa/roacont/sqlite3.exe"; DB="C:/Users/mmari/.archon/archon.db"
|
||||
RUNID=$("$SQLITE" -ascii "$DB" "SELECT id FROM remote_agent_workflow_runs WHERE workflow_name='roa-fix' AND working_path LIKE '%ROACONT%' ORDER BY started_at DESC LIMIT 1;" 2>/dev/null | tr -d '\036\037')
|
||||
if [ -n "$RUNID" ] && "$SQLITE" -ascii "$DB" "SELECT data FROM remote_agent_workflow_events WHERE workflow_run_id='$RUNID' AND step_name='implement' AND event_type='node_completed' ORDER BY event_order DESC LIMIT 1;" 2>/dev/null | grep -q '"stop_reason":"length"'; then
|
||||
echo "STOP_REASON_LENGTH: nodul implement s-a oprit trunchiat (stop_reason=length)." >> "$LOG"
|
||||
FAIL=1
|
||||
fi
|
||||
|
||||
if [ $FAIL -eq 1 ]; then echo FAIL; else echo OK; fi
|
||||
|
||||
# ============================================================
|
||||
# e. RETRY: implement inca o data cu eroarea, apoi re-verifica
|
||||
@@ -241,13 +292,32 @@ nodes:
|
||||
Iesirea verificarii (citeste si $ARTIFACTS_DIR/verifica_log.txt pentru detalii complete):
|
||||
$verifica.output
|
||||
|
||||
# `escaladare` foloseste `$verifica2.output == 'FAIL'` - aceeasi cerinta de
|
||||
# egalitate exacta ca la `verifica` (vezi nota de acolo); stdout STRICT OK/FAIL.
|
||||
- id: verifica2
|
||||
depends_on: [implement_retry]
|
||||
bash: |
|
||||
powershell -ExecutionPolicy Bypass -File D:/roa/roacont/.archon/scripts/verifica_vfp_text.ps1 -ProjectRoot D:\roa\roacont > "$ARTIFACTS_DIR/verifica_log2.txt" 2>&1
|
||||
cd D:/roa/roacont
|
||||
LOG="$ARTIFACTS_DIR/verifica_log2.txt"
|
||||
powershell -ExecutionPolicy Bypass -File D:/roa/roacont/.archon/scripts/verifica_vfp_text.ps1 -ProjectRoot D:\roa\roacont > "$LOG" 2>&1
|
||||
RC=$?
|
||||
cat "$ARTIFACTS_DIR/verifica_log2.txt"
|
||||
if [ $RC -eq 0 ]; then echo OK; else echo FAIL; fi
|
||||
FAIL=0
|
||||
if [ $RC -ne 0 ]; then FAIL=1; fi
|
||||
|
||||
{ git status --porcelain; git -C COMUN status --porcelain | sed 's/^/COMUN: /'; } > "$ARTIFACTS_DIR/status_after_retry.txt"
|
||||
if diff -q "$ARTIFACTS_DIR/baseline_status.txt" "$ARTIFACTS_DIR/status_after_retry.txt" > /dev/null 2>&1; then
|
||||
echo "DIFF_GOL: implement_retry nu a modificat niciun fisier fata de inceputul rularii." >> "$LOG"
|
||||
FAIL=1
|
||||
fi
|
||||
|
||||
SQLITE="D:/roa/roacont/sqlite3.exe"; DB="C:/Users/mmari/.archon/archon.db"
|
||||
RUNID=$("$SQLITE" -ascii "$DB" "SELECT id FROM remote_agent_workflow_runs WHERE workflow_name='roa-fix' AND working_path LIKE '%ROACONT%' ORDER BY started_at DESC LIMIT 1;" 2>/dev/null | tr -d '\036\037')
|
||||
if [ -n "$RUNID" ] && "$SQLITE" -ascii "$DB" "SELECT data FROM remote_agent_workflow_events WHERE workflow_run_id='$RUNID' AND step_name='implement_retry' AND event_type='node_completed' ORDER BY event_order DESC LIMIT 1;" 2>/dev/null | grep -q '"stop_reason":"length"'; then
|
||||
echo "STOP_REASON_LENGTH: nodul implement_retry s-a oprit trunchiat (stop_reason=length)." >> "$LOG"
|
||||
FAIL=1
|
||||
fi
|
||||
|
||||
if [ $FAIL -eq 1 ]; then echo FAIL; else echo OK; fi
|
||||
|
||||
# ============================================================
|
||||
# al doilea esec -> escaladare la Opus
|
||||
@@ -292,6 +362,10 @@ nodes:
|
||||
diff (corectitudine, nu stil). Verifica fiecare afirmatie pe codul real inainte de
|
||||
verdict - citeste fisierele schimbate, nu doar diful.
|
||||
|
||||
Confirma implementarea prin hash: `git hash-object <fisier>` ==
|
||||
`git rev-parse HEAD:<fisier>` pe fisierele tinta din plan; egalitate = diff gol =
|
||||
BLOCANT "nu exista implementare", nu se trece la analiza calitatii codului.
|
||||
|
||||
## Cautare rapida (obligatorie)
|
||||
Niciodata `grep -r` pe tot arborele `D:\ROA\ROACONT`. In ordine:
|
||||
1. Unealta `grep`/`find` (rapide, bazate pe ripgrep) sau `rg` direct din bash - exclude
|
||||
|
||||
@@ -134,6 +134,7 @@ Cand un bug apare "de azi", compara cu clasa veche fara sa atingi SVN:
|
||||
scrie in log.
|
||||
- **Doua constructii care NU compileaza, dar trec de `txt2vcx`** (storno eFactura, 18.09.2026): `NEWOBJECT('c', 'lib.vcx', , p1, ...)` cu argumentul 3 omis ("Function argument value, type, or count is invalid" - pune `''`) si `CREATEOBJECT(...).Metoda()` inlantuit ("Syntax error"). `txt2vcx` (si `-DryRun`) NU compileaza metodele: dupa write-back, copiaza `.vcx`/`.vct` in ACELASI folder sub alt nume (parintii se rezolva relativ), `COMPILE CLASSLIB` headless, citeste `.ERR`, sterge copia.
|
||||
- **`FOR EACH` pe `loDom.selectNodes(...)`** da la rulare "Expression evaluator failed". Foloseste `loN = loDom.selectNodes(...)` + `FOR i = 0 TO loN.length - 1` / `loN.item(i)`.
|
||||
- **`COUNT ... TO x IN alias` nu e sintaxa VFP9** (eroare "Command contains unrecognized phrase/keyword", vizibila doar in `.ERR`): `COUNT` nu are `IN`; fa `SELECT (cAlias)` inainte, apoi `COUNT FOR ... TO x`.
|
||||
|
||||
## 7. Capcane la SCRIEREA scriptului de test
|
||||
|
||||
|
||||
@@ -17,6 +17,11 @@
|
||||
*!* 15.09.2021
|
||||
*!* verific_analitic - acont_alt, explicatie_alt
|
||||
|
||||
*!* 25.09.2026
|
||||
*!* marius.mutu
|
||||
*!* verificare_note_contabile - garzi pe id_fact/tva_incasare/nract, pentru cursorii care nu au aceste campuri
|
||||
*!* LipsuriNoteContabile - coloreaza celulele cu campuri lipsa si sare la urmatorul rand cu lipsuri
|
||||
|
||||
******************************** INCEPUT: viz_act ********************************
|
||||
Procedure viz_act
|
||||
Lparameters tnCurs,tcValuta
|
||||
@@ -589,9 +594,11 @@ Procedure verificare_note_contabile
|
||||
*!* 18.09.2026
|
||||
*!* marius.mutu
|
||||
*!* marcaj opt-in al randurilor cu campuri lipsa, doar daca apelantul are campul clipsa pe cursor
|
||||
Local llMarcajLipsuri, llMesajConstruit, lcClipsaRand, lcScopVerif
|
||||
Local llMarcajLipsuri, llMesajConstruit, lcClipsaRand, lcScopVerif, llCuIdFact, llCuNract
|
||||
lcScopVerif = Iif(Vartype(tnRecno) = 'N' And tnRecno > 0, 'RECORD ' + Transform(tnRecno), 'ALL') && tnRecno: verific doar randul dat
|
||||
llMarcajLipsuri = (Type(lcAct + '.clipsa') = 'C')
|
||||
llCuIdFact = (Type(lcAct + '.id_fact') = 'N' And Type(lcAct + '.tva_incasare') = 'N')
|
||||
llCuNract = (Type(lcAct + '.nract') <> 'U')
|
||||
llMesajConstruit = .F.
|
||||
If llMarcajLipsuri
|
||||
Replace &lcScopVerif clipsa With '' In (lcAct)
|
||||
@@ -604,7 +611,7 @@ Procedure verificare_note_contabile
|
||||
lcScc = Alltrim(Nvl(scc,''))
|
||||
*!* 07.05.2013 : verific id_fact de pe notele de TVA devenit exigibil ( 4426 - 4428 si 4428 - 4427 ), id_factc
|
||||
*!* si id_factd sa nu fie marcate ca sterse in tabela "documente"
|
||||
lcIdFact = Iif(id_fact>0 and tva_incasare=1 and ((scd = [4426] and scc = [4428]) or (scd = [4428] and scc = [4427])),Alltrim(Str(id_fact)),[])
|
||||
lcIdFact = Iif(llCuIdFact And id_fact>0 and tva_incasare=1 and ((scd = [4426] and scc = [4428]) or (scd = [4428] and scc = [4427])),Alltrim(Str(id_fact)),[])
|
||||
lcIdFact = lcIdFact + Iif(id_factc>0,Iif(!Empty(lcIdFact),[,],[]) + Alltrim(Str(id_factc)),[])
|
||||
lcIdFact = lcIdFact + Iif(id_factd>0,Iif(!Empty(lcIdFact),[,],[]) + Alltrim(Str(id_factd)),[])
|
||||
*!* 07.05.2013 ^
|
||||
@@ -629,7 +636,7 @@ Procedure verificare_note_contabile
|
||||
Endif
|
||||
Endif
|
||||
*!* 11.03.2008 ^
|
||||
If Empty(nract)
|
||||
If llCuNract And Empty(nract)
|
||||
ll_return = .F.
|
||||
If !llMesajConstruit
|
||||
lcMesaj = lcMesaj + ',' + 'nr.document'
|
||||
@@ -1060,6 +1067,7 @@ Procedure verificare_note_contabile
|
||||
|
||||
*!* modificare 14.11.2007
|
||||
*!* Verificare mai multe nr act pe acelasi Id fact
|
||||
If llCuIdFact And llCuNract
|
||||
Select Distinct id_fact,nract From &lcAct Where !Inlist(Nvl(id_fact,0),0,-1) ;
|
||||
and !(tva_incasare=1 and ((scd = [4426] and scc = [4428]) or (scd = [4428] and scc = [4427]))) ; && modificare ROACONT v 2.4.4
|
||||
Into Cursor cduplicatetemp1
|
||||
@@ -1081,6 +1089,7 @@ Procedure verificare_note_contabile
|
||||
ll_return = .F.
|
||||
Endif
|
||||
Use In (Select("cduplicatetemp"))
|
||||
Endif
|
||||
|
||||
*!* modificare ROAPRODUCTIE v 2.0.2
|
||||
If !Empty(lcMesaj) And !tlFaraMesaj
|
||||
@@ -2129,3 +2138,164 @@ Procedure Eval_balanta
|
||||
Repl All totcred With Round(totcred/tnCurs,gnPval)
|
||||
|
||||
Endproc && eval_balanta
|
||||
******************************************************************************************
|
||||
Define Class LipsuriNoteContabile As Custom
|
||||
cAlias = ''
|
||||
lVerificAnalitic = .F.
|
||||
lCacheProprie = .F.
|
||||
|
||||
Procedure Init(tcAlias, tlVerificAnalitic)
|
||||
This.cAlias = tcAlias
|
||||
This.lVerificAnalitic = tlVerificAnalitic
|
||||
Endproc
|
||||
|
||||
Procedure Coloreaza(toGrid)
|
||||
*!* coloanele de completat se coloreaza roz; coloana se recunoaste dupa ControlSource, nu dupa pozitia din grila
|
||||
Local lnCol, lnCfg, lnI, loCol, lcCs, lcCamp, lcExpr
|
||||
Local Array laCfg(10,3)
|
||||
laCfg(1,1) = 'scd'
|
||||
laCfg(1,2) = 'S'
|
||||
laCfg(1,3) = 'Empty(' + This.cAlias + '.scd) Or Upper(Left(' + This.cAlias + '.scd,1)) = "X"'
|
||||
laCfg(2,1) = 'scc'
|
||||
laCfg(2,2) = 'C'
|
||||
laCfg(2,3) = 'Empty(' + This.cAlias + '.scc) Or Upper(Left(' + This.cAlias + '.scc,1)) = "X"'
|
||||
laCfg(3,1) = 'ascd'
|
||||
laCfg(3,2) = 'a'
|
||||
laCfg(3,3) = '.T.'
|
||||
laCfg(4,1) = 'ascc'
|
||||
laCfg(4,2) = 'b'
|
||||
laCfg(4,3) = '.T.'
|
||||
laCfg(5,1) = 'partd'
|
||||
laCfg(5,2) = 'p'
|
||||
laCfg(5,3) = 'Empty(Nvl(' + This.cAlias + '.id_partd,0))'
|
||||
laCfg(6,1) = 'partc'
|
||||
laCfg(6,2) = 'q'
|
||||
laCfg(6,3) = 'Empty(Nvl(' + This.cAlias + '.id_partc,0))'
|
||||
laCfg(7,1) = 'pereched'
|
||||
laCfg(7,2) = 'd'
|
||||
laCfg(7,3) = 'Empty(Nvl(' + This.cAlias + '.pereched,0))'
|
||||
laCfg(8,1) = 'perechec'
|
||||
laCfg(8,2) = 'c'
|
||||
laCfg(8,3) = 'Empty(Nvl(' + This.cAlias + '.perechec,0))'
|
||||
laCfg(9,1) = 'nume_val'
|
||||
laCfg(9,2) = 'V'
|
||||
laCfg(9,3) = 'Empty(Nvl(' + This.cAlias + '.id_valuta,0))'
|
||||
laCfg(10,1) = 'denumiretax'
|
||||
laCfg(10,2) = 'T'
|
||||
laCfg(10,3) = 'Empty(Nvl(' + This.cAlias + '.id_jtva_coloana,0))'
|
||||
For lnCol = 1 To toGrid.ColumnCount
|
||||
lcCs = Alltrim(toGrid.Columns(lnCol).ControlSource)
|
||||
If Empty(lcCs)
|
||||
Loop
|
||||
Endif
|
||||
lcCamp = Lower(Getwordnum(lcCs, Getwordcount(lcCs, '.'), '.'))
|
||||
lnCfg = 0
|
||||
For lnI = 1 To Alen(laCfg,1)
|
||||
If laCfg(lnI,1) = lcCamp
|
||||
lnCfg = lnI
|
||||
Exit
|
||||
Endif
|
||||
Endfor
|
||||
If lnCfg = 0
|
||||
Loop
|
||||
Endif
|
||||
loCol = toGrid.Columns(lnCol)
|
||||
lcExpr = Alltrim(loCol.DynamicBackColor)
|
||||
If Empty(lcExpr)
|
||||
lcExpr = Transform(loCol.BackColor)
|
||||
Endif
|
||||
loCol.DynamicBackColor = "Iif('" + laCfg(lnCfg,2) + "' $ " + This.cAlias + ".clipsa And (" + laCfg(lnCfg,3) + "), Rgb(255,205,205), " + lcExpr + ")"
|
||||
Endfor
|
||||
Endproc
|
||||
|
||||
Procedure Verifica(toForm)
|
||||
*!* verificare silentioasa: marcheaza lipsurile in clipsa, repozitioneaza pe randul curent si reactualizeaza eticheta
|
||||
Local lnRecno, lnLipsuri, lnSucces, lcSql, llLock
|
||||
If !Used(This.cAlias) Or Type(This.cAlias + '.clipsa') <> 'C'
|
||||
Return
|
||||
Endif
|
||||
If !Used('crsLipsuriCfg')
|
||||
lcSql = 'select distinct c.cont as contpart, c.fel_cont, c.cu_inregistrari, c.explicatie as explic_cont, e.cont_c as exceptie, e.debit as pozitie, e.invers, 0 as gasit ' + ;
|
||||
'from ' + gcS + '.vconfig_cont_ireg c left join ' + gcS + '.exceptii_ireg e on c.cont = e.cont and e.invers = 1'
|
||||
lnSucces = goExecutor.oExecute(lcSql, 'crsLipsuriCfg')
|
||||
If lnSucces > 0
|
||||
lcSql = 'select CONT, ACONT from ' + gcS + '.vplcont_ANALITIC where inactiv = 0 and an = ?gnAn'
|
||||
lnSucces = goExecutor.oExecute(lcSql, 'crsLipsuriPlcont')
|
||||
Endif
|
||||
If lnSucces < 1
|
||||
If Used('crsLipsuriCfg')
|
||||
Use In crsLipsuriCfg
|
||||
Endif
|
||||
If Used('crsLipsuriPlcont')
|
||||
Use In crsLipsuriPlcont
|
||||
Endif
|
||||
Else
|
||||
This.lCacheProprie = .T.
|
||||
Endif
|
||||
Endif
|
||||
llLock = toForm.LockScreen
|
||||
toForm.LockScreen = .T.
|
||||
lnRecno = Recno(This.cAlias)
|
||||
verificare_note_contabile(This.cAlias, This.lVerificAnalitic, .F., .F., .T.)
|
||||
Select (This.cAlias)
|
||||
Replace clipsa With Alltrim(clipsa) + 'S' For !'S' $ clipsa And Upper(Left(Nvl(scd,''),1)) = 'X' And !Empty(suma)
|
||||
Replace clipsa With Alltrim(clipsa) + 'C' For !'C' $ clipsa And Upper(Left(Nvl(scc,''),1)) = 'X' And !Empty(suma)
|
||||
Count For !Empty(clipsa) To lnLipsuri
|
||||
Try
|
||||
Go lnRecno
|
||||
Catch
|
||||
Go Top
|
||||
Endtry
|
||||
toForm.lblLipsuri.Caption = 'Completeaza: ' + Transform(lnLipsuri)
|
||||
toForm.lblLipsuri.ToolTipText = 'Celulele rosii trebuie completate. Click pentru urmatorul rand.'
|
||||
toForm.lblLipsuri.Visible = (lnLipsuri > 0)
|
||||
If lnLipsuri > 0
|
||||
toForm.lblLipsuri.Left = toForm.But_nou1.Left - toForm.lblLipsuri.Width - 12
|
||||
Endif
|
||||
toForm.Gridb1.Refresh()
|
||||
toForm.LockScreen = llLock
|
||||
Endproc
|
||||
|
||||
Procedure SaltUrmatoare
|
||||
*!* click pe eticheta: sare la urmatorul rand cu lipsuri, cu revenire la primul la capatul listei
|
||||
Local lnRec, loForm
|
||||
Local Array laEv(1)
|
||||
AEVENTS(laEv, 0)
|
||||
If Alen(laEv,1) = 0 Or Vartype(laEv(1)) <> 'O'
|
||||
Return
|
||||
Endif
|
||||
loForm = laEv(1).Parent
|
||||
Select (This.cAlias)
|
||||
lnRec = Recno(This.cAlias)
|
||||
If !Eof()
|
||||
Skip
|
||||
Endif
|
||||
Locate Rest For !Empty(clipsa)
|
||||
If !Found()
|
||||
Locate For !Empty(clipsa)
|
||||
Endif
|
||||
If Found()
|
||||
loForm.Gridb1.SetFocus()
|
||||
loForm.Gridb1.Refresh()
|
||||
Else
|
||||
Try
|
||||
Go lnRec
|
||||
Catch
|
||||
Go Top
|
||||
Endtry
|
||||
Endif
|
||||
Endproc
|
||||
|
||||
Procedure Destroy
|
||||
*!* cache-ul se inchide doar daca l-a incarcat acest obiect
|
||||
If This.lCacheProprie
|
||||
If Used('crsLipsuriCfg')
|
||||
Use In crsLipsuriCfg
|
||||
Endif
|
||||
If Used('crsLipsuriPlcont')
|
||||
Use In crsLipsuriPlcont
|
||||
Endif
|
||||
Endif
|
||||
Endproc
|
||||
Enddefine
|
||||
******************************************************************************************
|
||||
@@ -59,6 +59,11 @@
|
||||
*!* introducere_compacta
|
||||
*!* Aduc explicatia, explicatia4 si explicatia5 in cursorul introdc, ca sa poata fi editate pe fiecare rand din grila
|
||||
|
||||
*!* 25.09.2026
|
||||
*!* marius.mutu
|
||||
*!* introducere_compacta
|
||||
*!* Campul clipsa in cursorul introdc, pentru marcajul si colorarea randurilor cu campuri lipsa
|
||||
|
||||
*--------------------------------------------
|
||||
Function deschide_menu
|
||||
Parameters tabela, cc1, cc2, mnrtata, stinga, sus, ONT
|
||||
@@ -882,7 +887,7 @@ Procedure introducere_compacta
|
||||
A.nresp, A.id_sectie, A.sectie, A.id_venchelt, A.dst_chlt, N.id_jtax As id_jtva_coloana, ;
|
||||
00000000000000 As id_factd, 00000000000000 As id_factc, 00000000000000 As pereched, 00000000000000 As perechec, ;
|
||||
a.nrord, a.id_lucrare, ;
|
||||
A.explicatia, A.explicatia4, A.explicatia5 ;
|
||||
A.explicatia, A.explicatia4, A.explicatia5, Space(10) As clipsa ;
|
||||
From cnote_contabile N Join actactan A On N.ID_SET = A.ID_SET ;
|
||||
Where N.ID_SET = tn_idset ;
|
||||
Into Cursor introdc Readwrite Order By ordine
|
||||
|
||||
@@ -21,11 +21,16 @@ a lui Marius.
|
||||
|
||||
## Pasi
|
||||
|
||||
1. Confirma ca sursa de referinta `MARIUSM_AUTO` (pe `ROA_CENTRAL`) e la zi: compara scripturile
|
||||
din `SCRIPTURI_CLAR` cu inregistrarile din `VERSIUNE`. Daca lipseste vreunul, opreste-te si
|
||||
semnaleaza-i lui Marius. Nu porni de la sursa citita dintr-o schema de client.
|
||||
2. Alege numele `<prefix>_YYYY_MM_DD_NN_<subiect>.sql`. Prefixe in uz: `ff`, `co`, `sys`, `ris`,
|
||||
`rf`. `NN` e o secventa **unica pe zi, comuna tuturor prefixelor**.
|
||||
0. Scripturile stau in `SCRIPTURI_CLAR\YYYY\MM\`, nu direct in `SCRIPTURI_CLAR`. Cauta intai un
|
||||
script precedent pe aceeasi tabela (`grep -ril "<tabela>" D:/ROA/DATABASE/SCRIPTURI_CLAR`) si
|
||||
copiaza-i tiparul; cauta si valoarea/codul, ca sa nu adaugi ceva deja livrat.
|
||||
1. La schimbari de **obiecte** (pachet, view, tabela) confirma ca sursa de referinta `MARIUSM_AUTO`
|
||||
(pe `ROA_CENTRAL`) e la zi: compara scripturile din `SCRIPTURI_CLAR` cu inregistrarile din
|
||||
`VERSIUNE`. Daca lipseste vreunul, opreste-te si semnaleaza-i lui Marius. Nu porni de la sursa
|
||||
citita dintr-o schema de client. La un simplu `merge` de date de referinta pasul nu e necesar.
|
||||
2. Alege numele `<prefix>_YYYY_MM_DD_NN_<subiect>.sql`, in folderul `YYYY\MM` al datei. Prefixe
|
||||
in uz: `ff`, `co`, `sys`, `ris`, `rf`. `NN` e o secventa **unica pe zi, comuna tuturor
|
||||
prefixelor** (`ls -R SCRIPTURI_CLAR | grep YYYY_MM_DD`).
|
||||
3. Scrie scriptul ASCII, CRLF, **scoped** pe cazul tratat si **idempotent** (`merge`,
|
||||
`where <coloana> is null`). Un pachet sta singur in scriptul lui, fara alt DDL/DML alaturi.
|
||||
4. Termina **fiecare instructiune** explicit cu `;` (sau `/` pentru blocurile PL/SQL).
|
||||
@@ -96,7 +101,7 @@ Fara dovada nu se spune "gata". Ruleaza si pastreaza iesirea:
|
||||
Verificarea de ASCII + CRLF (trebuie sa intoarca `0` si `True`):
|
||||
|
||||
```powershell
|
||||
$b = [IO.File]::ReadAllBytes('D:\ROA\DATABASE\SCRIPTURI_CLAR\<script>.sql')
|
||||
$b = [IO.File]::ReadAllBytes('D:\ROA\DATABASE\SCRIPTURI_CLAR\YYYY\MM\<script>.sql')
|
||||
($b | Where-Object { $_ -gt 127 }).Count
|
||||
($b -join ',').Contains('13,10')
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user