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
923 lines
47 KiB
Plaintext
923 lines
47 KiB
Plaintext
* test_s8_editare_incarcare.prg
|
|
* Suita COMPLETA a pasului 8 (docs\propunere_s8_incarcare.md §5.1): G1-G11 intr-o singura rulare,
|
|
* traseul REAL Newobject('frm_facturi') + .do_editare_unificata() (nu Createobject direct pe
|
|
* frm_facturare_articole2 - proba doar codul, nu rutarea, cf. handoff §4.0a).
|
|
*
|
|
* NU inlocuieste test_s8_pas7_cablare.prg (ramane pe loc, neatins) - o completeaza cu:
|
|
* - un al treilea tip de sursa (1047, DEVIZE AUTO, fara delegat)
|
|
* - un document AVIZ pozitiv (1110, tip=22) si unul NEGATIV/istoric (953, tip=23, respins de garda
|
|
* "luna curenta") - Ct_clb_politici_preturi ramane totusi neexercitat, vezi raportul (motivat mai jos)
|
|
* - G3/G4/G4b (linii) verificate si pe traseul COMPLET, nu doar pe IncarcaLiniiFacturaEditare izolat
|
|
* - R1: curatenie de aliasuri + jurnal AUSED() intre cazuri (lectia din triaj_s8_regresie_28fail.md)
|
|
* - R2: diagnostic care distinge, cand formularul NU se deschide, intre iesire CU mesaj de garda,
|
|
* iesire silentioasa CONFIRMATA prin IncarcaAntetFacturaEditare (ofacturare_editare.prg:83-86) si
|
|
* iesire silentioasa NEEXPLICATA de acea cale (candidat: cursa driverului/Timer)
|
|
*
|
|
* Documente reale, gasite prin interogare read-only pe MARIUSM_AUTO (probe_s8p8_candidati.prg,
|
|
* probe_s8p8_garzi.prg - pastrate ca dovada in acest director):
|
|
* 1113 - sursa COMANDA (tip=3) [reluat din pas7, stabil 133/0 x3]
|
|
* 1055 - sursa CONTRACT (tip=2) [reluat din pas7]
|
|
* 1048 - factura SIMPLA, lista de preturi (tip=1) [reluat din pas7]
|
|
* 1130 - VALUTA (tip=5) [reluat din pas7]
|
|
* 1047 - DEVIZE AUTO (tip=-12), FARA DELEGAT (id_delegat=0/NULL) - singurul document din toata
|
|
* schema care trece toate garzile do_editare_unificata SI nu are delegat (interogarea D din
|
|
* probe_s8p8_candidati_log.txt: 0 rezultate pe tip 1-4 fara delegat, 1 rezultat pe orice tip
|
|
* valid - exact acesta). Deja folosit, izolat, in test_s8_pas6_linii.prg.
|
|
* 1110 - AVIZ DIN LISTA DE PRETURI (tip=22), luna curenta, toate garzile trec (probe_s8p8_garzi).
|
|
* CORECTAT fata de prima trecere a acestei suite (vezi docs\raport_s8_pas8_suita.md §2/§10):
|
|
* la editare, IncarcaAntetFacturaEditare (ofacturare_editare.prg:94) seteaza intotdeauna
|
|
* nIdTipDoc = nIdTipDocFactura pentru documente ne-proforma, deci llAviz = (poDate.nIdTipDoc
|
|
* = poDate.nIdTipDocAvizExpeditie) e mereu .F. la editare, indiferent de poDate.tip - ramura
|
|
* "aviz" a Do Case-ului din Init (ofacturare.vc2 ~21030) nu se activeaza NICIODATA la editare.
|
|
* Toate documentele editate, aviz sau nu, trec prin ramura "factura" (~21148+), care scoate
|
|
* Ct_clb_politici_preturi NECONDITIONAT pentru orice tip. Deci controlul lipseste la editare
|
|
* pe toate tipurile, nu doar pe 22 - exercita restul traseului de aviz (G1-G9,G11).
|
|
* 953 - AVIZ SUBUNITATI (tip=23), mai 2022 (istoric) - caz NEGATIV. Premiza initiala ("tip 23/41
|
|
* pastreaza Ct_clb_politici_preturi la editare") s-a dovedit FALSA (vezi 1110 mai sus - acea
|
|
* ramura nu se activeaza deloc la editare). Documentul ramane util ca proba a garzii "luna
|
|
* curenta": probe_s8p8_garzi_log.txt arata ca 953 cade pe ea (documentul e din mai 2022,
|
|
* sesiunea de test ruleaza in luna contabila curenta august 2026) - respins CU mesaj, nu
|
|
* silentios, fara sa deschida formularul si fara sa consume niciun numar (G2).
|
|
*
|
|
* Nu scrie in Oracle - doar SELECT; verifica ca formularul deschis nici el nu scrie (G8).
|
|
|
|
SET SAFETY OFF
|
|
SET TALK OFF
|
|
|
|
PUBLIC gcErrLog
|
|
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_editare_incarcare_log.txt'
|
|
STRTOFILE('start ' + Transform(Datetime()) + CHR(13) + CHR(10), gcErrLog)
|
|
|
|
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
|
|
|
|
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
|
|
IF gnHandle <= 0
|
|
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
|
|
QUIT
|
|
ENDIF
|
|
gnIdUtil = 8
|
|
|
|
*!* gnScadereStoc: neinitializat de test_init_env_auto_roafacturare.prg. Documentele tip 1-5 nu-l
|
|
*!* citesc (cad in ramura OTHERWISE a Do Case-ului din Init, care nu-l testeaza), dar 1110 (tip=22)
|
|
*!* intra pe ramura "CASE gnScadereStoc=0 AND poDate.tip=22" - fara variabila declarata, VFP arunca
|
|
*!* "Variable GNSCADERESTOC is not found". Precedent: creeaza_documente_s8.prg (acelasi director)
|
|
*!* seteaza explicit gnScadereStoc=0 ca parte a mediului de test, nu a codului de productie.
|
|
PUBLIC gnScadereStoc
|
|
gnScadereStoc = 0
|
|
|
|
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
|
|
|
|
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul -
|
|
*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless
|
|
LOCAL lcProcExistent
|
|
lcProcExistent = SET("PROCEDURE")
|
|
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
|
|
|
|
PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns
|
|
gcMockUltimMesaj = ''
|
|
gnMockUltimTip = 0
|
|
gnMockRaspuns = 6
|
|
gnPass = 0
|
|
gnFail = 0
|
|
|
|
*!* --- driver care inchide fereastra modala frm_facturare_articole2 (acelasi tipar validat in
|
|
*!* test_s8_pas7_cablare.prg / driverS8p7 - Timer legat de _SCREEN prin Bindevent, viu in interiorul
|
|
*!* Show()-ului modal, care citeste formularul din colectia Objects si il elibereaza) ---
|
|
PUBLIC goDriverS8p7
|
|
goDriverS8p7 = Createobject('driverS8p7')
|
|
_SCREEN.AddObject('tmrS8p8', 'Timer')
|
|
_SCREEN.tmrS8p8.Interval = 150
|
|
Bindevent(_SCREEN.tmrS8p8, 'Timer', goDriverS8p7, 'Executa')
|
|
_SCREEN.tmrS8p8.Enabled = .T.
|
|
|
|
*!* --- verificare statica G2: corpul do_editare_unificata nu contine nicio referinta la alocarea
|
|
*!* de numere (factureaza/poGeneratorNumere/creeaza_cursor_serii) ---
|
|
LOCAL lcSrc, lcTail, lnStart, lnEnd, lcMetoda
|
|
lcSrc = FILETOSTR('D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vc2')
|
|
lnStart = AT('PROCEDURE do_editare_unificata' + CHR(13) + CHR(10), lcSrc)
|
|
DO asserteaza WITH 'static: metoda do_editare_unificata gasita in sursa', lnStart > 0, TRANSFORM(lnStart)
|
|
IF lnStart > 0
|
|
lcTail = SUBSTR(lcSrc, lnStart)
|
|
lnEnd = AT('ENDPROC', lcTail)
|
|
lcMetoda = UPPER(SUBSTR(lcTail, 1, lnEnd + 6))
|
|
DO asserteaza WITH 'static G2: fara FACTUREAZA( in do_editare_unificata', 'FACTUREAZA(' $ lcMetoda = .F., ''
|
|
DO asserteaza WITH 'static G2: fara POGENERATORNUMERE in do_editare_unificata', 'POGENERATORNUMERE' $ lcMetoda = .F., ''
|
|
DO asserteaza WITH 'static G2: fara CREEAZA_CURSOR_SERII in do_editare_unificata', 'CREEAZA_CURSOR_SERII' $ lcMetoda = .F., ''
|
|
ENDIF
|
|
|
|
*!* --- crsfacturi, exact ca in oproceduri_facturare.vizualizare_facturi, pe toate documentele de test ---
|
|
Private poFacturi
|
|
poFacturi = Null
|
|
IF Used('crsfacturi')
|
|
Use In crsfacturi
|
|
ENDIF
|
|
|
|
LOCAL lcSchema, lcSelect, lcOrder, lcFiltru
|
|
lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ;
|
|
['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ;
|
|
['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ;
|
|
['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ;
|
|
['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ;
|
|
['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ;
|
|
['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ;
|
|
['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ;
|
|
['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ;
|
|
['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+;
|
|
['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)']
|
|
|
|
lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ;
|
|
['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ;
|
|
['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ;
|
|
['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ;
|
|
['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ;
|
|
['valuta,id_valuta,valval,tvaval,totval,'+] + ;
|
|
['id_delegat,id_agent,id_masina,valoarea,'+] + ;
|
|
['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ;
|
|
['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ;
|
|
['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+;
|
|
['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where ']
|
|
|
|
lcOrder = [data_act,numar_act]
|
|
lcFiltru = [id_vanzare in (1113, 1055, 1048, 1130, 1047, 1110, 953)]
|
|
gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., [])
|
|
poFacturi.ca_baza1.afisare()
|
|
|
|
DO asserteaza WITH 'crsfacturi incarcat cu cele 7 documente reale (rownum=7)', Used('crsfacturi') AND Reccount('crsfacturi') = 7, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa')
|
|
|
|
*!* =====================================================================================
|
|
*!* Cazurile POZITIVE - documentul trebuie sa se deschida (G1-G9, G11, plus G3/G4/G4b pe linii)
|
|
*!* Ct_clb_altele (infirmare §3.2 din propunerea S8): document CU sursa comanda/contract -> prezent,
|
|
*!* etichetat; factura simpla/valuta/aviz(tip22)/devize(tip-12) editate (nu copiate) -> absent, G10.
|
|
*!* =====================================================================================
|
|
DO VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda', .T.
|
|
DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract', .T.
|
|
DO VerificaEditare WITH 1048, 'factura simpla', .F., '', .T.
|
|
DO VerificaEditare WITH 1130, 'valuta', .F., '', .T.
|
|
*!* 1047/1110: nici tip=-12 (DEVIZE AUTO), nici tip=22 (aviz lista preturi) nu se incadreaza in
|
|
*!* Inlist(poDate.tip,1,5,10,48,49) - unicul grup pe care Init il scoate la editare (llCopiere=.F.)
|
|
*!* in ramura "factura" (llAviz e mereu .F. la editare, cf. IncarcaAntetFacturaEditare:94, care
|
|
*!* seteaza mereu nIdTipDocFactura pentru documente ne-proforma - ramura de aviz din Do Case NU se
|
|
*!* activeaza niciodata la editare, indiferent de poDate.tip). Deci Ct_clb_altele RAMANE prezent,
|
|
*!* dar FARA eticheta schimbata (niciun Case din Do Case-ul "gnScadereStoc=0" nu acopera 22/-12) -
|
|
*!* verificat pe rulare (test_s8_p8_candidati/garzi + prima trecere a acestei suite). Nu se
|
|
*!* verifica eticheta exacta (ramane design-time, neschimbata de do_schimba_explicatia).
|
|
DO VerificaEditare WITH 1047, 'DEVIZE AUTO, fara delegat', .T., '', .T.
|
|
DO VerificaEditare WITH 1110, 'aviz din lista de preturi (tip=22)', .T., '', .F.
|
|
|
|
*!* =====================================================================================
|
|
*!* Cazul NEGATIV - 953, aviz istoric (tip=23), respins de garda "luna curenta"
|
|
*!* =====================================================================================
|
|
DO VerificaEditareRespinsa WITH 953, 'aviz istoric tip=23, respins - luna curenta', 'luna curenta'
|
|
|
|
*!* --- S8 incasarea la editare (D1/D3/D4) - foloseste Show() real, deci trebuie sa ruleze inainte
|
|
*!* de teardown-ul lui tmrS8p8 de mai jos. 1071: tip_incasare=11 (chitanta) -> mod 2.
|
|
*!* 1072: tip_incasare=2 (bon fiscal) -> mod 3, cazul in care hardcodarea veche "mod 2" ar fi mintit.
|
|
DO VerificaIncasareLaEditare WITH 1071, 'chitanta, tip_incasare=11', 119, 44, 11, 2
|
|
DO VerificaIncasareLaEditare WITH 1072, 'bon fiscal, tip_incasare=2', 119, 66, 2, 3
|
|
|
|
_SCREEN.tmrS8p8.Enabled = .F.
|
|
Try
|
|
_SCREEN.RemoveObject('tmrS8p8')
|
|
Catch
|
|
Endtry
|
|
|
|
*!* --- S8 grupurile B/C: neregresie pe document NOU ---
|
|
DO VerificaDocumentNou
|
|
|
|
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
|
|
|
|
|
|
*!* =====================================================================================
|
|
*!* R1: curatenie intre cazuri - inchide aliasurile care raman deschise dupa
|
|
*!* IncarcaLiniiFacturaEditare/do_calculeaza_totaluri/Init-ul formularului (gasite la X2,
|
|
*!* docs\raport_s8_driver_determinist.md): CRSGESTIUNI, JTVA_COLOANE(_TEMP), SAFT_TAXTABLE,
|
|
*!* CRSCURSURI. Nu produc FAIL azi (X2: Select crsfacturi/crsfactura restaureaza mereu zona
|
|
*!* corecta), dar cresc numarul de work area-uri intre cazuri - se inchid explicit aici ca sa nu
|
|
*!* se acumuleze pe 8 cazuri (limita VFP de work areas e departe, dar igiena conteaza pe R1).
|
|
*!* =====================================================================================
|
|
PROCEDURE CurataAliasuriReziduale
|
|
LOCAL laAlias(1), lnI, lcA
|
|
laAlias(1) = 'CRSGESTIUNI'
|
|
DIMENSION laAlias(9)
|
|
laAlias(2) = 'JTVA_COLOANE'
|
|
laAlias(3) = 'JTVA_COLOANE_TEMP'
|
|
laAlias(4) = 'SAFT_TAXTABLE'
|
|
laAlias(5) = 'CRSCURSURI'
|
|
laAlias(6) = 'CRSARTICOLE_DOC'
|
|
laAlias(7) = 'CRSARTICOLE_EDITARE'
|
|
laAlias(8) = 'V_ANTET_EDITARE'
|
|
laAlias(9) = 'CRSFACTURA'
|
|
FOR lnI = 1 TO ALEN(laAlias)
|
|
lcA = laAlias(lnI)
|
|
IF Used(m.lcA)
|
|
Use In (m.lcA)
|
|
ENDIF
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
|
|
*!* R1: jurnal AUSED() - numarul de work area-uri deschise, ca sa se vada ca starea de start e
|
|
*!* aceeasi la fiecare caz (semnalul de scurgere din triaj: 16 -> 16 -> 17 -> 17, in crestere)
|
|
PROCEDURE LogAUsed
|
|
LPARAMETERS tcEticheta
|
|
LOCAL lnN, laAliasuri(1), lnI, lcLista
|
|
lnN = AUSED(laAliasuri)
|
|
lcLista = ''
|
|
FOR lnI = 1 TO m.lnN
|
|
lcLista = lcLista + laAliasuri(m.lnI,1) + ' '
|
|
ENDFOR
|
|
STRTOFILE('AUSED ' + m.tcEticheta + ' = ' + TRANSFORM(m.lnN) + ' [' + m.lcLista + ']' + CHR(13) + CHR(10), gcErrLog, 1)
|
|
ENDPROC
|
|
|
|
|
|
PROCEDURE VerificaEditare
|
|
LPARAMETERS tnIdVanzare, tcEticheta, tlCtClbAsteptat, tcCtClbEtichetaAsteptata, tlVerificaLinii
|
|
|
|
LOCAL lcPrefix, lnSucces, loFrm, lnI, llGasitForm
|
|
LOCAL lcSnapPlajeA, lcSnapPlajeB, lcSnapDetA, lcSnapDetB
|
|
LOCAL ltDataorasVanzareA, lnIdUtilsVanzareA
|
|
lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']'
|
|
gcMockUltimMesaj = ''
|
|
|
|
*!* --- R1: curatenie + jurnal AUSED INAINTE de caz ---
|
|
DO CurataAliasuriReziduale
|
|
DO LogAUsed WITH lcPrefix + ' INAINTE'
|
|
|
|
*!* --- G2: snapshot generator de numere, INAINTE ---
|
|
IF Used('v_plaje_a')
|
|
Use In v_plaje_a
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_a')
|
|
goExecutor.oReset()
|
|
lcSnapPlajeA = CursorToSnapshot('v_plaje_a')
|
|
Use In v_plaje_a
|
|
|
|
*!* --- G8: snapshot dataoras/id_utils, INAINTE ---
|
|
IF Used('v_g8a')
|
|
Use In v_g8a
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a')
|
|
goExecutor.oReset()
|
|
DO asserteaza WITH lcPrefix + ': martor G8 antet Oracle a reusit', lnSucces >= 0 AND Used('v_g8a') AND Reccount('v_g8a') = 1, Transform(lnSucces)
|
|
ltDataorasVanzareA = v_g8a.dataoras
|
|
lnIdUtilsVanzareA = Nvl(v_g8a.id_utils, 0)
|
|
Use In v_g8a
|
|
|
|
IF Used('v_g8d_a')
|
|
Use In v_g8d_a
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_a')
|
|
goExecutor.oReset()
|
|
lcSnapDetA = CursorToSnapshot('v_g8d_a')
|
|
Use In v_g8d_a
|
|
|
|
*!* --- martor G3/G4/G4b: interogare INDEPENDENTA pe VANZARI_DETALII+NOM_ARTICOLE, INAINTE de
|
|
*!* codul testat (acelasi tipar ca test_s8_pas6_linii.prg, dar aici pe traseul COMPLET) ---
|
|
LOCAL lnMartorLinii
|
|
lnMartorLinii = 0
|
|
IF m.tlVerificaLinii
|
|
IF Used('v_g4pre')
|
|
Use In v_g4pre
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select count(*) as nr from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ and sters = 0], 'v_g4pre')
|
|
goExecutor.oReset()
|
|
DO asserteaza WITH lcPrefix + ': martor G3 Oracle a reusit', lnSucces >= 0 AND Used('v_g4pre'), Transform(lnSucces)
|
|
lnMartorLinii = Nvl(v_g4pre.nr, 0)
|
|
Use In v_g4pre
|
|
|
|
IF Used('v_g4')
|
|
Use In v_g4
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select vd.id_vanzare_det, vd.cantitate, vd.taxcode, vd.lot, vd.serie, ] + ;
|
|
[na.in_stoc from vanzari_detalii vd left join nom_articole na on na.id_articol = vd.id_articol ] + ;
|
|
[where vd.id_vanzare = ] + Transform(m.tnIdVanzare) + [ and vd.sters = 0 order by vd.id_vanzare_det], 'v_g4')
|
|
goExecutor.oReset()
|
|
DO asserteaza WITH lcPrefix + ': martor G4/G4b Oracle a reusit', lnSucces >= 0 AND Used('v_g4'), Transform(lnSucces)
|
|
ENDIF
|
|
|
|
*!* --- R2 diagnostic PRE: IncarcaAntetFacturaEditare, apel direct izolat - baseline. Daca
|
|
*!* traseul complet de mai jos nu deschide formularul, aceasta valoare arata daca poarta
|
|
*!* silentioasa (cale 11, ofacturare_editare.prg:83-86) era deja activa INAINTE de orice
|
|
*!* interferenta a traseului complet (frm_facturi/driver) ---
|
|
LOCAL poDateDiagPre, lnDiscRPre, lnDiscVPre
|
|
poDateDiagPre = IncarcaAntetFacturaEditare(m.tnIdVanzare, @lnDiscRPre, @lnDiscVPre)
|
|
DO asserteaza WITH lcPrefix + ': diagnostic - IncarcaAntetFacturaEditare (apel direct, izolat) reuseste', Vartype(poDateDiagPre) == 'O', Vartype(poDateDiagPre)
|
|
IF Used('v_antet_editare')
|
|
Use In v_antet_editare
|
|
ENDIF
|
|
|
|
*!* --- G1/G6/G7: poDateDiagPre e chiar obiectul pe care do_editare_unificata il va construi mai
|
|
*!* jos (aceeasi functie, acelasi id_vanzare, fara nicio scriere intre timp) - comparat cu randul
|
|
*!* deja incarcat in crsfacturi (acelasi SELECT ca fact_vfacturi, martor independent) ---
|
|
IF Vartype(poDateDiagPre) == 'O'
|
|
Select crsfacturi
|
|
Locate For id_vanzare = m.tnIdVanzare
|
|
IF Found()
|
|
DO asserteaza WITH lcPrefix + ' G1: serie_act = VANZARI', Alltrim(Nvl(poDateDiagPre.serie_act,'')) == Alltrim(Nvl(crsfacturi.serie_act,'')), poDateDiagPre.serie_act
|
|
DO asserteaza WITH lcPrefix + ' G1: nract = VANZARI', poDateDiagPre.nract == Nvl(crsfacturi.numar_act,0), Transform(poDateDiagPre.nract)
|
|
DO asserteaza WITH lcPrefix + ' G1: dataact = VANZARI', poDateDiagPre.dataact == crsfacturi.data_act, Dtoc(poDateDiagPre.dataact)
|
|
DO asserteaza WITH lcPrefix + ' G1: datascad = VANZARI (sau ambele NULL)', Iif(Isnull(crsfacturi.data_scad), Isnull(poDateDiagPre.datascad), poDateDiagPre.datascad == crsfacturi.data_scad), Transform(poDateDiagPre.datascad)
|
|
DO asserteaza WITH lcPrefix + ' G6: discount_evidentiat = VANZARI', poDateDiagPre.discount_evidentiat == Nvl(crsfacturi.discount_evidentiat,0), Transform(poDateDiagPre.discount_evidentiat)
|
|
IF poDateDiagPre.in_valuta = 0
|
|
DO asserteaza WITH lcPrefix + ' G6: discount (lei) = VANZARI', Round(lnDiscRPre,2) == Round(Nvl(crsfacturi.discount,0),2), Transform(lnDiscRPre)
|
|
ENDIF
|
|
DO asserteaza WITH lcPrefix + ' G7: id_delegat = VANZARI (sau ambele NULL - cazul "fara delegat")', ;
|
|
Iif(Isnull(crsfacturi.id_delegat), Isnull(poDateDiagPre.id_delegat), Nvl(poDateDiagPre.id_delegat,0) == Nvl(crsfacturi.id_delegat,0)), Transform(Nvl(poDateDiagPre.id_delegat,-1))
|
|
DO asserteaza WITH lcPrefix + ' G7: nume_delegat = VANZARI', Alltrim(Nvl(poDateDiagPre.nume_delegat,'')) == Alltrim(Nvl(crsfacturi.delegat,'')), poDateDiagPre.nume_delegat
|
|
DO asserteaza WITH lcPrefix + ' G7: adresa_facturare = VANZARI', Alltrim(Nvl(poDateDiagPre.adresa_facturare,'')) == Alltrim(Nvl(crsfacturi.adresa_facturare,'')), poDateDiagPre.adresa_facturare
|
|
DO asserteaza WITH lcPrefix + ' G7: listare_detaliata = VANZARI', poDateDiagPre.nListareDetaliata == Nvl(crsfacturi.listare_detaliata,0), Transform(poDateDiagPre.nListareDetaliata)
|
|
DO asserteaza WITH lcPrefix + ' G7: efactura = VANZARI', poDateDiagPre.eFactura == Nvl(crsfacturi.efactura,0), Transform(poDateDiagPre.eFactura)
|
|
DO asserteaza WITH lcPrefix + ' G7: id_ruta = VANZARI (sau ambele NULL)', Iif(Isnull(crsfacturi.id_ruta), Isnull(poDateDiagPre.id_ruta), poDateDiagPre.id_ruta == crsfacturi.id_ruta), Transform(poDateDiagPre.id_ruta)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
*!* --- codul testat: traseul real, prin frm_facturi.do_editare_unificata ---
|
|
*!* Init-ul clasei presupune crsfacturi ca zona curenta (la fel ca in test_s7_urmasi.prg) -
|
|
*!* interogarile martor de mai sus au schimbat zona curenta intre timp, se restaureaza aici
|
|
Select crsfacturi
|
|
loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx')
|
|
DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm)
|
|
IF Vartype(m.loFrm) <> 'O'
|
|
RETURN
|
|
ENDIF
|
|
|
|
Select crsfacturi
|
|
Locate For id_vanzare = m.tnIdVanzare
|
|
DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found())
|
|
IF !Found()
|
|
loFrm.Release()
|
|
RETURN
|
|
ENDIF
|
|
|
|
*!* --- driverS8p7 gaseste si inchide formularul unificat (FARA but_termin1.Click()) ---
|
|
goDriverS8p7.Reseteaza()
|
|
loFrm.do_editare_unificata()
|
|
|
|
IF !goDriverS8p7.lGasit
|
|
*!* --- R2: iesirea a esuat - distinge CU MESAJ (garda explicita) de SILENTIOASA, si in acest
|
|
*!* caz distinge daca poarta 11 (IncarcaAntetFacturaEditare->NULL) e cauza confirmata ---
|
|
DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', .F., 'NU s-a deschis'
|
|
IF !Empty(gcMockUltimMesaj)
|
|
DO asserteaza WITH lcPrefix + ' diagnostic: iesire CU MESAJ de garda (nu silentioasa) - mesaj=[' + gcMockUltimMesaj + ']', .F., gcMockUltimMesaj
|
|
ELSE
|
|
LOCAL poDateDiagPost, lnDiscRPost, lnDiscVPost
|
|
poDateDiagPost = IncarcaAntetFacturaEditare(m.tnIdVanzare, @lnDiscRPost, @lnDiscVPost)
|
|
IF Vartype(poDateDiagPost) <> 'O'
|
|
DO asserteaza WITH lcPrefix + ' diagnostic: iesire silentioasa CONFIRMATA - cale 11 (ofacturare_editare.prg:83-86), IncarcaAntetFacturaEditare revine .NULL. si la apel direct chiar acum', .F., 'confirmat cale 11'
|
|
ELSE
|
|
DO asserteaza WITH lcPrefix + ' diagnostic: iesire silentioasa NEEXPLICATA de cale 11 (IncarcaAntetFacturaEditare reuseste izolat chiar acum) - candidat: cale 3 (glLunaInchisa) sau cursa driverului/Timer', .F., 'neexplicat, nu e cale 11'
|
|
ENDIF
|
|
IF Used('v_antet_editare')
|
|
Use In v_antet_editare
|
|
ENDIF
|
|
ENDIF
|
|
Try
|
|
loFrm.Release()
|
|
Catch
|
|
Endtry
|
|
DO CurataAliasuriReziduale
|
|
DO LogAUsed WITH lcPrefix + ' DUPA (esec deschidere)'
|
|
RETURN
|
|
ENDIF
|
|
|
|
DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit)
|
|
|
|
*!* --- Ct_clb_altele: prezenta citita din colectia Objects a formularului, cat timp era deschis ---
|
|
DO asserteaza WITH lcPrefix + ': Ct_clb_altele prezenta = ' + Iif(m.tlCtClbAsteptat, 'prezent', 'absent'), ;
|
|
goDriverS8p7.lCtClbPrezent == m.tlCtClbAsteptat, Transform(goDriverS8p7.lCtClbPrezent)
|
|
IF m.tlCtClbAsteptat AND !Empty(m.tcCtClbEtichetaAsteptata)
|
|
DO asserteaza WITH lcPrefix + ': Ct_clb_altele eticheta = [' + m.tcCtClbEtichetaAsteptata + ']', ;
|
|
Upper(goDriverS8p7.cCtClbEticheta) == Upper(m.tcCtClbEtichetaAsteptata), goDriverS8p7.cCtClbEticheta
|
|
ENDIF
|
|
*!* --- grupul B si C (S8, decizia 25): needitabile la editare ---
|
|
DO VerificaBlocajGrupBC WITH m.lcPrefix
|
|
|
|
*!* --- G5: totalul afisat = totalul deja scris in VANZARI ---
|
|
Select crsfacturi
|
|
IF Nvl(crsfacturi.in_valuta, 0) = 1
|
|
DO asserteaza WITH lcPrefix + ' G5: total afisat (valuta) = VANZARI.totval', ;
|
|
Round(goDriverS8p7.nTotalVal, 2) == Round(Nvl(crsfacturi.totval, 0), 2), Transform(goDriverS8p7.nTotalVal) + ' vs ' + Transform(crsfacturi.totval)
|
|
ELSE
|
|
DO asserteaza WITH lcPrefix + ' G5: total afisat (lei) = VANZARI.total_cu_tva', ;
|
|
Round(goDriverS8p7.nTotalRon, 2) == Round(Nvl(crsfacturi.total_cu_tva, 0), 2), Transform(goDriverS8p7.nTotalRon) + ' vs ' + Transform(crsfacturi.total_cu_tva)
|
|
ENDIF
|
|
|
|
*!* --- G3/G4/G4b: crsfactura ramane deschis dupa ce driverul a eliberat formularul (nu e
|
|
*!* proprietate a obiectului, e o zona de lucru globala populata inaintea Createobject) ---
|
|
IF m.tlVerificaLinii
|
|
DO asserteaza WITH lcPrefix + ' G3: crsfactura a ramas deschis dupa inchiderea formularului', Used('crsfactura'), Transform(Used('crsfactura'))
|
|
IF Used('crsfactura') AND Used('v_g4')
|
|
DO asserteaza WITH lcPrefix + ' G3: Reccount(crsfactura)=' + Transform(Reccount('crsfactura')) + ' = martor(' + Transform(m.lnMartorLinii) + ')', ;
|
|
Reccount('crsfactura') == m.lnMartorLinii, Transform(Reccount('crsfactura'))
|
|
|
|
LOCAL lnDetTemp, llGasitLinie
|
|
Select v_g4
|
|
Scan
|
|
lnDetTemp = v_g4.id_vanzare_det
|
|
Select crsfactura
|
|
Locate For id_temp = m.lnDetTemp
|
|
llGasitLinie = Found()
|
|
DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ': gasit in crsfactura', m.llGasitLinie, Transform(m.llGasitLinie)
|
|
IF m.llGasitLinie
|
|
DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ' G4: cantitate', Round(crsfactura.cantitate,4) == Round(v_g4.cantitate,4), Transform(crsfactura.cantitate)
|
|
DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ' G4: taxcode', Nvl(crsfactura.taxcode,0) == Nvl(v_g4.taxcode,0), Transform(Nvl(crsfactura.taxcode,0))
|
|
DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ' G4b: gestionabil = in_stoc curent(' + Transform(Nvl(v_g4.in_stoc,0)) + ')', ;
|
|
crsfactura.gestionabil == Iif(Nvl(v_g4.in_stoc,0) <> 0, 1, 0), Transform(crsfactura.gestionabil)
|
|
ENDIF
|
|
Select v_g4
|
|
Endscan
|
|
ENDIF
|
|
IF Used('v_g4')
|
|
Use In v_g4
|
|
ENDIF
|
|
ENDIF
|
|
|
|
loFrm.Release()
|
|
|
|
*!* --- G9: niciun dialog modal la deschidere ---
|
|
DO asserteaza WITH lcPrefix + ' G9: niciun amessagebox la deschidere', Empty(gcMockUltimMesaj), gcMockUltimMesaj
|
|
|
|
*!* --- G2: snapshot generator de numere, DUPA - identic caracter cu caracter ---
|
|
IF Used('v_plaje_b')
|
|
Use In v_plaje_b
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_b')
|
|
goExecutor.oReset()
|
|
lcSnapPlajeB = CursorToSnapshot('v_plaje_b')
|
|
Use In v_plaje_b
|
|
DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, ''
|
|
|
|
*!* --- G8: dataoras/id_utils neschimbate pe VANZARI si VANZARI_DETALII ---
|
|
IF Used('v_g8a2')
|
|
Use In v_g8a2
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a2')
|
|
goExecutor.oReset()
|
|
DO asserteaza WITH lcPrefix + ' G8: VANZARI.dataoras neschimbat', ;
|
|
Nvl(Ttoc(v_g8a2.dataoras), 'NULL') == Nvl(Ttoc(m.ltDataorasVanzareA), 'NULL'), Nvl(Ttoc(v_g8a2.dataoras), 'NULL')
|
|
DO asserteaza WITH lcPrefix + ' G8: VANZARI.id_utils neschimbat', Nvl(v_g8a2.id_utils, 0) == m.lnIdUtilsVanzareA, Transform(Nvl(v_g8a2.id_utils, 0))
|
|
Use In v_g8a2
|
|
|
|
IF Used('v_g8d_b')
|
|
Use In v_g8d_b
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_b')
|
|
goExecutor.oReset()
|
|
lcSnapDetB = CursorToSnapshot('v_g8d_b')
|
|
Use In v_g8d_b
|
|
DO asserteaza WITH lcPrefix + ' G8: VANZARI_DETALII dataoras/id_utils identice (nicio scriere)', m.lcSnapDetA == m.lcSnapDetB, ''
|
|
|
|
*!* --- G11 partial: fara nicio scriere pe VANZARI_DETALII (G8), nu s-a putut genera nicio miscare
|
|
*!* de stoc noua pe acest document; proba indirecta, partiala (forma completa a G11 cere S9/reemitere) ---
|
|
DO asserteaza WITH lcPrefix + ' G11 partial (derivat din G8): nicio scriere pe VANZARI_DETALII => stoc agregat neschimbat pe acest document', m.lcSnapDetA == m.lcSnapDetB, ''
|
|
|
|
*!* --- R1: curatenie + jurnal AUSED DUPA caz ---
|
|
DO CurataAliasuriReziduale
|
|
DO LogAUsed WITH lcPrefix + ' DUPA'
|
|
ENDPROC
|
|
|
|
|
|
*!* Caz NEGATIV: documentul e respins de o garda CU MESAJ a do_editare_unificata (aici, "luna
|
|
*!* curenta") - formularul nu trebuie sa se deschida, trebuie sa apara mesajul asteptat, si G2
|
|
*!* (niciun numar alocat) trebuie sa ramana curat chiar si pe calea de refuz.
|
|
PROCEDURE VerificaEditareRespinsa
|
|
LPARAMETERS tnIdVanzare, tcEticheta, tcMesajContine
|
|
|
|
LOCAL lcPrefix, lnSucces, loFrm, lcSnapPlajeA, lcSnapPlajeB
|
|
lcPrefix = Transform(m.tnIdVanzare) + ' [' + m.tcEticheta + ']'
|
|
gcMockUltimMesaj = ''
|
|
|
|
DO CurataAliasuriReziduale
|
|
DO LogAUsed WITH lcPrefix + ' INAINTE'
|
|
|
|
IF Used('v_plaje_resp_a')
|
|
Use In v_plaje_resp_a
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_resp_a')
|
|
goExecutor.oReset()
|
|
lcSnapPlajeA = CursorToSnapshot('v_plaje_resp_a')
|
|
Use In v_plaje_resp_a
|
|
|
|
Select crsfacturi
|
|
loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx')
|
|
DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm)
|
|
IF Vartype(m.loFrm) <> 'O'
|
|
RETURN
|
|
ENDIF
|
|
|
|
Select crsfacturi
|
|
Locate For id_vanzare = m.tnIdVanzare
|
|
DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found())
|
|
IF !Found()
|
|
loFrm.Release()
|
|
RETURN
|
|
ENDIF
|
|
|
|
goDriverS8p7.Reseteaza()
|
|
loFrm.do_editare_unificata()
|
|
|
|
DO asserteaza WITH lcPrefix + ': formularul NU s-a deschis (garda a respins documentul)', !goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit)
|
|
DO asserteaza WITH lcPrefix + ': a aparut un mesaj de garda (refuz explicat, nu iesire silentioasa)', !Empty(gcMockUltimMesaj), gcMockUltimMesaj
|
|
DO asserteaza WITH lcPrefix + ': mesajul contine [' + m.tcMesajContine + ']', m.tcMesajContine $ Lower(gcMockUltimMesaj), gcMockUltimMesaj
|
|
|
|
Try
|
|
loFrm.Release()
|
|
Catch
|
|
Endtry
|
|
|
|
IF Used('v_plaje_resp_b')
|
|
Use In v_plaje_resp_b
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_resp_b')
|
|
goExecutor.oReset()
|
|
lcSnapPlajeB = CursorToSnapshot('v_plaje_resp_b')
|
|
Use In v_plaje_resp_b
|
|
DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (refuz, dar tot fara numar ars)', m.lcSnapPlajeA == m.lcSnapPlajeB, ''
|
|
|
|
DO CurataAliasuriReziduale
|
|
DO LogAUsed WITH lcPrefix + ' DUPA'
|
|
ENDPROC
|
|
|
|
|
|
*!* S8 - blocarea grupurilor B si C la editare. Citeste starea deja capturata de goDriverS8p7
|
|
*!* (formularul e inchis pana aici) si asearta doar cand controlul e prezent.
|
|
PROCEDURE VerificaBlocajGrupBC
|
|
LPARAMETERS tcPrefix
|
|
|
|
IF goDriverS8p7.lCtClbPrezent
|
|
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_altele (sursa) needitabil', !goDriverS8p7.lCtClbAlteleActiv, Transform(goDriverS8p7.lCtClbAlteleActiv)
|
|
ENDIF
|
|
DO asserteaza WITH tcPrefix + ' grupB: clb_fdoc.cboFdoc (tip document) needitabil', ;
|
|
goDriverS8p7.lClbFdocPrezent AND !goDriverS8p7.lClbFdocActiv, Transform(goDriverS8p7.lClbFdocActiv)
|
|
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_nume_client (client) needitabil', ;
|
|
goDriverS8p7.lCtClbNumeClientPrezent AND !goDriverS8p7.lCtClbNumeClientActiv, Transform(goDriverS8p7.lCtClbNumeClientActiv)
|
|
IF goDriverS8p7.lCtClbValutaPrezent
|
|
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_valuta needitabil', !goDriverS8p7.lCtClbValutaActiv, Transform(goDriverS8p7.lCtClbValutaActiv)
|
|
ENDIF
|
|
IF goDriverS8p7.lClbZiCursPrezent
|
|
DO asserteaza WITH tcPrefix + ' grupB: Clb_zi_curs needitabil', !goDriverS8p7.lClbZiCursActiv, Transform(goDriverS8p7.lClbZiCursActiv)
|
|
ENDIF
|
|
IF goDriverS8p7.lCtClbGestiuneInitPrezent
|
|
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_gestiune_init (gestiune sursa) needitabil', !goDriverS8p7.lCtClbGestiuneInitActiv, Transform(goDriverS8p7.lCtClbGestiuneInitActiv)
|
|
ENDIF
|
|
IF goDriverS8p7.lCtClbPolPreturiPrezent
|
|
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_politici_preturi needitabil', !goDriverS8p7.lCtClbPolPreturiActiv, Transform(goDriverS8p7.lCtClbPolPreturiActiv)
|
|
ENDIF
|
|
DO asserteaza WITH tcPrefix + ' grupB: but_incarca_articole needitabil (G2: evita poGeneratorNumere.verifica_numar)', ;
|
|
goDriverS8p7.lButIncarcaArticolePrezent AND !goDriverS8p7.lButIncarcaArticoleActiv, Transform(goDriverS8p7.lButIncarcaArticoleActiv)
|
|
DO asserteaza WITH tcPrefix + ' grupB: but_cursuri needitabil', ;
|
|
goDriverS8p7.lButCursuriPrezent AND !goDriverS8p7.lButCursuriActiv, Transform(goDriverS8p7.lButCursuriActiv)
|
|
IF goDriverS8p7.lCtIncasarePrezent
|
|
DO asserteaza WITH tcPrefix + ' grupC: ct_incasare needitabil', !goDriverS8p7.lCtIncasareActiv, Transform(goDriverS8p7.lCtIncasareActiv)
|
|
DO asserteaza WITH tcPrefix + ' grupC: chk_incasare needitabil', goDriverS8p7.lChkIncasarePrezent AND !goDriverS8p7.lChkIncasareActiv, Transform(goDriverS8p7.lChkIncasareActiv)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
*!* S8 - neregresie: pe document NOU, grupurile B/C raman editabile (acelasi tipar validat in
|
|
*!* test_s8_pas7_cablare.prg). NU trece prin factureaza()/poGeneratorNumere.
|
|
PROCEDURE VerificaDocumentNou
|
|
PRIVATE poDate
|
|
LOCAL loForm
|
|
|
|
poDate = Createobject('oDateFactura', 0, 0)
|
|
poDate.tip = 3
|
|
poDate.id_client = 0
|
|
poDate.incasat = 0
|
|
|
|
*!* Init-ul lui frm_facturare_articole2 presupune 'crsfactura' deja deschis (in productie,
|
|
*!* creeaza_facturacrs('crsfactura') ruleaza in factureaza() inainte de Createobject, pentru
|
|
*!* orice document, nou sau editat). R1 (curatenie de aliasuri intre cazuri) inchide crsfactura
|
|
*!* dupa fiecare caz anterior - fara acest bloc, acest test ar depinde tacit de un leftover
|
|
*!* (exact cum facea, neintentionat, test_s8_pas7_cablare.prg).
|
|
IF !Used('crsfactura')
|
|
creeaza_facturacrs('crsfactura')
|
|
ENDIF
|
|
|
|
loForm = Newobject('frm_facturare_articole2', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx')
|
|
DO asserteaza WITH 'document nou: Newobject(frm_facturare_articole2) reuseste (fara Show, fara factureaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm)
|
|
IF Vartype(m.loForm) <> 'O'
|
|
RETURN
|
|
ENDIF
|
|
|
|
DO asserteaza WITH 'document nou: poDate.lEditare = .F. (stare naturala, nesetata de nimeni)', !poDate.lEditare, Transform(poDate.lEditare)
|
|
|
|
IF loForm.do_exista_obiect('Ct_clb_altele')
|
|
DO asserteaza WITH 'document nou grupB: Ct_clb_altele ramane editabil', loForm.Ct_clb_altele.lactiv, Transform(loForm.Ct_clb_altele.lactiv)
|
|
ENDIF
|
|
DO asserteaza WITH 'document nou grupB: clb_fdoc.cboFdoc ramane editabil', loForm.clb_fdoc.cboFdoc.Enabled, Transform(loForm.clb_fdoc.cboFdoc.Enabled)
|
|
DO asserteaza WITH 'document nou grupB: Ct_clb_nume_client ramane editabil', loForm.Ct_clb_nume_client.lactiv, Transform(loForm.Ct_clb_nume_client.lactiv)
|
|
IF loForm.do_exista_obiect('Ct_clb_valuta')
|
|
DO asserteaza WITH 'document nou grupB: Ct_clb_valuta ramane editabil', loForm.Ct_clb_valuta.lactiv, Transform(loForm.Ct_clb_valuta.lactiv)
|
|
ENDIF
|
|
IF loForm.do_exista_obiect('Clb_zi_curs')
|
|
DO asserteaza WITH 'document nou grupB: Clb_zi_curs ramane editabil', !loForm.Clb_zi_curs.text_simplu1.ReadOnly, Transform(loForm.Clb_zi_curs.text_simplu1.ReadOnly)
|
|
ENDIF
|
|
IF loForm.do_exista_obiect('Ct_clb_gestiune_init', loForm.ct_contabilitate)
|
|
DO asserteaza WITH 'document nou grupB: Ct_clb_gestiune_init ramane editabil', loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv, Transform(loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv)
|
|
ENDIF
|
|
IF loForm.do_exista_obiect('Ct_clb_politici_preturi')
|
|
DO asserteaza WITH 'document nou grupB: Ct_clb_politici_preturi ramane editabil', loForm.Ct_clb_politici_preturi.lactiv, Transform(loForm.Ct_clb_politici_preturi.lactiv)
|
|
ENDIF
|
|
DO asserteaza WITH 'document nou grupB: but_incarca_articole ramane editabil', loForm.but_incarca_articole.Enabled, Transform(loForm.but_incarca_articole.Enabled)
|
|
*!* but_cursuri.Enabled = Used('crscursuri') AND Reccount('crscursuri')>0 (ofacturare.vc2:20918),
|
|
*!* iar citeste_cursuri_zi() ruleaza in Init doar pentru Inlist(poDate.tip,1,22,5,29,7,10,45)
|
|
*!* (:20899) - tip=3 (comanda) NU e in acea lista, deci but_cursuri e NATURAL needitabil pe un
|
|
*!* document nou de acest tip, indiferent de lEditare. Prima trecere a acestei suite astepta
|
|
*!* .T. aici (copiat din test_s8_pas7_cablare.prg) si a picat: R1 (curatenie de aliasuri intre
|
|
*!* cazuri) a inchis 'crscursuri' ramas din cazul anterior, care mascase adevaratul comportament -
|
|
*!* asertiunea veche trecea din intamplare, nu din cauza codului. Corectata aici la valoarea reala.
|
|
DO asserteaza WITH 'document nou grupB: but_cursuri needitabil natural (tip=3 nu incarca crscursuri in Init, independent de lEditare)', !loForm.but_cursuri.Enabled, Transform(loForm.but_cursuri.Enabled)
|
|
IF loForm.do_exista_obiect('ct_incasare')
|
|
DO asserteaza WITH 'document nou grupC: ct_incasare ramane editabil', loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled)
|
|
DO asserteaza WITH 'document nou grupC: chk_incasare ramane editabil', loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled)
|
|
ENDIF
|
|
|
|
loForm.Release()
|
|
ENDPROC
|
|
|
|
|
|
*!* S8 - incasarea la editare (D1/D3/D4). Replica dovedita a corpului do_editare_unificata pana la
|
|
*!* Createobject (acelasi tipar validat in test_s8_pas7_cablare.prg).
|
|
PROCEDURE VerificaIncasareLaEditare
|
|
LPARAMETERS tnIdVanzare, tcEticheta, tnIncasatAsteptat, tnNrIncasareAsteptat, tnTipIncasareAsteptat, tnModAsteptat
|
|
|
|
LOCAL lcPrefix, lnSucces, loForm, pnDiscountRon, pnDiscountValuta
|
|
LOCAL lnSters, llEProforma, lnTipDoc, lcSnapPlajeA, lcSnapPlajeB
|
|
PRIVATE pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP, poDate
|
|
Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP
|
|
lcPrefix = Transform(m.tnIdVanzare) + ' [incasare ' + m.tcEticheta + ']'
|
|
gcMockUltimMesaj = ''
|
|
|
|
DO CurataAliasuriReziduale
|
|
DO LogAUsed WITH lcPrefix + ' INAINTE'
|
|
|
|
IF Used('v_plaje_inc_a')
|
|
Use In v_plaje_inc_a
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_a')
|
|
goExecutor.oReset()
|
|
lcSnapPlajeA = CursorToSnapshot('v_plaje_inc_a')
|
|
Use In v_plaje_inc_a
|
|
|
|
lnSucces = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip,incasat from fact_vfacturi where id_vanzare=' + Transform(m.tnIdVanzare), 'crsIncUnic')
|
|
goExecutor.oReset()
|
|
DO asserteaza WITH lcPrefix + ': documentul a putut fi reincarcat', lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1, Transform(lnSucces)
|
|
IF !(lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1)
|
|
RETURN
|
|
ENDIF
|
|
SELECT crsIncUnic
|
|
lnIdVanzareP = id_vanzare
|
|
lnCod = cod
|
|
pnAn = Year(data_act)
|
|
pnLuna = Month(data_act)
|
|
lnSters = sters
|
|
lnIdFact = id_fact
|
|
llEProforma = (eproforma = 1)
|
|
lnTipDoc = tip
|
|
Use In crsIncUnic
|
|
|
|
DO asserteaza WITH lcPrefix + ': garzile do_editare_unificata trecute (nesters/neproforma/tip valid/luna curenta)', ;
|
|
lnSters = 0 AND !llEProforma AND !Inlist(lnTipDoc,44,45,46,51) AND (pnAn*12+pnLuna) == (gnAn*12+gnLuna), ''
|
|
DO asserteaza WITH lcPrefix + ': fara referinte (incasari/plati)', !ReferinteDocumenteNota(pnAn, pnLuna, lnCod), ''
|
|
DO asserteaza WITH lcPrefix + ': nu e in eFactura', !EsteInEFactura(lnIdFact), ''
|
|
DO asserteaza WITH lcPrefix + ': fara urmasi', !DocumentAreUrmasi(lnIdVanzareP), ''
|
|
|
|
poDate = IncarcaAntetFacturaEditare(lnIdVanzareP, @pnDiscountRon, @pnDiscountValuta)
|
|
DO asserteaza WITH lcPrefix + ': IncarcaAntetFacturaEditare reuseste', Vartype(m.poDate) == 'O', Vartype(m.poDate)
|
|
IF Vartype(m.poDate) <> 'O'
|
|
RETURN
|
|
ENDIF
|
|
|
|
IncarcaLiniiFacturaEditare(poDate, lnIdVanzareP)
|
|
|
|
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')
|
|
DO asserteaza WITH lcPrefix + ': formularul se deschide fara eroare (defectul 5 latent nu se activeaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm)
|
|
IF Vartype(m.loForm) <> 'O'
|
|
RETURN
|
|
ENDIF
|
|
DO asserteaza WITH lcPrefix + ': G9 niciun amessagebox la Createobject/Init', Empty(gcMockUltimMesaj), gcMockUltimMesaj
|
|
|
|
*!* --- asertiunile care prind regresia D1/D3/D4 ---
|
|
DO asserteaza WITH lcPrefix + ': poDate.incasat = valoarea din baza (NU suprascrisa cu totalctva)', ;
|
|
Round(Nvl(poDate.incasat,-1),2) == Round(m.tnIncasatAsteptat,2), Transform(Nvl(poDate.incasat,-1))
|
|
DO asserteaza WITH lcPrefix + ': poDate.nr_incasare nu a fost zeroit', ;
|
|
Nvl(poDate.nr_incasare,-1) == m.tnNrIncasareAsteptat, Transform(Nvl(poDate.nr_incasare,-1))
|
|
DO asserteaza WITH lcPrefix + ': poDate.ntip_incasare incarcat corect', ;
|
|
Nvl(poDate.ntip_incasare,-1) == m.tnTipIncasareAsteptat, Transform(Nvl(poDate.ntip_incasare,-1))
|
|
DO asserteaza WITH lcPrefix + ': modul afisat (opt_incasat.Value) corespunde tip_incasare', ;
|
|
loForm.ct_incasare.opt_incasat.Value == m.tnModAsteptat - 1, Transform(loForm.ct_incasare.opt_incasat.Value)
|
|
DO asserteaza WITH lcPrefix + ': chk_incasare.Value = 1 (document incasat)', loForm.chk_incasare.Value == 1, Transform(loForm.chk_incasare.Value)
|
|
DO asserteaza WITH lcPrefix + ': grupC ct_incasare needitabil', !loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled)
|
|
DO asserteaza WITH lcPrefix + ': grupC chk_incasare needitabil', !loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled)
|
|
|
|
loForm.ndiscfactron = pnDiscountRon
|
|
loForm.ndiscfactval = pnDiscountValuta
|
|
loForm.do_calculeaza_totaluri()
|
|
|
|
*!* nemodal: eliberarea din Timer, in interiorul propriului Show() modal, blocheaza VFP in Release()
|
|
loForm.WindowType = 0
|
|
goDriverS8p7.Reseteaza()
|
|
loForm.Show()
|
|
DO asserteaza WITH lcPrefix + ': niciun amessagebox pe parcursul Show()', Empty(gcMockUltimMesaj), gcMockUltimMesaj
|
|
|
|
Try
|
|
loForm.Release()
|
|
Catch
|
|
Endtry
|
|
|
|
IF Used('v_plaje_inc_b')
|
|
Use In v_plaje_inc_b
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_b')
|
|
goExecutor.oReset()
|
|
lcSnapPlajeB = CursorToSnapshot('v_plaje_inc_b')
|
|
Use In v_plaje_inc_b
|
|
DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, ''
|
|
|
|
DO CurataAliasuriReziduale
|
|
DO LogAUsed WITH lcPrefix + ' DUPA'
|
|
ENDPROC
|
|
|
|
|
|
PROCEDURE CursorToSnapshot
|
|
LPARAMETERS tcAlias
|
|
|
|
LOCAL lcResult, lnI
|
|
lcResult = ''
|
|
SELECT (m.tcAlias)
|
|
SCAN
|
|
FOR lnI = 1 TO FCOUNT()
|
|
lcResult = lcResult + Transform(Evaluate(Field(m.lnI))) + '|'
|
|
ENDFOR
|
|
lcResult = lcResult + Chr(10)
|
|
ENDSCAN
|
|
RETURN m.lcResult
|
|
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)
|
|
ENDPROC
|
|
|
|
|
|
*!* driverS8p7: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms in timp ce .Show() e blocat pe
|
|
*!* modal (acelasi tipar ca test_s8_pas7_cablare.prg). Citeste Ct_clb_altele din Objects (nu
|
|
*!* PEMSTATUS) inainte sa elibereze forma, ceea ce incheie .Show() si reda controlul apelantului.
|
|
DEFINE CLASS driverS8p7 AS Custom
|
|
lBusy = .F.
|
|
lGasit = .F.
|
|
lCtClbPrezent = .F.
|
|
lCtClbAlteleActiv = .F.
|
|
cCtClbEticheta = ''
|
|
nTotalRon = 0
|
|
nTotalVal = 0
|
|
|
|
lClbFdocPrezent = .F.
|
|
lClbFdocActiv = .F.
|
|
lCtClbNumeClientPrezent = .F.
|
|
lCtClbNumeClientActiv = .F.
|
|
lCtClbValutaPrezent = .F.
|
|
lCtClbValutaActiv = .F.
|
|
lClbZiCursPrezent = .F.
|
|
lClbZiCursActiv = .F.
|
|
lCtClbGestiuneInitPrezent = .F.
|
|
lCtClbGestiuneInitActiv = .F.
|
|
lCtClbPolPreturiPrezent = .F.
|
|
lCtClbPolPreturiActiv = .F.
|
|
lButIncarcaArticolePrezent = .F.
|
|
lButIncarcaArticoleActiv = .F.
|
|
lButCursuriPrezent = .F.
|
|
lButCursuriActiv = .F.
|
|
lCtIncasarePrezent = .F.
|
|
lCtIncasareActiv = .F.
|
|
lChkIncasarePrezent = .F.
|
|
lChkIncasareActiv = .F.
|
|
|
|
PROCEDURE Reseteaza
|
|
This.lGasit = .F.
|
|
This.lCtClbPrezent = .F.
|
|
This.lCtClbAlteleActiv = .F.
|
|
This.cCtClbEticheta = ''
|
|
This.nTotalRon = 0
|
|
This.nTotalVal = 0
|
|
This.lClbFdocPrezent = .F.
|
|
This.lClbFdocActiv = .F.
|
|
This.lCtClbNumeClientPrezent = .F.
|
|
This.lCtClbNumeClientActiv = .F.
|
|
This.lCtClbValutaPrezent = .F.
|
|
This.lCtClbValutaActiv = .F.
|
|
This.lClbZiCursPrezent = .F.
|
|
This.lClbZiCursActiv = .F.
|
|
This.lCtClbGestiuneInitPrezent = .F.
|
|
This.lCtClbGestiuneInitActiv = .F.
|
|
This.lCtClbPolPreturiPrezent = .F.
|
|
This.lCtClbPolPreturiActiv = .F.
|
|
This.lButIncarcaArticolePrezent = .F.
|
|
This.lButIncarcaArticoleActiv = .F.
|
|
This.lButCursuriPrezent = .F.
|
|
This.lButCursuriActiv = .F.
|
|
This.lCtIncasarePrezent = .F.
|
|
This.lCtIncasareActiv = .F.
|
|
This.lChkIncasarePrezent = .F.
|
|
This.lChkIncasareActiv = .F.
|
|
ENDPROC
|
|
|
|
PROCEDURE Executa
|
|
IF This.lBusy OR This.lGasit
|
|
RETURN
|
|
ENDIF
|
|
This.lBusy = .T.
|
|
TRY
|
|
LOCAL lnI, lnJ, lnJ2, loFrm2, loObj, loObj2
|
|
FOR lnI = 1 TO _SCREEN.FormCount
|
|
IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2'
|
|
loFrm2 = _SCREEN.Forms(m.lnI)
|
|
This.lGasit = .T.
|
|
This.nTotalRon = Nvl(loFrm2.ntotalron, 0)
|
|
This.nTotalVal = Nvl(loFrm2.ntotalval, 0)
|
|
FOR lnJ = 1 TO loFrm2.Objects.Count
|
|
loObj = loFrm2.Objects(m.lnJ)
|
|
DO CASE
|
|
CASE Upper(loObj.Name) == 'CT_CLB_ALTELE'
|
|
This.lCtClbPrezent = .T.
|
|
This.lCtClbAlteleActiv = loObj.lactiv
|
|
This.cCtClbEticheta = Alltrim(loObj.clb_tx_cautare.lb_SIMPLU1.Caption)
|
|
CASE Upper(loObj.Name) == 'CLB_FDOC'
|
|
This.lClbFdocPrezent = .T.
|
|
This.lClbFdocActiv = loObj.cboFdoc.Enabled
|
|
CASE Upper(loObj.Name) == 'CT_CLB_NUME_CLIENT'
|
|
This.lCtClbNumeClientPrezent = .T.
|
|
This.lCtClbNumeClientActiv = loObj.lactiv
|
|
CASE Upper(loObj.Name) == 'CT_CLB_VALUTA'
|
|
This.lCtClbValutaPrezent = .T.
|
|
This.lCtClbValutaActiv = loObj.lactiv
|
|
CASE Upper(loObj.Name) == 'CLB_ZI_CURS'
|
|
This.lClbZiCursPrezent = .T.
|
|
This.lClbZiCursActiv = !loObj.text_simplu1.ReadOnly
|
|
CASE Upper(loObj.Name) == 'CT_CLB_POLITICI_PRETURI'
|
|
This.lCtClbPolPreturiPrezent = .T.
|
|
This.lCtClbPolPreturiActiv = loObj.lactiv
|
|
CASE Upper(loObj.Name) == 'BUT_INCARCA_ARTICOLE'
|
|
This.lButIncarcaArticolePrezent = .T.
|
|
This.lButIncarcaArticoleActiv = loObj.Enabled
|
|
CASE Upper(loObj.Name) == 'BUT_CURSURI'
|
|
This.lButCursuriPrezent = .T.
|
|
This.lButCursuriActiv = loObj.Enabled
|
|
CASE Upper(loObj.Name) == 'CT_INCASARE'
|
|
This.lCtIncasarePrezent = .T.
|
|
This.lCtIncasareActiv = loObj.Enabled
|
|
CASE Upper(loObj.Name) == 'CHK_INCASARE'
|
|
This.lChkIncasarePrezent = .T.
|
|
This.lChkIncasareActiv = loObj.Enabled
|
|
CASE Upper(loObj.Name) == 'CT_CONTABILITATE'
|
|
FOR lnJ2 = 1 TO loObj.Objects.Count
|
|
loObj2 = loObj.Objects(m.lnJ2)
|
|
IF Upper(loObj2.Name) == 'CT_CLB_GESTIUNE_INIT'
|
|
This.lCtClbGestiuneInitPrezent = .T.
|
|
This.lCtClbGestiuneInitActiv = loObj2.lactiv
|
|
ENDIF
|
|
ENDFOR
|
|
ENDCASE
|
|
ENDFOR
|
|
loFrm2.Release()
|
|
EXIT
|
|
ENDIF
|
|
ENDFOR
|
|
CATCH TO loExcS8p7
|
|
STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1)
|
|
FINALLY
|
|
This.lBusy = .F.
|
|
ENDTRY
|
|
ENDPROC
|
|
ENDDEFINE
|