Files
comun/utile/Teste/editare_factura/test_s9_8_flux.prg
Marius Mutu 8e022d332e #13: formular de facturare unificat - etapa curenta
Squash al branch-ului de lucru plan13-s2.

Clase: ofacturare (nucleul formularului unificat), ofacturare_comun,
ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de
cautare), omodificari.

Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si
ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie
si cota standard de TVA cand articolul nu are cota pe politica.

Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea
testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte
proiecte sunt rezolvate pastrand ambele parti.

Loguri de rulare a testelor scoase din versionare; testele raman.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
2026-09-09 21:38:25 +03:00

542 lines
26 KiB
Plaintext

* test_s9_8_flux.prg
* Proba S9-8 (docs\propunere_s9_stergere_reemitere.md:115): testul de flux. Reemitere IDENTICA +
* reemitere CU MODIFICARI, pe cate un document din fiecare familie de dispecerizare a scrierii
* (ofacturare.vc2:20171,20214,20249): AVIZ (tip=4), COMANDA (tip in 3,21,25,28,42,47), CONTRACT
* (tip in 2,6,26,52), ELSE (restul - aici tip=-3). Depinde de S9-1..S9-7, toate probate.
*
* Foloseste acelasi driver ca test_s9_7_cablare_idfact.prg (IncarcaAntetFacturaEditare +
* IncarcaLiniiFacturaEditare + do_scrie_factura() REAL, fara nicio fortare manuala si fara
* glRegenerareEditare - fortarea ID_FACT o face automat cablajul S9-7). Diferenta: scenariul A
* (identica) NU modifica nimic pe crsfactura inainte de apel; scenariul B (modificata) creste
* cantitatea primei linii cu 1, ca in test_s9_7.
*
* CONSTATARE, verificata pe cod (ofacturare_rutare_scriere.prg:69-95) inainte de a scrie probele
* de mai jos: AlegeRutaScriereEditare intoarce ruta 1 (regenerare = sterge+reemite) NUMAI cand
* LiniiAuSumeSchimbate() gaseste o diferenta reala fata de instantaneu (cantitate/pret/discount/
* tva/gestiune/lot/serie sau discountul de document). O salvare FARA nicio modificare nu trece
* niciodata prin sterge+reemite - ea cade pe ruta 0 (nimic), exact ca a doua chemare din D3
* (test_s9_7 P5). Deci scenariul A ("reemitere identica") NU produce un rand DOCUMENTE "STERS
* revenit la 0" prin fluxul normal de editare - documentul original ramane pur si simplu neatins.
* Testat mai jos ca atare (ruta 0 confirmata, nimic scris), nu fortat artificial pe ruta 1.
*
* Parametru tnRulare:
* 0 = DESCOPERIRE (read-only, nu scrie nimic) - lista candidati vii pe fiecare familie, pentru
* alegerea documentelor de mai jos. Nu face parte din sweep-ul de proba.
* 1 = AVIZ A (identica) doc 1118 (DATA_ACT 2026/8 - coincide cu perioada implicita)
* 2 = AVIZ B (modificata) doc 1189 (DATA_ACT 2026/8 - coincide cu perioada implicita;
* lantul 1119 -> 1180 -> 1182 -> 1184 -> 1186 -> 1189, fiecare rulare B isi consuma documentul)
* 3 = COMANDA A (identica) doc 306
* 4 = COMANDA B (modificata) doc 1188 (DATA_ACT 2014/1 - necesita tnForceAn=2014,
* tnForceLuna=1; doc 146 initial ales a picat cu ORA-01400 chiar cu perioada implicita,
* pastrat in raport ca prima dovada a CONSTATARII a doua)
* 5 = CONTRACT A (identica) doc 630
* 6 = CONTRACT B (modificata) doc 1191 (DATA_ACT 2024/7 - necesita tnForceAn=2024,
* tnForceLuna=7; lantul 992 -> 1191, fiecare rulare B isi consuma documentul;
* doc 1192 e rezerva echivalenta, din lantul 870 -> 1192)
* 7 = ELSE A (identica) doc 372 (tip -3)
* 8 = ELSE B (modificata) doc 1190 (tip 1, DATA_ACT 2014/1 - necesita tnForceAn=2014,
* tnForceLuna=1; lantul 580 -> 1172 -> 1181 -> 1183 -> 1185 -> 1187 -> 1190, fiecare rulare B isi consuma documentul)
*
* Scenariul A verifica: ruta aleasa e 0 (nimic), niciun document nou, iar documentul ORIGINAL
* ramane neatins (ID_FACT/serie/numar/total/STERS/ID_UTIL/DATAORA identice) - vezi CONSTATAREA
* de mai sus. Scenariul B verifica: ruta 1, ID_FACT pastrat pe documentul NOU, serie/numar
* identice (identitatea de act), randul DOCUMENTE reinviat (STERS revenit la 0), ID_UTIL/DATAORA
* initiale (auditul de creare nu se rescrie), TOTAL_CU_TVA schimbat (modificarea a ajuns in
* Oracle) si legatura cu sursa (AVIZ: VANZARI_CORESP tip=1; COMANDA/CONTRACT:
* FACT_VFACTURI.id_comanda/id_ctr) pastrata pe documentul NOU.
*
* Documente alese prin interogare directa (sqlplus, citite, nu scrise) pe MARIUSM_AUTO, apoi
* verificate ca nu apar in niciun alt fisier din COMUN\utile\Teste (grep pe numar exact) - vezi
* raportul S9-8 pentru lista completa cercetata si motivul alegerii fiecarui id.
*
* CONSTATARE (a doua): rularea 4 pe doc 146 (id_facturare NULL) A DAT ORA-01400 "cannot insert
* NULL into ACT_TEMP.ID_FDOC" (PACK_FACTURARE, linia ~11315, din 6309/5006) - dar acelasi
* ORA-01400 a reaparut IDENTIC si pe doc 631 (id_facturare=523, NENULL!) - deci NU e despre
* id_facturare. Cauza reala, confirmata pe codul test_s9_3_stergere.prg:15-17,61-67: candidatii
* eligibili pentru stergere/reemitere sunt filtrati explicit "extract(year/month from data_act) =
* gnAn/gnLuna" - mecanismul S9 (ACT_TEMP/VACT_TOT/VRUL_TOT) e SCOPAT pe perioada activa. Toate
* documentele COMANDA/CONTRACT/ELSE gasite initial sunt din 2008-2015, in afara perioadei active
* (gnAn/gnLuna, azi 2026/8) - de-asta pica orice document mai vechi, indiferent de familie sau de
* id_facturare. Solutia (tiparul test_s9_3): tnForceAn/tnForceLuna, LPARAMETERS suplimentare care
* forteaza perioada activa sa coincida cu DATA_ACT a documentului tintit - vezi mai jos.
* CONSTATARE (a treia): familia CONTRACT nu e uniforma. Documentele CONTRACT ale caror linii
* au VANZARI_DETALII.ID_RATA <> 0 cad la reemitere cu "Too many columns." (VFP 1872), pentru
* ca PACK_FACTURARE body 5055-5058 le trimite prin contabilizeaza_rata - ramura pe care nicio
* alta familie n-o atinge. Documentele CONTRACT fara linii de rata trec (992, 870: 13/0).
* Docs 360 si 1055 sunt documente cu rata si raman datorie deschisa - docs/raport_contract_b.md.
*!* tnForceAn/tnForceLuna optionale (tiparul test_s9_3_stergere.prg:15-17): forteaza perioada
*!* activa gnAn/gnLuna sa coincida cu DATA_ACT a documentului tintit de scenariul B - necesar
*!* pentru COMANDA/CONTRACT/ELSE (vezi CONSTATAREA a doua); scenariile A si AVIZ nu au nevoie
*!* (A nu scrie nimic, AVIZ nu foloseste ACT_TEMP scopat pe perioada)
LPARAMETERS tnRulare, tnForceAn, tnForceLuna, tnIdFirma
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate, poSnapshotEditare, goFormReemitere
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s9_8_flux_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' rulare=' + TRANSFORM(tnRulare) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
*!* tnForceAn/tnForceLuna sosesc ca STRING cand vin din linia de comanda vfp9.exe (nu din DO...WITH
*!* intern) - VAL() le converteste; VAL('') = 0, iar EMPTY(0) e .T. in test_init_env_auto_..., deci
*!* neforsat cade corect pe YEAR(DATE())/MONTH(DATE())
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', VAL(TRANSFORM(tnForceAn)), VAL(TRANSFORM(tnForceLuna)), VAL(TRANSFORM(tnIdFirma))
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
*!* stub_verificare inaintea lui COMUN\FERESTRE: Do Form verificare (ofacturare.vc2) nu se afiseaza
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL lnRulare
lnRulare = VAL(TRANSFORM(tnRulare))
STRTOFILE('rulare ceruta: ' + TRANSFORM(lnRulare) + CHR(13) + CHR(10), gcErrLog, 1)
DO CASE
CASE lnRulare = 0
DO Descoperire
CASE lnRulare = 1
DO ProbaScenariu WITH 1118, 'AVIZ', .F., 'AVIZ-A'
CASE lnRulare = 2
DO ProbaScenariu WITH 1189, 'AVIZ', .T., 'AVIZ-B'
CASE lnRulare = 3
DO ProbaScenariu WITH 306, 'COMANDA', .F., 'COM-A'
CASE lnRulare = 4
DO ProbaScenariu WITH 1188, 'COMANDA', .T., 'COM-B'
CASE lnRulare = 5
DO ProbaScenariu WITH 630, 'CONTRACT', .F., 'CTR-A'
CASE lnRulare = 6
DO ProbaScenariu WITH 1191, 'CONTRACT', .T., 'CTR-B'
CASE lnRulare = 7
DO ProbaScenariu WITH 372, 'ELSE', .F., 'ELSE-A'
CASE lnRulare = 8
DO ProbaScenariu WITH 1190, 'ELSE', .T., 'ELSE-B'
OTHERWISE
STRTOFILE('EROARE: tnRulare trebuie sa fie intre 0 si 8' + CHR(13) + CHR(10), gcErrLog, 1)
ENDCASE
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
* Descoperire: LISTEAZA candidati vii (STERS=0, ID_FACT>0) pe fiecare familie - read-only, nu
* face parte din sweep-ul de proba. Rulata o singura data, inaintea alegerii documentelor de mai
* sus (rezultatul e citat in raportul S9-8, nu retesteaza nimic aici).
*==============================================================================================
PROCEDURE Descoperire
DO ListeazaCandidati WITH 'AVIZ', [tip=4 and exists (select 1 from vanzari_coresp vc where vc.tip=1 and vc.sters=0 and vc.id_vanzare_fact=v.id_vanzare)]
DO ListeazaCandidati WITH 'COMANDA', [tip in (3,21,25,28,42,47)]
DO ListeazaCandidati WITH 'CONTRACT', [tip in (2,6,26,52)]
DO ListeazaCandidati WITH 'ELSE', [tip not in (4,3,21,25,28,42,47,2,6,26,52)]
ENDPROC
PROCEDURE ListeazaCandidati
LPARAMETERS tcFamilie, tcFiltru
IF USED('v_disc98')
USE IN v_disc98
ENDIF
IF !goExecutor.oExecuta([select id_vanzare, tip, id_fact from vanzari v where sters=0 and nvl(id_fact,0)>0 and ] + ;
tcFiltru + [ and rownum <= 10 order by id_vanzare desc], 'v_disc98')
STRTOFILE('EROARE la descoperire ' + tcFamilie + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
STRTOFILE('--- candidati ' + tcFamilie + ' ---' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT v_disc98
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' id_fact=' + TRANSFORM(id_fact) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_disc98
ENDPROC
*==============================================================================================
* ProbaScenariu: reemite tnIdV o singura data. tlModifica = .F. -> reemitere IDENTICA (nicio
* schimbare pe crsfactura). tlModifica = .T. -> reemitere CU MODIFICARI (cantitatea primei linii
* +1). Verifica identitatea (ID_FACT, serie/numar/data), auditul de creare neschimbat, si - pe
* scenariul B - ca schimbarea a ajuns in Oracle (TOTAL_CU_TVA diferit) si ca legatura cu sursa
* s-a pastrat pe documentul nou (AVIZ: VANZARI_CORESP; COMANDA/CONTRACT: FACT_VFACTURI).
*==============================================================================================
PROCEDURE ProbaScenariu
LPARAMETERS tnIdV, tcFamilie, tlModifica, tcPrefix
LOCAL lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lcSerieInainte, lnNumarInainte
LOCAL lnTotalInainte, lnLegaturaInainte, lnComandaInainte, lnCtrInainte
LOCAL lnIdVNou, llRez, lcSerieDupa, lnNumarDupa, lnTotalDupa, lnLegaturaDupa
LOCAL lnComandaDupa, lnCtrDupa, lnLiniiInainte, lnLiniiDupa
IF !CititStareInainte(tnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte)
RETURN
ENDIF
CititAntetInainte(tnIdV, @lcSerieInainte, @lnNumarInainte, @lnTotalInainte, @lnComandaInainte, @lnCtrInainte)
lnLegaturaInainte = CititLegaturaSursa(tcFamilie, tnIdV)
lnLiniiInainte = NumaraLiniiVii(tnIdV)
STRTOFILE(tcPrefix + ' INAINTE: serie=[' + lcSerieInainte + '] numar=' + TRANSFORM(lnNumarInainte) + ;
' total=' + TRANSFORM(lnTotalInainte) + ' legatura=' + TRANSFORM(lnLegaturaInainte) + ;
' id_comanda=' + TRANSFORM(lnComandaInainte) + ' id_ctr=' + TRANSFORM(lnCtrInainte) + ;
' linii=' + TRANSFORM(lnLiniiInainte) + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL lnRuta
IF !ReemiteDocumentAuto2(tnIdV, @lnIdVNou, @llRez, tlModifica, @lnRuta)
RETURN
ENDIF
DO asserteaza WITH tcPrefix + '-1 do_scrie_factura() a intors .T.', llRez, TRANSFORM(llRez)
IF !llRez
RETURN
ENDIF
IF !tlModifica
*!* scenariul A, verificat pe cod (vezi antetul fisierului): fara nicio modificare, ruta e 0
*!* (nimic) - documentul ORIGINAL (tnIdV) trebuie sa ramana complet neatins, fara reemitere
DO asserteaza WITH tcPrefix + '-2 niciun document nou (ruta 0, nimic scris)', lnIdVNou = 0, TRANSFORM(lnIdVNou)
LOCAL lnIdFactAcum, lnStersAcum
lnIdFactAcum = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV))
lnStersAcum = Val1([select nvl(sters,-1) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV))
DO asserteaza WITH tcPrefix + '-3 ID_FACT-ul documentului original neschimbat', lnIdFactAcum = lnIdFactVechi, ;
TRANSFORM(lnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactAcum)
DO asserteaza WITH tcPrefix + '-4 documentul original ramane STERS = 0 (n-a fost sters/reemis)', ;
lnStersAcum = 0, TRANSFORM(lnStersAcum)
CititAntetInainte(tnIdV, @lcSerieDupa, @lnNumarDupa, @lnTotalDupa, @lnComandaDupa, @lnCtrDupa)
DO asserteaza WITH tcPrefix + '-5 serie/numar/total identice (nimic scris)', ;
lcSerieDupa == lcSerieInainte AND lnNumarDupa = lnNumarInainte AND lnTotalDupa = lnTotalInainte, ;
'[' + lcSerieInainte + '/' + TRANSFORM(lnNumarInainte) + '/' + TRANSFORM(lnTotalInainte) + ;
'] vs [' + lcSerieDupa + '/' + TRANSFORM(lnNumarDupa) + '/' + TRANSFORM(lnTotalDupa) + ']'
DO VerificaRandulDocumente WITH lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, tcPrefix
RETURN
ENDIF
*!* scenariul B: modificare reala -> ruta 1 -> sterge+reemite. Identitatea (ID_FACT, serie,
*!* numar) trebuie pastrata pe documentul NOU, iar continutul trebuie sa reflecte modificarea.
LOCAL lnIdFactNou
lnIdFactNou = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou))
DO asserteaza WITH tcPrefix + '-2 ID_FACT pastrat (identitate)', lnIdFactNou = lnIdFactVechi, ;
TRANSFORM(lnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactNou)
CititAntetInainte(lnIdVNou, @lcSerieDupa, @lnNumarDupa, @lnTotalDupa, @lnComandaDupa, @lnCtrDupa)
DO asserteaza WITH tcPrefix + '-3 serie/numar identice fata de inainte (identitatea de act pastrata)', ;
lcSerieDupa == lcSerieInainte AND lnNumarDupa = lnNumarInainte, ;
'[' + lcSerieInainte + '/' + TRANSFORM(lnNumarInainte) + '] vs [' + lcSerieDupa + '/' + TRANSFORM(lnNumarDupa) + ']'
DO VerificaRandulDocumente WITH lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, tcPrefix
DO asserteaza WITH tcPrefix + '-6 TOTAL_CU_TVA s-a schimbat (modificarea a ajuns in Oracle)', ;
lnTotalDupa <> lnTotalInainte, TRANSFORM(lnTotalInainte) + ' -> ' + TRANSFORM(lnTotalDupa)
DO CASE
CASE tcFamilie == 'AVIZ'
lnLegaturaDupa = CititLegaturaSursa(tcFamilie, lnIdVNou)
DO asserteaza WITH tcPrefix + '-7 legatura AVIZ (VANZARI_CORESP) pastrata pe documentul nou', ;
lnLegaturaDupa >= 1 AND lnLegaturaDupa = lnLegaturaInainte, ;
TRANSFORM(lnLegaturaInainte) + ' -> ' + TRANSFORM(lnLegaturaDupa)
CASE tcFamilie == 'COMANDA'
DO asserteaza WITH tcPrefix + '-7 legatura ID_COMANDA pastrata pe documentul nou', ;
lnComandaDupa = lnComandaInainte AND lnComandaInainte > 0, ;
TRANSFORM(lnComandaInainte) + ' -> ' + TRANSFORM(lnComandaDupa)
CASE tcFamilie == 'CONTRACT'
DO asserteaza WITH tcPrefix + '-7 legatura ID_CTR pastrata pe documentul nou', ;
lnCtrDupa = lnCtrInainte AND lnCtrInainte > 0, ;
TRANSFORM(lnCtrInainte) + ' -> ' + TRANSFORM(lnCtrDupa)
OTHERWISE
STRTOFILE(tcPrefix + '-7 familia ELSE nu are legatura sursa de verificat' + CHR(13) + CHR(10), gcErrLog, 1)
ENDCASE
*!* fara asta, o linie pierduta tacut la reemitere (FACT-005 / FACT-030) trece de toate
*!* asertiunile de mai sus, care verifica doar identitatea si antetul
lnLiniiDupa = NumaraLiniiVii(lnIdVNou)
DO asserteaza WITH tcPrefix + '-8 numarul de linii vii pastrat pe documentul nou', ;
lnLiniiDupa = lnLiniiInainte AND lnLiniiInainte > 0, ;
TRANSFORM(lnLiniiInainte) + ' -> ' + TRANSFORM(lnLiniiDupa)
ENDPROC
*==============================================================================================
* NumaraLiniiVii: cate linii nesterse are documentul.
*==============================================================================================
FUNCTION NumaraLiniiVii
LPARAMETERS tnIdV
RETURN Val1([select count(*) as v from vanzari_detalii where sters = 0 and id_vanzare = ] + TRANSFORM(tnIdV))
ENDFUNC
*==============================================================================================
* ReemiteDocumentAuto2: acelasi driver ca test_s9_7 (IncarcaAntetFacturaEditare +
* IncarcaLiniiFacturaEditare + do_scrie_factura() REAL, fara fortare manuala). tlModifica = .F.
* NU atinge crsfactura (reemitere identica); .T. creste cantitatea primei linii cu 1.
*==============================================================================================
PROCEDURE ReemiteDocumentAuto2
LPARAMETERS tnIdV, tnIdVNou, tlRez, tlModifica, tnRutaAleasa
LOCAL loForm, lnDiscRon, lnDiscVal, lnCantVeche, lnCantNoua, lnNr, lnIdVMaxInainte
lnIdVMaxInainte = Val1([select nvl(max(id_vanzare),0) as v from vanzari])
DO urma WITH 'IncarcaAntetFacturaEditare ' + TRANSFORM(tnIdV)
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal)
DO asserteaza WITH 'antetul documentului ' + TRANSFORM(tnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate)
IF VARTYPE(poDate) <> 'O'
RETURN .F.
ENDIF
DO urma WITH 'IncarcaLiniiFacturaEditare ' + TRANSFORM(tnIdV)
IncarcaLiniiFacturaEditare(poDate, tnIdV)
DO asserteaza WITH 'liniile documentului ' + TRANSFORM(tnIdV) + ' s-au incarcat', ;
USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1))
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
RETURN .F.
ENDIF
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
loForm = CREATEOBJECT('frm_facturare_articole2')
loForm.ndiscfactron = lnDiscRon
loForm.ndiscfactval = lnDiscVal
loForm.do_calculeaza_totaluri()
poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ;
tnIdV, Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV)), ;
Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV)), gnAn, gnLuna)
IF VARTYPE(poSnapshotEditare) <> 'O'
DO asserteaza WITH 'instantaneul de editare s-a creat (' + TRANSFORM(tnIdV) + ')', .F., VARTYPE(poSnapshotEditare)
RETURN .F.
ENDIF
IF tlModifica
SELECT crsfactura
GO TOP
lnCantVeche = cantitate
lnCantNoua = lnCantVeche + 1
REPLACE cantitate WITH lnCantNoua IN crsfactura
loForm.do_calculeaza_totaluri()
STRTOFILE('cantitate ' + TRANSFORM(lnCantVeche) + ' -> ' + TRANSFORM(lnCantNoua) + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
STRTOFILE('reemitere IDENTICA - crsfactura neatins' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
tnRutaAleasa = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura')
DO asserteaza WITH 'ruta aleasa e ' + TRANSFORM(IIF(tlModifica,1,0)) + IIF(tlModifica,' (regenerare)',' (nimic)') + ', doc ' + TRANSFORM(tnIdV), ;
tnRutaAleasa = IIF(tlModifica, 1, 0), TRANSFORM(tnRutaAleasa)
*!* FARA nicio fortare manuala, FARA glRegenerareEditare - fortarea o face automat cablajul S9-7
DO urma WITH 'do_scrie_factura (SCRIE IN ORACLE, fortare automata prin cablaj) doc ' + TRANSFORM(tnIdV)
tlRez = loForm.do_scrie_factura()
DO urma WITH 'do_scrie_factura a revenit, doc ' + TRANSFORM(tnIdV)
STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1)
goFormReemitere = loForm
lnNr = Val1([select count(*) as v from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxInainte))
tnIdVNou = 0
IF lnNr >= 1
tnIdVNou = Val1([select nvl(max(id_vanzare),0) as v from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxInainte))
ENDIF
STRTOFILE('documente noi nesterse dupa apel = ' + TRANSFORM(lnNr) + ' id_vanzare nou=' + TRANSFORM(tnIdVNou) + CHR(13) + CHR(10), gcErrLog, 1)
RETURN .T.
ENDPROC
*==============================================================================================
PROCEDURE CititStareInainte
LPARAMETERS tnIdV, tnIdFactVechi, tnIdUtilInainte, tcDataOraInainte
tnIdFactVechi = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV) + [ and sters = 0])
DO asserteaza WITH 'PRECONDITIE documentul ' + TRANSFORM(tnIdV) + ' e viu si are ID_FACT', tnIdFactVechi > 0, TRANSFORM(tnIdFactVechi)
IF tnIdFactVechi <= 0
RETURN .F.
ENDIF
tnIdUtilInainte = -1
tcDataOraInainte = ''
IF USED('v_doc98')
USE IN v_doc98
ENDIF
IF goExecutor.oExecuta([select id_util, to_char(dataora,'dd.mm.yyyy hh24:mi:ss') as dataorat from documente ] + ;
[where id_doc = ] + TRANSFORM(tnIdFactVechi), 'v_doc98')
SELECT v_doc98
IF RECCOUNT('v_doc98') = 1
GO TOP
tnIdUtilInainte = NVL(id_util, -1)
tcDataOraInainte = ALLTRIM(NVL(dataorat, ''))
ENDIF
USE IN v_doc98
ENDIF
STRTOFILE('INAINTE doc ' + TRANSFORM(tnIdV) + ': id_fact=' + TRANSFORM(tnIdFactVechi) + ;
' documente.id_util=' + TRANSFORM(tnIdUtilInainte) + ' documente.dataora=' + tcDataOraInainte + CHR(13) + CHR(10), gcErrLog, 1)
RETURN .T.
ENDPROC
*==============================================================================================
* CititAntetInainte: serie/numar/total/id_comanda/id_ctr direct din FACT_VFACTURI (o singura
* interogare, aceleasi coloane folosite si "inainte" si "dupa").
*==============================================================================================
PROCEDURE CititAntetInainte
LPARAMETERS tnIdV, tcSerie, tnNumar, tnTotal, tnComanda, tnCtr
tcSerie = ''
tnNumar = 0
tnTotal = -1
tnComanda = 0
tnCtr = 0
IF USED('v_ant98')
USE IN v_ant98
ENDIF
IF goExecutor.oExecuta([select nvl(serie_act,' ') as serie_act, nvl(numar_act,-1) as numar_act, ] + ;
[nvl(total_cu_tva,-1) as total_cu_tva, nvl(id_comanda,0) as id_comanda, nvl(id_ctr,0) as id_ctr ] + ;
[from fact_vfacturi where id_vanzare = ] + TRANSFORM(tnIdV), 'v_ant98')
SELECT v_ant98
IF RECCOUNT('v_ant98') = 1
GO TOP
tcSerie = ALLTRIM(NVL(serie_act, ''))
tnNumar = NVL(numar_act, -1)
tnTotal = NVL(total_cu_tva, -1)
tnComanda = NVL(id_comanda, 0)
tnCtr = NVL(id_ctr, 0)
ENDIF
USE IN v_ant98
ENDIF
ENDPROC
*==============================================================================================
* CititLegaturaSursa: numarul de avize sursa vii (VANZARI_CORESP TIP=1) legate de documentul dat.
* Foloseste doar familia AVIZ; celelalte familii se verifica direct din FACT_VFACTURI.
*==============================================================================================
FUNCTION CititLegaturaSursa
LPARAMETERS tcFamilie, tnIdV
IF tcFamilie <> 'AVIZ'
RETURN -1
ENDIF
RETURN Val1([select count(*) as v from vanzari_coresp where tip=1 and sters=0 and id_vanzare_fact = ] + TRANSFORM(tnIdV))
ENDFUNC
*==============================================================================================
PROCEDURE VerificaRandulDocumente
LPARAMETERS tnIdDoc, tnIdUtilInainte, tcDataOraInainte, tcPrefix
LOCAL lnSters, lnIdUtil, lcDataOra
IF USED('v_ver98')
USE IN v_ver98
ENDIF
IF !goExecutor.oExecuta([select sters, id_util, to_char(dataora,'dd.mm.yyyy hh24:mi:ss') as dataorat ] + ;
[from documente where id_doc = ] + TRANSFORM(tnIdDoc), 'v_ver98')
DO asserteaza WITH tcPrefix + '-4 randul reinviat s-a putut citi', .F., 'eroare interogare'
RETURN
ENDIF
SELECT v_ver98
IF RECCOUNT('v_ver98') <> 1
DO asserteaza WITH tcPrefix + '-4 randul reinviat exista o singura data', .F., TRANSFORM(RECCOUNT('v_ver98'))
USE IN v_ver98
RETURN
ENDIF
GO TOP
lnSters = NVL(sters, -1)
lnIdUtil = NVL(id_util, -1)
lcDataOra = ALLTRIM(NVL(dataorat, ''))
USE IN v_ver98
DO asserteaza WITH tcPrefix + '-4 randul reinviat are STERS = 0', lnSters = 0, TRANSFORM(lnSters)
DO asserteaza WITH tcPrefix + '-5a ID_UTIL neschimbat (audit de creare)', lnIdUtil = tnIdUtilInainte, ;
TRANSFORM(tnIdUtilInainte) + ' -> ' + TRANSFORM(lnIdUtil)
DO asserteaza WITH tcPrefix + '-5b DATAORA neschimbata (audit de creare)', lcDataOra == tcDataOraInainte, ;
'[' + tcDataOraInainte + '] -> [' + lcDataOra + ']'
ENDPROC
*==============================================================================================
* Val1: o singura valoare numerica dintr-un select care aliaseaza coloana ca "v".
*==============================================================================================
FUNCTION Val1
LPARAMETERS tcSql
LOCAL lnRet
lnRet = -1
IF USED('v_val98')
USE IN v_val98
ENDIF
IF goExecutor.oExecuta(tcSql, 'v_val98')
SELECT v_val98
IF RECCOUNT('v_val98') > 0
GO TOP
lnRet = NVL(v_val98.v, -1)
ENDIF
USE IN v_val98
ELSE
STRTOFILE('EROARE Val1: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
RETURN lnRet
ENDFUNC
PROCEDURE urma
LPARAMETERS tcPas
STRTOFILE('URMA ' + TTOC(DATETIME()) + ' ' + m.tcPas + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
gnFail = gnFail + 1
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC