Initial: flux text FoxBin2Prg (git urmareste .??2 in-arbore, binarele VFP git-ignored)

Include si sistemul de depanare/testare headless din Teste\ (harness UI cu capturi, verificare de sintaxa prin compilare, wrappere text<->binar) si docs\depanare_testare_flora2roa.md.
This commit is contained in:
2026-08-02 08:56:52 +03:00
commit 2736cbd525
49 changed files with 16011 additions and 0 deletions

4
.gitattributes vendored Normal file
View File

@@ -0,0 +1,4 @@
# SVN ramane autoritatea pentru line endings (rulaj paralel svn+git).
# Dezactiveaza orice normalizare CRLF/LF facuta de git, ca sa nu mai apara
# "modificari" fantoma dupa fiecare svn update/checkout care doar atinge mtime-ul.
* -text

104
.gitignore vendored Normal file
View File

@@ -0,0 +1,104 @@
# =============================================================================
# Flux text FoxBin2Prg: git urmareste DOAR versiunile text .??2 (in arbore),
# nu binarele VFP. Binarele convertibile si indecsii regenerabili se ignora.
# SVN ramane sursa de adevar pentru binare (via global-ignores pe .??2).
# =============================================================================
# --- Binare VFP convertibile in text .??2 (ambele forme de caz) ---
*.vcx
*.VCX
*.vct
*.VCT
*.scx
*.SCX
*.sct
*.SCT
*.frx
*.FRX
*.frt
*.FRT
*.mnx
*.MNX
*.mnt
*.MNT
*.lbx
*.LBX
*.lbt
*.LBT
*.pjx
*.PJX
*.pjt
*.PJT
*.dbc
*.DBC
*.dct
*.DCT
# --- Indecsi regenerabili (nu se transporta in .db2/.dc2) ---
*.cdx
*.CDX
*.dcx
*.DCX
# --- Fisiere generate/compilate Visual FoxPro ---
*.fxp
*.FXP
*.mpr
*.MPR
*.mpx
*.MPX
*.vcr
*.VCR
*.src
# --- Backup-uri si fisiere temporare create de editorul VFP ---
*.bak
*.BAK
*.tmp
*.TMP
*.err
*.ERR
*.Stats
*.stackdump
# --- Stare locala / specifica masinii, nu proiectului ---
# Raman urmarite (sunt si in SVN, sunt dependente de rulare): settings.ini,
# settings.flora.ini, app.ico, vfpconnection.fll, vfpencryption.fll
FOXUSER.DBF
FOXUSER.FPT
flora2roa.exe
update_log.txt
log/
log.txt
LOG.txt
# --- Date de intrare pentru import: doar exemplele de referinta (cele din SVN) ---
# restul (~900 fisiere, ~80 MB) sunt date locale de lucru, nu sursa
EXEMPLE/*
!EXEMPLE/flora.txt
!EXEMPLE/coresp_parteneri.csv
!EXEMPLE/Monografii.xlsx
!EXEMPLE/hotel/
EXEMPLE/hotel/*
!EXEMPLE/hotel/bts_detalii_facturi_rep_20240916.xml
!EXEMPLE/restaurant/
EXEMPLE/restaurant/*
!EXEMPLE/restaurant/Iesiri_20240718.xml
!EXEMPLE/restaurant/Intrari_20240426.xml
!EXEMPLE/restaurant/Vanzari_20240909.xml
# --- Artefacte ale testelor headless (Teste\ruleaza_teste.ps1) ---
Teste/uisync/
Teste/screenshots/
Teste/_erori_test.txt
Teste/*_log.txt
# --- Cache text extern (inlocuit de fluxul in-arbore .??2) ---
_textcache/
# --- Subversion (working copy paralela) ---
.svn/
docs/diff_*.patch
docs/local/
.gstack/

10
ALTE/azi.sql Normal file
View File

@@ -0,0 +1,10 @@
SELECT SUM(SUMA) AS SUMA from imp_import_documente where extract(year from dat_document) = 2024 and extract(month from dat_document) = 6
AND SUBSTR(SCD, 1,3) = '401';
SELECT SUM(SUMA) AS SUMA from imp_import_documente where extract(year from dat_document) = 2024 and extract(month from dat_document) = 6
AND SUBSTR(SCC, 1,3) = '401';
SELECT sum(t.suma) as suma, dat_document from imp_import_documente t where extract(year from dat_document) = 2024 and extract(month from dat_document) = 6 AND SUBSTR(SCD, 1,3) = '401' group by dat_document order by dat_DOCUMENT;
SELECT sum(t.suma) as suma, dataact from ACT t where AN=2024 AND LUNA = 6 AND SUBSTR(SCD, 1,3) = '401' AND STERS= 0 group by dataact order by dataact;
select t.*,rowid from imp_import_documente t where extract(year from dat_document) = 2024 and extract(month from dat_document) = 6 AND SUBSTR(SCD, 1,3) = '401' AND dat_document = to_date('04062024', 'ddmmyyyy')order by dat_document, suma;
select t.*,rowid from act t where AN=2024 AND LUNA = 6 AND SUBSTR(SCD, 1,3) = '401' AND STERS= 0 AND dataact = to_date('04062024', 'ddmmyyyy')order by dataact, NRACT, suma;

32
ALTE/documente_duble.sql Normal file
View File

@@ -0,0 +1,32 @@
--select t.*,rowid from act t where an=2024 and luna = 6 order by dataact, nract, cod;
/*select t.*,rowid from act t where an=2024 and luna = 3 and cod in (
select cod from
(with select_data as
(select distinct a.cod, a.dataact, a.nract, b.cod as codb from
(select distinct dataact, nract, suma, cod, explicatia4 from act where an=2024 and luna = 2 and sters = 0 and explicatia4 = 'IMPORT BIZ') a join
(select distinct dataact, nract, suma, cod, explicatia4 from act where an=2024 and luna = 2 and sters = 0 and explicatia4 is null) b on (a.dataact = b.dataact and a.nract = b.nract and a.suma = b.suma)
)
select cod from select_data
union
select codb from select_data))
order by dataact, nract, cod;*/
select an, luna, nract, dataact, scd, ascd, scc, ascc, suma, explicatia4, sters, id_utils, dataoras, cod from
(select an, luna, nract, dataact, scd, ascd, scc, ascc, suma, explicatia4, sters, id_utils, dataoras, cod from act
union
select an, luna, nract, dataact, scd, ascd, scc, ascc, suma, explicatia4, 0 as sters, 0 as id_utils, null as dataoras, cod from act_imp_2024)
where an=2024 and luna = 10 and cod in (
select cod from
(with select_data as
(select distinct a.cod, a.dataact, a.nract, b.cod as codb from
(select distinct dataact, nract, suma, cod, explicatia4 from act_imp_2024 where an=2024 and luna = 10 ) a join
(select distinct dataact, nract, suma, cod, explicatia4 from act where an=2024 and luna = 10 and sters = 0 and explicatia4 is null) b on (a.dataact = b.dataact and a.nract = b.nract and a.suma = b.suma)
)
select cod from select_data
union
select codb from select_data))
order by dataact, nract, cod, suma;

View File

@@ -0,0 +1,406 @@
-- SQL SERVER
-- DROP VIEW dbo.FACC_V_LIST_REGISTRU_JURNAL_X;
CREATE VIEW dbo.FACC_V_LIST_REGISTRU_JURNAL_X AS
SELECT
TBL_REGISTRU.ID_DOCUMENT,
TBL_REGISTRU.DAT_DOCUMENT,
TBL_REGISTRU.DAT_SCADENT,
TBL_REGISTRU.COD_NUMBER,
TBL_REGISTRU.TIP_DOCUMENT,
TBL_REGISTRU.ID_PARTNER,
TBL_REGISTRU.PARTNER_NAME,
TBL_REGISTRU.COD_FISCAL,
TBL_REGISTRU.COD_CNP,
TBL_REGISTRU.EXPLICATII,
TBL_REGISTRU.CONT_DEBIT,
TBL_REGISTRU.CONT_CREDIT,
SUM(TBL_REGISTRU.DEC_VALUE) AS DEC_VALUE
FROM
(SELECT
TOP (100) PERCENT
dbo.FACC_T_CONTARI.ID_DOCUMENT,
dbo.FACC_T_CONTARI.DAT_DOCUMENT,
dbo.FACC_T_DOCUMENTS.DAT_SCADENT,
dbo.FACC_V_ALL_DOCUMENTS.COD_NUMBER,
dbo._FACC_GET_DOCUMENT_TYPE_NAME(dbo.FACC_T_CONTARI.ID_DOCUMENT) AS TIP_DOCUMENT,
dbo.NCL_V_PARTNERS_NAMES.ID_PARTNER,
dbo.NCL_V_PARTNERS_NAMES.PARTNER_NAME,
dbo.NCL_T_PARTNERS.COD_FISCAL,
dbo.NCL_T_PARTNERS.COD_CNP,
dbo.FACC_T_CONTARI.EXPLICATII,
dbo.FACC_T_CONTARI.CONT_DEBIT,
dbo.FACC_T_CONTARI.CONT_CREDIT,
dbo.FACC_T_CONTARI.DEC_VAL AS DEC_VALUE
FROM
dbo.FACC_T_CONTARI
INNER JOIN dbo.FACC_V_ALL_DOCUMENTS ON dbo.FACC_T_CONTARI.ID_DOCUMENT = dbo.FACC_V_ALL_DOCUMENTS.ID_DOCUMENT
LEFT OUTER JOIN dbo.NCL_V_PARTNERS_NAMES ON dbo.FACC_V_ALL_DOCUMENTS.ID_PARTNER = dbo.NCL_V_PARTNERS_NAMES.ID_PARTNER
LEFT OUTER JOIN dbo.NCL_T_PARTNERS ON dbo.FACC_V_ALL_DOCUMENTS.ID_PARTNER = dbo.NCL_T_PARTNERS.ID_PARTNER
LEFT OUTER JOIN dbo.FACC_T_DOCUMENTS on dbo.FACC_T_CONTARI.ID_DOCUMENT = dbo.FACC_T_DOCUMENTS.ID_DOCUMENT
WHERE
(dbo.FACC_T_CONTARI.DEC_VAL <> 0)
) AS TBL_REGISTRU
INNER JOIN dbo.NCL_T_ACCOUNTS ON TBL_REGISTRU.CONT_DEBIT = dbo.NCL_T_ACCOUNTS.COD_ACCOUNT
INNER JOIN dbo.NCL_T_ACCOUNTS AS NCL_T_ACCOUNTS_1 ON TBL_REGISTRU.CONT_CREDIT = NCL_T_ACCOUNTS_1.COD_ACCOUNT
GROUP BY
TBL_REGISTRU.ID_DOCUMENT,
TBL_REGISTRU.DAT_DOCUMENT,
TBL_REGISTRU.DAT_SCADENT,
TBL_REGISTRU.COD_NUMBER,
TBL_REGISTRU.TIP_DOCUMENT,
TBL_REGISTRU.ID_PARTNER,
TBL_REGISTRU.PARTNER_NAME,
TBL_REGISTRU.COD_FISCAL,
TBL_REGISTRU.COD_CNP,
TBL_REGISTRU.EXPLICATII,
TBL_REGISTRU.CONT_DEBIT,
TBL_REGISTRU.CONT_CREDIT
HAVING
(SUM(TBL_REGISTRU.DEC_VALUE) <> 0)
CREATE VIEW dbo.FACC_V_LIST_REGISTRU_JURNAL_Y AS
SELECT
r.ID_DOCUMENT,r.DAT_DOCUMENT,r.DAT_SCADENT,r.COD_NUMBER,r.TIP_DOCUMENT,r.ID_PARTNER,r.PARTNER_NAME,r.COD_FISCAL,r.COD_CNP,r.EXPLICATII,r.CONT_DEBIT,r.CONT_CREDIT,r.DEC_VALUE,
l.ID_IN as ID_DOCP, l.VAL_LEI, COALESCE(l.val_lei, r.dec_value) as suma
FROM [mybiz].[dbo].[FACC_V_LIST_REGISTRU_JURNAL_X] r
left outer join [mybiz].[dbo].[PRT_T_LEGATURI] l on r.id_document = l.ID_OUT
CREATE VIEW dbo.FACC_V_LIST_REGISTRU_JURNAL_Y_2024 AS
SELECT [ID_DOCUMENT]
,[DAT_DOCUMENT]
,[DAT_SCADENT]
,[COD_NUMBER]
,[TIP_DOCUMENT]
,[ID_PARTNER]
,[PARTNER_NAME]
,[COD_FISCAL]
,[COD_CNP]
,[EXPLICATII]
,[CONT_DEBIT]
,[CONT_CREDIT]
,[DEC_VALUE]
,[ID_DOCP]
,[VAL_LEI]
,[suma]
FROM [mybiz].[dbo].[FACC_V_LIST_REGISTRU_JURNAL_Y]
where dat_document >= '2024-01-01'
/****** Script for SelectTopNRows command from SSMS ******/
SELECT [ID_DOCUMENT]
,[DAT_DOCUMENT]
,[DAT_SCADENT]
,[COD_NUMBER]
,[TIP_DOCUMENT]
,[ID_PARTNER]
,[PARTNER_NAME]
,[COD_FISCAL]
,[COD_CNP]
,[EXPLICATII]
,[CONT_DEBIT]
,[CONT_CREDIT]
,[DEC_VALUE]
,[ID_DOCP]
,[VAL_LEI]
,[suma]
FROM [mybiz].[dbo].FACC_V_LIST_REGISTRU_JURNAL_Y_2024
order by dat_document desc
-------------------------------------
CREATE TABLE EXT_IMPORT_DOCUMENTE (
ID_DOCUMENT VARCHAR2(100),
DAT_DOCUMENT VARCHAR2(100),
DAT_SCADENT VARCHAR2(100),
COD_NUMBER VARCHAR2(100),
TIP_DOCUMENT VARCHAR2(100),
ID_PARTNER VARCHAR2(100),
PARTNER_NAME VARCHAR2(200),
COD_FISCAL VARCHAR2(100),
COD_CNP VARCHAR2(100),
EXPLICATII VARCHAR2(500),
CONT_DEBIT VARCHAR2(100),
CONT_CREDIT VARCHAR2(100),
DEC_VALUE VARCHAR2(100),
ID_DOCP VARCHAR2(100),
VAL_LEI VARCHAR2(100),
SUMA VARCHAR2(100)
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY DMPDIR
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
SKIP 1
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
)
LOCATION ('registru_jurnal_2024.csv')
)
REJECT LIMIT 0;
-- Verificarea datelor brute
SELECT * FROM EXT_IMPORT_DOCUMENTE WHERE ROWNUM <= 10;
-- Crearea tabelului final cu conversie flexibilă și gestionarea erorilor
create table IMP_IMPORT_DOCUMENTE AS
SELECT
TO_NUMBER(REGEXP_SUBSTR(ID_DOCUMENT, '\d+')) AS ID_DOCUMENT,
TO_DATE(SUBSTR(REPLACE(DAT_DOCUMENT, 'NULL', ''),1,10), 'YYYY-MM-DD') AS DAT_DOCUMENT,
TO_DATE(SUBSTR(REPLACE(DAT_SCADENT, 'NULL', ''),1,10), 'YYYY-MM-DD') AS DAT_SCADENT,
REGEXP_SUBSTR(COD_NUMBER, '\d+') as COD_NUMBER,
REPLACE(TIP_DOCUMENT, 'NULL', '') AS TIP_DOCUMENT,
TO_NUMBER(REGEXP_SUBSTR(ID_PARTNER, '\d+')) AS ID_PARTNER,
REPLACE(PARTNER_NAME, 'NULL', '') AS PARTNER_NAME,
REPLACE(COD_FISCAL, 'NULL', '') AS COD_FISCAL,
REPLACE(COD_CNP, 'NULL', '') AS COD_CNP,
REPLACE(EXPLICATII, 'NULL', '') AS EXPLICATII,
REPLACE(CONT_DEBIT, 'NULL', '') AS CONT_DEBIT,
REPLACE(CONT_CREDIT, 'NULL', '') AS CONT_CREDIT,
TO_NUMBER(REPLACE(DEC_VALUE, 'NULL', '0'), '999999999.99') AS DEC_VALUE,
TO_NUMBER(REGEXP_SUBSTR(ID_DOCP, '\d+')) AS ID_DOCP,
TO_NUMBER(REPLACE(VAL_LEI,'NULL', '0'), '999999999.99') AS VAL_LEI,
TO_NUMBER(REPLACE(SUMA, 'NULL', '0'), '999999999.99') AS SUMA
FROM EXT_IMPORT_DOCUMENTE;
-- Verificarea datelor convertite
SELECT * FROM IMPORT_DOCUMENTE WHERE ROWNUM <= 10;
-- Verificarea rândurilor cu probleme la conversia datei
SELECT ID_DOCUMENT, DAT_DOCUMENT, DAT_SCADENT
FROM IMP_IMPORT_DOCUMENTE
WHERE DAT_DOCUMENT IS NULL OR DAT_SCADENT IS NULL;
ALTER TABLE IMP_IMPORT_DOCUMENTE ADD ID_PART NUMBER(20) NULL;
alter table IMP_IMPORT_DOCUMENTE add scd varchar2(4);
alter table IMP_IMPORT_DOCUMENTE add ascd varchar2(4);
alter table IMP_IMPORT_DOCUMENTE add scc varchar2(4);
alter table IMP_IMPORT_DOCUMENTE add ascc varchar2(4);
alter table IMP_IMPORT_DOCUMENTE add cod number(20);
alter table IMP_IMPORT_DOCUMENTE add id_fdoc number(5);
-- Created on 10/29/2024 by MMARI
declare
lnIdPart NOM_PARTENERI.ID_PART%TYPE := 0;
begin
-- Test statements here
for item in (select distinct id_partner, partner_name, cod_fiscal, cod_cnp from imp_import_documente where cod_fiscal is not null) loop
select max(id_part) into lnIdPart from nom_parteneri where sters = 0 and trim(regexp_replace(cod_fiscal, '[^0-9]', '')) = item.cod_fiscal;
if lnIdPart is null then
PACK_DEF.adauga_partener(tcDenumire => item.partner_name,
tcNume => item.partner_name,
tcPrenume => '',
tcCod_fiscal => item.cod_fiscal,
tcReg_comert => '',
tnId_loc => NULL,
tnId_categorie_entitate => NULL,
tcPrefix => NULL,
tcSufix => NULL,
tnTip_persoana => 1,
tcBanca => NULL,
tcCont_banca => NULL,
tnInactiv => 0,
tcMotiv_inactiv => NULL,
tnId_util => -3,
tcSir_id_tipPart => '16;',
tnId_Part => lnIdPart);
update nom_parteneri set zona = 'IMPORT' where id_part = lnIdPart;
end if;
update imp_import_documente set id_part = lnIdPart where id_partner = item.id_partner;
end loop;
end;
/
UPDATE IMP_IMPORT_DOCUMENTE
SET SCD = CASE
WHEN INSTR(cont_debit, '.') > 0 THEN
SUBSTR(cont_debit, 1, INSTR(cont_debit, '.') - 1)
ELSE
cont_debit
END,
ascd = CASE
WHEN INSTR(cont_debit, '.') > 0 THEN
REPLACE(SUBSTR(cont_debit, INSTR(cont_debit, '.') + 1),
'.',
'')
ELSE
null
END,
scc = CASE
WHEN INSTR(cont_credit, '.') > 0 THEN
SUBSTR(cont_credit, 1, INSTR(cont_credit, '.') - 1)
ELSE
cont_credit
END,
ascc = CASE
WHEN INSTR(cont_credit, '.') > 0 THEN
REPLACE(SUBSTR(cont_credit, INSTR(cont_credit, '.') + 1),
'.',
'')
ELSE
null
END;
BEGIN
FOR ITEM IN (SELECT 50 as id_fdoc, 'Amortizare' as fel_document
FROM DUAL
UNION ALL
SELECT 25, 'Chitanta Beneficiar Lei'
FROM DUAL
UNION ALL
SELECT 25, 'Chitanta Furnizor Lei'
FROM DUAL
UNION ALL
SELECT 15, 'Consum'
FROM DUAL
UNION ALL
SELECT 35, 'Dispozitie de incasare / plata Lei'
FROM DUAL
UNION ALL
SELECT 40, 'Extras de cont Lei'
FROM DUAL
UNION ALL
SELECT 42, 'Factura Client'
FROM DUAL
UNION ALL
SELECT 42, 'Factura Furnizor'
FROM DUAL
UNION ALL
SELECT 50, 'Import Aplicatii Fidelio'
FROM DUAL
UNION ALL
SELECT 50, 'Import Aplicatii Micros'
FROM DUAL
UNION ALL
SELECT 50, 'Inchidere Venituri si Cheltuieli'
FROM DUAL
UNION ALL
SELECT 48, 'Monetar lei'
FROM DUAL
UNION ALL
SELECT 50, 'Nota Salarizare'
FROM DUAL
UNION ALL
SELECT 50, 'Note contabile diverse'
FROM DUAL
UNION ALL
SELECT 56, 'Ordin de plata beneficiar Lei'
FROM DUAL
UNION ALL
SELECT 56, 'Ordin de plata furnizor Lei'
FROM DUAL
UNION ALL
SELECT 55, 'Transfer'
FROM DUAL) LOOP
UPDATE IMP_IMPORT_DOCUMENTE
SET ID_FDOC = ITEM.ID_FDOC
WHERE UPPER(TRIM(replace(tip_document,'-->',''))) = UPPER(ITEM.FEL_DOCUMENT);
END LOOP;
END;
insert into act (an, luna, dataireg, cod, id_fact, dataact, datascad, nract, id_fdoc, explicatia, scd, ascd, scc, ascc, suma, id_Factd, id_factc, id_partd, id_partc, id_util, dataora, explicatia4)
select extract(year from dat_document) as an, extract(month from dat_document) as luna, dat_document as dataireg, id_document as cod, id_document as id_fact, dat_document as dataact, dat_scadent as datascad, to_number(nvl(cod_number,to_char(dat_document, 'yyyymmdd'))) as nract,
id_fdoc, explicatii as explicatia, scd, ascd, scc, ascc, suma,
case when scd in ('401','404','419','462', '408') then nvl(id_docp,0) else 0 end as id_factd,
case when scc in ('4111','409','4091', '4092', '4093', '4094','461', '418') then nvl(id_docp,0) else 0 end as id_factc,
case when scd in ('401','404','419','462', '408','4111','409','4091', '4092', '4093', '4094','461', '418') then nvl(id_part,0) else 0 end as id_partd,
case when scc in ('401','404','419','462', '408','4111','409','4091', '4092', '4093', '4094','461', '418') then nvl(id_part,0) else 0 end as id_partc,
-3 as id_util, to_date('29102024','ddmmyyyy') as dataora, 'IMPORT BIZ' as explicatia4
from imp_import_documente where extract(year from dat_document) = 2024 and extract(month from dat_document) between 1 and 5 order by dat_document, cod_number;
update act set id_jtva_coloana = 113 where an=2024 and scc = '401' and id_jtva_coloana is null and explicatia4 = 'IMPORT BIZ';
----------------------------------
-- DOCUMENTE DUBLE DIN IMPORTBIZ SI ROA
--select t.*,rowid from act t where an=2024 and luna = 6 order by dataact, nract, cod;
select an, luna, nract, dataact, scd, ascd, scc, ascc, suma, explicatia4, sters, id_utils, dataoras, cod from
(select an, luna, nract, dataact, scd, ascd, scc, ascc, suma, explicatia4, sters, id_utils, dataoras, cod from act
union
select an, luna, nract, dataact, scd, ascd, scc, ascc, suma, explicatia4, 0 as sters, 0 as id_utils, null as dataoras, cod from act_imp_2024)
where an=2024 and luna = 10 and cod in (
select cod from
(with select_data as
(select distinct a.cod, a.dataact, a.nract, b.cod as codb from
(select distinct dataact, nract, suma, cod, explicatia4 from act_imp_2024 where an=2024 and luna = 10 ) a join
(select distinct dataact, nract, suma, cod, explicatia4 from act where an=2024 and luna = 10 and sters = 0 and explicatia4 is null) b on (a.dataact = b.dataact and a.nract = b.nract and a.suma = b.suma)
)
select cod from select_data
union
select codb from select_data))
order by dataact, nract, cod, suma;
------------------------
update act set explicatia5 = 'DUPLICATE' WHERE an=2024 and luna = 9 and cod in (
select cod from
(with select_data as
(select distinct a.cod, a.dataact, a.nract, b.cod as codb from
(select distinct dataact, nract, suma, cod, explicatia4 from act where an=2024 and luna = 9 and sters = 0 and explicatia4 = 'IMPORT BIZ') a join
(select distinct dataact, nract, suma, cod, explicatia4 from act where an=2024 and luna = 9 and sters = 0 and explicatia4 is null) b on (a.dataact = b.dataact and a.nract = b.nract and a.suma = b.suma)
)
select cod from select_data
union
select codb from select_data));
select t.*,rowid from act t where an=2024 and luna = 6 and cod in (
select cod from
(with select_data as
(select distinct a.cod, a.dataact, a.nract, b.cod as codb from
(select distinct dataact, nract, suma, cod, explicatia4 from act where an=2024 and luna = 6 and sters = 0 and explicatia4 = 'IMPORT BIZ') a join
(select distinct dataact, nract, suma, cod, explicatia4 from act where an=2024 and luna = 6 and sters = 0 and explicatia4 is null) b on (a.dataact = b.dataact and a.nract = b.nract and a.suma = b.suma)
)
select cod from select_data
union
select codb from select_data))
order by dataact, nract, cod;
select T.EXPLICATIA4, T.EXPLICATIA5, T.STERS, T.DATAORAS, T.ID_UTILS, t.nract, t.dataact, t.explicatia, t.scd, t.ascd, t.scc, t.ascc, t.suma, t.*,rowid from act t where an=2024 and luna = 6 AND EXPLICATIA5 like '%DUPLICATE' order by t.dataact, t.nract, t.cod;
-- DUPLICATE
select T.EXPLICATIA4, T.EXPLICATIA5, T.STERS, t.nract, t.dataact, t.scd, t.ascd, t.scc, t.ascc, t.suma, t.id_jtva_coloana, t.taxcode, t.paymentcode, t.explicatia, t.id_fact, t.id_factd, t.id_factc, t.cod, t.id_act, t.id_fdoc, t.datascad, t.dataireg, t.an, t.luna, t.nnir, t.id_util, t.dataora, t.id_responsabil, t.id_venchelt, t.id_sectie, t.id_set, t.id_lucrare, t.id_Gestin, t.id_Gestout, t.id_Valuta, t.proc_tva, t.id_ctr, t.serie_act,rowid from act t where an=2024 and luna = 6 AND STERS = 0 AND EXPLICATIA5 = 'DUPLICATE' order by t.dataact, t.nract, t.cod, t.suma;
-- ZDUPLICATE
select T.EXPLICATIA4, T.EXPLICATIA5, T.STERS, t.nract, t.dataact, t.scd, t.ascd, t.scc, t.ascc, t.suma, t.explicatia, t.id_fact, t.id_factd, t.id_factc, t.cod, t.id_act, t.id_jtva_coloana, t.id_fdoc, t.datascad, t.dataireg, t.an, t.luna, t.nnir, t.id_util, t.dataora, t.id_responsabil, t.id_venchelt, t.id_sectie, t.id_set, t.id_lucrare, t.id_Gestin, t.id_Gestout, t.id_Valuta, t.proc_tva, t.id_ctr, t.serie_act, t.taxcode, t.paymentcode,rowid from act t where an=2024 and luna = 6 AND EXPLICATIA5 = 'ZDUPLICATE' order by t.dataact, t.nract, t.cod, t.suma;
------------------------
/*SELECT SUM(SUMA) AS SUMA from imp_import_documente where extract(year from dat_document) = 2024 and extract(month from dat_document) = 6
AND SUBSTR(SCD, 1,3) = '401';
SELECT SUM(SUMA) AS SUMA from imp_import_documente where extract(year from dat_document) = 2024 and extract(month from dat_document) = 6
AND SUBSTR(SCC, 1,3) = '401';*/
SELECT CONT, SUM(DEBIT) AS DEBIT, SUM(CREDIT) AS CREDIT FROM
(SELECT SUBSTR(SCD,1,3) AS CONT, SUMA AS DEBIT, 0 AS CREDIT FROM ACT WHERE AN=2024 AND LUNA = 6 AND STERS = 0 AND SCD IS NOT NULL
UNION ALL
SELECT SUBSTR(SCC,1,3) AS CONT, 0 AS DEBIT, SUMA AS CREDIT FROM ACT WHERE AN=2024 AND LUNA = 6 AND STERS = 0 AND SCC IS NOT NULL)
GROUP BY CONT
ORDER BY CONT;
select a.dataact, a.suma as biz, b.suma as roa, a.suma - b.suma as dif from
(SELECT sum(t.suma) as suma, dat_document as dataact from imp_import_documente t where extract(year from dat_document) = 2024 and extract(month from dat_document) = 6 AND SUBSTR(SCD, 1,3) = '401' group by dat_document) a left join
(SELECT sum(t.suma) as suma, dataact from ACT t where AN=2024 AND LUNA = 6 AND SUBSTR(SCD, 1,3) = '401' AND STERS= 0 group by dataact) b on (a.dataact = b.dataact) order by dataact;
select a.scd, a.scc, b.scd, b.scc, a.dataact, a.suma as biz, b.suma as roa, nvl(a.suma,0) - nvl(b.suma,0) as dif from
(SELECT SCD, SCC, sum(t.suma) as suma, dat_document as dataact from imp_import_documente t where extract(year from dat_document) = 2024 and extract(month from dat_document) = 6 group by SCD, SCC, dat_document) a left join
(SELECT SCD, SCC, sum(t.suma) as suma, dataact from ACT t where AN=2024 AND LUNA = 6 AND STERS= 0 group by SCD, SCC, dataact) b on (a.dataact = b.dataact and a.scd = b.scd and a.scc = b.scc)
where nvl(a.suma,0) - nvl(b.suma,0) <> 0 order by a.scd, a.dataact;
select t.*,rowid from imp_import_documente t where extract(year from dat_document) = 2024 and extract(month from dat_document) = 6 AND SUBSTR(SCC, 1,3) = '401' AND dat_document = to_date('20062024', 'ddmmyyyy')order by dat_document, to_number(cod_number), suma;
--select t.explicatia4, t.*,rowid from act t where AN=2024 AND LUNA = 6 AND SUBSTR(SCD, 1,3) = '401' AND STERS= 0 AND dataact = to_date('21062024', 'ddmmyyyy')order by dataact, suma;
select T.EXPLICATIA4, T.EXPLICATIA5, T.STERS, t.nract, t.dataact, t.scd, t.ascd, t.scc, t.ascc, t.suma, t.id_jtva_coloana, t.taxcode, t.paymentcode, t.explicatia, t.id_fact, t.id_factd, t.id_factc, t.cod, t.id_act, t.id_fdoc, t.datascad, t.dataireg, t.an, t.luna, t.nnir, t.id_util, t.dataora, t.id_responsabil, t.id_venchelt, t.id_sectie, t.id_set, t.id_lucrare, t.id_Gestin, t.id_Gestout, t.id_Valuta, t.proc_tva, t.id_ctr, t.serie_act,rowid from act t where an=2024 and luna = 6 AND STERS = 0 AND SUBSTR(SCC, 1,3) = '401' AND dataact = to_date('20062024', 'ddmmyyyy') order by t.dataact, T.NRACT, t.suma;
select t.*,rowid from imp_import_documente t where extract(year from dat_document) = 2024 and extract(month from dat_document) = 6 AND cod_number like '%7000696928%' AND dat_document = to_date('20062024', 'ddmmyyyy')order by dat_document, to_number(cod_number), suma;
select T.EXPLICATIA4, T.EXPLICATIA5, T.STERS, t.nract, t.dataact, t.scd, t.ascd, t.scc, t.ascc, t.suma, t.id_jtva_coloana, t.taxcode, t.paymentcode, t.explicatia, t.id_fact, t.id_factd, t.id_factc, t.cod, t.id_act, t.id_fdoc, t.datascad, t.dataireg, t.an, t.luna, t.nnir, t.id_util, t.dataora, t.id_responsabil, t.id_venchelt, t.id_sectie, t.id_set, t.id_lucrare, t.id_Gestin, t.id_Gestout, t.id_Valuta, t.proc_tva, t.id_ctr, t.serie_act,rowid from act t where an=2024 and luna = 6 AND STERS = 0 AND nract= 7000696928 AND dataact = to_date('20062024', 'ddmmyyyy') order by t.dataact, T.NRACT, t.suma;

