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
542 lines
26 KiB
Plaintext
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
|