#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
This commit is contained in:
541
utile/Teste/editare_factura/test_s9_8_flux.prg
Normal file
541
utile/Teste/editare_factura/test_s9_8_flux.prg
Normal file
@@ -0,0 +1,541 @@
|
||||
* 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
|
||||
Reference in New Issue
Block a user