BIN
EXEMPLE/Monografii.xlsx Normal file

Binary file not shown.

2963
EXEMPLE/coresp_parteneri.csv Normal file

File diff suppressed because it is too large Load Diff

140
EXEMPLE/flora.txt Normal file
View File

@@ -0,0 +1,140 @@
restaurant
vanzari: tip document (La masa), nr document, data document, valoare fara tva, valoare tva, procent tva, tip plata (Carte credit, Numerar)
intrari: doar valoarea fara tva (nu exista coloane cu valoare TVA, cota TVA)
iesiri: tip document (RaportGestiune), nr document, data document, valoare, cod sectie iesire, denumire sectie iesire, cod sectie intrare, denumire sectie intrare, tip iesire (Vanzare)
hotel
facturi: nr factura, data factura, cumparator, camera, tip camera, tarif, grupa tarif, pers facturare, sosire, plecare , codfiscal/cnp, regcomert/ci/pasaport, total, cash, card, cec, virament, alt tip, departament pos, denumire pos (Visa Card, Tarif Cazare, Taxa Statiune, Cash, Virament Intern), pos pret net, pos tva, pos taxa1 (proc tva), tip factura (Factura Laser A4, Decontare Interna), copanie tara, companie oras, agentie
La Restaurant sunt 3 fisiere:
1. Vanzari: monetare POS
- numar
- data
- valoare totala fara TVA
- valoare TVA
- Procent TVA
- tip plata (ex: Carte credit, Numerar, Tichete)
- tip document (ex: "La masa")
* Nu exista articole
Restaurant Monetar MON MICROS 7/6 07.05.2024 (F:\flora\restaurant\Vanzari_20240506.xml)
Data document: 06.05.2024
Incasare Card 19% 24
5125.01 = 418.02 20.17
5125.01 = 4427.0101 3.83
Incasare Numerar Casa Flora 19 % 30
5311 = 418.02 25.21
5311 = 4427.0101 4.79
Incasare Numerar Casa Flora 9% 148.50
5311 = 418.02 136.24
5311 = 4427.0201 12.26
Incasare Tichete?
2. intrari: facturi achizitie
- numar
- data
- Tip document (Factura)
- Cod fiscal
- Nume furnizor
- valoare totala fara TVA
- cod sectie intrare
- denumire sectie intrare (Bar Casa Flora, Bucatarie Casa Flora)
- tip tranzactie (Achizitie)
* Nu exista valoarea TVA!
* Nu este completata Cota TVA!
* Nu exista articole
Restaurant Intrari
Factura 594121001391 29.04.2024, Selgros Cash&Carry, CUI RO11805367
Achizitii marfuri Bucatarie Casa Flora, 485.15 lei fara TVA, 0 lei TVA
371.08 = 401.01 485.15 lei
4426.0101 = 401.01 0 lei
Factura 320406 29.04.2024, Sorla SRL, CUI RO5782471
Achizitii marfuri Bar Casa Flora, 3745.79 lei fara TVA, 0 lei TVA
371.08 = 401.01 3745.79 lei
4426.0101 = 401.01 0 lei
3. iesiri: consum, Raport gestiune
- numar
- data
- valoare totala document
- tip document (ex: "RaportGestiune")
- sectie intrare
- sectie iesire
- tip iesire (ex: "Vanzare")
Restaurant Raport de Gestiune
RAP MICROS 7 07.05.2024
Consum marfa vanzare Bar Casa Flora 607 = 371.01 11.04
Consum marfa vanzare Bucatarie Casa Flora 607 = 371.08 60.24
RAP MICROS 6 06.05.2024
Iesiri_20240506.xml
Consum marfa vanzare Bar Casa Flora 607 = 371.01 21.92
Consum marfa vanzare Bucatarie Casa Flora 607 = 371.08 39.95
Se importa din fisierul de vanzari
Vanzare CASA FLORA 418.02 = 707.0201 45.38
TVA Vanzare CASA FLORA 418.02 = 4428.03 8.62
RAP MICROS 5 05.05.2024
Vanzare CASA FLORA 418.02 = 707.0201 159.65
TVA Vanzare CASA FLORA 418.02 = 4428.03 30.33
Consum marfa vanzare Bar Casa Flora 607 = 371.01 21.92
Consum marfa vanzare Bucatarie Casa Flora 607 = 371.08 39.95
La Hotel este 1 fisier:
1. facturi:
- numar
- data
- nume cumparator
- cod fiscal/cnp
- reg. comert/ci/pasaport
- total valoare defalcat pe cash/card/cec/virament/alte
- departament POS
- denumire POS (ex: Visa Card, Tarif Cazare, Taxa Statiune, Cash, Virament Intern)
Fidelio Gestiune
bts_detalii_facturi_rep_20240507.xml
RAP FID 7 07.05.2024
418.01 = 472.03 180 Tichete (de ce este suma cu tot cu TVA pe venituri in avans?)
Fidelio Monetar
FID 8/7 08.05.2024
5125.03 = 418.01 164.14 Incasare tichete card 9%
5125.03 = 4427.0201 14.86 TVA Incasare tichete card 9%
Fidelio Factura 1 (Card)
Cumparator: GOCIU GABRIELA LUMINITA
Factura servicii 9% Tichete 100 lei, 11429 07.05.2024, Partener: KARD, CUI: 00000000
4111.02 = 418.01 91.74
4111.02 = 4427.0201 8.26
Fidelio Factura 2 servicii 9% Tichete 80 lei, 11430 07.05.2024, Partener: KARD, CUI: 00000000
Cumparator: GOCIU GABRIELA LUMINITA
4111.02 = 418.01 73.39
4111.02 = 4427.0201 6.61
* Este posibil ca o factura sa se achite cu mai multe mijloace de plata (card, tichete, numerar, virament intern)?
* Din Fidelio se importa doar facturile achitate cu Card. Ce se intampla cu facturile achitate numerar, tichete?
* La sfarsitul lunii se storneaza manual facturile importate din Fidelio, intrucat se declara din Fidelio eFactura cu toate detaliile:
4111 = 418 -180 lei
* Se face automat la import nota:
472 = 70x

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" standalone="yes"?>
<DocumentElement>
<Intrari>
<IdInregistrare>0-20240426</IdInregistrare>
<TipDocument>Factura</TipDocument>
<NrDocument>57778</NrDocument>
<DataDocument>26.04.2024 00:00:00</DataDocument>
<CodFiscal>22495407</CodFiscal>
<DenumireFurnizor>ARISA CORPORATION SRL</DenumireFurnizor>
<ValoareFacturaFaraTVA>2613.48</ValoareFacturaFaraTVA>
<ValoareAjustataFaraTVA>2613.48</ValoareAjustataFaraTVA>
<ValoareAjustare>0</ValoareAjustare>
<TVAValoareAjustata>0</TVAValoareAjustata>
<CotaTVA>0</CotaTVA>
<CodSectieDeIntrare>4</CodSectieDeIntrare>
<DenumireSectieDeIntrare>Bucatarie Casa Flora</DenumireSectieDeIntrare>
<TipTranzactie>Achizitie</TipTranzactie>
</Intrari>
<Intrari>
<IdInregistrare>1-20240426</IdInregistrare>
<TipDocument>Factura</TipDocument>
<NrDocument>57779</NrDocument>
<DataDocument>26.04.2024 00:00:00</DataDocument>
<CodFiscal>22495407</CodFiscal>
<DenumireFurnizor>ARISA CORPORATION SRL</DenumireFurnizor>
<ValoareFacturaFaraTVA>3289.77</ValoareFacturaFaraTVA>
<ValoareAjustataFaraTVA>3289.77</ValoareAjustataFaraTVA>
<ValoareAjustare>0</ValoareAjustare>
<TVAValoareAjustata>0</TVAValoareAjustata>
<CotaTVA>0</CotaTVA>
<CodSectieDeIntrare>4</CodSectieDeIntrare>
<DenumireSectieDeIntrare>Bucatarie Casa Flora</DenumireSectieDeIntrare>
<TipTranzactie>Achizitie</TipTranzactie>
</Intrari>
<Intrari>
<IdInregistrare>2-20240426</IdInregistrare>
<TipDocument>Factura</TipDocument>
<NrDocument>57784</NrDocument>
<DataDocument>26.04.2024 00:00:00</DataDocument>
<CodFiscal>22495407</CodFiscal>
<DenumireFurnizor>ARISA CORPORATION SRL</DenumireFurnizor>
<ValoareFacturaFaraTVA>939.39</ValoareFacturaFaraTVA>
<ValoareAjustataFaraTVA>939.39</ValoareAjustataFaraTVA>
<ValoareAjustare>0</ValoareAjustare>
<TVAValoareAjustata>0</TVAValoareAjustata>
<CotaTVA>0</CotaTVA>
<CodSectieDeIntrare>4</CodSectieDeIntrare>
<DenumireSectieDeIntrare>Bucatarie Casa Flora</DenumireSectieDeIntrare>
<TipTranzactie>Achizitie</TipTranzactie>
</Intrari>
</DocumentElement>

View File

