Import parteneri: se curata doar CNP-urile invalide, codul persoanelor juridice ramane neatins

This commit is contained in:
2026-08-02 10:29:34 +03:00
parent 349130c369
commit da19090ed9
10 changed files with 754 additions and 139 deletions

View File

@@ -0,0 +1,59 @@
<#
.SYNOPSIS
Recompileaza formularele/clasele VFP dupa un write-back din text (bin_din_text.ps1).
.DESCRIPTION
FoxBin2Prg regenereaza .scx/.sct DIN TEXT, dar fara codul obiect compilat. Un formular
regenerat si NErecompilat ruleaza fara `#INCLUDE`-uri: constantele din comun.h (CT_SUCCES,
CT_INSUCCES...) devin "Variable not found" abia in RUNTIME, nu la verificarea de sintaxa.
De aceea, dupa FIECARE bin_din_text.ps1 se ruleaza si scriptul asta.
.EXAMPLE
powershell -ExecutionPolicy Bypass -File Teste\bin_din_text.ps1 -TextFile frm_import.sc2
powershell -ExecutionPolicy Bypass -File Teste\recompileaza_binare.ps1
#>
[CmdletBinding()]
param(
[string[]]$Formular = @('frm_import.scx'),
[string]$ProjectRoot
)
$ErrorActionPreference = 'Stop'
if (-not $ProjectRoot) { $ProjectRoot = Split-Path $PSScriptRoot -Parent }
$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
if (-not (Test-Path $vfp)) { throw "Nu gasesc $vfp" }
$prg = Join-Path $env:TEMP ("recompile_" + [guid]::NewGuid().ToString('N') + '.prg')
$linii = @(
"SET DEFAULT TO `"$ProjectRoot`"",
"SET PATH TO `"$ProjectRoot`""
)
foreach ($f in $Formular) {
$cale = Join-Path $ProjectRoot $f
if (-not (Test-Path $cale)) { throw "Nu exista $cale" }
$linii += "COMPILE FORM `"$f`""
}
$linii += 'QUIT'
[IO.File]::WriteAllLines($prg, $linii, [Text.Encoding]::GetEncoding(1252))
try {
& $vfp -A -T $prg | Out-Null
} finally {
Remove-Item $prg -ErrorAction SilentlyContinue
}
# verificare: .sct trebuie sa contina cod obiect, nu doar textul metodelor
$rezultate = foreach ($f in $Formular) {
$sct = Join-Path $ProjectRoot ([IO.Path]::ChangeExtension($f, '.sct'))
[pscustomobject]@{
Formular = $f
SCT_KB = if (Test-Path $sct) { [math]::Round((Get-Item $sct).Length / 1KB) } else { 0 }
Stare = if ((Test-Path $sct) -and (Get-Item $sct).Length -gt 0) { 'OK' } else { 'LIPSA' }
}
}
$rezultate | Format-Table -AutoSize
if ($rezultate | Where-Object { $_.Stare -ne 'OK' }) { exit 1 }
Write-Host 'Recompilare terminata.' -ForegroundColor Green

View File

@@ -34,7 +34,8 @@ $Root = Split-Path $Teste -Parent
$suita = @(
@{ Prg = 'test_frm_import_ui.prg'; Steps = @('afisat', 'trace', 'date') }
@{ Prg = 'test_export_date.prg'; Steps = @('afisat', 'importat') }
@{ Prg = 'test_cod_fiscal.prg'; Steps = @('validari') }
@{ Prg = 'test_cod_fiscal.prg'; Steps = @('validari') }
@{ Prg = 'test_cod_fiscal_real.prg'; Steps = @('analiza') }
)
if ($Doar) { $suita = $suita | Where-Object { $_.Prg -like "*$Doar*" } }

View File

@@ -1,6 +1,11 @@
* test_cod_fiscal.prg - test unitar pentru GetCodFiscalValid (validare CNP / CUI la import parteneri).
* Verifica regula ceruta: cod fiscal / CNP invalid => se salveaza GOL in ROA, ca sa nu dea
* erori la declaratii (D394 / D406).
* test_cod_fiscal.prg - teste pentru clasificarea partenerilor importati si curatarea CNP-urilor.
*
* Regula verificata:
* - PERSOANA FIZICA cu CNP invalid => cod fiscal GOL (permis la D394/D406)
* - PERSOANA FIZICA cu CNP valid => CNP pastrat, curatat de spatii/puncte
* - PERSOANA JURIDICA => codul NU se sterge NICIODATA, chiar daca nu trece
* validarea romaneasca (poate fi partener strain),
* ca sa fim atentionati la validarea declaratiei
*
* Rulare directa:
* vfp9.exe -A -T "D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_cod_fiscal.prg"
@@ -31,70 +36,172 @@ DO HarnessInit
LOCAL lnTip, lcRez
*--- CNP valid: se pastreaza, tip persoana fizica ---
*==============================================================
* 1. PERSOANE FIZICE - singurele la care se sterge codul
*==============================================================
lnTip = 0
lcRez = GetCodFiscalValid('1800101410013', @lnTip)
TestAssertEqual('1800101410013', m.lcRez, 'CNP valid pastrat')
TestAssertEqual(2, m.lnTip, 'CNP valid => persoana fizica')
lcRez = GetCodFiscalValid('1800101410013', @lnTip, 'POPESCU ION', 'ZV 093375')
TestAssertEqual('1800101410013', m.lcRez, 'PF: CNP valid pastrat')
TestAssertEqual(2, m.lnTip, 'PF: CNP valid => persoana fizica')
*--- CNP valid murdar (spatii, punct): se curata si ramane ---
TestAssertEqual('1800101410013', GetCodFiscalValid(' 1800101410013. '), 'CNP valid curatat de spatii/punct')
TestAssertEqual('1800101410013', GetCodFiscalValid(' 1800101410013. ', @lnTip, 'POPESCU ION', ''), ;
'PF: CNP valid curatat de spatii si punct')
*--- CNP cu cifra de control gresita => sir gol ---
TestAssertEqual('', GetCodFiscalValid('1800101410018'), 'CNP cu cifra de control alterata se sterge')
TestAssertEqual('', GetCodFiscalValid('2650407170374'), 'CNP invalid real din Fidelio (1)')
TestAssertEqual('', GetCodFiscalValid('1550622400577'), 'CNP invalid real din Fidelio (2)')
*--- lungimi gresite (12 / 14 cifre) => sir gol ---
TestAssertEqual('', GetCodFiscalValid('171030126201'), '12 cifre => invalid')
TestAssertEqual('', GetCodFiscalValid('29050709211182'), '14 cifre => invalid')
TestAssertEqual('', GetCodFiscalValid('60109121600600'), '14 cifre => invalid (2)')
* '2920121295914.' are 13 cifre dupa curatarea punctului si CNP-ul e valid => se pastreaza
TestAssertEqual('2920121295914', GetCodFiscalValid('2920121295914.'), 'CNP valid cu punct la final se curata')
*--- CUI persoana juridica ---
* CNP-uri invalide reale din Fidelio: codul se goleste
lnTip = 0
lcRez = GetCodFiscalValid('RO21675175', @lnTip)
TestAssertEqual('RO21675175', m.lcRez, 'CUI cu prefix RO pastrat')
TestAssertEqual(1, m.lnTip, 'CUI => persoana juridica')
lcRez = GetCodFiscalValid('2650407170374', @lnTip, 'TRUTA CLAUDIA MIHAELA', 'RK 800386')
TestAssertEqual('', m.lcRez, 'PF: CNP cu cifra de control gresita se sterge')
TestAssertEqual(2, m.lnTip, 'PF: ramane persoana fizica')
TestAssertEqual('RO23565004', GetCodFiscalValid('RO 23565004'), 'CUI cu spatiu normalizat')
TestAssertEqual('', GetCodFiscalValid('171030126201', @lnTip, 'TARTA GAVRIL SILVIU', ''), ;
'PF: CNP de 12 cifre se sterge')
TestAssertEqual('', GetCodFiscalValid('29050709211182', @lnTip, 'HOGESCU CRISTINA', ''), ;
'PF: CNP de 14 cifre se sterge')
TestAssertEqual('', GetCodFiscalValid('60109121600600', @lnTip, 'IOANCA DAMARIS', ''), ;
'PF: CNP de 14 cifre se sterge (2)')
* CNP valid scris cu punct la final
TestAssertEqual('2920121295914', GetCodFiscalValid('2920121295914.', @lnTip, 'ANDREI MARIA', ''), ;
'PF: CNP valid cu punct la final se curata')
* persoana fizica fara niciun semnal, cod invalid => tot persoana fizica, cod gol
lnTip = 0
lcRez = GetCodFiscalValid('287101935573', @lnTip, 'OPREA ANDREEA', '')
TestAssertEqual('', m.lcRez, 'PF: fara semnale, cod invalid => gol')
TestAssertEqual(2, m.lnTip, 'PF: fara semnale => persoana fizica')
*==============================================================
* 2. PERSOANE JURIDICE - codul NU se sterge niciodata
*==============================================================
lnTip = 0
lcRez = GetCodFiscalValid('RO21675175', @lnTip, 'JUST MULTISERV SRL', 'J03/245/2007')
TestAssertEqual('RO21675175', m.lcRez, 'PJ: CUI cu prefix RO pastrat')
TestAssertEqual(1, m.lnTip, 'PJ: prefix RO => persoana juridica')
TestAssertEqual('RO23565004', GetCodFiscalValid('RO 23565004', @lnTip, 'FIRMA SRL', ''), ;
'PJ: spatiul din cod se elimina')
lnTip = 0
lcRez = GetCodFiscalValid('24536740', @lnTip)
TestAssertEqual('24536740', m.lcRez, 'CUI fara RO pastrat')
TestAssertEqual(1, m.lnTip, 'CUI fara RO => persoana juridica')
lcRez = GetCodFiscalValid('24536740', @lnTip, 'KALVA SOLUTIONS SRL', 'J29/2677/2008')
TestAssertEqual('24536740', m.lcRez, 'PJ: CUI fara RO pastrat')
TestAssertEqual(1, m.lnTip, 'PJ: denumire cu SRL => persoana juridica')
*--- CUI cu cifra de control gresita => sir gol ---
TestAssertEqual('', GetCodFiscalValid('24536741'), 'CUI cu cifra de control gresita se sterge')
*--- valori goale / fara cifre utile ---
TestAssertEqual('', GetCodFiscalValid(''), 'sir gol')
TestAssertEqual('', GetCodFiscalValid(' '), 'spatii')
*--- parteneri STRAINI: codul nu respecta algoritmul romanesc, deci NU se sterge ---
* CUI romanesc GRESIT la o persoana juridica: NU se sterge, ca sa dea eroare la declaratie
lnTip = 0
lcRez = GetCodFiscalValid('BE0325777171', @lnTip)
TestAssertEqual('BE0325777171', m.lcRez, 'TVA belgian pastrat ca atare')
TestAssertEqual(1, m.lnTip, 'cod strain => persoana juridica')
lcRez = GetCodFiscalValid('24536741', @lnTip, 'KALVA SOLUTIONS SRL', 'J29/2677/2008')
TestAssertEqual('24536741', m.lcRez, 'PJ: CUI invalid NU se sterge')
TestAssertEqual(1, m.lnTip, 'PJ: CUI invalid ramane persoana juridica')
TestAssertEqual('DICA9712015/99KS', GetCodFiscalValid('DICA9712015/99KS'), 'cod strain cu slash pastrat')
TestAssertEqual('NN9J17714', GetCodFiscalValid('NN9J17714'), 'cod strain alfanumeric pastrat')
TestAssertEqual('XD 061964', GetCodFiscalValid('XD 061964'), 'cod strain cu spatiu pastrat')
TestAssertEqual('ABC', GetCodFiscalValid('ABC'), 'cod strain fara cifre pastrat')
*--- prefixele romanesti se trateaza tot cu regulile RO ---
TestAssertEqual('RO14770212', GetCodFiscalValid('CUI 14770212'), 'prefix CUI => CUI romanesc valid')
TestAssertEqual('RO12870', GetCodFiscalValid('RO 12870'), 'CUI scurt valid, spatiu eliminat')
TestAssertEqual('', GetCodFiscalValid('RO 12871'), 'CUI romanesc invalid se sterge')
*--- codul de tara declarat opreste validarea romaneasca ---
* partener strain cu cod alfanumeric
lnTip = 0
lcRez = GetCodFiscalValid('123456789012345', @lnTip, 'BE')
TestAssertEqual('123456789012345', m.lcRez, 'cod numeric cu tara straina nu se valideaza romaneste')
TestAssertEqual(1, m.lnTip, 'tara straina => persoana juridica')
lcRez = GetCodFiscalValid('BE0325777171', @lnTip, 'UNIVERSITE DE LIEGE', '')
TestAssertEqual('BE0325777171', m.lcRez, 'PJ straina: TVA belgian pastrat')
TestAssertEqual(1, m.lnTip, 'PJ straina: cod TVA intracomunitar => persoana juridica')
TestAssertEqual('', GetCodFiscalValid('1800101410018', 0, 'RO'), 'tara RO => se valideaza romaneste')
TestAssertEqual('DICA9712015/99KS', GetCodFiscalValid('DICA9712015/99KS', @lnTip, 'FIRMA STRAINA SRL', ''), ;
'PJ straina: cod cu slash pastrat cand denumirea are forma juridica')
* cod cu litere care NU e cod de TVA si fara alt semnal => pasaport de persoana fizica
lnTip = 0
lcRez = GetCodFiscalValid('NN9J17714', @lnTip, 'TORRES MELISSA', '')
TestAssertEqual('', m.lcRez, 'PF straina: pasaportul nu se salveaza pe cod fiscal')
TestAssertEqual(2, m.lnTip, 'PF straina: pasaport fara alt semnal => persoana fizica')
* prefixul romanesc se normalizeaza la RO
lnTip = 0
lcRez = GetCodFiscalValid('CUI 14770212', @lnTip, 'ASOCIATIA JUDETEANA DE HANDBAL', '')
TestAssertEqual('14770212', m.lcRez, 'PJ: eticheta CUI se scoate, fara sa se adauge RO')
TestAssertEqual(1, m.lnTip, 'PJ: eticheta CUI => persoana juridica')
* 'RO' inseamna platitor de TVA: in ROA e ALT partener decat neplatitorul cu acelasi numar,
* deci prefixul se pastreaza exact cum vine si NU se adauga niciodata de noi
TestAssertEqual('RO24536740', GetCodFiscalValid('RO24536740', @lnTip, 'KALVA SOLUTIONS SRL', ''), ;
'PJ platitoare de TVA: prefixul RO se pastreaza')
TestAssertEqual('24536740', GetCodFiscalValid('24536740', @lnTip, 'KALVA SOLUTIONS SRL', ''), ;
'PJ neplatitoare: NU se adauga RO')
* partener strain cu cod NUMAI DIN CIFRE, recunoscut dupa tara
lnTip = 0
lcRez = GetCodFiscalValid('123456789012345', @lnTip, 'HOTEL PARTNER', '', 'BE')
TestAssertEqual('123456789012345', m.lcRez, 'PJ straina: cod numeric cu tara straina se pastreaza')
TestAssertEqual(1, m.lnTip, 'PJ straina: tara straina => persoana juridica')
* persoana juridica recunoscuta dupa numarul de registrul comertului
lnTip = 0
lcRez = GetCodFiscalValid('99999999', @lnTip, 'DENUMIRE FARA FORMA JURIDICA', 'J40/5790/2018')
TestAssertEqual('99999999', m.lcRez, 'PJ: cod invalid pastrat cand exista nr. reg. comertului')
TestAssertEqual(1, m.lnTip, 'PJ: nr. registrul comertului => persoana juridica')
lnTip = 0
lcRez = GetCodFiscalValid('88888888', @lnTip, 'TICMAR EMMA CONCEPT', 'J2018000211289')
TestAssertEqual(1, m.lnTip, 'PJ: nr. reg. comertului fara slash => persoana juridica')
lnTip = 0
lcRez = GetCodFiscalValid('9924188', @lnTip, 'CAR CFR SECTIA L2 SI CT1 BRAILA', '54/1997')
TestAssertEqual(1, m.lnTip, 'PJ: numar/an => persoana juridica')
* tipul venit direct din import bate toate celelalte semnale
lnTip = 0
lcRez = GetCodFiscalValid('1800101410013', @lnTip, 'POPESCU ION', '', '', '1')
TestAssertEqual('1800101410013', m.lcRez, 'tip impus PJ: codul se pastreaza')
TestAssertEqual(1, m.lnTip, 'tip impus din import => persoana juridica')
*==============================================================
* 3. Recuperare din campuri inversate in Fidelio
*==============================================================
* operatorul a scris pasaportul pe cod fiscal si CNP-ul pe serie CI
lnTip = 0
lcRez = GetCodFiscalValid('XD 061964', @lnTip, 'POPITIU IOANA', '2640626364228')
TestAssertEqual('2640626364228', m.lcRez, 'recuperare: CNP valid luat din campul de serie CI')
TestAssertEqual(2, m.lnTip, 'recuperare: ramane persoana fizica')
* daca in campul de serie CI nu exista CNP valid, nu inventam nimic
TestAssertEqual('', GetCodFiscalValid('XD 061964', @lnTip, 'POPITIU IOANA', 'ZV 093375'), ;
'recuperare: fara CNP valid in serie CI ramane gol')
*==============================================================
* 4. Cazuri limita
*==============================================================
lnTip = 0
TestAssertEqual('', GetCodFiscalValid('', @lnTip, 'POPESCU ION', ''), 'cod gol ramane gol')
TestAssertEqual(2, m.lnTip, 'cod gol + nume de persoana => persoana fizica')
lnTip = 0
TestAssertEqual('', GetCodFiscalValid(' ', @lnTip, 'POPESCU ION', ''), 'spatii => gol')
lnTip = 0
lcRez = GetCodFiscalValid('', @lnTip, 'ALFA CONSTRUCT SRL', '')
TestAssertEqual('', m.lcRez, 'PJ fara cod ramane fara cod')
TestAssertEqual(1, m.lnTip, 'PJ fara cod este tot persoana juridica')
*--- functiile ajutatoare ---
TestAssert(EstePersoanaJuridica('KALVA SOLUTIONS SRL'), 'EstePersoanaJuridica: SRL')
TestAssert(EstePersoanaJuridica('ASOCIATIA SPORTIVA X'), 'EstePersoanaJuridica: ASOCIATIA')
TestAssert(EstePersoanaJuridica('UNIVERSITE DE LIEGE'), 'EstePersoanaJuridica: UNIVERSITE')
TestAssert(!EstePersoanaJuridica('SAVU MARIA'), 'EstePersoanaJuridica: SAVU nu e SA')
TestAssert(!EstePersoanaJuridica('MIHAII ION'), 'EstePersoanaJuridica: MIHAII nu e II')
TestAssert(!EstePersoanaJuridica('POPESCU ION'), 'EstePersoanaJuridica: nume simplu')
TestAssert(EsteNrRegComert('J40/5790/2018'), 'EsteNrRegComert: J40/5790/2018')
TestAssert(EsteNrRegComert('J2018000211289'), 'EsteNrRegComert: J2018000211289')
TestAssert(EsteNrRegComert('54/1997'), 'EsteNrRegComert: 54/1997')
TestAssert(!EsteNrRegComert('ZV 093375'), 'EsteNrRegComert: serie CI nu e reg. comert')
TestAssert(!EsteNrRegComert(''), 'EsteNrRegComert: gol')
TestAssert(EsteSerieCI('ZV 093375'), 'EsteSerieCI: cu spatiu')
TestAssert(EsteSerieCI('IF834409'), 'EsteSerieCI: fara spatiu')
TestAssert(!EsteSerieCI('J40/5790/2018'), 'EsteSerieCI: nr. reg. comert nu e serie CI')
TestAssert(!EsteSerieCI('2990118070015'), 'EsteSerieCI: CNP nu e serie CI')
TestAssert(EsteCodTVAStrain('BE0325777171'), 'EsteCodTVAStrain: BE')
TestAssert(EsteCodTVAStrain('DE811234567'), 'EsteCodTVAStrain: DE')
TestAssert(!EsteCodTVAStrain('NN9J17714'), 'EsteCodTVAStrain: pasaport nu e cod TVA')
TestAssert(!EsteCodTVAStrain('XD061964'), 'EsteCodTVAStrain: serie pasaport nu e cod TVA')
TestAssertEqual('RO23565004', GetCodFiscalCurat('RO 23565004'), 'GetCodFiscalCurat: spatii, RO pastrat')
TestAssertEqual('14770212', GetCodFiscalCurat('CUI 14770212'), 'GetCodFiscalCurat: eticheta CUI se scoate')
TestAssertEqual('14770212', GetCodFiscalCurat('CF 14770212'), 'GetCodFiscalCurat: eticheta CF se scoate')
TestAssertEqual('2920121295914', GetCodFiscalCurat('2920121295914.'), 'GetCodFiscalCurat: punct')
DO HarnessStep WITH 0, 'validari cod fiscal'

View File

@@ -0,0 +1,133 @@
* test_cod_fiscal_real.prg - ruleaza GetCodFiscalValid pe TOATE codurile din XML-urile Fidelio
* si scrie un raport, ca sa vedem efectul real inainte de import.
*
* Verifica invariantii care conteaza pentru declaratii:
* - nicio persoana JURIDICA nu ramane fara cod din cauza noastra (codul nu se sterge)
* - se sterge cod DOAR la persoane fizice si DOAR cand CNP-ul chiar este invalid
* - niciun CNP valid nu se pierde
*
* Rulare: vfp9.exe -A -T "D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_cod_fiscal_real.prg"
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gcSyncDir, gnTestFail, gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnTestFail = 0
gnMockRaspuns = 6
gcMockUltimMesaj = ''
gnMockUltimTip = 0
LOCAL lcTestDir
lcTestDir = ADDBS(JUSTPATH(SYS(16, 0)))
gcUILog = lcTestDir + 'test_cod_fiscal_real_log.txt'
gcSyncDir = lcTestDir + 'uisync\'
IF !DIRECTORY(gcSyncDir)
MD (gcSyncDir)
ENDIF
STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
DO (lcTestDir + 'test_init_env_auto.prg') WITH .F.
SET PROCEDURE TO (lcTestDir + 'ui_harness.prg') ADDITIVE
SET PROCEDURE TO (lcTestDir + 'mock_amessagebox.prg') ADDITIVE
DO HarnessInit
LOCAL lcCale, lcFisier, lnFisiere, lcRaport
lcCale = ADDBS(ALLTRIM(goApp.oSettings.cale_import_fidelio))
HarnessLog('Citesc XML-urile din: ' + m.lcCale)
CREATE CURSOR cTot (denumire C(200), cod C(50), reg_com C(50))
lnFisiere = 0
lnSarite = 0
lcFisier = SYS(2000, m.lcCale + 'bts_detalii_facturi_rep_*.xml')
DO WHILE !EMPTY(m.lcFisier)
lnRanduri = 0
* fisierele goale sau fara coloanele asteptate se sar controlat
TRY
lnRanduri = XMLTOCURSOR(m.lcCale + m.lcFisier, 'cUnul', 512)
CATCH
lnRanduri = 0
ENDTRY
IF m.lnRanduri > 0 AND USED('cUnul') AND ;
TYPE('cUnul.codfiscal_cnp') = 'C' AND TYPE('cUnul.cumparator') = 'C'
SELECT DISTINCT CAST(ALLTRIM(cumparator) AS C(200)) AS denumire, ;
CAST(ALLTRIM(codfiscal_cnp) AS C(50)) AS cod, ;
CAST(ALLTRIM(regcomert_ci_pass) AS C(50)) AS reg_com ;
FROM cUnul WHERE !EMPTY(NVL(codfiscal_cnp, '')) INTO CURSOR cTemp
SELECT cTot
APPEND FROM DBF('cTemp')
USE IN (SELECT('cTemp'))
lnFisiere = m.lnFisiere + 1
ELSE
lnSarite = m.lnSarite + 1
ENDIF
USE IN (SELECT('cUnul'))
lcFisier = SYS(2000, m.lcCale + 'bts_detalii_facturi_rep_*.xml', 1)
ENDDO
HarnessLog('Fisiere citite: ' + TRANSFORM(m.lnFisiere) + ', sarite (goale/fara coloane): ' + TRANSFORM(m.lnSarite))
TestAssert(m.lnFisiere > 0, 'exista fisiere XML de analizat')
SELECT DISTINCT denumire, cod, reg_com FROM cTot INTO CURSOR cUnic
HarnessLog('Combinatii distincte nume+cod+regcom: ' + TRANSFORM(RECCOUNT('cUnic')))
LOCAL lnPF, lnPJ, lnSters, lnPJNevalidat, lnCnpPierdut, lnPJFaraCod
LOCAL lnTip, lcRez, lcCifre, lcCod
STORE 0 TO lnPF, lnPJ, lnSters, lnPJNevalidat, lnCnpPierdut, lnPJFaraCod
lcRaport = 'denumire;cod_import;reg_com;tip;cod_salvat' + CHR(13) + CHR(10)
SELECT cUnic
SCAN
lcCod = ALLTRIM(cUnic.cod)
lnTip = 0
lcRez = GetCodFiscalValid(m.lcCod, @lnTip, cUnic.denumire, cUnic.reg_com)
IF m.lnTip = 1
lnPJ = m.lnPJ + 1
* invariant 1: la persoana juridica NU stergem niciodata codul
IF EMPTY(m.lcRez) AND !EMPTY(m.lcCod)
lnPJFaraCod = m.lnPJFaraCod + 1
HarnessLog('EROARE invariant: PJ ramasa fara cod: ' + ALLTRIM(cUnic.denumire) + ' [' + m.lcCod + ']')
ENDIF
IF !VerifCF(m.lcRez)
lnPJNevalidat = m.lnPJNevalidat + 1
ENDIF
ELSE
lnPF = m.lnPF + 1
IF EMPTY(m.lcRez)
lnSters = m.lnSters + 1
* invariant 2: nu stergem CNP-uri VALIDE
lcCifre = CHRTRAN(m.lcCod, CHRTRAN(m.lcCod, '0123456789', ''), '')
IF LEN(m.lcCifre) = 13 AND cValidCNP(m.lcCifre)
lnCnpPierdut = m.lnCnpPierdut + 1
HarnessLog('EROARE invariant: CNP valid pierdut: ' + ALLTRIM(cUnic.denumire) + ' [' + m.lcCod + ']')
ENDIF
ENDIF
ENDIF
lcRaport = m.lcRaport + ALLTRIM(cUnic.denumire) + ';' + m.lcCod + ';' + ALLTRIM(cUnic.reg_com) + ';' + ;
IIF(m.lnTip = 1, 'PJ', 'PF') + ';' + m.lcRez + CHR(13) + CHR(10)
ENDSCAN
STRTOFILE(m.lcRaport, m.lcTestDir + 'raport_cod_fiscal_real.csv', .F.)
HarnessLog('persoane fizice : ' + TRANSFORM(m.lnPF))
HarnessLog('persoane juridice : ' + TRANSFORM(m.lnPJ))
HarnessLog('PF cu CNP sters : ' + TRANSFORM(m.lnSters))
HarnessLog('PJ cu cod nevalidat RO : ' + TRANSFORM(m.lnPJNevalidat) + ' (raman cu cod, atentioneaza declaratia)')
TestAssertEqual(0, m.lnPJFaraCod, 'nicio persoana juridica nu ramane fara cod')
TestAssertEqual(0, m.lnCnpPierdut, 'niciun CNP valid nu se pierde')
TestAssert(m.lnPF + m.lnPJ > 1000, 's-au analizat toti partenerii din exemple')
TestAssert(m.lnSters > 0, 'exista CNP-uri invalide care se curata')
TestAssert(m.lnPJ > 0, 'exista si persoane juridice detectate')
DO HarnessStep WITH 0, 'analiza pe date reale'
HarnessLog('REZULTAT: ' + TestRezultat())
DO HarnessDone WITH TestRezultat()
QUIT