achizitie import: TVA DVI cu valuta proprie, discount financiar, cote multiple

- TVA-ul de pe DVI poate avea valuta si curs proprii, diferite de ale facturii
  (rand "protejat": rand_dvi/valuta_proprie pe introdc, sparge_tva_protejat).
- Discount financiar pe factura: rand tip_rand='G' (401 = 767), TVA calculat pe
  baza diminuata, marfa si preturile articolelor pe valoarea integrala.
- Factura multi-cota: randurile S, G si T se sparg pe cotele articolelor, cu
  explicatia TVA din familia coloanei si alinierea T -> S.
- Teste noi in utile/Teste/achizitie_import (discount, DVI, cote, e2e).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U9uDgDfUQXbh2Neib36CN8
This commit is contained in:
2026-08-01 09:32:35 +03:00
parent 704e25e190
commit 832fea4913
62 changed files with 12071 additions and 575 deletions

View File

@@ -535,22 +535,21 @@ TRY
DO ArLog WITH 'INFO verificare2: cmesajsync gol -> nota SINCRONIZATA'
ENDIF
*-- runda4c (spargere doar factura principala): dupa sincronizeaza(), doar documentul
*-- principal (primul B/S din introdc, aici nract=100/RAJA) trebuie spart in randuri S (cont
*-- 212); documentele 102 (TRANS OIL MOTO) si 103 (BIROUL VAMAL) trebuie sa ramana B/T
*-- neatinse (regula de domeniu: articolele apartin doar facturii principale).
LOCAL llDoc100Spart, llDoc102Nesparte, llDoc103Nesparte
*-- lSpargeSecundare implicit .T. si documentele 102/103 sunt participante (lIntern=.F.,
*-- id_jtva_coloana nenul): dupa sincronizeaza() se sparg TOATE documentele B/S in randuri S
*-- pe conturile articolelor (aici doar 212), nu doar documentul principal (100/RAJA).
LOCAL llDoc100Spart, llDoc102Spart, llDoc103Spart
SELECT introdc
LOCATE FOR nract = 100 AND tip_rand == 'S'
llDoc100Spart = FOUND()
LOCATE FOR nract = 102 AND tip_rand == 'B'
llDoc102Nesparte = FOUND()
LOCATE FOR nract = 103 AND tip_rand == 'B'
llDoc103Nesparte = FOUND()
IF llDoc100Spart AND llDoc102Nesparte AND llDoc103Nesparte
DO ArLog WITH 'PASS verificare3 (runda4c spargere doar principala): doc 100/RAJA spart (rand S gasit), doc 102/103 raman B/T nesparte'
LOCATE FOR nract = 102 AND tip_rand == 'S'
llDoc102Spart = FOUND()
LOCATE FOR nract = 103 AND tip_rand == 'S'
llDoc103Spart = FOUND()
IF llDoc100Spart AND llDoc102Spart AND llDoc103Spart
DO ArLog WITH 'PASS verificare3 (lSpargeSecundare implicit): doc 100/102/103 toate sparte (rand S gasit pe fiecare)'
ELSE
DO ArLog WITH 'FAIL verificare3 (runda4c spargere doar principala): doc100Spart=' + TRANSFORM(llDoc100Spart) + ' (astept .T.) doc102Nesparte=' + TRANSFORM(llDoc102Nesparte) + ' (astept .T.) doc103Nesparte=' + TRANSFORM(llDoc103Nesparte) + ' (astept .T.)'
DO ArLog WITH 'FAIL verificare3 (lSpargeSecundare implicit): doc100Spart=' + TRANSFORM(llDoc100Spart) + ' (astept .T.) doc102Spart=' + TRANSFORM(llDoc102Spart) + ' (astept .T.) doc103Spart=' + TRANSFORM(llDoc103Spart) + ' (astept .T.)'
ENDIF
*========================= PAS 2: dupa sincronizeaza() =========================
@@ -691,8 +690,8 @@ PROCEDURE CreeazaIntrodc
nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ;
id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ;
se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ;
doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), ;
scd_orig C(20), ascd_orig C(20))
doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ;
scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1))
ENDPROC
PROCEDURE VerificaPereche