@@ -0,0 +1,523 @@
<?xml version="1.0" standalone="yes"?>
<DocumentElement>
<Vanzari>
<IdInregistrare>0-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2155</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>0</ValoareFaraTVA>
<TVA>0</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Numerar</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>1-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2156</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>64.22</ValoareFaraTVA>
<TVA>5.78</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>tichete</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>2-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2157</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>10.08</ValoareFaraTVA>
<TVA>1.92</TVA>
<ProcentTVA>19</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Carte credit</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>3-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2158</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>4.59</ValoareFaraTVA>
<TVA>0.41</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Numerar</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>4-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2158</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>10.08</ValoareFaraTVA>
<TVA>1.92</TVA>
<ProcentTVA>19</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Numerar</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>5-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2158</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>13.03</ValoareFaraTVA>
<TVA>2.47</TVA>
<ProcentTVA>19</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Numerar</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>6-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2158</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>82.57</ValoareFaraTVA>
<TVA>7.43</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Numerar</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>7-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2159</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>10.08</ValoareFaraTVA>
<TVA>1.92</TVA>
<ProcentTVA>19</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Carte credit</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>8-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2160</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>13.76</ValoareFaraTVA>
<TVA>1.24</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Numerar</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>9-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2161</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>2.75</ValoareFaraTVA>
<TVA>0.25</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Carte credit</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>10-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2161</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>10.08</ValoareFaraTVA>
<TVA>1.92</TVA>
<ProcentTVA>19</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Carte credit</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>11-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2161</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>13.76</ValoareFaraTVA>
<TVA>1.24</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Carte credit</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>12-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2161</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>18.35</ValoareFaraTVA>
<TVA>1.65</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Carte credit</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>13-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2161</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>18.49</ValoareFaraTVA>
<TVA>3.51</TVA>
<ProcentTVA>19</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Carte credit</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>14-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2161</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>27.52</ValoareFaraTVA>
<TVA>2.48</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Carte credit</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>15-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2161</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>36.7</ValoareFaraTVA>
<TVA>3.3</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Carte credit</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>16-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2161</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>35.29</ValoareFaraTVA>
<TVA>6.71</TVA>
<ProcentTVA>19</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Carte credit</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>17-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2161</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>43.58</ValoareFaraTVA>
<TVA>3.92</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Carte credit</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>18-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2162</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>6.88</ValoareFaraTVA>
<TVA>0.62</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>tichete</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>19-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2162</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>13.76</ValoareFaraTVA>
<TVA>1.24</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>tichete</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>20-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2162</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>16.51</ValoareFaraTVA>
<TVA>1.49</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>tichete</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>21-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2162</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>23.53</ValoareFaraTVA>
<TVA>4.47</TVA>
<ProcentTVA>19</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>tichete</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>22-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2162</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>33.49</ValoareFaraTVA>
<TVA>3.01</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>tichete</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>23-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2162</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>44.95</ValoareFaraTVA>
<TVA>4.05</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>tichete</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>24-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2162</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>39.91</ValoareFaraTVA>
<TVA>3.59</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>tichete</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>25-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2163</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>16.51</ValoareFaraTVA>
<TVA>1.49</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>tichete</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>26-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2163</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>35.29</ValoareFaraTVA>
<TVA>6.71</TVA>
<ProcentTVA>19</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>tichete</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>27-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2163</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>40.83</ValoareFaraTVA>
<TVA>3.67</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>tichete</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>28-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2163</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>50</ValoareFaraTVA>
<TVA>4.5</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>tichete</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>29-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2163</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>21.43</ValoareFaraTVA>
<TVA>4.07</TVA>
<ProcentTVA>19</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>tichete</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>30-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2164</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>9.24</ValoareFaraTVA>
<TVA>1.76</TVA>
<ProcentTVA>19</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Carte credit</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>31-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2165</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>1.83</ValoareFaraTVA>
<TVA>0.17</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Numerar</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>32-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2165</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>3.67</ValoareFaraTVA>
<TVA>0.33</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Numerar</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>33-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2165</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>6.88</ValoareFaraTVA>
<TVA>0.62</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Numerar</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>34-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2165</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>13.76</ValoareFaraTVA>
<TVA>1.24</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Numerar</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>35-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2165</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>13.76</ValoareFaraTVA>
<TVA>1.24</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Numerar</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>36-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2165</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>27.52</ValoareFaraTVA>
<TVA>2.48</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Numerar</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>37-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2165</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>27.52</ValoareFaraTVA>
<TVA>2.48</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Numerar</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>38-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2165</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>100.46</ValoareFaraTVA>
<TVA>9.04</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Numerar</TipPlata>
</Vanzari>
<Vanzari>
<IdInregistrare>39-20240909</IdInregistrare>
<TipDocument>La masa</TipDocument>
<NrDocument>2165</NrDocument>
<DataDocument>09.09.2024 00:00:00</DataDocument>
<ValoareFaraTVA>44.95</ValoareFaraTVA>
<TVA>4.05</TVA>
<ProcentTVA>9</ProcentTVA>
<ValoareAchizitie>0</ValoareAchizitie>
<CodSectieVanzare>1</CodSectieVanzare>
<DenumireSectieVanzare />
<TipPlata>Numerar</TipPlata>
</Vanzari>
</DocumentElement>

91
INFO.txt Normal file
View File

@@ -0,0 +1,91 @@
Am facut suma(cantitate * pret) pe intrari si pe iesiri, dar nu am gasit in balanta sumele respective la 371, 401.
In fisierul de iesiri nu am gasit referinte la conturi. Sunt doar iesiri de 371?
In fisierul de intrari nu este contul in clar, ci un camp ID care face referire la un nomenclator de conturi. Trebuie sa aflu ce conturi reprezinta ID-urile
Am gasit si un fisier cu transferuri. Trebuie sa generam note si pentru transferuri?
Pentru lamuriri o sa imi trebuiasca:
RAPORT DE GESTIUNE
CENTRALIZATOR BONURI CONSUM
CENTRALIZATOR NIR-URI
CENTRALIZATOR TRANSFERURI (daca trebuie generate note)
LISTA ARTICOLE
Factura F/54381/17.05.2016 COCA COLA HBC ROMANIA SRL (NIR 1299)
NIR 1301 si Factura 866673 18/05/2016 (articolele au alte conturi decat NIR-ul 1299)
SELECT CONT, SUM(CANT*PRET) AS VALOARE FROM NIR1 GROUP BY CONT INTO CURSOR TT
CONT 11 (301): 6598.88
CONT 18 (371): 7490.00
balanta 301 debit: 6598.90
balanta 371 debit: 7533.45
balanta 378 credit: 4808.81
balanta 4428.1 credit: 715.53
SELECT l.cont, sum(l1.pret*l1.cant) as valoare FROM livrare l FULL JOIN livrare1 l1 ON l.codparinte = l1.codparinte AND l.indexlocal = l1.indexlivr GROUP BY l.cont
transf1
marfa
607: CALCULATE SUM((valachiz) FOR valachiz <> 0
378: CALCULATE SUM((pret*cant)-tva-valachiz) FOR valachiz <> 0
4428: CALCULATE SUM(tva) FOR valachiz <> 0
------------------------------
LUNA 06/2016
INTRARI - NIR
SELECT N.CONT, SUM(N.CANT*N.PRET) AS VALCTVAV, SUM(N.tva) AS VALTVAV, SUM(I.CANT*I.PRET) AS VALACH, SUM(((N.CANT*N.PRET)-N.TVA)-(I.CANT*I.PRET)) AS VALADAOS, SUM(I.TVA) AS VALTVAA FROM NIR1 N JOIN INTRARI1 I ON N.CODPARINTE = I.CODPARINTE AND N.ART = I.ART GROUP BY CONT INTO CURSOR TT
301
valoare achizitie fara tva: 7944.39
valoare tva achizitie: 717.51
371
valoare achizitie fara tva: 2982.41 (371 = 401)
valoare tva achizitie: 377.68 (4426 = 401)
valoare adaos: 5457.26 (371 = 378)
valoare tva vz neex: 904.33 (371 = 4428)
valoare vz cu adaos si tva: 9344 (debit 371)
LIVRARE - BON CONSUM (descarcare gestiune produse retete 301 si 371)
SELECT l.cont, ROUND(sum(l1.pret*l1.cant),2) as valvctva, ROUND(SUM((l1.pret-l1.adaos)*l1.cant),2) as valach, ROUND(SUM(l1.pret*l1.tvaneex/(1+l1.tvaneex)*l1.cant),2) as valtvaneex, ROUND(SUM((l1.adaos*l1.cant)-(l1.pret*l1.tvaneex/(1+l1.tvaneex)*l1.cant)),2) as valadaos FROM livrare l FULL JOIN livrare1 l1 ON l.codparinte = l1.codparinte AND l.indexlocal = l1.indexlivr GROUP BY l.cont
301
valoare achizitie fara tva: 9543.77 (601 = 301)
371
valoare achizitie fara tva: 491.42 (607 = 371)
valoare adaos: 1352.62 (378 = 371)
valoare tva neex: 165.96 (4428 = 371)
TRANSFER - MONETARE (descarcare gestiune marfa 371)
SELECT ROUND(SUM(valachiz),2) as valach, ROUND(SUM((pret*cant)-tva-valachiz),2) as valadaos, ROUND(SUM(tva),2) as valtva WHERE valachiz <> 0 FROM transf1
371
valoare achizitie fara tva: 2368.64 (607 = 371)
valoare adaos: 4199.53 (378 = 371)
valoare tva neex: 724.34 (4428 = 371)
INCASARI
SELECT t.zi, SUM(t.valdoc) as valtot, SUM(NVL(t2.valoare, 0.00)) as valpos, SUM(t.valdoc-NVL(t2.valoare,0.00)) as valcasa FROM transf t LEFT JOIN transf2 t2 ON t.coddoc = t2.codparinte GROUP BY t.zi
select z.zi, ROUND(NVL(x.proctva*100, 0.00),0) as proctva, ROUND(NVL(x.valvctva, 0.0000),2) - ROUND(NVL(z.valdiscoun * x.valvctva/y.valvctva, 0.0000),2) as valdoc, round(w.valpos* x.valvctva/y.valvctva,2) as valpos, round(w.valcasa* x.valvctva/y.valvctva,2) as valcasa from ;
(SELECT tr.zi, s.tvaneex as proctva, ROUND(SUM(t.cant*t.pret),2) as valvctva FROM transf1 t FULL JOIN sursa1 s ON t.codparinte = s.codparinte AND t.indexlocal = s.indexlivr FULL JOIN transf tr ON t.codparinte = tr.coddoc GROUP BY tr.zi, s.tvaneex ) x, ;
(SELECT tr.zi, ROUND(SUM(t.cant*t.pret),2) as valvctva FROM transf1 t JOIN transf tr ON t.codparinte = tr.coddoc GROUP BY tr.zi) y, ;
(SELECT tr.zi, ROUND(SUM(tr.valdiscoun),2) as valdiscoun FROM transf tr GROUP BY tr.zi) z, ;
(SELECT tr.zi, SUM(NVL(t2.valoare, 0.00)) as valpos, SUM(tr.valdoc-NVL(t2.valoare,0.00)) as valcasa FROM transf tr LEFT JOIN transf2 t2 ON tr.coddoc = t2.codparinte GROUP BY tr.zi) w ;
WHERE x.zi = y.zi AND x.zi = z.zi and x.zi = w.zi ;
INTO CURSOR tt
select zi, proctva, valdoc, ;
round(valdoc * proctva /(100 + proctva),2) as tva,;
valdoc - round(valdoc * proctva /(100 + proctva),2) as baza,;
round(valpos * proctva /(100 + proctva),2) as tvacard,;
valpos - round(valpos * proctva /(100 + proctva),2) as bazacard,;
round(valcasa * proctva /(100 + proctva),2) as tvanumerar,;
valcasa - round(valcasa * proctva /(100 + proctva),2) as bazanumerar ;
FROM tt INTO CURSOR vv
CASA = valoarea incasata numerar, cu tot cu TVA
CARD = valoarea incasata cu card, cu tot cu TVA

66
Teste/_precompile.ps1 Normal file
View File

@@ -0,0 +1,66 @@
# _precompile.ps1 -Prg <cale.prg> - regenereaza .fxp-ul target intr-un proces IZOLAT.
# De ce izolat: precompilarea (vfp9 -A ... COMPILE) atarna dupa COMPILE si e omorata; daca
# ruleaza in ACEEASI sesiune powershell care lanseaza apoi testul, lansarile ulterioare de
# vfp9 esueaza (deschid editorul in loc sa ruleze). Rulat ca proces separat (Start-Process
# -Wait din harness), nu otraveste sesiunea care lanseaza testul.
param([Parameter(Mandatory=$true)][string]$Prg)
$Vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
$Fxp = [System.IO.Path]::ChangeExtension($Prg, 'fxp')
$dir = [System.IO.Path]::GetDirectoryName($Prg)
$tmpPrg = Join-Path $dir '_compile_tmp.prg'
# prg temporar care compileaza target-ul (COMPILE cu variabila; forma cu literal in ghilimele da eroare)
Set-Content -Path $tmpPrg -Value ("lcT = `"$Prg`"`r`nCOMPILE (lcT)`r`nQUIT`r`n") -Encoding ascii
# omoara doar vfp9 proprii (linia de comanda contine folderul testului), nu instante straine
function Stop-VfpProprii([string]$Marker) {
Get-CimInstance Win32_Process -Filter "Name='vfp9.exe'" -ErrorAction SilentlyContinue | ForEach-Object {
if ($_.CommandLine -and $_.CommandLine.ToLower().Contains($Marker.ToLower())) {
Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue
}
}
}
Stop-VfpProprii $dir
Start-Sleep -Milliseconds 500
if (Test-Path $Fxp) { [System.IO.File]::Delete($Fxp) }
# Fara furt de focus: fereastra vfp9 a compilarii (chiar tranzitorie) e impinsa off-screen,
# la fel ca in vfp_ui_harness.ps1 (SetWindowPos HWND_BOTTOM + NOACTIVATE, x=-4000).
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Win32UiPc {
[DllImport("user32.dll")]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
[DllImport("user32.dll")]
public static extern bool IsWindow(IntPtr hWnd);
public static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
public const uint SWP_NOSIZE = 0x0001;
public const uint SWP_NOACTIVATE = 0x0010;
}
"@
function Push-OffscreenPc([IntPtr]$Hwnd) {
if ($Hwnd -eq [IntPtr]::Zero -or -not [Win32UiPc]::IsWindow($Hwnd)) { return }
[Win32UiPc]::SetWindowPos($Hwnd, [Win32UiPc]::HWND_BOTTOM, -4000, 0, 0, 0, ([Win32UiPc]::SWP_NOSIZE -bor [Win32UiPc]::SWP_NOACTIVATE)) | Out-Null
}
$ok = $false
foreach ($try in 1..3) {
$pcProc = Start-Process -FilePath $Vfp -ArgumentList @('-A', "`"$tmpPrg`"") -PassThru
$dl = (Get-Date).AddSeconds(30)
$pcHwnd = [IntPtr]::Zero
while (-not (Test-Path $Fxp) -and (Get-Date) -lt $dl) {
if ($pcHwnd -eq [IntPtr]::Zero -and -not $pcProc.HasExited) {
$pcProc.Refresh()
if ($pcProc.MainWindowHandle -ne [IntPtr]::Zero) { $pcHwnd = $pcProc.MainWindowHandle }
}
Push-OffscreenPc $pcHwnd
Start-Sleep -Milliseconds 300
}
Start-Sleep -Seconds 3
Stop-VfpProprii $dir
Start-Sleep -Seconds 1
if (Test-Path $Fxp) { $ok = $true; break }
}
foreach ($f in @($tmpPrg, [System.IO.Path]::ChangeExtension($tmpPrg, 'fxp'))) {
if (Test-Path $f) { try { [System.IO.File]::Delete($f) } catch {} }
}
if ($ok) { exit 0 } else { exit 1 }

49
Teste/bin_din_text.ps1 Normal file
View File

@@ -0,0 +1,49 @@
<#
.SYNOPSIS
Scrie inapoi in proiect binarele VFP (.scx+.sct / .vcx+.vct) regenerate din textul editat.
.DESCRIPTION
Wrapper peste D:\ROA\UTIL\foxbin2prg\txt2vcx.ps1 cu parametrii FLORA2ROA. Flux in-arbore:
textul .sc2/.vc2 sta LANGA binar, deci -CacheRoot = radacina proiectului.
Regenereaza in staging, face fidelity check (bin -> text, comparat pe octeti) si abia apoi
copiaza peste binarul din proiect. Refuza daca binarul e blocat (IDE sau flora2roa.exe
deschis) sau daca e mai nou decat textul (fara -Force).
Editarea textului se face byte-safe, in Windows-1252:
$t = [IO.File]::ReadAllText($p, [Text.Encoding]::GetEncoding(1252))
[IO.File]::WriteAllText($p, $t, [Text.Encoding]::GetEncoding(1252))
NU cu tool-uri care scriu UTF-8: corup diacriticele din TOT fisierul.
Vezi COMUN\docs\flux-editare-vfp-text.md si conventie_encoding_cp1252.md.
Dupa write-back binarul e modificat in SVN: se comite in SVN doar cu acordul utilizatorului.
.PARAMETER TextFile
Unul sau mai multe fisiere .sc2/.vc2 din arbore (ex. frm_import.sc2).
.EXAMPLE
powershell -ExecutionPolicy Bypass -File Teste\bin_din_text.ps1 -TextFile frm_import.sc2 -DryRun
.EXAMPLE
powershell -ExecutionPolicy Bypass -File Teste\bin_din_text.ps1 -TextFile frm_import.sc2
#>
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)][string[]]$TextFile,
[string]$ProjectRoot,
[switch]$Force,
[switch]$NoVerify,
[switch]$DryRun
)
$ErrorActionPreference = 'Stop'
if (-not $ProjectRoot) { $ProjectRoot = Split-Path $PSScriptRoot -Parent }
$tool = 'D:\ROA\UTIL\foxbin2prg\txt2vcx.ps1'
if (-not (Test-Path $tool)) { throw "Nu gasesc $tool (tooling-ul partajat FoxBin2Prg)." }
$TextFile = $TextFile | ForEach-Object { if ([IO.Path]::IsPathRooted($_)) { $_ } else { Join-Path $ProjectRoot $_ } }
# flux in-arbore: CacheRoot = ProjectRoot (maparea text->binar devine identitate)
& $tool -TextFile $TextFile -ProjectRoot $ProjectRoot -CacheRoot $ProjectRoot `
-Force:$Force -NoVerify:$NoVerify -DryRun:$DryRun
exit $LASTEXITCODE

View File

@@ -0,0 +1,21 @@
* mock_amessagebox.prg - inlocuieste FUNCTION amessagebox (myutils.prg) in testele headless,
* ca dialogurile modale sa nu blocheze procesul. Returneaza 6 (Da/OK) implicit.
* Se incarca cu SET PROCEDURE ... ADDITIVE dupa initializarea mediului: la nume duplicat de
* procedura VFP alege fisierul deschis cel mai recent.
* gnMockRaspuns (PUBLIC, optional): valoarea returnata (implicit 6).
* gcMockUltimMesaj / gnMockUltimTip (PUBLIC, optional): daca testul declara gcMockUltimMesaj ca
* sir, mock-ul memoreaza mesajul si tipul ultimului apel, pentru aserturi pe textul dialogului.
FUNCTION amessagebox
LPARAMETERS tcMessage, tnDialogBoxType, tcTitle, tcFont, tnTimeOut, tnTimeoutValue
LOCAL lnRaspuns
lnRaspuns = IIF(TYPE('gnMockRaspuns') = 'N', gnMockRaspuns, 6)
IF TYPE('gcMockUltimMesaj') = 'C'
gcMockUltimMesaj = TRANSFORM(tcMessage)
gnMockUltimTip = IIF(TYPE('tnDialogBoxType') = 'N', tnDialogBoxType, 0)
ENDIF
TestLog('MOCK amessagebox: [' + ALLTRIM(TRANSFORM(tcMessage)) + '] -> returnez ' + TRANSFORM(lnRaspuns))
RETURN lnRaspuns
ENDFUNC
* MESSAGEBOX nativ nu se poate umbri; formularul apeleaza si MESSAGEBOX() direct in cateva
* locuri. Testele care ating acele ramuri trebuie sa evite conditia care le declanseaza.

74
Teste/ruleaza_teste.ps1 Normal file
View File

@@ -0,0 +1,74 @@
<#
.SYNOPSIS
Ruleaza suita de teste FLORA2ROA (verificare de sintaxa + teste UI cu capturi).
.DESCRIPTION
Ordinea e cea din COMUN\docs\depanare_testare_vfp.md: intai compilarea de verificare (ieftina,
prinde sintaxa), apoi testele functionale pe fluxul real al utilizatorului.
Suitele NU se ruleaza in paralel: harness-ul isi omoara instantele vfp9 proprii inainte de
fiecare lansare (filtrat pe linia de comanda, instantele straine nu sunt atinse).
.PARAMETER Doar
Ruleaza numai testele al caror nume contine acest sir.
.PARAMETER FaraSintaxa
Sare peste verificarea de sintaxa.
.EXAMPLE
powershell -ExecutionPolicy Bypass -File Teste\ruleaza_teste.ps1
.EXAMPLE
powershell -ExecutionPolicy Bypass -File Teste\ruleaza_teste.ps1 -Doar export
#>
[CmdletBinding()]
param(
[string]$Doar,
[switch]$FaraSintaxa
)
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
$Root = Split-Path $Teste -Parent
# nume test -> etichetele pasilor asteptate de vfp_ui_harness.ps1 (o captura per pas)
$suita = @(
@{ Prg = 'test_frm_import_ui.prg'; Steps = @('afisat', 'trace', 'date') }
@{ Prg = 'test_export_date.prg'; Steps = @('afisat', 'importat') }
)
if ($Doar) { $suita = $suita | Where-Object { $_.Prg -like "*$Doar*" } }
$rezultate = @()
if (-not $FaraSintaxa) {
Write-Host '=== Verificare de sintaxa (compilare headless) ===' -ForegroundColor Cyan
& (Join-Path $Teste 'verifica_sintaxa.ps1')
$rezultate += [pscustomobject]@{ Test = 'verifica_sintaxa'; Rezultat = $(if ($LASTEXITCODE -eq 0) { 'PASS' } else { 'FAIL' }) }
}
foreach ($t in $suita) {
$prg = Join-Path $Teste $t.Prg
if (-not (Test-Path $prg)) { Write-Warning "lipsa: $prg"; continue }
Write-Host ''
Write-Host ("=== {0} ===" -f $t.Prg) -ForegroundColor Cyan
# capturile fiecarui test in folderul lui, ca sa nu se suprascrie intre teste
$shots = Join-Path (Join-Path $Teste 'screenshots') ([IO.Path]::GetFileNameWithoutExtension($t.Prg))
& (Join-Path $Teste 'vfp_ui_harness.ps1') -TestPrg $prg -Steps $t.Steps -ShotsDir $shots -StepTimeoutSec 300
# verdictul il da testul: ultima linie "REZULTAT:" din log
$log = Join-Path $Teste ([IO.Path]::GetFileNameWithoutExtension($t.Prg) + '_log.txt')
$verdict = 'FARA LOG'
if (Test-Path $log) {
$linie = Select-String -Path $log -Pattern '^REZULTAT:' | Select-Object -Last 1
if ($linie) { $verdict = $linie.Line -replace '^REZULTAT:\s*', '' }
$failuri = @(Select-String -Path $log -Pattern '^FAIL:')
foreach ($f in $failuri) { Write-Warning $f.Line }
}
$rezultate += [pscustomobject]@{ Test = $t.Prg; Rezultat = $verdict }
}
Write-Host ''
Write-Host '=== SUMAR ===' -ForegroundColor Cyan
$rezultate | Format-Table -AutoSize
$nrFail = @($rezultate | Where-Object { $_.Rezultat -notlike 'PASS*' }).Count
exit ([int]($nrFail -gt 0))

View File

@@ -0,0 +1,63 @@
* test_conectare_roa.prg - verifica drumul de initializare CU conectare la Oracle.
* Ruleaza cu datele din settings.ini; daca baza nu e accesibila, testul trebuie sa raporteze
* esecul si sa iasa - NU sa ramana agatat pe un dialog de login (SQLSetProp DispLogin).
*
* vfp9.exe -A -T "Teste\test_conectare_roa.prg"
* Nu face parte din suita implicita: depinde de reteaua/serverul Oracle.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gcSyncDir, gnTestFail
gnTestFail = 0
LOCAL lcTestDir, llConectat
lcTestDir = ADDBS(JUSTPATH(SYS(16, 0)))
gcUILog = lcTestDir + 'test_conectare_roa_log.txt'
gcSyncDir = lcTestDir + 'uisync\'
IF !DIRECTORY(gcSyncDir)
MD (gcSyncDir)
ENDIF
STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
* fara dialog de login: headless, un prompt ODBC ar bloca procesul la nesfarsit
SQLSETPROP(0, 'DispLogin', 3)
llConectat = DO_CONECTARE(lcTestDir)
HarnessLog('gnHandle = ' + TRANSFORM(gnHandle))
TestAssert(TYPE('goConn') = 'O', 'goConn instantiat chiar si fara conectare')
TestAssert(TYPE('gnHandle') = 'N', 'gnHandle este numeric')
IF llConectat
TestAssert(gnHandle > 0, 'conectare reusita la ' + ALLTRIM(goApp.oSettings.host))
LOCAL lnSucces
lnSucces = goExecutor.oExecute(GetHash('cSql=>select 1 as unu from dual??cCursor=>cPing'))
TestAssertEqual(1, lnSucces, 'interogare de test executata')
IF USED('cPing')
TestAssertEqual(1, cPing.unu, 'baza a raspuns corect')
USE IN (SELECT('cPing'))
ENDIF
goConn.Disconnect()
TestAssert(goConn.GetHandle() <= 0, 'deconectare reusita')
ELSE
HarnessLog('Conectare esuata (host ' + ALLTRIM(goApp.oSettings.host) + ;
'). Testul a iesit controlat, fara sa ramana agatat.')
TestAssert(gnHandle <= 0, 'esecul de conectare e raportat, nu ascuns')
ENDIF
HarnessLog('REZULTAT: ' + TestRezultat())
DO HarnessDone WITH TestRezultat()
QUIT
FUNCTION DO_CONECTARE
LPARAMETERS tcTestDir
LOCAL llOk
llOk = .F.
DO (tcTestDir + 'test_init_env_auto.prg') WITH .T.
SET PROCEDURE TO (tcTestDir + 'ui_harness.prg') ADDITIVE
SET PROCEDURE TO (tcTestDir + 'mock_amessagebox.prg') ADDITIVE
DO HarnessInit
llOk = (TYPE('gnHandle') = 'N' AND gnHandle > 0)
RETURN llOk
ENDFUNC

111
Teste/test_export_date.prg Normal file
View File

@@ -0,0 +1,111 @@
* test_export_date.prg - test functional pe fluxul REAL de citire a fisierelor de import.
* Instantiaza frm_import, seteaza intervalul din controale si apeleaza ExportDate() (pasul pe
* care il declanseaza butonul "Import Fidelio&Biz > ROA"), apoi verifica cursoarele rezultate.
* Nu are nevoie de Oracle: ExportDate citeste doar XML-urile din folderele din settings.ini.
*
* Parametri optionali: data de inceput si data de sfarsit ca AAAALLZZ.
* vfp9.exe -A -T "Teste\test_export_date.prg" 20250601 20250630
* Rulare cu capturi:
* powershell -ExecutionPolicy Bypass -File Teste\vfp_ui_harness.ps1 `
* -TestPrg 'D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_export_date.prg' -Steps @('afisat','importat')
LPARAMETERS tcData1, tcData2
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gcSyncDir, gnTestFail, gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnTestFail = 0
gnMockRaspuns = 6
gcMockUltimMesaj = ''
gnMockUltimTip = 0
LOCAL lcTestDir, ldData1, ldData2
lcTestDir = ADDBS(JUSTPATH(SYS(16, 0)))
gcUILog = lcTestDir + 'test_export_date_log.txt'
gcSyncDir = lcTestDir + 'uisync\'
IF !DIRECTORY(gcSyncDir)
MD (gcSyncDir)
ENDIF
STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ldData1 = IIF(TYPE('tcData1') = 'C' AND LEN(ALLTRIM(TRANSFORM(tcData1))) = 8, ;
DATE(VAL(LEFT(tcData1, 4)), VAL(SUBSTR(tcData1, 5, 2)), VAL(RIGHT(tcData1, 2))), DATE(2025, 6, 1))
ldData2 = IIF(TYPE('tcData2') = 'C' AND LEN(ALLTRIM(TRANSFORM(tcData2))) = 8, ;
DATE(VAL(LEFT(tcData2, 4)), VAL(SUBSTR(tcData2, 5, 2)), VAL(RIGHT(tcData2, 2))), DATE(2025, 6, 30))
DO (lcTestDir + 'test_init_env_auto.prg') WITH .F.
SET PROCEDURE TO (lcTestDir + 'ui_harness.prg') ADDITIVE
SET PROCEDURE TO (lcTestDir + 'mock_amessagebox.prg') ADDITIVE
DO HarnessInit
HarnessLog('Interval cerut: ' + DTOC(ldData1) + ' - ' + DTOC(ldData2))
HarnessLog('cale_import_fidelio = ' + goApp.oSettings.cale_import_fidelio)
HarnessLog('cale_import_biz = ' + goApp.oSettings.cale_import_biz)
HarnessLog('cale_import = ' + goApp.oSettings.cale_import)
TestAssert(DIRECTORY(ADDBS(ALLTRIM(goApp.oSettings.cale_import_fidelio))), 'exista directorul Fidelio')
TestAssert(DIRECTORY(ADDBS(ALLTRIM(goApp.oSettings.cale_import_biz))), 'exista directorul Biz')
TestAssert(DIRECTORY(ADDBS(ALLTRIM(goApp.oSettings.cale_import))), 'exista directorul de import')
PUBLIC goImportFrm
DO FORM (gcAppPath + 'frm_import') NAME goImportFrm NOSHOW
goImportFrm.WindowType = 0
goImportFrm.Show()
DOEVENTS FORCE
DO HarnessStep WITH 0, 'formular afisat'
* fluxul real: utilizatorul completeaza intervalul in controale, apoi apasa butonul de import
goImportFrm.txtData1.Value = ldData1
goImportFrm.txtData2.Value = ldData2
goImportFrm.chkTest.Value = 1
LOCAL lnSucces
lnSucces = goImportFrm.ExportDate()
DOEVENTS FORCE
HarnessLog('ExportDate a returnat ' + TRANSFORM(lnSucces))
TestAssertEqual(1, lnSucces, 'ExportDate returneaza CT_SUCCES')
LOCAL lnFidelio, lnIntrari, lnIesiri, lnVanzari, lnPart
lnFidelio = IIF(USED('cFacturiFidelio'), RECCOUNT('cFacturiFidelio'), -1)
lnIntrari = IIF(USED('cIntrariRestaurant'), RECCOUNT('cIntrariRestaurant'), -1)
lnIesiri = IIF(USED('cIesiriRestaurant'), RECCOUNT('cIesiriRestaurant'), -1)
lnVanzari = IIF(USED('cVanzariRestaurant'), RECCOUNT('cVanzariRestaurant'), -1)
lnPart = IIF(USED('nPart'), RECCOUNT('nPart'), -1)
HarnessLog('Randuri citite: facturi Fidelio=' + TRANSFORM(lnFidelio) + ' intrari=' + TRANSFORM(lnIntrari) + ;
' iesiri=' + TRANSFORM(lnIesiri) + ' vanzari=' + TRANSFORM(lnVanzari) + ' parteneri=' + TRANSFORM(lnPart))
TestAssert(lnFidelio >= 0, 'cursorul cFacturiFidelio exista')
TestAssert(lnIntrari >= 0, 'cursorul cIntrariRestaurant exista')
TestAssert(lnIesiri >= 0, 'cursorul cIesiriRestaurant exista')
TestAssert(lnVanzari >= 0, 'cursorul cVanzariRestaurant exista')
TestAssert(lnPart >= 0, 'cursorul nPart exista')
TestAssert(lnFidelio + lnIntrari + lnIesiri + lnVanzari > 0, ;
's-au citit randuri din fisierele intervalului')
* datele citite trebuie sa fie DOAR din intervalul cerut (filtrul pe numele fisierului)
IF lnVanzari > 0
LOCAL lnInAfara
SELECT cVanzariRestaurant
COUNT FOR !BETWEEN(CTOD(LEFT(ALLTRIM(NVL(datadocument, '')), 10)), ldData1, ldData2) ;
AND !EMPTY(ALLTRIM(NVL(datadocument, ''))) TO lnInAfara
TestAssertEqual(0, lnInAfara, 'vanzarile citite sunt in intervalul cerut')
ENDIF
* cheia externa de partener se calculeaza pentru toate randurile
IF lnPart > 0
LOCAL lnFaraCod
SELECT nPart
COUNT FOR EMPTY(NVL(cod, '')) TO lnFaraCod
TestAssertEqual(0, lnFaraCod, 'toti partenerii au cod cheie externa calculat')
ENDIF
DO HarnessStep WITH 1, 'import citit: ' + TRANSFORM(lnFidelio + lnIntrari + lnIesiri + lnVanzari) + ' randuri'
HarnessLog('REZULTAT: ' + TestRezultat())
DO HarnessDone WITH TestRezultat()
goImportFrm.Release()
QUIT

View File

@@ -0,0 +1,82 @@
* test_frm_import_ui.prg - test UI smoke pentru formularul real frm_import.
* Verifica pornirea aplicatiei fara Oracle: mediul se initializeaza, formularul se instantiaza,
* Init completeaza intervalul de date din settings.ini, iar metoda Trace scrie in edtInfo.
*
* Rulare (orchestrator + capturi):
* powershell -ExecutionPolicy Bypass -File Teste\vfp_ui_harness.ps1 `
* -TestPrg 'D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_frm_import_ui.prg' `
* -Steps @('afisat','trace','date')
* Rulare fara capturi: vfp9.exe -A -T "Teste\test_frm_import_ui.prg" (auto-continue la 30s/pas)
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gcSyncDir, gnTestFail, gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnTestFail = 0
gnMockRaspuns = 6
gcMockUltimMesaj = ''
gnMockUltimTip = 0
LOCAL lcTestDir
lcTestDir = ADDBS(JUSTPATH(SYS(16, 0)))
gcUILog = lcTestDir + 'test_frm_import_ui_log.txt'
gcSyncDir = lcTestDir + 'uisync\'
IF !DIRECTORY(gcSyncDir)
MD (gcSyncDir)
ENDIF
STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
DO (lcTestDir + 'test_init_env_auto.prg') WITH .F.
SET PROCEDURE TO (lcTestDir + 'ui_harness.prg') ADDITIVE
* mock-ul de dialoguri se incarca ULTIMUL, ca sa umbreasca amessagebox din myutils.prg
SET PROCEDURE TO (lcTestDir + 'mock_amessagebox.prg') ADDITIVE
DO HarnessInit
HarnessLog('Mediu initializat. goApp=' + TYPE('goApp') + ' goExecutor=' + TYPE('goExecutor') + ;
' goConn=' + TYPE('goConn'))
TestAssert(TYPE('goApp') = 'O', 'goApp instantiat')
TestAssert(TYPE('goExecutor') = 'O', 'goExecutor instantiat')
TestAssert(TYPE('goConn') = 'O', 'goConn instantiat')
TestAssert(TYPE('goApp.oSettings') = 'O', 'settings.ini citit in goApp.oSettings')
PUBLIC goImportFrm
DO FORM (gcAppPath + 'frm_import') NAME goImportFrm NOSHOW
* modeless: Show(1) pe un formular modal nu returneaza si blocheaza testul headless
goImportFrm.WindowType = 0
goImportFrm.Show()
goImportFrm.WindowState = 2
DOEVENTS FORCE
TestAssert(TYPE('goImportFrm') = 'O', 'frm_import instantiat')
TestAssert(TYPE('goImportFrm.txtData1.Value') = 'D', 'txtData1 are valoare data')
TestAssert(TYPE('goImportFrm.txtData2.Value') = 'D', 'txtData2 are valoare data')
TestAssert(goImportFrm.txtData1.Value <= goImportFrm.txtData2.Value, ;
'interval valid: ' + DTOC(goImportFrm.txtData1.Value) + ' - ' + DTOC(goImportFrm.txtData2.Value))
TestAssertEqual(1, goImportFrm.chkTest.Value, 'bifa Test activa implicit (nu scrie note in ROA)')
DO HarnessStep WITH 0, 'formular afisat'
* Trace este canalul prin care formularul raporteaza progresul importului
goImportFrm.Trace('Verificare harness: mesaj de test')
DOEVENTS FORCE
TestAssert('Verificare harness' $ goImportFrm.edtInfo.Value, 'Trace scrie in edtInfo')
DO HarnessStep WITH 1, 'trace scris in edtInfo'
* schimbarea intervalului se reflecta in controale (fluxul real al utilizatorului)
goImportFrm.txtData1.Value = DATE(2025, 6, 1)
goImportFrm.txtData2.Value = DATE(2025, 6, 30)
goImportFrm.Refresh()
DOEVENTS FORCE
TestAssertEqual(DATE(2025, 6, 1), goImportFrm.txtData1.Value, 'data inceput modificata')
TestAssertEqual(DATE(2025, 6, 30), goImportFrm.txtData2.Value, 'data sfarsit modificata')
DO HarnessStep WITH 2, 'interval 06/2025 setat'
HarnessLog('REZULTAT: ' + TestRezultat())
DO HarnessDone WITH TestRezultat()
goImportFrm.Release()
QUIT

55
Teste/test_helpers.prg Normal file
View File

@@ -0,0 +1,55 @@
* test_helpers.prg - proceduri comune testelor FLORA2ROA (handler de erori headless + aserturi).
* Se incarca automat din test_init_env_auto.prg cu SET PROCEDURE ... ADDITIVE.
* TestErrorHandler - ON ERROR pentru rulare fara consola: logheaza si continua
* TestAssert(cond, mesaj) - PASS/FAIL in log; incrementeaza gnTestFail la esec
* TestAssertEqual(asteptat, obtinut, mesaj)
* TestRezultat() - 'PASS'/'FAIL' + numarul de aserturi picate
* TestLog(mesaj) - scrie in gcUILog (harness) sau in gcTestErrLog
PROCEDURE TestErrorHandler
LPARAMETERS tnError, tcMessage, tcProgram, tnLine
LOCAL lcLinie
lcLinie = TTOC(DATETIME()) + ' EROARE ' + TRANSFORM(tnError) + ': ' + TRANSFORM(tcMessage) + ;
' | program: ' + TRANSFORM(tcProgram) + ' | linia: ' + TRANSFORM(tnLine)
IF TYPE('gcTestErrLog') = 'C' AND !EMPTY(gcTestErrLog)
SET SAFETY OFF
STRTOFILE(lcLinie + CHR(13) + CHR(10), gcTestErrLog, .T.)
ENDIF
TestLog(lcLinie)
ENDPROC
PROCEDURE TestLog
LPARAMETERS tcMesaj
IF TYPE('gcUILog') = 'C' AND !EMPTY(gcUILog)
DO HarnessLog WITH TRANSFORM(tcMesaj)
ENDIF
ENDPROC
FUNCTION TestAssert
LPARAMETERS tlConditie, tcMesaj
IF TYPE('gnTestFail') <> 'N'
PUBLIC gnTestFail
gnTestFail = 0
ENDIF
IF tlConditie
TestLog('PASS: ' + TRANSFORM(tcMesaj))
ELSE
gnTestFail = gnTestFail + 1
TestLog('FAIL: ' + TRANSFORM(tcMesaj))
ENDIF
RETURN tlConditie
ENDFUNC
FUNCTION TestAssertEqual
LPARAMETERS tuAsteptat, tuObtinut, tcMesaj
LOCAL llEgal
llEgal = (TRANSFORM(tuAsteptat) == TRANSFORM(tuObtinut))
RETURN TestAssert(llEgal, TRANSFORM(tcMesaj) + ' [asteptat: ' + TRANSFORM(tuAsteptat) + ;
' | obtinut: ' + TRANSFORM(tuObtinut) + ']')
ENDFUNC
FUNCTION TestRezultat
LOCAL lnFail
lnFail = IIF(TYPE('gnTestFail') = 'N', gnTestFail, 0)
RETURN IIF(lnFail = 0, 'PASS', 'FAIL (' + TRANSFORM(lnFail) + ' aserturi picate)')
ENDFUNC

View File

@@ -0,0 +1,102 @@
* test_init_env_auto.prg
* Initializare NEINTERACTIVA a mediului FLORA2ROA pentru rulare headless
* (vfp9.exe -A -T "script.prg"), echivalentul programului principal main.prg fara
* DO FORM / READ EVENTS.
*
* Utilizare dintr-un script de test:
* DO Teste\test_init_env_auto WITH .F. && fara conectare Oracle (implicit)
* DO Teste\test_init_env_auto WITH .T. && conectare cu datele din settings.ini
* DO Teste\test_init_env_auto WITH .T., 'ROA', 'XENOTI', 'parola'
*
* Parametri:
* tlConnect - .T. = se conecteaza la Oracle (goConn.Connect); implicit .F.
* tcHost/tcUser/tcPassword - suprascriu datele din settings.ini
* tcAppPath - radacina aplicatiei; implicit se deduce din calea acestui program
*
* Dupa apel sunt disponibile: gcAppName, gcAppPath, gcTempPath, goLog, goApp, goConn,
* goExecutor, gnHandle si SET PROCEDURE / SET LIBRARY ca in main.prg. Se poate face
* CREATEOBJECT('frm_import') sau DO FORM frm_import si apela metodele punctual.
*
* ATENTIE: ErrorHandler-ul din main.prg deschide MESSAGEBOX (blocheaza headless). Aici se
* instaleaza TestErrorHandler (test_helpers.prg), care logheaza in gcTestErrLog si continua.
LPARAMETERS tlConnect, tcHost, tcUser, tcPassword, tcAppPath
SET SAFETY OFF
SET TALK OFF
CLOSE DATABASES ALL
SET DELETED ON
SET EXCLUSIVE ON
SET ANSI ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
PUBLIC gcAppName, gcAppPath, gcTempPath, gcTestErrLog
PUBLIC goApp, goLog, goConn, goExecutor, goImportFrm, gnHandle
LOCAL lcHere
lcHere = ADDBS(JUSTPATH(SYS(16, 0)))
IF TYPE('tcAppPath') = 'C' AND !EMPTY(tcAppPath)
gcAppPath = ADDBS(tcAppPath)
ELSE
* scriptul sta in <radacina>\Teste\, deci radacina e cu un nivel mai sus
gcAppPath = ADDBS(JUSTPATH(SUBSTR(lcHere, 1, LEN(lcHere) - 1)))
ENDIF
gcAppName = 'FLORA2ROA'
gcTempPath = GETENV("TEMP")
gcTestErrLog = gcAppPath + 'Teste\_erori_test.txt'
SET DEFAULT TO (gcAppPath)
SET PATH TO (gcAppPath) ADDITIVE
SET PATH TO (gcAppPath + 'Teste') ADDITIVE
* aceleasi fisiere de proceduri ca in main.prg; mock-urile se incarca DUPA, in test
SET PROCEDURE TO (gcAppPath + 'capp.prg') ADDITIVE
SET PROCEDURE TO (gcAppPath + 'app.prg') ADDITIVE
SET PROCEDURE TO (gcAppPath + 'myutils.prg') ADDITIVE
SET PROCEDURE TO (gcAppPath + 'vfpconnection_utils.prg') ADDITIVE
SET PROCEDURE TO (gcAppPath + 'myapp.prg') ADDITIVE
SET PROCEDURE TO (gcAppPath + 'Teste\test_helpers.prg') ADDITIVE
LOCAL lnLib, lcLib
FOR lnLib = 1 TO 2
lcLib = IIF(lnLib = 1, 'vfpconnection.fll', 'vfpencryption.fll')
IF FILE(gcAppPath + lcLib)
TRY
SET LIBRARY TO (gcAppPath + lcLib) ADDITIVE
CATCH
STRTOFILE('Nu s-a putut incarca ' + lcLib + CHR(13) + CHR(10), gcTestErrLog, .T.)
ENDTRY
ENDIF
ENDFOR
ON ERROR DO TestErrorHandler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
goImportFrm = NULL
goConn = CREATEOBJECT("oConn")
goExecutor = CREATEOBJECT("oExecutor")
goLog = CREATEOBJECT("Log", gcAppPath + "log\log_test_" + gcAppName + "_" + DTOS(DATE()) + ".txt")
goApp = CREATEOBJECT("MyApp")
gnHandle = 0
IF TYPE('tcHost') = 'C' AND !EMPTY(tcHost)
goApp.oSettings.host = ALLTRIM(tcHost)
ENDIF
IF TYPE('tcUser') = 'C' AND !EMPTY(tcUser)
goApp.oSettings.user = ALLTRIM(tcUser)
ENDIF
IF TYPE('tcPassword') = 'C' AND !EMPTY(tcPassword)
goApp.oSettings.password = ALLTRIM(tcPassword)
ENDIF
IF TYPE('tlConnect') = 'L' AND tlConnect
goConn.Connect()
gnHandle = goConn.GetHandle()
IF gnHandle <= 0
RETURN .F.
ENDIF
ENDIF
RETURN .T.

35
Teste/text_din_bin.ps1 Normal file
View File

@@ -0,0 +1,35 @@
<#
.SYNOPSIS
Genereaza/improspateaza versiunile TEXT (.sc2/.vc2/.pj2) ale binarelor VFP din FLORA2ROA.
.DESCRIPTION
Wrapper peste D:\ROA\UTIL\foxbin2prg\git_sync.ps1 cu parametrii acestui proiect (flux
in-arbore: textul sta LANGA binar, nu intr-un cache extern). Git urmareste textele .??2;
binarele VFP sunt git-ignored, iar SVN ramane sursa de adevar pentru ele.
Se ruleaza la inceput de sesiune si INAINTE de orice git commit, ca textele sa reflecte
binarele curente. Conversia e incrementala si nu atinge niciodata binarele.
Fluxul complet si capcanele: COMUN\docs\flux-editare-vfp-text.md,
COMUN\docs\inrolare-proiect-git-text.md.
.PARAMETER Force
Reconverteste chiar daca textul e la zi.
.EXAMPLE
powershell -ExecutionPolicy Bypass -File Teste\text_din_bin.ps1
#>
[CmdletBinding()]
param(
[string]$ProjectRoot,
[switch]$Force
)
$ErrorActionPreference = 'Stop'
if (-not $ProjectRoot) { $ProjectRoot = Split-Path $PSScriptRoot -Parent }
$tool = 'D:\ROA\UTIL\foxbin2prg\git_sync.ps1'
if (-not (Test-Path $tool)) { throw "Nu gasesc $tool (tooling-ul partajat FoxBin2Prg)." }
# -DbfList gol: proiectul nu are tabele de configurare de urmarit ca text
& $tool -ProjectRoot $ProjectRoot -DbfList @() -Force:$Force
exit $LASTEXITCODE

64
Teste/ui_harness.prg Normal file
View File

@@ -0,0 +1,64 @@
* ui_harness.prg - proceduri reutilizabile pentru teste UI VFP cu handshake pe semafoare.
* Un test seteaza PUBLIC gcSyncDir (folder semafoare, cu \ final) si gcUILog (fisier log),
* apoi SET PROCEDURE TO ui_harness ADDITIVE si foloseste:
* HarnessLog(mesaj) - scrie o linie in log
* HarnessStep(n, mesaj [, autoSec]) - semnaleaza pasul n gata + asteapta continuarea
* HarnessReady(n, mesaj) / HarnessWaitContinue(n [, autoSec]) - variantele separate
* HarnessDone([status]) - scrie done.txt
* HarnessWaitContinue asteapta cont_<n>.txt; daca nu apare in autoSec secunde (implicit 30),
* continua singur (auto-continue) => testul merge si FARA orchestrator (doar log, fara capturi).
PROCEDURE HarnessInit
*-- defensiv: SAFETY OFF ca STRTOFILE peste un fisier existent sa nu scoata dialogul modal
*-- "overwrite?" (blocheaza headless); TALK OFF ca SUM/CALCULATE sa nu deseneze pe desktop.
*-- Un test ar trebui sa faca oricum SET SAFETY OFF INAINTE de prima lui scriere de log.
SET SAFETY OFF
SET TALK OFF
ENDPROC
PROCEDURE HarnessLog
LPARAMETERS tcMsg
IF TYPE('gcUILog') <> 'C' OR EMPTY(gcUILog)
RETURN
ENDIF
SET SAFETY OFF
LOCAL lcL
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog)
ENDPROC
PROCEDURE HarnessReady
LPARAMETERS tnStep, tcNote
SET SAFETY OFF
STRTOFILE(TTOC(DATETIME()) + ' ' + tcNote + CHR(13)+CHR(10), gcSyncDir + 'ready_' + TRANSFORM(tnStep) + '.txt')
HarnessLog('READY ' + TRANSFORM(tnStep) + ' - ' + tcNote)
ENDPROC
FUNCTION HarnessWaitContinue
LPARAMETERS tnStep, tnAutoSec
LOCAL lcCont, lnMax, lnI, llPrimit
lcCont = gcSyncDir + 'cont_' + TRANSFORM(tnStep) + '.txt'
lnMax = IIF(TYPE('tnAutoSec') = 'N' AND tnAutoSec > 0, tnAutoSec, 30)
lnI = 0
DO WHILE !FILE(lcCont) AND lnI < (lnMax * 5)
lnI = lnI + 1
DOEVENTS FORCE
= INKEY(0.2)
ENDDO
llPrimit = FILE(lcCont)
HarnessLog('CONTINUE ' + TRANSFORM(tnStep) + IIF(llPrimit, ' (semnal primit)', ' (auto-continue dupa ' + TRANSFORM(lnMax) + 's)'))
RETURN llPrimit
ENDFUNC
PROCEDURE HarnessStep
LPARAMETERS tnStep, tcNote, tnAutoSec
HarnessReady(tnStep, tcNote)
HarnessWaitContinue(tnStep, tnAutoSec)
ENDPROC
PROCEDURE HarnessDone
LPARAMETERS tcStatus
SET SAFETY OFF
STRTOFILE(IIF(EMPTY(tcStatus), 'done', tcStatus) + ' ' + TTOC(DATETIME()) + CHR(13)+CHR(10), gcSyncDir + 'done.txt')
HarnessLog('GATA')
ENDPROC

128
Teste/verifica_sintaxa.ps1 Normal file
View File

@@ -0,0 +1,128 @@
<#
.SYNOPSIS
Verificare de sintaxa prin compilare headless a fisierelor .prg din FLORA2ROA.
.DESCRIPTION
Cel mai ieftin test dupa orice editare de .prg (vezi COMUN\docs\depanare_testare_vfp.md, sect. 4).
Compileaza COPII ale fisierelor intr-un folder temporar, ca .fxp-urile si .err-urile generate
sa nu murdareasca arborele proiectului. VFP nu rezolva simboluri externe la compilare, deci
copia izolata e suficienta pentru sintaxa.
Toate fisierele se compileaza intr-o SINGURA rulare vfp9: lansarile repetate de vfp9 din
aceeasi sesiune PowerShell esueaza tacut (procesul porneste dar nu executa - vezi
COMUN\docs\testare-ui-vfp.md, capcana d).
Verdict per fisier: existenta unui <nume>.err dupa compilare. Se raporteaza si liniile mai
lungi de 250 de caractere (capcana VFP: literal/linie prea lunga = eroare de compilare sau
eroare 11 derutanta la runtime).
NU inlocuieste testul functional: prinde sintaxa, nu apeluri catre metode inexistente.
.PARAMETER Files
Fisiere .prg de verificat. Implicit toate .prg-urile din radacina proiectului si din Teste\.
.PARAMETER ProjectRoot
Radacina proiectului (implicit folderul parinte al acestui script).
.EXAMPLE
powershell -ExecutionPolicy Bypass -File Teste\verifica_sintaxa.ps1
.EXAMPLE
powershell -ExecutionPolicy Bypass -File Teste\verifica_sintaxa.ps1 -Files myutils.prg,app.prg
#>
[CmdletBinding()]
param(
[string[]]$Files,
[string]$ProjectRoot,
[int]$MaxLineLen = 250,
[string]$Vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
)
$ErrorActionPreference = 'Stop'
if (-not $ProjectRoot) { $ProjectRoot = Split-Path $PSScriptRoot -Parent }
if (-not (Test-Path $Vfp)) { throw "Nu gasesc vfp9.exe: $Vfp" }
if (-not $Files) {
$Files = @(Get-ChildItem -Path $ProjectRoot -Filter '*.prg' -File | ForEach-Object { $_.FullName })
$Files += @(Get-ChildItem -Path (Join-Path $ProjectRoot 'Teste') -Filter '*.prg' -File -ErrorAction SilentlyContinue | ForEach-Object { $_.FullName })
}
$Files = $Files | ForEach-Object { if ([IO.Path]::IsPathRooted($_)) { $_ } else { Join-Path $ProjectRoot $_ } }
$work = Join-Path $env:TEMP ('flora2roa_syntax_' + [Guid]::NewGuid().ToString('N').Substring(0,8))
New-Item -ItemType Directory -Force -Path $work | Out-Null
# fisierele .h referite prin #INCLUDE trebuie sa fie langa copie, altfel compilarea da eroare
Get-ChildItem -Path $ProjectRoot -Filter '*.h' -File -ErrorAction SilentlyContinue |
ForEach-Object { Copy-Item $_.FullName (Join-Path $work $_.Name) -Force }
# omoara doar instantele vfp9 proprii (linia de comanda contine folderul de lucru temporar)
function Stop-VfpProprii([string]$Marker) {
Get-CimInstance Win32_Process -Filter "Name='vfp9.exe'" -ErrorAction SilentlyContinue | ForEach-Object {
if ($_.CommandLine -and $_.CommandLine.ToLower().Contains($Marker.ToLower())) {
Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue
}
}
}
# copiaza sursele + strange liniile prea lungi (analiza statica, fara VFP)
$copii = @()
$liniiLungi = @{}
foreach ($f in $Files) {
if (-not (Test-Path $f)) { Write-Warning "lipsa: $f"; continue }
$nume = [IO.Path]::GetFileName($f)
$copie = Join-Path $work $nume
Copy-Item -LiteralPath $f -Destination $copie -Force
$copii += [pscustomobject]@{ Nume = $nume; Sursa = $f; Copie = $copie }
$lungi = @()
$linii = [IO.File]::ReadAllLines($f, [Text.Encoding]::GetEncoding(1252))
for ($i = 0; $i -lt $linii.Length; $i++) {
if ($linii[$i].Length -gt $MaxLineLen) { $lungi += ('{0} (len={1})' -f ($i + 1), $linii[$i].Length) }
}
if ($lungi) { $liniiLungi[$nume] = ($lungi -join '; ') }
}
if (-not $copii) { Write-Host 'Nimic de verificat.'; return }
# un singur .prg care compileaza toate copiile (SAFETY OFF: fara dialog "overwrite?" headless)
$linii = @('SET SAFETY OFF', 'SET TALK OFF')
foreach ($c in $copii) { $linii += ('lcT = "{0}"' -f $c.Copie); $linii += 'COMPILE (lcT)' }
$linii += 'STRTOFILE("gata", "' + (Join-Path $work '_gata.txt') + '")'
$linii += 'QUIT'
$tmpPrg = Join-Path $work '_compile_all.prg'
Set-Content -Path $tmpPrg -Value (($linii -join "`r`n") + "`r`n") -Encoding ascii
# -A ignora config.fpw implicit, -T sare peste splash; ambele obligatorii headless
$p = Start-Process -FilePath $Vfp -ArgumentList @('-A', '-T', "`"$tmpPrg`"") -PassThru -WindowStyle Minimized
if (-not $p.WaitForExit(180000)) { Write-Warning 'Timeout la compilare (180s).'; try { $p.Kill() } catch {} }
Stop-VfpProprii $work
if (-not (Test-Path (Join-Path $work '_gata.txt'))) {
Write-Warning 'Compilarea nu a ajuns la final - verdictul per fisier poate fi incomplet.'
}
$rezultate = foreach ($c in $copii) {
$err = [IO.Path]::ChangeExtension($c.Copie, 'err')
$fxp = [IO.Path]::ChangeExtension($c.Copie, 'fxp')
$erori = if (Test-Path $err) { (Get-Content -Raw $err).Trim() } else { '' }
[pscustomobject]@{
Fisier = $c.Nume
Sintaxa = if ($erori) { 'ERORI' } elseif (Test-Path $fxp) { 'OK' } else { 'NECOMPILAT' }
Erori = $erori
LiniiLungi = $(if ($liniiLungi.ContainsKey($c.Nume)) { $liniiLungi[$c.Nume] } else { '' })
}
}
Remove-Item -Recurse -Force $work -ErrorAction SilentlyContinue
$rezultate | Format-Table Fisier, Sintaxa -AutoSize
foreach ($r in $rezultate | Where-Object { $_.Erori }) {
Write-Host ''
Write-Warning ("ERORI in {0}:`n{1}" -f $r.Fisier, $r.Erori)
}
foreach ($r in $rezultate | Where-Object { $_.LiniiLungi }) {
Write-Host ''
Write-Warning ("Linii peste $MaxLineLen caractere in {0}: {1}" -f $r.Fisier, $r.LiniiLungi)
}
$nrProbleme = @($rezultate | Where-Object { $_.Sintaxa -ne 'OK' }).Count
Write-Host ''
Write-Host ("Gata. Fisiere verificate: {0} Cu probleme: {1}" -f @($rezultate).Count, $nrProbleme)
exit ([int]($nrProbleme -gt 0))

231
Teste/vfp_ui_harness.ps1 Normal file
View File

@@ -0,0 +1,231 @@
# vfp_ui_harness.ps1 - harness reutilizabil pentru teste UI VFP cu capturi de ecran.
# Lanseaza un test VFP care afiseaza un formular real, il conduce pas cu pas prin semafoare
# (ready_<n>.txt scris de test <-> cont_<n>.txt scris de harness), face un screenshot dupa
# fiecare pas si il valideaza. Testul VFP foloseste procedurile din ui_harness.prg.
#
# Exemplu:
# powershell -ExecutionPolicy Bypass -File vfp_ui_harness.ps1 `
# -TestPrg 'D:\...\test_x_ui.prg' -Steps @('afisat','actiune1','actiune2')
#
# Capcane rezolvate (vezi docs\testare-ui-vfp.md): precompilare izolata, lansare .fxp,
# detectie pornire pe mtime log, timeout-uri generoase, kill zombi vfp9.
#
# FARA FURT DE FOCUS (cerinta Marius, 17/07/2026): capturile NU mai folosesc
# Graphics.CopyFromScreen (poza ecranului intreg - fura focus / se corupe daca utilizatorul
# lucreaza in paralel). Se foloseste PrintWindow pe handle-ul ferestrei vfp9 + fereastra e
# mutata OFF-SCREEN (x=-4000, HWND_BOTTOM, SWP_NOACTIVATE) imediat ce apare handle-ul si
# re-impinsa inainte de fiecare pas (VFP isi poate re-activa fereastra la Show()/dialoguri).
# Fereastra ramane "visible" pentru GDI (PrintWindow merge), doar nu e pe ecranul vizibil
# utilizatorului si nu ia focus.
param(
[Parameter(Mandatory=$true)][string]$TestPrg,
[Parameter(Mandatory=$true)][string[]]$Steps, # etichete pentru pasii 0..N-1
[int]$StepTimeoutSec = 130, # cat astept fiecare ready_<n> (dupa pas 0)
[int]$ReadyTimeoutSec = 180, # cat astept ready_0 (afisarea formularului, incarcare lenta)
[string]$ShotsDir,
[string]$SyncDir,
[string]$Vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
)
$ErrorActionPreference = 'Stop'
$TestDir = [System.IO.Path]::GetDirectoryName($TestPrg)
$TestFxp = [System.IO.Path]::ChangeExtension($TestPrg, 'fxp')
$TestLog = [System.IO.Path]::ChangeExtension($TestPrg, $null) + '_log.txt'
if (-not $SyncDir) { $SyncDir = Join-Path $TestDir 'uisync' }
if (-not $ShotsDir) { $ShotsDir = Join-Path $TestDir 'screenshots' }
$Precompile = Join-Path $PSScriptRoot '_precompile.ps1'
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Win32Ui {
[StructLayout(LayoutKind.Sequential)]
public struct RECT { public int Left, Top, Right, Bottom; }
[DllImport("user32.dll")]
public static extern bool PrintWindow(IntPtr hwnd, IntPtr hdc, uint nFlags);
[DllImport("user32.dll")]
public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[DllImport("user32.dll")]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
[DllImport("user32.dll")]
public static extern bool IsWindow(IntPtr hWnd);
public static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
public const uint SWP_NOSIZE = 0x0001;
public const uint SWP_NOACTIVATE = 0x0010;
public const uint SWP_NOZORDER = 0x0004;
}
"@
function Clear-Dir([string]$Dir) {
if (Test-Path $Dir) {
Get-ChildItem -Path $Dir -File -ErrorAction SilentlyContinue | ForEach-Object {
try { [System.IO.File]::Delete($_.FullName) } catch {}
}
} else { New-Item -ItemType Directory -Path $Dir | Out-Null }
}
# Muta fereastra vfp9 off-screen (x=-4000), fara sa o activeze/minimizeze - ramane randabila
# pentru PrintWindow, dar nu se vede si nu fura focus. Se cheama repetat (VFP isi reactiveaza
# singur fereastra la Show()/dialoguri modale).
function Push-Offscreen([IntPtr]$Hwnd) {
if ($Hwnd -eq [IntPtr]::Zero) { return }
if (-not [Win32Ui]::IsWindow($Hwnd)) { return }
[Win32Ui]::SetWindowPos($Hwnd, [Win32Ui]::HWND_BOTTOM, -4000, 0, 0, 0, ([Win32Ui]::SWP_NOSIZE -bor [Win32Ui]::SWP_NOACTIVATE)) | Out-Null
}
# Polleaza MainWindowHandle pana devine nenul (fereastra principala vfp9 aparuta).
function Wait-MainWindowHandle([System.Diagnostics.Process]$Proc, [int]$TimeoutSec) {
$deadline = (Get-Date).AddSeconds($TimeoutSec)
while ((Get-Date) -lt $deadline) {
try {
$Proc.Refresh()
if ($Proc.HasExited) { return [IntPtr]::Zero }
if ($Proc.MainWindowHandle -ne [IntPtr]::Zero) { return $Proc.MainWindowHandle }
} catch {}
Start-Sleep -Milliseconds 200
}
return [IntPtr]::Zero
}
function Wait-File([string]$Path, [int]$TimeoutSec, [IntPtr]$Hwnd = [IntPtr]::Zero) {
$deadline = (Get-Date).AddSeconds($TimeoutSec)
while (-not (Test-Path $Path)) {
if ((Get-Date) -gt $deadline) { return $false }
if ($Hwnd -ne [IntPtr]::Zero) { Push-Offscreen $Hwnd }
Start-Sleep -Milliseconds 300
}
return $true
}
# Captura pe HANDLE cu PrintWindow (nu depinde de foreground/ecran vizibil). flag 2 =
# PW_RENDERFULLCONTENT (randare completa, necesar pt. multe ferestre GDI+/themed); daca da
# imagine goala, se incearca fallback cu flag 0.
function Take-Screenshot([IntPtr]$Hwnd, [string]$Path) {
if ($Hwnd -eq [IntPtr]::Zero -or -not [Win32Ui]::IsWindow($Hwnd)) {
Write-Warning "Take-Screenshot: handle invalid, sar captura ($Path)."
return
}
$rect = New-Object Win32Ui+RECT
[Win32Ui]::GetWindowRect($Hwnd, [ref]$rect) | Out-Null
$w = $rect.Right - $rect.Left
$h = $rect.Bottom - $rect.Top
if ($w -le 0 -or $h -le 0) { $w = 1920; $h = 1080 }
$bmp = New-Object System.Drawing.Bitmap $w, $h
$g = [System.Drawing.Graphics]::FromImage($bmp)
$hdc = $g.GetHdc()
$ok = [Win32Ui]::PrintWindow($Hwnd, $hdc, 2)
$g.ReleaseHdc($hdc)
$g.Dispose()
if (-not $ok) {
$g2 = [System.Drawing.Graphics]::FromImage($bmp)
$hdc2 = $g2.GetHdc()
[Win32Ui]::PrintWindow($Hwnd, $hdc2, 0) | Out-Null
$g2.ReleaseHdc($hdc2)
$g2.Dispose()
}
$bmp.Save($Path, [System.Drawing.Imaging.ImageFormat]::Png)
$bmp.Dispose()
}
# omoara doar vfp9 proprii (linia de comanda contine folderul testului), nu instante straine
function Stop-VfpProprii([string]$Marker) {
Get-CimInstance Win32_Process -Filter "Name='vfp9.exe'" -ErrorAction SilentlyContinue | ForEach-Object {
if ($_.CommandLine -and $_.CommandLine.ToLower().Contains($Marker.ToLower())) {
Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue
}
}
}
Clear-Dir $SyncDir
Clear-Dir $ShotsDir
# 1) Precompilare izolata (proces copil complet, ca sa nu otraveasca sesiunea de lansare).
# -WindowStyle Hidden pe consola powershell copil (sigur - e consola, nu GUI VFP).
Write-Host "Precompilez .fxp (izolat): $Precompile -Prg $TestPrg"
Stop-VfpProprii $TestDir
Start-Sleep -Milliseconds 500
$pc = Start-Process powershell -WindowStyle Hidden -ArgumentList @('-ExecutionPolicy','Bypass','-File', "`"$Precompile`"", '-Prg', "`"$TestPrg`"") -Wait -PassThru
Start-Sleep -Seconds 2
Stop-VfpProprii $TestDir
Start-Sleep -Seconds 2
if (-not (Test-Path $TestFxp)) { Write-Warning "Nu s-a generat $TestFxp - compilare esuata." }
# 2) Lansez .FXP-ul (nu .prg-ul). vfp9 -A porneste uneori procesul FARA sa execute (log gol);
# discriminator: START e prima linie a testului (mtime log > momentul lansarii) => in ~2s daca
# ruleaza. Relansez doar daca log-ul nu e scris in 30s (instanta moarta). Apoi astept ready_0.
# Imediat ce apare MainWindowHandle, fereastra e impinsa off-screen (fara activare).
$ready0 = Join-Path $SyncDir 'ready_0.txt'
$started = $false
$hwnd = [IntPtr]::Zero
foreach ($try in 1..8) {
if (Test-Path $ready0) { [System.IO.File]::Delete($ready0) }
if (Test-Path $TestLog) { [System.IO.File]::Delete($TestLog) }
$t0 = Get-Date
Write-Host "Lansez VFP (incercarea $try): $Vfp -A $TestFxp"
$proc = Start-Process -FilePath $Vfp -ArgumentList @('-A', "`"$TestFxp`"") -PassThru
$dl = (Get-Date).AddSeconds(30)
while ((Get-Date) -lt $dl) {
if ($hwnd -eq [IntPtr]::Zero -and -not $proc.HasExited) {
$proc.Refresh()
if ($proc.MainWindowHandle -ne [IntPtr]::Zero) {
$hwnd = $proc.MainWindowHandle
Push-Offscreen $hwnd
}
} else {
Push-Offscreen $hwnd
}
if ((Test-Path $TestLog) -and ((Get-Item $TestLog).LastWriteTime -gt $t0)) { $started = $true; break }
if (Test-Path $ready0) { $started = $true; break }
Start-Sleep -Milliseconds 500
}
if ($started) { break }
Write-Warning "Incercarea ${try}: testul nu a scris START in 30s (instanta moarta); relansez."
if ($proc -and -not $proc.HasExited) { try { $proc.Kill() } catch {} }
Stop-VfpProprii $TestDir
Start-Sleep -Milliseconds 1500
$hwnd = [IntPtr]::Zero
}
# Daca handle-ul principal inca nu a aparut (formular aditional creat mai tarziu), mai astept putin.
if ($hwnd -eq [IntPtr]::Zero) { $hwnd = Wait-MainWindowHandle $proc 15 }
Push-Offscreen $hwnd
if (-not (Wait-File $ready0 $ReadyTimeoutSec $hwnd)) {
Write-Warning "Testul nu a ajuns la ready_0 in ${ReadyTimeoutSec}s. Ultima linie log: '$(Get-Content $TestLog -Tail 1 -ErrorAction SilentlyContinue)'"
}
# 3) Parcurg pasii: astept ready_<n> (re-impingand fereastra off-screen periodic), screenshot
# pe handle (PrintWindow), scriu cont_<n>.
$ok = $true
for ($n = 0; $n -lt $Steps.Count; $n++) {
$label = $Steps[$n]
$ready = Join-Path $SyncDir ("ready_{0}.txt" -f $n)
$cont = Join-Path $SyncDir ("cont_{0}.txt" -f $n)
Write-Host "Astept pasul $n ($label)"
if (-not (Wait-File $ready $StepTimeoutSec $hwnd)) {
Write-Warning "TIMEOUT la pasul $n."
$ok = $false
break
}
Write-Host (" ready: {0}" -f (Get-Content $ready -Raw).Trim())
# daca fereastra principala s-a schimbat intre timp (formular nou), reincerc handle-ul
if ($hwnd -eq [IntPtr]::Zero -or -not [Win32Ui]::IsWindow($hwnd)) { $hwnd = Wait-MainWindowHandle $proc 5 }
Push-Offscreen $hwnd
Start-Sleep -Milliseconds 1200 # las formularul sa se deseneze complet
Push-Offscreen $hwnd
$png = Join-Path $ShotsDir ("step_{0}_{1}.png" -f $n, $label)
Take-Screenshot $hwnd $png
Write-Host " screenshot: $png"
Set-Content -Path $cont -Value 'go' -Encoding ascii
}
# 4) Astept done.txt si inchid.
if ($ok) {
$done = Join-Path $SyncDir 'done.txt'
if (Wait-File $done 30 $hwnd) { Write-Host "done: $((Get-Content $done -Raw).Trim())" }
}
Start-Sleep -Milliseconds 800
if ($proc -and -not $proc.HasExited) { try { $proc.Kill() } catch {} }
Stop-VfpProprii $TestDir
Write-Host "GATA. Screenshots in $ShotsDir"

BIN
app.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

240
app.prg Normal file
View File

@@ -0,0 +1,240 @@
*!* app.prg
*!* MyApp *!*
#INCLUDE COMUN.H
#DEFINE CRLF CHR(13) + CHR(10)
*** ==================== MyApp ============================ ***
Define Class MyApp As cApp
Enddefine && MyApp
Define Class Settings As cSettings
cIniText = ;
"[general]" + CRLF + ;
"host = ROA" + CRLF + ;
"user = XENOTI" + CRLF + ;
"password = +vIcfGb3NCfLCZXaqOM19Q==" + CRLF + ;
"cale_import_fidelioD:\PROIECTE\FLORA\FLORA2ROA\EXEMPLE\hotel\" + CRLF + ;
"cale_import_biz=D:\PROIECTE\FLORA\FLORA2ROA\EXEMPLE\restaurant\" + CRLF + ;
"cale_import=D:\PROIECTE\FLORA\FLORA2ROA\EXEMPLE\import\" + CRLF + ;
"last_data1 =" + CRLF + ;
"last_data2 =" + CRLF + ;
"tva_incasare = 0" + CRLF + ;
"id_part_casa_restaurant = 232" + CRLF + ;
"id_part_card_restaurant = 230" + CRLF + ;
"id_part_tichete_restaurant = 230" + CRLF + ;
"id_part_casa_hotel = 232" + CRLF + ;
"id_part_card_hotel = 230" + CRLF + ;
"id_part_tichete_hotel = 231" + CRLF + ;
"id_part_virament_hotel = 226" + CRLF + ;
"id_part_viramentint_hotel = " + CRLF + ;
"id_part_clienti_hotel = 233" + CRLF + ;
"id_part_clienti_restaurant = 234" + CRLF + ;
"cont_casa_restaurant = 5311" + CRLF + ;
"acont_casa_restaurant = " + CRLF + ;
"cont_card_restaurant = 5125" + CRLF + ;
"acont_card_restaurant = 01" + CRLF + ;
"cont_tichete_restaurant = 472" + CRLF + ;
"acont_tichete_restaurant = 03" + CRLF + ;
"cont_casa_hotel = 5311" + CRLF + ;
"acont_casa_hotel = " + CRLF + ;
"cont_card_hotel = 5125" + CRLF + ;
"acont_card_hotel = 01" + CRLF + ;
"cont_tichete_hotel = 5125" + CRLF + ;
"acont_tichete_hotel = 01" + CRLF + ;
"cont_virament_hotel = 5121" + CRLF + ;
"acont_virament_hotel = " + CRLF + ;
"cont_viramentint_hotel = 581" + CRLF + ;
"acont_viramentint_hotel = " + CRLF + ;
"cont_clienti_restaurant = 418" + CRLF + ;
"acont_clienti_restaurant = 02" + CRLF + ;
"cont_clienti_hotel = 418" + CRLF + ;
"acont_clienti_hotel = 01" + CRLF + ;
"cont_factura_casa_hotel = 4111" + CRLF + ;
"cont_factura_card_hotel = 4111" + CRLF + ;
"cont_factura_tichete_hotel = 4111" + CRLF + ;
"cont_factura_viramentint_hotel = 4111" + CRLF + ;
"acont_factura_casa_hotel = 01" + CRLF + ;
"acont_factura_card_hotel = 02" + CRLF + ;
"acont_factura_tichete_hotel = 0Y" + CRLF + ;
"acont_factura_viramentint_hotel = 01" + CRLF + ;
"acont_marfa_bar = 01" + CRLF + ;
"acont_marfa_bucatarie = 08" + CRLF + ;
"acont_ach_4428 = TP" + CRLF + ;
"acont_ach_4426 = " + CRLF + ;
"acont_vz_4428 = TI" + CRLF + ;
"acont_vz_4427 = " + CRLF + ;
"acont_mf_4428 = M" + CRLF + ;
"[connection]" + CRLF + ;
"connection_timeout=60" + CRLF + ;
"response_timeout=60" + CRLF + ;
"[other]" + CRLF + ;
"write_log=0"
host = ''
user = ''
password = ''
password_crypt = ''
cContCasaRestaurant = '5311'
cAcontCasaRestaurant = ''
cContCardRestaurant = '5125'
cAcontCardRestaurant = '01'
cContTicheteRestaurant = '472'
cAcontTicheteRestaurant = '03'
cContCasaHotel = '5311'
cAcontCasaHotel = ''
cContCardHotel = '5125'
cAcontCardHotel = '01'
cContTicheteHotel = '5125'
cAcontTicheteHotel = '01' && pe extrasul de cont apar ca incasari cu cardul normale
cContViramentHotel = '5121'
cAcontViramentHotel = ''
cContViramentIntHotel = '5121'
cAcontViramentIntHotel = ''
cContClientiRestaurant = '418'
cAcontClientiRestaurant = '02'
cContClientiHotel = '4111'
cAcontClientiHotel = '01'
cContFacturaCasaHotel = '4111'
cContFacturaCardHotel = '4111'
cContFacturaTicheteHotel = '4111'
cContFacturaViramentIntHotel = '418'
cAContFacturaCasaHotel = '01'
cAContFacturaCardHotel = '02'
cAContFacturaTicheteHotel = '02'
cAContFacturaViramentIntHotel = '01'
cAcontMarfaBar = '01' && 371.01
cAcontMarfaBucatarie = '08' && 371.08
cAcontVenituriBar = '0201' && 707.0201
cAcontVenituriBucatarie = '0202' && 707.0202
nIdPartCasaRestaurant = 251 && Id Partener Casa Lei 5311 Restaurant
nIdPartCardRestaurant = 230 && Id Partener Card 5125 Restaurant
nIdPartTicheteRestaurant = 230 && Id Partener Tichete 472 Restaurant
nIdPartClientiRestaurant = 234 && Id Partener 418 vanzare Restaurant
nIdPartCasaHotel = 251 && Id Partener Casa Lei 5311 Hotel
nIdPartCardHotel = 230 && Id Partener Card 5125 Hotel
nIdPartTicheteHotel = 230 && Id Partener Card 5125 Hotel
nIdPartViramentHotel = 230 && Id Partener Card 5125 Hotel
nIdPartViramentIntHotel = 230 && Id Partener Card 5125 Hotel
nIdPartClientiHotel = 233 && Id Partener 418 vanzare Hotel
connect_timeout = 60 && ftpget default 60 secunde
response_timeout = 60
nTVAIncasare = 0 && sistem TVA Incasare pentru facturi achizitie 4426/4428
cAcontAch4428 = ''
cAcontAch4426 = ''
cAcontVz4428 = ''
cAcontVz4427 = ''
cAcontMf4428 = ''
cale_import_fidelio = ''
cale_import_biz = ''
cale_import = ''
last_data1 = {}
last_data2 = {}
lWriteLog = .F.
Procedure ReadSettings
DoDefault()
lcInifile = This.cIniFile
Dimension aFiles[4]
This.host = Alltrim(This.ReadVariable("general","host"))
This.user = This.ReadVariable("general","user")
This.password_crypt = This.ReadVariable("general","password")
This.password = This.DecryptPassword(This.password_crypt)
lcIdPart = Alltrim(This.ReadVariable("general","id_part_casa_restaurant"))
This.nIdPartCasaRestaurant = IIF(!EMPTY(m.lcIdPart), INT(VAL(m.lcIdPart)), 0)
lcIdPart = Alltrim(This.ReadVariable("general","id_part_card_restaurant"))
This.nIdPartCardRestaurant = IIF(!EMPTY(m.lcIdPart), INT(VAL(m.lcIdPart)), 0)
lcIdPart = Alltrim(This.ReadVariable("general","id_part_tichete_restaurant"))
This.nIdPartTicheteRestaurant = IIF(!EMPTY(m.lcIdPart), INT(VAL(m.lcIdPart)), 0)
lcIdPart = Alltrim(This.ReadVariable("general","id_part_clienti_restaurant"))
This.nIdPartClientiRestaurant = IIF(!EMPTY(m.lcIdPart), INT(VAL(m.lcIdPart)), 0)
lcTVAIncasare = Alltrim(This.ReadVariable("general","tva_incasare"))
This.nTVAIncasare = IIF(!EMPTY(m.lcTVAIncasare), INT(VAL(m.lcTVAIncasare)), 0)
This.cContCasaRestaurant = Alltrim(NVL(This.ReadVariable("general","cont_casa_restaurant"),''))
This.cAcontCasaRestaurant = Alltrim(NVL(This.ReadVariable("general","acont_casa_restaurant"),''))
This.cContCardRestaurant = Alltrim(NVL(This.ReadVariable("general","cont_card_restaurant"),''))
This.cAcontCardRestaurant = Alltrim(NVL(This.ReadVariable("general","acont_card_restaurant"),''))
This.cContTicheteRestaurant = Alltrim(NVL(This.ReadVariable("general","cont_tichete_restaurant"),''))
This.cAcontTicheteRestaurant = Alltrim(NVL(This.ReadVariable("general","acont_tichete_restaurant"),''))
This.cContCasaHotel = Alltrim(NVL(This.ReadVariable("general","cont_casa_hotel"),''))
This.cAcontCasaHotel = Alltrim(NVL(This.ReadVariable("general","acont_casa_hotel"),''))
This.cContCardHotel = Alltrim(NVL(This.ReadVariable("general","cont_card_hotel"),''))
This.cAcontCardHotel = Alltrim(NVL(This.ReadVariable("general","acont_card_hotel"),''))
This.cContTicheteHotel = Alltrim(NVL(This.ReadVariable("general","cont_tichete_hotel"),''))
This.cAcontTicheteHotel = Alltrim(NVL(This.ReadVariable("general","acont_tichete_hotel"),''))
This.cContViramentHotel = Alltrim(NVL(This.ReadVariable("general","cont_virament_hotel"),''))
This.cAcontViramentHotel = Alltrim(NVL(This.ReadVariable("general","acont_virament_hotel"),''))
This.cContViramentIntHotel = Alltrim(NVL(This.ReadVariable("general","cont_viramentint_hotel"),''))
This.cAcontViramentIntHotel = Alltrim(NVL(This.ReadVariable("general","acont_viramentint_hotel"),''))
This.cContClientiRestaurant = Alltrim(NVL(This.ReadVariable("general","cont_clienti_restaurant"),''))
This.cAcontClientiRestaurant = Alltrim(NVL(This.ReadVariable("general","acont_clienti_restaurant"),''))
This.cContClientiHotel = Alltrim(NVL(This.ReadVariable("general","cont_clienti_hotel"),''))
This.cAcontClientiHotel = Alltrim(NVL(This.ReadVariable("general","acont_clienti_hotel"),''))
This.cAcontMarfaBar = Alltrim(NVL(This.ReadVariable("general","acont_marfa_bar"),''))
This.cAcontMarfaBucatarie = Alltrim(NVL(This.ReadVariable("general","acont_marfa_bucatarie"),''))
This.cAcontVenituriBar = Alltrim(NVL(This.ReadVariable("general","acont_venituri_bar"),''))
This.cAcontVenituriBucatarie = Alltrim(NVL(This.ReadVariable("general","acont_venituri_bucatarie"),''))
This.cAcontAch4428 = Alltrim(NVL(This.ReadVariable("general","acont_ach_4428"),''))
This.cAcontAch4426 = Alltrim(NVL(This.ReadVariable("general","acont_ach_4426"),''))
This.cAcontVz4428 = Alltrim(NVL(This.ReadVariable("general","acont_vz_4428"),''))
This.cAcontVz4427 = Alltrim(NVL(This.ReadVariable("general","acont_vz_4427"),''))
This.cAcontMf4428 = Alltrim(NVL(This.ReadVariable("general","acont_mf_4428"),''))
This.cale_import_fidelio = Alltrim(This.ReadVariable("general","cale_import_fidelio"))
This.cale_import_biz = Alltrim(This.ReadVariable("general","cale_import_biz"))
This.cale_import = Alltrim(This.ReadVariable("general","cale_import"))
This.last_data1 = CTOD(This.ReadVariable("general","last_data1"))
This.last_data2 = CTOD(This.ReadVariable("general","last_data2"))
lcTimeOut = This.ReadVariable("connection","connect_timeout")
If Empty(Nvl(lcTimeOut,''))
This.connect_timeout = 60
Else
This.connect_timeout = Round(Val(lcTimeOut),0)
Endif
lcTimeOut = This.ReadVariable("connection","response_timeout")
If Empty(Nvl(lcTimeOut,''))
This.response_timeout = 60
Else
This.response_timeout = Round(Val(lcTimeOut),0)
ENDIF
lcLog = This.ReadVariable("other","write_log")
This.lWriteLog = (VAL(m.lcLog) = 1)
Endproc && ReadSettings
Enddefine

275
capp.prg Normal file
View File

@@ -0,0 +1,275 @@
*!* capp *!*
#INCLUDE COMUN.H
#INCLUDE SECURITY.H
#DEFINE CRLF CHR(13) + CHR(10)
*** ==================== CAPP ============================ ***
Define Class cApp As Custom
oSettings = Null
lError = .F.
cErrorMessage = ''
oLog = Null
oTrace = Null
lWriteLog = .F. && .T. = scrie in log pe disc
*
Procedure Init
*Set Procedure To "app.prg" Additive
This.oSettings = Newobject("Settings","app.prg") && CREATEOBJECT("Settings")
This.oLog = Iif(Type('goLog') = 'O', goLog, Createobject("Log"))
Endproc && INIT
*
Procedure ProcessError(toHash)
Declare laErrors[1]
LOCAL loHash
IF TYPE('toHash') = 'O'
loHash = toHash
ELSE
loHash = GetHash()
ENDIF
lnErrorLines = Aerror(laErrors)
lnError = Iif(loHash.HasProperty("nError"), loHash.GetValue("nError"), Transform(laErrors(1)) + ' ' + Transform(laErrors(5)))
lcMethod = loHash.GetValue("cMethod")
lnLine = loHash.GetValue("nLine")
lcError = Iif(loHash.HasProperty("cError"), loHash.GetValue("cError"), Transform(laErrors(2)))
lcCode = Iif(loHash.HasProperty("cCode"), loHash.GetValue("cCode"), Message(1) )
lcCallStack = GetCallStack()
lcUserMessage = loHash.GetValue("cUserMessage")
This.cErrorMessage = lcUserMessage + CRLF + CRLF + ;
'Eroarea nr: ' + Transform(lnError) + CRLF + ;
'Eroarea: ' + Transform(lcError) + CRLF + ;
'Procedura: ' + Transform(lcMethod) + CRLF + ;
'Linia: ' + Transform(lnLine) + CRLF + ;
'Codul: ' + Transform(lcCode) + CRLF + ;
lcCallStack
This.lError = .T.
This.Log(This.cErrorMessage)
*!* MESSAGEBOX(THIS.cErrorMessage,0+16,'Eroare')
*!* IF MESSAGEBOX(THIS.cErrorMessage + CRLF + 'Doriti sa iesiti?',16+4,'Eroare') = 6
*!* IF _vfp.StartMode = 0
*!* SET STEP ON
*!* ELSE
*!* RETURN TO MASTER
*!* ENDIF
*!* ENDIF
Endproc && ProcessError
*
Procedure Log
Lparameters tcMessage, toTrace
LOCAL loTrace
IF this.oSettings.lWriteLog
This.oLog.WriteLog(tcMessage)
ENDIF
loTrace = This.oTrace
*!* 03.03.2010
IF TYPE('toTrace') = 'O'
toTrace.Trace(tcMessage)
ELSE
IF TYPE('loTrace') = 'O'
loTrace.Trace(tcMessage)
ENDIF
ENDIF
*!* 03.03.2010 ^
Endproc && Log
*
Function Gethost
Local lcValue
lcValue = This.oSettings.GetValue("HOST")
Return lcValue
Endfunc && GetHost
*
Function GetUser
Local lcValue
lcValue = This.oSettings.GetValue("USER")
Return lcValue
Endfunc && GetUser
*
Function GetPassword
Local lcValue
lcValue = This.oSettings.GetValue("PASSWORD")
Return lcValue
Endfunc && GetPassword
*
Function GetConnectionString
Local lcValue
lcValue = This.oSettings.GetValue("CONNECTIONSTRING")
Return lcValue
Endfunc && GetConnectionString
*
Function GetError
Return This.cErrorMessage
Endfunc && GetError
*
Function HasError
Return This.lError
Endfunc && HasError
*
Function IsLoggedIn
Return .T.
&& RETURN THIS.oSettings.GetValue("IdUtilizator") > 0
Endfunc && IsLoggedIn
Function ShowError
Return Messagebox(This.cErrorMessage + CRLF + 'Doriti sa iesiti?',16+4,'Eroare')
Endfunc && ShowError
Enddefine && cAPP
*** ==================== cSETTINGS ============================ ***
Define Class cSETTINGS As Custom
cIniFile = ''
cAppPath = ''
cIniText = ''
Proc Init
Local lcApppath, lcApplicationFile
If Type('gcAppPath') = 'C'
lcApppath = gcAppPath
Else
lcApppath = Addbs(Justpath(Sys(16, 0)))
If 'PROGRAME'$Upper(lcApppath)
lcApppath = Strtran(lcApppath, 'PROGRAME\','')
Endif
Endif
This.cAppPath = lcApppath
This.cIniFile = This.cAppPath + 'settings.ini'
This.InitSettings()
This.ReadSettings()
Endproc
Procedure InitSettings
Local lcInifile, lcIniText
lcIniText = This.cIniText
lcInifile = This.cIniFile
If Empty(lcInifile)
Return
Endif
IF !FILE(lcInifile)
Strtofile(lcIniText, lcInifile)
ENDIF
Endproc && InitSettings
Procedure ReadSettings
Endproc && ReadSettings
*==========================================
Procedure SetVariable
Lparameters tcSection, tcVarname, tuValue
Local lcSection, lcVarname, lcValue
lcSection = Lower(Alltrim(tcSection))
lcVarname = Lower(Alltrim(tcVarname))
lcValue = Transform(tuValue)
SetIni(This.cIniFile, lcSection, lcVarname, lcValue)
Endproc && SetVariable
*==========================================
Procedure ReadVariable
Lparameters tcSection, tcVarname
Local lcSection, lcVarname, lcValue
lcSection = Lower(Alltrim(tcSection))
lcVarname = Lower(Alltrim(tcVarname))
lcValue = GetIni(This.cIniFile, lcSection, lcVarname)
lcValue = Nvl(lcValue, '')
Return lcValue
Endproc && ReadVariable
Function GetValue
Lparameters tcSetting
Local lcSetting, luValue
lcSetting = "THIS." + tcSetting
luValue = ''
If Type(lcSetting) # 'U'
luValue = &lcSetting
Endif
Return luValue
Endfunc
Procedure SetValue
Lparameters tcSetting, tuValue
Local lcSetting, luValue
lcSetting = "THIS." + tcSetting
luValue = tuValue
If Type(lcSetting) # 'U'
&lcSetting = luValue
Endif
Endproc
Function DecryptPassword As Character
Lparameters tcPassword
Local lcPassword
lcPassword = Alltrim(Strconv(Alltrim(m.tcPassword),14))
lcPassword = This.EncryptDecrypt(m.lcPassword, ENCRYPTKEY, "decrypt","blowfish")
Return m.lcPassword
Endfunc
*!* EncryptDecrypt
*!* EX: EncryptDecrypt("text to encrypt", "encrypt key", "encrypt")
*!* EX: EncryptDecrypt("text to decrypt", "decrypt key", "decrypt")
*!* EX: EncryptDecrypt("text to encrypt", "encrypt key", "encrypt","blowfish")
Function EncryptDecrypt
Lparameters tcText, tcPassword, tcMode, tcAlgorithm
&& tcMode : ENCRYPT/DECRYPT
Local lcAlgorithm,lcReturn, lcString, lcPWD
Local loException As Exception
m.lcString = tcText
m.lcPWD = tcPassword
m.lcReturn = ""
lcAlgorithm = ""
If Type('tcAlgorithm') = 'C'
lcAlgorithm = tcAlgorithm
Endif
If lcAlgorithm = "blowfish"
If Upper(Alltrim(Transform(tcMode))) = "ENCRYPT"
lcReturn=Encrypt(m.lcString, m.lcPWD,4,0)
Else
Try
lcReturn=decrypt(m.lcString, Alltrim(m.lcPWD),4,0)
Catch To loException
If loException.ErrorNo=2028
golog.Log("S-a incercat decriptarea unui text care nu a fost generat cu algoritmul de criptare selectat.",Program())
Else
golog.Log(loException.Message,Program())
Endif
Endtry
Endif
Endif
*!* 18.03.2008 : am scos chr(0) de la sfarsitul textului decriptat
If At(Chr(0),m.lcReturn) > 0 And Upper(Alltrim(Transform(tcMode))) != "ENCRYPT"
m.lcReturn = Substr(m.lcReturn, 1, At(Chr(0),m.lcReturn)-1)
Endif
*!* 18.03.2008
Return m.lcReturn
Endfunc && EncryptDecrypt
Enddefine && cSETTINGS

96
changelog_flora2roa.txt Normal file
View File

@@ -0,0 +1,96 @@
<!--
02/07/2026
FLORA2ROA - 2.0.5
:eroare:
Corectare eroare "numeric overflow" la salvarea notelor contabile.
-->
<!--
01/07/2026
FLORA2ROA - 2.0.4
:modificare:
Toti clientii cu cod fiscale peste 10 cifre se considera persoane fizice, in scopul declaratiei D406 SAFT.
Toate persoanele fizice cu CNP invalid se salveaza fara CNP in baza de date pentru a nu da eroare la D406 SAFT.
-->
<!--
16/10/2025
FLORA2ROA - 2.0.3
:modificare:
Nu se mai genereaza note VANZARI RESTAURANT pentru Tip Plata = "MD BUFET".
-->
<!--
24/09/2025
FLORA2ROA - 2.0.2
:nou:
Corectare explicatie TVA livrari 21% MONETAR HOTEL.
-->
<!--
12/08/2025
FLORA2ROA - 2.0.1
:nou:
Actualizare cote TVA 21%, 11%
-->
<!--
11/08/2025
FLORA2ROA - 2.0.0
:nou:
Actualizare cote TVA 21%, 11%
:modificare:
Completare document pereche la contul "418" in notele MONETAR RESTAURANT 5125 = 418, pentru constituirea "418" in VENITURI RESTAURANT 418 = 707
-->
<!--
14/07/2025
FLORA2ROA - 1.0.9
:eroare:
S-a corectat o eroaree de la salvarea notelor contabile in baza de date.
-->
<!--
25/06/2025
FLORA2ROA - 1.0.8
:modificare:
Facturi Hotel TAXA STATIUNE - EXPLICATIA TVA ESTE "LIVRARI SCUTITE CU DREPT DE DEDUCERE" in loc de "LIVRARI 19%"
Incasare Hotel, cu tichete se face nota 418.02 - 472.03
-->
<!--
25/04/2025
FLORA2ROA - 1.0.7
:modificare:
Import. Corectare Explicatie TVA pentru facturi 4111. Completare cod de taxa si cod de plata SAFT.
-->
<!--
06/12/2024
FLORA2ROA - 1.0.5
:modificare:
Import RESTAURANT. Se pot exclude din import Intrari, Iesiri, Vanzari Restaurant sau Hotel.
-->
<!--
04/12/2024
FLORA2ROA - 1.0.4
:modificare:
Import DESCARCARE RESTAURANT.
- Notele se cumuleaza dupa data document si tip document, in loc de numar document.
- Iesirile tip "Protocol" se inregistreaza 623 = 371.
-->

12
comun.h Normal file
View File

@@ -0,0 +1,12 @@
#IFNDEF COMUN_H
#DEFINE COMUN_H
#DEFINE LF CHR(10)
#DEFINE CR CHR(10)
#DEFINE CRLF CHR(13) + CHR(10)
#DEFINE CT_INSUCCES -1
#DEFINE CT_SUCCES 1
#ENDIF

1
config.fpw Normal file
View File

@@ -0,0 +1 @@
SCREEN=ON

View File

@@ -0,0 +1,104 @@
# Depanare si testare FLORA2ROA (headless, fara IDE)
Implementarea in acest proiect a sistemului comun de depanare/testare VFP. Metoda generala si
capcanele complete: `D:\ROA\ROACONT\COMUN\docs\depanare_testare_vfp.md`,
`testare-ui-vfp.md`, `flux-editare-vfp-text.md`, `reguli_lucru.md`.
## Ce contine `Teste\`
Infrastructura (copiata din `COMUN\utile\Teste`, generica):
- `ui_harness.prg` - proceduri de handshake intre testul VFP si orchestrator
(`HarnessLog`, `HarnessStep`, `HarnessReady`, `HarnessWaitContinue`, `HarnessDone`).
- `vfp_ui_harness.ps1` - orchestrator: precompileaza, lanseaza vfp9, conduce testul pas cu pas
pe semafoare si face o captura PNG dupa fiecare pas. Fereastra e mutata off-screen, deci nu
fura focusul si se poate lucra in paralel.
- `_precompile.ps1` - precompilare izolata a `.fxp`-ului testului (proces copil separat).
Specific FLORA2ROA:
- `test_init_env_auto.prg` - initializare NEINTERACTIVA a mediului, echivalentul lui `main.prg`
fara `DO FORM` / `READ EVENTS`. Dupa apel sunt disponibile `goApp`, `goLog`, `goConn`,
`goExecutor`, `gcAppPath`. Conectarea la Oracle e OPTIONALA (primul parametru).
- `test_helpers.prg` - `TestErrorHandler` (ON ERROR care logheaza si continua, fara MESSAGEBOX)
si aserturile `TestAssert` / `TestAssertEqual` / `TestRezultat`.
- `mock_amessagebox.prg` - `amessagebox` care returneaza direct valoarea butonului, ca
dialogurile modale sa nu blocheze rularea headless.
- `verifica_sintaxa.ps1` - compilare de verificare pentru toate `.prg`-urile, pe copii in TEMP.
- `text_din_bin.ps1` / `bin_din_text.ps1` - conversie `.scx`/`.vcx` <-> text (`_textcache\`).
- `ruleaza_teste.ps1` - ruleaza toata suita si da sumarul.
- `test_frm_import_ui.prg` - smoke: formularul real porneste, Init completeaza intervalul din
`settings.ini`, `Trace` scrie in `edtInfo`.
- `test_export_date.prg` - functional: `ExportDate()` citeste XML-urile din interval si
populeaza cursoarele (fara Oracle).
- `test_conectare_roa.prg` - verifica drumul CU conectare la Oracle: fie se conecteaza si
executa o interogare de proba, fie raporteaza esecul si iese controlat. NU e in suita
implicita (depinde de reteaua/serverul Oracle).
## Comenzi uzuale
```powershell
# toata suita (sintaxa + teste UI cu capturi)
powershell -ExecutionPolicy Bypass -File Teste\ruleaza_teste.ps1
# doar verificarea de sintaxa, dupa orice editare de .prg
powershell -ExecutionPolicy Bypass -File Teste\verifica_sintaxa.ps1
# un singur test, cu capturi
powershell -ExecutionPolicy Bypass -File Teste\vfp_ui_harness.ps1 `
-TestPrg 'D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_export_date.prg' -Steps @('afisat','importat')
# un singur test, fara capturi (auto-continue la 30s pe pas)
& 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' -A -T "D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_export_date.prg" 20250601 20250630
# verificarea conexiunii la Oracle (datele din settings.ini)
& 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' -A -T "D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_conectare_roa.prg"
```
Rezultatele: `Teste\<test>_log.txt` (linii `PASS:`/`FAIL:` si `REZULTAT:`),
capturi in `Teste\screenshots\`, erori runtime in `Teste\_erori_test.txt`.
## Editarea formularului pe text
```powershell
powershell -ExecutionPolicy Bypass -File Teste\text_din_bin.ps1 # binar -> _textcache\*.sc2
# editezi _textcache\frm_import.sc2 BYTE-SAFE, in Windows-1252:
# $t = [IO.File]::ReadAllText($p, [Text.Encoding]::GetEncoding(1252))
# [IO.File]::WriteAllText($p, $t, [Text.Encoding]::GetEncoding(1252))
powershell -ExecutionPolicy Bypass -File Teste\bin_din_text.ps1 -TextFile _textcache\frm_import.sc2 -DryRun
powershell -ExecutionPolicy Bypass -File Teste\bin_din_text.ps1 -TextFile _textcache\frm_import.sc2
```
Write-back-ul face fidelity check (bin -> text, comparat pe octeti) inainte de a atinge
binarul si refuza daca `frm_import.scx` e blocat de IDE sau de `flora2roa.exe`.
## Un test nou in 5 pasi
1. `SET SAFETY OFF` + `SET TALK OFF` ca PRIMA linie, apoi `PUBLIC gcUILog, gcSyncDir`.
2. `DO test_init_env_auto WITH .F.` (sau `.T.` cand testul chiar are nevoie de Oracle), apoi
`SET PROCEDURE TO ui_harness ADDITIVE` si `mock_amessagebox` ULTIMUL.
3. `DO FORM (gcAppPath + 'frm_import') NAME goImportFrm NOSHOW`, `WindowType = 0`, `Show()`.
Modal (`Show(1)`) nu returneaza si blocheaza testul.
4. Pe fiecare pas: actiunea din fluxul REAL al utilizatorului (metoda pe care o apeleaza
butonul, nu popularea directa a cursoarelor), aserturi cu `TestAssert`, apoi
`DO HarnessStep WITH <n>, '<eticheta>'`. La final `DO HarnessDone WITH TestRezultat()` si `QUIT`.
5. Inregistreaza testul in lista `$suita` din `ruleaza_teste.ps1`.
## Capcane confirmate in acest proiect
- `ErrorHandler` din `main.prg` deschide `MESSAGEBOX` si face `SET STEP ON`: headless ar bloca
procesul la nesfarsit. De aceea `test_init_env_auto.prg` instaleaza `TestErrorHandler`.
- Compilarile repetate de `vfp9` din ACEEASI sesiune PowerShell esueaza tacut (procesul
porneste dar nu executa). `verifica_sintaxa.ps1` compileaza toate fisierele intr-o singura
rulare; harness-ul foloseste proces copil izolat pentru precompilare.
- `Set Exclusive On` din `main.prg` nu se pastreaza in teste (mediul de test deschide cursoare
partajate); daca un test are nevoie de comportamentul exact al aplicatiei, il seteaza el.
- Testele nu ruleaza in paralel intre ele: harness-ul isi omoara instantele `vfp9` proprii
inainte de fiecare lansare (filtrat pe linia de comanda; instantele straine nu sunt atinse).
- `settings.ini` decide folderele de import. Testele functionale depind de continutul din
`EXEMPLE\hotel` si `EXEMPLE\restaurant`; daca intervalul nu are fisiere, cursoarele raman goale.
- Un test care se conecteaza la Oracle face `SQLSETPROP(0, 'DispLogin', 3)` inainte de conectare:
altfel, cu date de acces gresite, driverul ODBC deschide un dialog de login care blocheaza
procesul headless la nesfarsit (simptom: proces viu, CPU 0%, log fara linii noi).
- `CreeazaNote()` si `ScrieNote()` scriu in ROA si NU pot fi testate fara Oracle. Bifa
"Nu scrie note contabile" (`chkTest.Value = 1`) opreste scrierea; testele o lasa activa.

12
fisiere.prg Normal file
View File

@@ -0,0 +1,12 @@
CLOSE DATABASES
SET DELETED ON
SET ANSI ON
SET EXACT ON
lcdir = [E:\vali\MARITIMO_DBF\]
CD (m.lcDir)
lnFiles = ADIR(laFiles, '*.dbf')
FOR lnFile = 1 TO lnFiles
lcFile = lcDir + laFiles(lnFile,1)
USE (m.lcFile) IN 0 SHARED
ENDFOR

103
flora2roa.pj2 Normal file
View File

@@ -0,0 +1,103 @@
*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.21" SourceFile="flora2roa.pjx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
LPARAMETERS tcDir
lcCurdir = SYS(5)+CURDIR()
CD ( EVL( tcDir, JUSTPATH( SYS(16) ) ) )
*<DevInfo>
_Author = ""
_Company = ""
_Address = ""
_City = ""
_State = ""
_PostalCode = ""
_Country = ""
*--
_Comments = ""
_CompanyName = " "
_FileDescription = " "
_LegalCopyright = ""
_LegalTrademark = ""
_ProductName = " "
_MajorVer = "2"
_MinorVer = "0"
_Revision = "5"
_LanguageID = ""
_AutoIncrement = "0"
*</DevInfo>
*<BuildProj>
*<.HomeDir = 'd:\proiecte\flora\flora2roa' />
FOR EACH loProject IN _VFP.Projects FOXOBJECT
loProject.Close()
ENDFOR
STRTOFILE( '', '__newproject.f2b' )
BUILD PROJECT flora2roa.pjx FROM '__newproject.f2b'
FOR EACH loProject IN _VFP.Projects FOXOBJECT
loProject.Close()
ENDFOR
MODIFY PROJECT 'flora2roa.pjx' NOWAIT NOSHOW NOPROJECTHOOK
loProject = _VFP.Projects('flora2roa.pjx')
WITH loProject.FILES
.ADD('app.ico') && *< FileMetadata: Type="x" Cpid="0" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('app.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" />
.ADD('capp.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" />
.ADD('comun.h') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('config.fpw') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('frm_import.scx') && *< FileMetadata: Type="K" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" />
.ADD('import.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" />
.ADD('main.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" />
.ADD('myapp.prg') && *< FileMetadata: Type="P" Cpid="1250" Timestamp="0" ID="0" ObjRev="544" User="" />
.ADD('myutils.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" />
.ADD('security.h') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('settings.ini') && *< FileMetadata: Type="T" Cpid="1250" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('vfpconnection_utils.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" />
*</BuildProj>
.ITEM('__newproject.f2b').Remove()
*<FileComments>
*</FileComments>
*<ExcludedFiles>
.ITEM("settings.ini").Exclude = .T.
*</ExcludedFiles>
*<TextFiles>
.ITEM("comun.h").Type = 'T'
.ITEM(lcCurdir + 'config.fpw').Type = 'T'
.ITEM("security.h").Type = 'T'
*</TextFiles>
ENDWITH
WITH loProject
*<ProjectProperties>
.SetMain("main.prg")
.Icon = "app.ico"
.Debug = .F.
.Encrypted = .F.
*<.CmntStyle = 1 />
*<.NoLogo = .F. />
*<.SaveCode = .T. />
*<.User = '' />
.ProjectHookLibrary = ''
.ProjectHookClass = ''
*</ProjectProperties>
ENDWITH
_VFP.Projects('flora2roa.pjx').Close()
*ERASE '__newproject.f2b'
CD (lcCurdir)
RETURN

1
flora2roa.txt Normal file
View File

@@ -0,0 +1 @@
2.0.3

2259
frm_import.sc2 Normal file

File diff suppressed because it is too large Load Diff

0
import.prg Normal file
View File

132
main.prg Normal file
View File

@@ -0,0 +1,132 @@
#INCLUDE COMUN.H
#INCLUDE SECURITY.H
_screen.Icon= 'D:\PROIECTE\FLORA\FLORA2ROA\app.ico'
RELEASE MENU _Msysmenu
Close Databases All
Set Deleted On
Set Exclusive On
Set Ansi On
Set Exact On
Set Century On
Set Date Dmy
Set Safety Off
Private gcAppName, gcAppPath, gcTempPath
Local lcMesaj, lcOnShutdown, llSucces
PRIVATE goApp as "MyApp"
PRIVATE goLog as "Log"
Local lcFile, lcFileI, i
Local lcLibraryPath
Local loEx As Exception
gcAppName = 'FLORA2ROA'
gcAppPath = Addbs(Justpath(Sys(16,0)))
gcTempPath = GETENV("TEMP")
SET DEFAULT TO (gcAppPath)
lcOnShutdown="ShutDown()"
On Shutdown &lcOnShutdown
On Error ErrorHandler(Error(),Program(),Lineno())
SET PROCEDURE TO capp.prg ADDITIVE
SET PROCEDURE TO app.prg ADDITIVE
SET PROCEDURE TO myutils.prg ADDITIVE
SET PROCEDURE TO vfpconnection_utils.prg ADDITIVE
SET PROCEDURE TO myapp.prg ADDITIVE
llSucces = .F.
lcLibraryPath = m.gcAppPath + "vfpconnection.fll"
If File(lcLibraryPath)
llSucces = .F.
Try
Set Library To (lcLibraryPath) Additive
llSucces = .T.
Catch To loEx
lcMesaj = 'vfpconnection ' + loEx.Message
ShowMessage(m.lcMesaj)
Endtry
ENDIF
If m.llSucces
lcLibraryPath = m.gcAppPath + "vfpencryption.fll"
If File(lcLibraryPath)
llSucces = .F.
Try
Set Library To (lcLibraryPath) Additive
llSucces = .T.
Catch To loEx
lcMesaj = 'vfpencryption' + loEx.Message
ShowMessage(m.lcMesaj)
Endtry
Endif
ENDIF
***********************
PRIVATE goImportFrm, goConn, goExecutor
goImportFrm = NULL
goConn = CREATEOBJECT("oConn")
goExecutor = CREATEOBJECT("oExecutor")
goLog = Createobject("Log", gcApppath + "log\log_" + gcAppName + "_" + Dtos(Date()) + ".txt")
goApp = Createobject("MyApp")
*!* 02.03.2010
SetConnectTimeout(goApp.oSettings.connect_timeout) && Default is 10 seconds
SetResponseTimeout(goApp.oSettings.response_timeout) && Default is 10 seconds
*!* 02.03.2010 ^
DO FORM frm_import NAME goImportFrm LINKED
READ EVENTS
SHUTDOWN()
*************************
Procedure ShowMessage
Lparameters tcMessage
Messagebox(m.tcMessage)
Endproc
*************************
Function ErrorHandler(nError,cMethod,nLine)
Local lcErrorMsg,lcCodeLineMsg
Wait Clear
lcErrorMsg=Message()+Chr(13)+Chr(13)
lcErrorMsg=lcErrorMsg+"Method: "+cMethod
lcCodeLineMsg=Message(1)
If Between(nLine,1,10000) And Not lcCodeLineMsg="..."
lcErrorMsg=lcErrorMsg+Chr(13)+"Line: "+Alltrim(Str(nLine))
If Not Empty(lcCodeLineMsg)
lcErrorMsg=lcErrorMsg+Chr(13)+Chr(13)+lcCodeLineMsg
Endif
ENDIF
SET STEP ON
If Messagebox(lcErrorMsg,17,_Screen.Caption)#1
On Error
Return .F.
Endif
Endfunc
*************************
Function Shutdown
Cleanup()
Quit
Endfunc
*************************
Function Cleanup
On Error
On Shutdown
Set Classlib To
Set Path To
Clear All
Close All
*POP MENU _msysmenu
Return
ENDFUNC

0
myapp.prg Normal file
View File

1707
myutils.prg Normal file

File diff suppressed because it is too large Load Diff

1
security.h Normal file
View File

@@ -0,0 +1 @@
#DEFINE ENCRYPTKEY "233!do*32Di3-o23\409"

72
settings.flora.ini Normal file
View File

@@ -0,0 +1,72 @@
[general]
host = ROA
user = XENOTI
password = +vIcfGb3NCfLCZXaqOM19Q==
cale_import_fidelio = \\10.0.0.37\Biz\
cale_import_biz = C:\BIZ\
cale_import = C:\roa\flora2roa\IMPORT\
last_data1 = 30/04/2025
last_data2 = 30/04/2025
tva_incasare = 0
id_part_casa_restaurant = 251
id_part_card_restaurant = 230
id_part_tichete_restaurant = 230
id_part_clienti_restaurant = 234
id_part_casa_hotel = 251
id_part_card_hotel = 230
id_part_clienti_hotel = 233
cont_casa_restaurant = 5311
acont_casa_restaurant =
cont_card_restaurant = 5125
acont_card_restaurant = 01
cont_tichete_restaurant = 472
acont_tichete_restaurant = 03
cont_casa_hotel = 5311
acont_casa_hotel =
cont_card_hotel = 5125
acont_card_hotel = 01
cont_tichete_hotel = 5125
acont_tichete_hotel = 01
cont_viramentint_hotel = 418
acont_viramentint_hotel = 01
cont_clienti_restaurant = 418
acont_clienti_restaurant = 02
cont_clienti_hotel = 4111
acont_clienti_hotel = 01
cont_factura_casa_hotel = 4111
cont_factura_card_hotel = 4111
cont_factura_tichete_hotel = 4111
cont_factura_viramentint_hotel = 4111
acont_fatura_casa_hotel = 01
acont_factura_card_hotel = 02
acont_factura_tichete_hotel = 02
acont_factura_viramentint_hotel = 01
acont_marfa_bar = 01
acont_marfa_bucatarie = 08
acont_venituri_bar = 0201
acont_venituri_bucatarie = 0202
acont_ach_4428 = TP
acont_ach_4426 =
acont_vz_4428 = TI
acont_vz_4427 =
acont_mf_4428 = M
[connection]
connection_timeout = 60
response_timeout = 60

72
settings.ini Normal file
View File

@@ -0,0 +1,72 @@
[general]
host = CONPRESS
user = XENOTI
password = +vIcfGb3NCfLCZXaqOM19Q==
cale_import_fidelio = D:\PROIECTE\FLORA\FLORA2ROA\EXEMPLE\hotel\
cale_import_biz = D:\PROIECTE\FLORA\FLORA2ROA\EXEMPLE\restaurant\
cale_import = D:\PROIECTE\FLORA\FLORA2ROA\EXEMPLE\
last_data1 = 01/08/2025
last_data2 = 01/08/2025
tva_incasare = 0
id_part_casa_restaurant = 251
id_part_card_restaurant = 230
id_part_tichete_restaurant = 230
id_part_clienti_restaurant = 234
id_part_casa_hotel = 251
id_part_card_hotel = 230
id_part_clienti_hotel = 233
cont_casa_restaurant = 5311
acont_casa_restaurant =
cont_card_restaurant = 5125
acont_card_restaurant = 01
cont_tichete_restaurant = 472
acont_tichete_restaurant = 03
cont_casa_hotel = 5311
acont_casa_hotel =
cont_card_hotel = 5125
acont_card_hotel = 01
cont_tichete_hotel = 5125
acont_tichete_hotel = 01
cont_viramentint_hotel = 418
acont_viramentint_hotel = 01
cont_clienti_restaurant = 418
acont_clienti_restaurant = 02
cont_clienti_hotel = 4111
acont_clienti_hotel = 01
cont_factura_casa_hotel = 4111
cont_factura_card_hotel = 4111
cont_factura_tichete_hotel = 4111
cont_factura_viramentint_hotel = 4111
acont_fatura_casa_hotel = 01
acont_factura_card_hotel = 02
acont_factura_tichete_hotel = 02
acont_factura_viramentint_hotel = 01
acont_marfa_bar = 01
acont_marfa_bucatarie = 08
acont_venituri_bar = 0201
acont_venituri_bucatarie = 0202
acont_ach_4428 = TP
acont_ach_4426 =
acont_vz_4428 = TI
acont_vz_4427 =
acont_mf_4428 = M
[connection]
connection_timeout = 60
response_timeout = 60

109
update.bat Normal file
View File

@@ -0,0 +1,109 @@
setlocal enabledelayedexpansion
:: Set the variables
set DOWNLOAD_URL=https://roa.romfast.ro/contafinupdate/default.aspx/update/download/1/
set APP_NAME=flora2roa
set APP_DIR=%~dp0
set CURRENT_VERSION_FILE=%APP_NAME%.txt
set SERVER_VERSION_FILE=%APP_NAME%.txt
set NEW_VERSION_FILE=%APP_NAME%_server.txt
set UPDATE_FILE=%APP_NAME%.zip
set UNZIP_DIR=%APP_DIR%\unzip
set APP_EXE=%APP_NAME%.exe
set APP_EXE_OLD=%APP_NAME%_old.exe
set LOG_FILE=%APP_DIR%update_log.txt
:: Log the variables for debugging
echo [%date% %time%] APP_DIR=%APP_DIR% >> %LOG_FILE%
echo [%date% %time%] LOG_FILE=%LOG_FILE% >> %LOG_FILE%
echo [%date% %time%] UNZIP_DIR=%UNZIP_DIR% >> %LOG_FILE%
echo [%date% %time%] Start actualizare >> %LOG_FILE%
CD %APP_DIR%
:: Check the current version
if not exist "%CURRENT_VERSION_FILE%" (
echo [%date% %time%] Current version file not found. >> %LOG_FILE%
echo 0.0.0 >> %APP_DIR%\%CURRENT_VERSION_FILE%
)
set /p CURRENT_VERSION=<"%CURRENT_VERSION_FILE%"
echo [%date% %time%] current version %CURRENT_VERSION_FILE%: %CURRENT_VERSION% >> %LOG_FILE%
:: Get the new version from the server
powershell -Command "(New-Object System.Net.WebClient).DownloadFile('%DOWNLOAD_URL%%SERVER_VERSION_FILE%', '%APP_DIR%\%NEW_VERSION_FILE%')" || (
echo [%date% %time%] Error: Failed to download new version file: %DOWNLOAD_URL%%SERVER_VERSION_FILE% >> %LOG_FILE%
goto END
)
set /p NEW_VERSION=<"%APP_DIR%\%NEW_VERSION_FILE%"
echo [%date% %time%] server version: %NEW_VERSION% >> %LOG_FILE%
:: Check if an update is available
if "%CURRENT_VERSION%" geq "%NEW_VERSION%" (
echo [%date% %time%] No update available. >> %LOG_FILE%
goto END
)
:: Download the update
powershell -Command "(New-Object System.Net.WebClient).DownloadFile('%DOWNLOAD_URL%%UPDATE_FILE%', '%APP_DIR%\%UPDATE_FILE%')" || (
echo [%date% %time%] Error: Failed to download update file. >> %LOG_FILE%
goto END
)
:: Check if the application is running
tasklist /fi "imagename eq %APP_EXE%" | find /i "%APP_EXE%" > nul
if %errorlevel% equ 0 (
echo [%date% %time%] Error: %APP_NAME% is currently running. Please close it before updating. >> %LOG_FILE%
goto END
)
:: Unzip the update
powershell -Command "Expand-Archive -Path '%APP_DIR%\%UPDATE_FILE%' -DestinationPath '%UNZIP_DIR%' -Force" || (
echo [%date% %time%] Error: Failed to unzip update file. >> %LOG_FILE%
goto END
)
:: Update the application
if exist "%APP_DIR%\%APP_EXE_OLD%" (
del "%APP_DIR%\%APP_EXE_OLD%"
echo [%date% %time%] Fișierul %APP_DIR%\%APP_EXE_OLD% a fost șters >> %LOG_FILE%
)
if not exist "%UNZIP_DIR%\%APP_EXE%" (
echo [%date% %time%] Nu exista fișierul %UNZIP_DIR%\%APP_EXE% >> %LOG_FILE%
goto END
)
if exist "%APP_DIR%\%APP_EXE%" (
rename "%APP_DIR%\%APP_EXE%" "%APP_EXE_OLD%"
echo [%date% %time%] Fișierul %APP_DIR%\%APP_EXE% a fost redenumit în %APP_DIR%\%APP_EXE_OLD% >> %LOG_FILE%
)
move /y "%UNZIP_DIR%\%APP_EXE%" "%APP_DIR%\%APP_EXE%"
echo [%date% %time%] Updating %APP_DIR%\%APP_NAME% to version %NEW_VERSION%... >> %LOG_FILE%
:: Update the local version file
if exist "%APP_DIR%\%CURRENT_VERSION_FILE%" (
del "%APP_DIR%\%CURRENT_VERSION_FILE%"
echo Fișierul %CURRENT_VERSION_FILE% a fost șters. >> %LOG_FILE%
)
if exist "%APP_DIR%\%NEW_VERSION_FILE%" (
rename "%APP_DIR%\%NEW_VERSION_FILE%" "%CURRENT_VERSION_FILE%"
echo Fișierul %APP_DIR%\%NEW_VERSION_FILE% a fost redenumit în %CURRENT_VERSION_FILE%. >> %LOG_FILE%
) else (
echo Fișierul %APP_DIR%\%NEW_VERSION_FILE% nu a fost găsit. >> %LOG_FILE%
)
echo [%date% %time%] Update successful. >> %LOG_FILE%
:END
start "" "%APP_DIR%\%APP_EXE%"
exit /b

BIN
vfpconnection.fll Normal file

Binary file not shown.

174
vfpconnection_demo.prg Normal file
View File

@@ -0,0 +1,174 @@
*!* The code below is not designed to run all at once
*!* Run the individual examples seperately
********************************************************************
*!* Upload Examples
********************************************************************
SET LIBRARY TO (LOCFILE("vfpconnection.fll","FLL"))
*!* FILE
?FILEGet("File:///C:\Source.txt", "C:\Destination.txt", "MyProgress()", "MyTrace()")
*!* FTP
?FTPGet("FTP://UserName:Password@somedomain.com/directory/Source.zip", "C:\Destination.zip", "MyProgress()", "MyTrace()")
*!* FTPS
?FTPSGet("FTPS://UserName:Password@somedomain.com:21/directory/Source.zip", "C:\Destination.zip", "MyProgress()", "MyTrace()")
*!* HTTP
?HTTPGet("http://www.somedomain.com/Source.htm", "C:\Destination.htm", "MyProgress()", "MyTrace()")
*!* HTTPS
?HTTPSGet("https://www.somedomain.com/Source.htm", "C:\Destination.htm", "MyProgress()", "MyTrace()")
SET LIBRARY TO
********************************************************************
*!* Download Examples
********************************************************************
SET LIBRARY TO (LOCFILE("vfpconnection.fll","FLL"))
*!* FILE
?FILEPut("C:\Source.txt", "File:///C:\Destination.txt", "MyProgress()", "MyTrace()")
*!* FTP
?FTPPut("C:\Source.zip", "FTP://UserName:Password@somedomain.com/directory/Destination.zip", "MyProgress()", "MyTrace()")
*!* FTPS
?FTPSPut("C:\Source.zip", "FTPS://UserName:Password@somedomain.com:21/directory/Destination.zip", "MyProgress()", "MyTrace()")
*!* HTTP
?HTTPPut("C:\Source.htm", "http://www.somedomain.com/Destination.htm", "MyProgress()", "MyTrace()")
*!* HTTPS
?HTTPSPut("C:\Source.htm", "https://www.somedomain.com/Destination.htm", "MyProgress()", "MyTrace()")
SET LIBRARY TO
********************************************************************
*!* To String Examples
********************************************************************
SET LIBRARY TO (LOCFILE("vfpconnection.fll","FLL"))
*!* FILE
?FILEToStr("C:\Source.txt")
*!* FTP
?FTPTOSTR("FTP://UserName:Password@somedomain.com:21/directory/Source.txt")
*!* FTPS
?FTPSTOSTR("FTPS://UserName:Password@somedomain.com:21/directory/Source.txt")
*!* HTTP
?HTTPToStr("http://www.somedomain.com/Source.txt")
*!* HTTPS
?HTTPSToStr("https://www.somedomain.com/Source.txt")
SET LIBRARY TO
********************************************************************
*!* HTTP Post Examples
********************************************************************
*!* Simple HTTP Post
SET LIBRARY TO (LOCFILE("vfpconnection.fll","FLL"))
LOCAL lcPost
m.lcPost = "fname=John&lname=Smith"
?HttpSimplePost("http://www.snee.com/xml/crud/posttest.cgi", m.lcPost, "", "MyTrace()")
SET LIBRARY TO
*!* MultiPart/Form-Data HTTP Post
SET LIBRARY TO (LOCFILE("vfpconnection.fll","FLL"))
LOCAL ARRAY aryPost(2,2)
aryPost(1,1) = "fname" && name
aryPost(1,2) = "test first" && value
aryPost(2,1) = "lname" && name
aryPost(2,2) = "test last" && value
?HttpPost("http://www.cs.tut.fi/cgi-bin/run/~jkorpela/echo.cgi", @aryPost, "", "MyTrace()")
SET LIBRARY TO
********************************************************************
*!* FTP Commands Example
********************************************************************
*!* Rename FTP Directory
SET LIBRARY TO (LOCFILE("vfpconnection.fll","FLL"))
LOCAL ARRAY aryFTPCommands(4)
aryFTPCommands(1) = "CWD /"
aryFTPCommands(2) = "PWD"
aryFTPCommands(3) = "RNFR MyDir"
aryFTPCommands(4) = "RNTO RenamedMyDir"
?FTPCommands("FTP://username:password@somedomain.com/", @aryFTPCommands, "MyTrace()")
*!* ?FTPSCommands("FTPS://username:password@somedomain.com/", @aryFTPCommands, "MyTrace()")
SET LIBRARY TO
********************************************************************
*!* URL Encode/Decode Example
********************************************************************
SET LIBRARY TO (LOCFILE("vfpconnection.fll","FLL"))
LOCAL lcString, lcEncoded, lcDecoded
m.lcString = "A!B@C#D$E%F^G&H*I(J)K_L-M=N+O[P]Q{R}S|T\U:V;W'X,Y.Z<0>1/2?3<>4<EFBFBD>5<EFBFBD>6<EFBFBD>7<EFBFBD>8<EFBFBD>9"
m.lcEncoded = UrlEncode(m.lcString)
m.lcDecoded = UrlDecode(m.lcEncoded)
?"Escaped: " + m.lcEncoded
?"Unescaped: " + m.lcDecoded
?"Original : " + m.lcString
SET LIBRARY TO
********************************************************************
*!* Setting Timeouts Example
********************************************************************
SET LIBRARY TO (LOCFILE("vfpconnection.fll","FLL"))
SetConnectTimeout(30) && Default is 10 seconds
SetResponseTimeout(30) && Default is 10 seconds
SET LIBRARY TO
********************************************************************
*!* Datetime String to the number of seconds from Epoch (12 Midnight on January 1, 1970)
********************************************************************
SET LIBRARY TO (LOCFILE("vfpconnection.fll","FLL"))
?DateStrToEpochSec("Sun, 06 Nov 1994 08:49:37 GMT")
?DateStrToEpochSec("Sunday, 06-Nov-94 08:49:37 GMT")
?DateStrToEpochSec("Sun Nov 6 08:49:37 1994")
?DateStrToEpochSec("06 Nov 1994 08:49:37 GMT")
?DateStrToEpochSec("06-Nov-94 08:49:37 GMT")
?DateStrToEpochSec("Nov 6 08:49:37 1994")
?DateStrToEpochSec("06 Nov 1994 08:49:37")
?DateStrToEpochSec("06-Nov-94 08:49:37")
?DateStrToEpochSec("1994 Nov 6 08:49:37")
?DateStrToEpochSec("GMT 08:49:37 06-Nov-94 Sunday")
?DateStrToEpochSec("94 6 Nov 08:49:37")
?DateStrToEpochSec("1994 Nov 6")
?DateStrToEpochSec("06-Nov-94")
?DateStrToEpochSec("Sun Nov 6 94")
?DateStrToEpochSec("1994.Nov.6")
?DateStrToEpochSec("Sun/Nov/6/94/GMT")
?DateStrToEpochSec("Sun, 06 Nov 1994 08:49:37 CET")
?DateStrToEpochSec("06 Nov 1994 08:49:37 EST")
?DateStrToEpochSec("Sun, 12 Sep 2004 15:05:58 -0700")
?DateStrToEpochSec("Sat, 11 Sep 2004 21:32:11 +0200")
?DateStrToEpochSec("20040912 15:05:58 -0700")
?DateStrToEpochSec("20040911 +0200")
SET LIBRARY TO
********************************************************************
*!* Determine the version of libcurl and OpenSSL that were used for VFPConnection.fll
********************************************************************
SET LIBRARY TO (LOCFILE("vfpconnection.fll","FLL"))
?CURLVERSION()
SET LIBRARY TO
***********************
FUNCTION MyProgress() && Callback from the FLL - can be used to track operation progress
***********************
*!* You can create your own function, procedure or method to handle this and name it whatever you want.
*!* The nConnectTotalBytes and nConnectBytesSoFar are private variables created on-the-fly by the FLL
?m.nConnectTotalBytes
?m.nConnectBytesSoFar
ENDFUNC
***********************
FUNCTION MyTrace() && Callback from the FLL - used to provide a detailed trace of the operation
***********************
*!* You can create your own function, procedure or method to handle this and name it whatever you want.
*!* The nTraceDataType and cTraceData are private variables created on-the-fly by the FLL
#DEFINE TYPE_TEXT 0
#DEFINE TYPE_HEADER_IN 1
#DEFINE TYPE_HEADER_OUT 2
#DEFINE TYPE_DATA_IN 3
#DEFINE TYPE_DATA_OUT 4
#DEFINE TYPE_SSL_DATA_IN 5
#DEFINE TYPE_SSL_DATA_OUT 6
#DEFINE TYPE_END 7
?ICASE(m.nTraceDataType = TYPE_TEXT, "STATUS:", ;
m.nTraceDataType = TYPE_HEADER_IN, "<RECV HEADER: ", ;
m.nTraceDataType = TYPE_HEADER_OUT, ">SEND HEADER: ", ;
m.nTraceDataType = TYPE_DATA_IN, "<RECV DATA: ", ;
m.nTraceDataType = TYPE_DATA_OUT, ">SEND DATA: ", ;
m.nTraceDataType = TYPE_SSL_DATA_IN, "<RECV SSL DATA: ", ;
m.nTraceDataType = TYPE_SSL_DATA_OUT, ">SEND SSL DATA: ", ;
m.nTraceDataType = TYPE_END, "END: ", "UNKNOWN: ")
??m.cTraceData
ENDFUNC

44
vfpconnection_utils.prg Normal file
View File

@@ -0,0 +1,44 @@
*!* vfpconnection_utils
***********************
Function MyProgress && Callback from the FLL - can be used to track operation progress
Lparameters tcFile
Local lnProgress, lcFile
lnProgress = 0
lcFile = Iif(Empty(m.tcFile) Or Type('tcFile') <> 'C', '', m.tcFile)
If m.nConnectTotalBytes > 0
m.lnProgress = Int(m.nConnectBytesSoFar / m.nConnectTotalBytes * 100)
Endif
Wait Window m.lcFile + ' ' + Transform(m.lnProgress) + '% ...' Nowait
Endfunc
***********************
Function MyTrace() && Callback from the FLL - used to provide a detailed trace of the operation
***********************
*!* You can create your own function, procedure or method to handle this and name it whatever you want.
*!* The nTraceDataType and cTraceData are private variables created on-the-fly by the FLL
#Define TYPE_TEXT 0
#Define TYPE_HEADER_IN 1
#Define TYPE_HEADER_OUT 2
#Define TYPE_DATA_IN 3
#Define TYPE_DATA_OUT 4
#Define TYPE_SSL_DATA_IN 5
#Define TYPE_SSL_DATA_OUT 6
#Define TYPE_END 7
lcDataType = Icase(m.nTraceDataType = TYPE_TEXT, "STATUS:", ;
m.nTraceDataType = TYPE_HEADER_IN, "<RECV HEADER: ", ;
m.nTraceDataType = TYPE_HEADER_OUT, ">SEND HEADER: ", ;
m.nTraceDataType = TYPE_DATA_IN, "<RECV DATA: ", ;
m.nTraceDataType = TYPE_DATA_OUT, ">SEND DATA: ", ;
m.nTraceDataType = TYPE_SSL_DATA_IN, "<RECV SSL DATA: ", ;
m.nTraceDataType = TYPE_SSL_DATA_OUT, ">SEND SSL DATA: ", ;
m.nTraceDataType = TYPE_END, "END: ", "UNKNOWN: ")
lcData = m.cTraceData
If Inlist(m.nTraceDataType, TYPE_TEXT)
lcMesaj = lcDataType + " " + lcData
goApp.Log(m.lcMesaj)
Endif
Endfunc

BIN
vfpencryption.fll Normal file

Binary file not shown.