Files
roafacturare/docs/mockup_13_formular_unificat.html
2026-09-09 22:19:22 +03:00

1177 lines
70 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<title>ROAFACTURARE #13 — formular unificat de facturare</title>
<style>
:root{
--paper:#EFF2F1; --card:#FFFFFF; --sunken:#F6F8F7;
--ink:#16201E; --ink-2:#3B4B47; --muted:#66756F;
--line:#D2DAD7; --line-2:#BFC9C5;
--accent:#0E5C60; --accent-soft:#DCEBEA;
--warn:#8A6209; --warn-soft:#F6EDD8;
--ok:#2F6B3A; --ok-soft:#E1EFE2;
--field:#FFFFFF; --field-ro:#EDF1F0; --head:#E4EAE8;
--shadow:0 1px 2px rgba(20,35,32,.10), 0 8px 24px rgba(20,35,32,.06);
--btn-on:#FFFFFF;
}
@media (prefers-color-scheme: dark){
:root:not([data-theme="light"]){
--paper:#111614; --card:#171E1C; --sunken:#141A18;
--ink:#E5EBE8; --ink-2:#BCC8C4; --muted:#8E9D98;
--line:#28322F; --line-2:#35413D;
--accent:#57B6B9; --accent-soft:#12312F;
--warn:#D6A73F; --warn-soft:#2E2513;
--ok:#7BBE85; --ok-soft:#16281A;
--field:#1D2624; --field-ro:#192120; --head:#212A28;
--shadow:0 1px 2px rgba(0,0,0,.4), 0 8px 24px rgba(0,0,0,.28);
--btn-on:#0B1413;
}
}
:root[data-theme="dark"]{
--paper:#111614; --card:#171E1C; --sunken:#141A18;
--ink:#E5EBE8; --ink-2:#BCC8C4; --muted:#8E9D98;
--line:#28322F; --line-2:#35413D;
--accent:#57B6B9; --accent-soft:#12312F;
--warn:#D6A73F; --warn-soft:#2E2513;
--ok:#7BBE85; --ok-soft:#16281A;
--field:#1D2624; --field-ro:#192120; --head:#212A28;
--shadow:0 1px 2px rgba(0,0,0,.4), 0 8px 24px rgba(0,0,0,.28);
--btn-on:#0B1413;
}
*{box-sizing:border-box}
body{
margin:0; background:var(--paper); color:var(--ink);
font-family:"Segoe UI", system-ui, -apple-system, sans-serif;
font-size:15px; line-height:1.55;
}
.wrap{max-width:1180px; margin:0 auto; padding:40px 24px 80px}
.eyebrow{font-size:11px; letter-spacing:.14em; text-transform:uppercase; color:var(--accent); font-weight:600; margin:0 0 10px}
h1{font-size:30px; line-height:1.2; margin:0 0 8px; text-wrap:balance; font-weight:650; letter-spacing:-.01em}
.lede{color:var(--ink-2); max-width:66ch; margin:0 0 6px}
.meta{color:var(--muted); font-size:13px; margin:14px 0 0}
code, .inline{font-family:ui-monospace,"Cascadia Mono",Consolas,monospace; font-size:12px}
h2{font-size:19px; margin:46px 0 6px; font-weight:650; letter-spacing:-.005em}
h2 .n{color:var(--muted); font-weight:500; margin-right:.5em; font-variant-numeric:tabular-nums}
h3{margin:30px 0 4px; font-size:14.5px; font-weight:650}
p{margin:0 0 10px}
.sub{color:var(--muted); font-size:13.5px; max-width:74ch; margin:0 0 18px}
hr.rule{border:0; border-top:1px solid var(--line); margin:44px 0 0}
/* ---------- fake app window ---------- */
.app{border:1px solid var(--line); background:var(--card); border-radius:6px; box-shadow:var(--shadow); overflow:hidden}
.titlebar{display:flex; align-items:center; gap:12px; background:var(--head); border-bottom:1px solid var(--line); padding:7px 10px 7px 14px}
.titlebar .caption{font-size:13px; font-weight:650; letter-spacing:.01em}
.titlebar .spacer{flex:1}
.tbtn{font-size:12px; font-weight:600; padding:4px 12px; border-radius:4px; border:1px solid var(--line-2); background:var(--field); color:var(--ink-2); white-space:nowrap}
.tbtn.primary{background:var(--accent); border-color:var(--accent); color:var(--btn-on)}
.tbtn.off{opacity:.45}
.iconbtn{display:inline-flex; align-items:center; justify-content:center; width:27px; height:24px; border-radius:4px; flex:none;
border:1px solid var(--line-2); background:var(--field); color:var(--ink-2)}
.iconbtn svg{width:14px; height:14px; display:block}
.iconbtn.armed{background:var(--accent); border-color:var(--accent); color:var(--btn-on)}
.stlbl{font-size:11px; font-weight:500; color:var(--muted); letter-spacing:0; text-transform:none}
.canvas{padding:14px; display:flex; flex-direction:column; gap:12px; background:var(--sunken)}
.panel{border:1px solid var(--line); background:var(--card); border-radius:4px}
.panel > .ph{display:flex; align-items:center; gap:10px; padding:6px 10px; border-bottom:1px solid var(--line); background:var(--head);
font-size:11px; font-weight:700; letter-spacing:.10em; text-transform:uppercase; color:var(--ink-2); flex-wrap:wrap}
.panel > .ph .right{margin-left:auto; display:flex; align-items:center; gap:10px}
.pb{padding:10px}
.callout{display:inline-flex; align-items:center; justify-content:center; width:19px; height:19px; border-radius:50%; flex:none;
background:var(--accent); color:var(--btn-on); font-size:11px; font-weight:700; font-variant-numeric:tabular-nums}
/* ---------- form fields ---------- */
.row{display:flex; flex-wrap:wrap; gap:10px 14px; align-items:flex-end}
.row + .row{margin-top:10px}
.grp{display:flex; flex-wrap:wrap; gap:10px 14px; align-items:flex-end; border-left:2px solid var(--accent-soft); padding-left:11px; flex:1 1 100%}
.grp + .grp{margin-top:11px}
.grp .gl{flex:1 1 100%; font-size:10px; letter-spacing:.11em; text-transform:uppercase; color:var(--accent); font-weight:700; margin:0 0 -2px}
.f{display:flex; flex-direction:column; gap:3px; min-width:0}
.f > label{font-size:10.5px; letter-spacing:.06em; text-transform:uppercase; color:var(--muted); font-weight:600; display:flex; align-items:center; gap:5px}
.inp{border:1px solid var(--line-2); background:var(--field); border-radius:3px; padding:4px 8px; font-size:13px; min-height:26px;
display:flex; align-items:center; gap:6px; color:var(--ink); white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.inp.num{justify-content:flex-end; font-variant-numeric:tabular-nums}
.inp.ro{background:var(--field-ro); color:var(--muted)}
.inp .find{margin-left:auto; flex:none; border:1px solid var(--line-2); border-radius:3px; background:var(--head); padding:0 5px; font-size:11px; color:var(--ink-2)}
.w-xs{width:78px}.w-sm{width:106px}.w-md{width:148px}.w-lg{width:206px}.w-fill{flex:1 1 210px}
.check{display:flex; align-items:center; gap:6px; font-size:12.5px; color:var(--ink-2)}
.check.tiny{font-size:11px; text-transform:none; letter-spacing:0}
.box{width:13px; height:13px; border:1px solid var(--line-2); border-radius:2px; background:var(--field); flex:none; display:grid; place-items:center; font-size:10px; line-height:1; color:var(--accent)}
.box.on{background:var(--accent-soft); border-color:var(--accent)}
.radio{width:13px;height:13px;border:1px solid var(--line-2);border-radius:50%;background:var(--field);flex:none;display:grid;place-items:center}
.radio.on::after{content:"";width:7px;height:7px;border-radius:50%;background:var(--accent)}
.disclosure{display:flex; align-items:center; gap:8px; font-size:12.5px; font-weight:600; color:var(--accent); padding:7px 10px; border-top:1px dashed var(--line)}
.disclosure .hint{margin-left:auto; font-weight:500; color:var(--muted); font-size:11.5px}
/* ---------- grid ---------- */
.gridwrap{overflow-x:auto}
table{border-collapse:collapse; width:100%; font-size:12.5px}
table.form{min-width:1280px}
th{background:var(--head); border:1px solid var(--line); padding:5px 7px; font-size:10px; letter-spacing:.05em; text-transform:uppercase;
color:var(--ink-2); font-weight:700; text-align:left; white-space:nowrap; vertical-align:bottom}
td{border:1px solid var(--line); padding:4px 7px; white-space:nowrap; background:var(--field); vertical-align:top}
td.n{text-align:right; font-variant-numeric:tabular-nums}
td.c{text-align:center}
tr.sel td{background:var(--accent-soft)}
tr.newline td{background:var(--sunken); color:var(--muted); font-style:italic}
.combo{display:inline-flex; align-items:center; gap:5px}
.combo::after{content:"▾"; color:var(--muted); font-size:10px}
/* ---------- toolbar ---------- */
.toolbar{display:flex; gap:6px; align-items:center; padding:7px 9px; border-bottom:1px solid var(--line); flex-wrap:wrap; background:var(--sunken)}
.tb{display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:600; padding:4px 10px; border-radius:4px;
border:1px solid var(--line-2); background:var(--field); color:var(--ink-2); white-space:nowrap}
.tb .ico{width:15px; height:15px; border-radius:3px; background:var(--accent-soft); color:var(--accent); display:grid; place-items:center; font-size:10px; font-weight:800; flex:none}
.tb.off{opacity:.45}
.tb.hero{border-color:var(--accent); color:var(--accent)}
.sep{width:1px; align-self:stretch; background:var(--line); margin:0 3px}
.toolbar .note{margin-left:auto; font-size:11.5px; color:var(--muted)}
.gridbar{display:flex; gap:6px; align-items:center; padding:7px 10px; border-top:1px solid var(--line); flex-wrap:wrap}
.gb.key{font-size:11.5px; color:var(--muted); border:1px dashed var(--line-2); border-radius:4px; padding:3px 9px}
/* ---------- popup menu ---------- */
.menu{display:inline-block; border:1px solid var(--line-2); background:var(--card); border-radius:4px; box-shadow:var(--shadow); min-width:280px; overflow:hidden}
.menu .mi{padding:6px 14px; font-size:13px; color:var(--ink-2); border-bottom:1px solid var(--line)}
.menu .mi:last-child{border-bottom:0}
.menu .mi.on{background:var(--accent-soft); color:var(--accent); font-weight:650}
.menu .mi.dim{color:var(--muted)}
.menu .mi.new{display:flex; align-items:center; gap:8px}
.menu .mi .tag{margin-left:auto; font-size:10px; font-weight:700; letter-spacing:.04em; text-transform:uppercase;
padding:1px 6px; border-radius:9px; border:1px solid var(--warn); background:var(--warn-soft); color:var(--warn)}
.menu .mh{padding:5px 14px; font-size:10px; letter-spacing:.1em; text-transform:uppercase; color:var(--muted); background:var(--sunken); border-bottom:1px solid var(--line); font-weight:700}
/* ---------- totals ---------- */
.foot{display:flex; gap:12px; flex-wrap:wrap; align-items:stretch}
.foot .panel{flex:1 1 320px}
.tot{display:flex; justify-content:space-between; gap:20px; padding:3px 0; font-size:13px}
.tot + .tot{border-top:1px dotted var(--line)}
.tot b{font-variant-numeric:tabular-nums; font-weight:600}
.tot.grand{margin-top:4px; border-top:2px solid var(--line-2); padding-top:7px; font-size:15px}
.tot.grand b{font-weight:700; color:var(--accent)}
/* ---------- prose tables ---------- */
.tbl{overflow-x:auto; margin:14px 0 0}
table.doc{min-width:640px; font-size:13.5px}
table.doc th{font-size:10.5px}
table.doc td{white-space:normal; vertical-align:top; line-height:1.45}
table.doc td.k{white-space:nowrap; font-family:ui-monospace,"Cascadia Mono",Consolas,monospace; font-size:12px; color:var(--ink-2)}
.pill{display:inline-block; font-size:11px; font-weight:700; letter-spacing:.03em; padding:1px 7px; border-radius:9px; border:1px solid var(--line-2); background:var(--sunken); color:var(--ink-2)}
.pill.keep{border-color:var(--ok); background:var(--ok-soft); color:var(--ok)}
.pill.regen{border-color:var(--accent); background:var(--accent-soft); color:var(--accent)}
.pill.check{border-color:var(--warn); background:var(--warn-soft); color:var(--warn)}
.pill.have{border-color:var(--ok); background:var(--ok-soft); color:var(--ok)}
/* ---------- legend ---------- */
.legend{display:grid; grid-template-columns:repeat(auto-fit,minmax(310px,1fr)); gap:14px; margin-top:20px}
.leg{display:flex; gap:10px; align-items:flex-start}
.leg .callout{margin-top:2px}
.leg h4{margin:0 0 2px; font-size:13.5px; font-weight:650}
.leg p{margin:0; font-size:13px; color:var(--ink-2)}
/* ---------- flow cards ---------- */
.flow{display:grid; grid-template-columns:repeat(auto-fit,minmax(250px,1fr)); gap:12px; margin-top:16px}
.fl{border:1px solid var(--line); border-radius:5px; background:var(--card); padding:12px 13px}
.fl h4{margin:0 0 6px; font-size:12.5px; font-weight:700}
.fl p{margin:0; font-size:12.5px; color:var(--ink-2)}
.fl code{display:inline-block; margin-top:6px}
.two{display:grid; grid-template-columns:repeat(auto-fit,minmax(320px,1fr)); gap:16px; margin-top:16px; align-items:start}
ul.tight, ol.tight{margin:8px 0 0; padding-left:20px}
ul.tight li, ol.tight li{margin:0 0 8px; color:var(--ink-2); font-size:13.5px}
/* ---------- v9: banda de totaluri + randul de trei sectiuni (varianta D, decizia 57/64) ---------- */
.totband{display:flex; align-items:center; gap:22px; flex-wrap:wrap; padding:8px 12px; border-top:1px solid var(--line); background:var(--card)}
.tb-item{display:flex; align-items:baseline; gap:7px}
.tb-item .tb-lbl{font-size:10px; letter-spacing:.08em; text-transform:uppercase; color:var(--muted); font-weight:600}
.tb-item b{font-variant-numeric:tabular-nums; font-weight:600; font-size:13px}
.tb-disc{gap:9px}
.tb-disc .inp{width:56px}
.tb-grand{margin-left:auto; display:flex; align-items:baseline; gap:10px}
.tb-grand .tb-lbl{font-size:11px}
.tb-grand b{font-size:17px; font-weight:700; color:var(--accent)}
.tb-reason{flex:1 1 200px; min-width:150px}
.tb-reason .inp{flex:1 1 auto; min-width:0; font-style:italic}
.duo{display:flex; gap:12px; align-items:flex-start}
.duo > .panel{flex:1 1 0; min-width:0}
</style>
<svg width="0" height="0" style="position:absolute" aria-hidden="true">
<defs>
<g id="ic-pencil" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M17 3a2.83 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"/>
</g>
<g id="ic-save" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"/>
<path d="M17 21v-8H7v8"/><path d="M7 3v5h8"/>
</g>
</defs>
</svg>
<div class="wrap">
<p class="eyebrow">ROAFACTURARE · todos.txt punctul 13 · mockup, versiunea 9 (runda 17)</p>
<h1>Un singur formular de facturare</h1>
<p class="lede">
Datele documentului si articolele in aceeasi fereastra, fara incarcarea prealabila a tuturor
articolelor din toate politicile de preturi. Acelasi formular la introducere, la modificare, la
copiere si la proforma.
</p>
<p class="meta">
Mockup, nu implementare. Campurile, etichetele si coloanele sunt cele reale, verificate pe cod la
09.08.2026 — rapoartele sunt in <code>docs\cercetare\</code>.
Plan: <code>docs\plan_13_unificare_formular_facturare.md</code>
Asezarea e varianta D (decizia 57, runda 15), cu motivul discountului in banda de totaluri
(decizia 66, runda 17).
</p>
<h2><span class="n">1</span>Formularul</h2>
<p class="sub">
Deschis pe o factura in lei, emisa pe baza de comanda. Antetul e blocat — butonul din bara lui
arata creionul. Asezarea e varianta D: antetul strans pe doua randuri, fara panou separat de
discount, banda de totaluri lipita de grid pe toata latimea — cu procentul si motivul discountului
chiar in ea — si randul de jos cu doua sectiuni colapsabile, incasare si alte date. La introducerea
unui document nou arata identic, cu antetul deschis si campurile goale.
</p>
<div class="app">
<div class="titlebar">
<span class="caption">Factura FF 1 244 / 07.08.2026 · SC EXEMPLU DISTRIBUTIE SRL</span>
<span class="spacer"></span>
<span class="tbtn">Renunta</span>
<span class="tbtn primary">Termina</span>
</div>
<div class="canvas">
<section class="panel">
<div class="ph">Document <span class="callout">1</span>
<span class="right">
<span class="stlbl">antet blocat</span>
<span class="iconbtn" title="Modifica antetul"><svg viewBox="0 0 24 24"><use href="#ic-pencil"/></svg></span>
</span>
</div>
<div class="pb">
<div class="row">
<div class="f w-md"><label>Tip document</label><div class="inp ro"><span class="combo">FACTURA</span></div></div>
<div class="f w-sm"><label>Serie</label><div class="inp ro">FF</div></div>
<div class="f w-sm"><label>Numar</label><div class="inp num ro">1 244</div></div>
<div class="f w-sm"><label>Data doc.</label><div class="inp ro">07.08.2026</div></div>
<div class="f w-sm"><label>Scadenta</label><div class="inp ro">06.09.2026</div></div>
</div>
<div class="row">
<div class="f w-fill"><label>Nume client</label><div class="inp ro">SC EXEMPLU DISTRIBUTIE SRL <span class="find">F4</span></div></div>
<div class="f w-md"><label>Cod fiscal</label><div class="inp ro">RO12345678 <span class="find">ANAF</span></div></div>
<div class="f w-md"><label>Sold curent</label><div class="inp num ro">14 820,00</div></div>
<div class="f w-md"><label>Nr. comanda</label><div class="inp ro">CMD 3312 <span class="find">F4</span></div></div>
<div class="f w-lg"><label>Gestiune sursa</label><div class="inp ro"><span class="combo">DEPOZIT CENTRAL</span></div></div>
</div>
</div>
</section>
<section class="panel">
<div class="ph">Articole <span class="callout">3</span></div>
<div class="toolbar">
<span class="tb"><span class="ico">+</span>Linie noua</span>
<span class="tb"><span class="ico">−</span>Sterge linia</span>
<span class="tb"><span class="ico">✎</span>Detalii linie</span>
<span class="sep"></span>
<span class="tb hero"><span class="ico">↧</span>Adauga articole ▾</span>
<span class="note">3 linii · comanda CMD 3312 acoperita 100%</span>
</div>
<div class="gridwrap">
<table class="form">
<thead>
<tr>
<th style="width:32px">Nr</th><th>Cod material</th><th>Articol</th><th>UM</th><th>Gestiune</th>
<th>Cantitate</th><th>Pret f. TVA</th><th>pret<br>c. TVA</th>
<th>Disc.&nbsp;%</th><th>Disc. unitar</th>
<th>Explicatie TVA</th>
<th>Val. f. TVA</th><th>TVA</th><th>Val. c. TVA</th><th>Explicatie linie</th>
</tr>
</thead>
<tbody>
<tr>
<td class="n">1</td><td><span class="combo">MAT-0041</span></td><td><span class="combo">Ciment Portland 42,5R 40 kg</span></td>
<td>SAC</td><td><span class="combo">DEPOZIT CENTRAL</span></td>
<td class="n">100,000</td><td class="n">28,5000</td><td class="c"><span class="box"></span></td>
<td class="n">0,00</td><td class="n">0,0000</td>
<td><span class="combo">Livrari 21%</span></td>
<td class="n">2 850,00</td><td class="n">598,50</td><td class="n">3 448,50</td><td>—</td>
</tr>
<tr class="sel">
<td class="n">2</td><td><span class="combo">MAT-0107</span></td><td><span class="combo">Adeziv gresie/faianta 25 kg</span></td>
<td>SAC</td><td><span class="combo">DEPOZIT CENTRAL</span></td>
<td class="n">40,000</td><td class="n">42,0000</td><td class="c"><span class="box"></span></td>
<td class="n">5,00</td><td class="n">2,1000</td>
<td><span class="combo">Livrari 21%</span></td>
<td class="n">1 596,00</td><td class="n">335,16</td><td class="n">1 931,16</td><td>conform comanda</td>
</tr>
<tr>
<td class="n">3</td><td><span class="combo">SRV-0002</span></td><td><span class="combo">Transport marfa</span></td>
<td>BUC</td><td class="c">—</td>
<td class="n">1,000</td><td class="n">250,0000</td><td class="c"><span class="box on">✓</span></td>
<td class="n">0,00</td><td class="n">0,0000</td>
<td><span class="combo">Prestari 21%</span></td>
<td class="n">250,00</td><td class="n">52,50</td><td class="n">302,50</td><td>—</td>
</tr>
<tr class="newline">
<td class="n">4</td><td><span class="combo">scrie codul sau denumirea…</span></td>
<td colspan="13">cautare pe server, pe masura ce scrii — nu se mai aduce lista de preturi intreaga</td>
</tr>
</tbody>
</table>
</div>
<div class="gridbar">
<span class="gb key">Ins — linie noua</span><span class="gb key">Del — sterge</span>
<span class="gb key">F4 — cauta</span><span class="gb key">Ctrl+N / Ctrl+D</span>
</div>
<div class="totband">
<div class="tb-item"><span class="tb-lbl">Baza</span><b>4 696,00</b></div>
<div class="tb-item"><span class="tb-lbl">Discount articole</span><b>84,00</b></div>
<div class="tb-item tb-disc"><span class="tb-lbl">Discount document</span><span class="callout">4</span>
<span class="inp num">0,00 %</span><b>0,00</b>
<span class="check tiny"><span class="box on">✓</span> evidentiat pe factura</span>
</div>
<div class="tb-item tb-reason"><span class="tb-lbl">Motiv</span><span class="callout">5</span>
<span class="inp ro">motivul discountului…</span>
</div>
<div class="tb-item"><span class="tb-lbl">TVA</span><b>986,16</b></div>
<div class="tb-grand"><span class="tb-lbl">Total factura</span><b>5 682,16 lei</b></div>
</div>
</section>
<div class="duo">
<section class="panel">
<div class="ph">▸ Incasare
<span class="right"><span class="stlbl">NUMERAR · 5 570,55 lei</span></span>
</div>
</section>
<section class="panel">
<div class="ph">▾ Alte date <span class="callout">2</span></div>
<div class="pb">
<div class="row">
<div class="f w-sm"><label>Venit/Chelt.</label><div class="inp ro">701</div></div>
<div class="f w-sm"><label>Sectie</label><div class="inp ro">—</div></div>
<div class="f w-sm"><label>Responsabil</label><div class="inp ro">—</div></div>
</div>
<div class="row">
<div class="f w-sm"><label>Delegat</label><div class="inp ro">IONESCU V.</div></div>
<div class="f w-sm"><label>Masina</label><div class="inp ro">B 123 XYZ</div></div>
<div class="f w-fill"><label>Adresa facturare</label><div class="inp ro">ca a clientului</div></div>
</div>
</div>
</section>
</div>
</div>
</div>
<div class="legend">
<div class="leg"><span class="callout">1</span><div><h4>Antetul, blocat pana ceri altfel</h4>
<p>Un singur buton. Creionul deschide antetul si devine discheta; discheta salveaza doar
antetul si redevine creion. Nicio bifa — nici cele patru de azi, pe serie, numar, data si
scadenta. Fara valuta si fara data de curs — factura e in lei si niciun articol nu are pret in
valuta (sectiunea 4). <b>Cat anume deschide</b>, si de ce nu chiar tot in prima etapa:
sectiunea 2.</p></div></div>
<div class="leg"><span class="callout">2</span><div><h4>Randul de jos, doua sectiuni</h4>
<p>Incasarea si alte date (analitice, delegat/transport, adresa de facturare, text aditional)
stau colapsate, una langa alta, nu una sub alta (decizia 57). Sunt independente — se poate tine
deschisa doar una — iar randul inchis arata rezumatul continutului, nu doar titlul: cand
incasarea e completata arata suma si modalitatea, cand nu e nimic completat rezumatul spune asta.
Campurile din interior stau pe orizontala, doua randuri fiecare. <b>A treia sectiune, pentru
motivul discountului, a fost incercata si respinsa</b> — motivul sta langa discount, in banda de
totaluri (decizia 66 rastoarna decizia 64).
<b>Incasarea ramane cea deosebita</b> (decizia 41): e singura cu efecte laterale reale —
alocare/dezalocare de numere — deci garda de non-alocare la deschidere se scrie si se testeaza
intr-un singur loc, si e singura blocata pe un document deja emis (decizia 25). Tot pe document
emis, analiticele se vad dar nu se editeaza de aici — sectiunea 2.</p></div></div>
<div class="leg"><span class="callout">3</span><div><h4>Un singur buton de adaugare</h4>
<p><i>Adauga articole</i> deschide un meniu cu optiunile potrivite sursei — sectiunea 3.
Dispare gridul de sus cu toate articolele din toate politicile.</p></div></div>
<div class="leg"><span class="callout">4</span><div><h4>Banda de totaluri, lipita de grid</h4>
<p>Baza, discount articole, discount document si TVA, desfacute pe un singur rand, cu totalul
mare singur la dreapta (decizia 57). Discountul de document se editeaza pe loc, procentul langa
suma; bifa „se pune in evidenta…" de pe panoul care disparea s-a mutat aici, discret. Repartizarea
pe cote de TVA e automata si proportionala (decizia 59) — nu se cere nimic utilizatorului.</p></div></div>
<div class="leg"><span class="callout">5</span><div><h4>Motivul discountului, langa discount</h4>
<p>Singura bucata din reparatia discountului de document care cere UI nou (decizia 61): text
optional, ajunge in <code>AllowanceChargeReason</code> din eFactura (<code>ReasonCode</code>
ramane <code>95</code>). Sta <b>in banda de totaluri, imediat dupa suma pe care o explica</b>
(decizia 66) — nu ca sectiune separata jos, cum se stabilise la decizia 64. Ia latimea ramasa
intre discount si TVA; <b>e activ doar cand discountul de document nu e zero</b> — un motiv fara
discount n-are ce explica.</p></div></div>
</div>
<h2><span class="n">2</span>Modificarea antetului, fara sa treci prin articole</h2>
<p class="sub">
Protectia antetului nu e o inventie: formularul de azi de modificare are deja patru bife, cate una
pe camp, care deblocheaza serie, numar, data si scadenta. Ce se schimba e ca toate patru dispar,
inlocuite de <b>un singur buton</b> in bara panoului, care isi schimba imaginea: creion cat timp
antetul e blocat, discheta cat timp e deschis.
</p>
<div class="two">
<div>
<div class="app">
<div class="titlebar"><span class="caption">1 · antet blocat</span><span class="spacer"></span></div>
<div class="canvas"><section class="panel">
<div class="ph">Document<span class="right">
<span class="stlbl">antet blocat</span>
<span class="iconbtn" title="Modifica antetul"><svg viewBox="0 0 24 24"><use href="#ic-pencil"/></svg></span></span></div>
<div class="pb"><div class="row">
<div class="f w-sm"><label>Serie</label><div class="inp ro">FF</div></div>
<div class="f w-sm"><label>Numar</label><div class="inp num ro">1 244</div></div>
<div class="f w-sm"><label>Scadenta</label><div class="inp ro">06.09.2026</div></div>
<div class="f w-fill"><label>Delegat</label><div class="inp ro">IONESCU V.</div></div>
</div></div>
</section></div>
</div>
<p class="meta">Nimic nu se poate schimba din greseala. Documentul se poate citi in liniste.
Butonul arata creionul: apasarea deschide.</p>
</div>
<div>
<div class="app">
<div class="titlebar"><span class="caption">2 · antet deschis</span><span class="spacer"></span></div>
<div class="canvas"><section class="panel">
<div class="ph">Document<span class="right">
<span class="stlbl">antet deschis</span>
<span class="iconbtn armed" title="Salveaza antetul"><svg viewBox="0 0 24 24"><use href="#ic-save"/></svg></span></span></div>
<div class="pb"><div class="row">
<div class="f w-sm"><label>Serie</label><div class="inp">FF</div></div>
<div class="f w-sm"><label>Numar</label><div class="inp num">1 244</div></div>
<div class="f w-sm"><label>Scadenta</label><div class="inp">06.09.2026 <span class="find">▾</span></div></div>
<div class="f w-fill"><label>Delegat</label><div class="inp">IONESCU V. <span class="find">F4</span></div></div>
</div></div>
</section></div>
</div>
<p class="meta">Tot antetul e editabil, si campurile de identitate. Butonul a devenit discheta:
a doua apasare salveaza antetul si il blocheaza la loc, cu creionul inapoi.</p>
</div>
</div>
<p class="meta">
Un singur ciclu, doua stari: <b>creion → deschis → discheta → salvat si blocat → creion</b>.
<i>Termina</i> ramane neschimbat si salveaza tot documentul; butonul de antet nu il inlocuieste,
ci acopera cazul in care nu vrei sa treci prin articole.
</p>
<p class="meta">
<span class="pill check">de adaugat</span> Un singur camp de antet nu are azi control nicaieri:
<b>eFactura</b>. Procedura il scrie la fiecare apel, dar valoarea vine din inregistrare sau e
fortata zero — nimeni nu il poate schimba. Daca butonul deschide tot antetul, il deschide si pe
el, langa tipul SAF-T.
</p>
<p class="meta">
<span class="pill have">exista deja</span> Comutatorul nu e un tipar nou in suita: fereastra de
rulaje face exact asta pe acelasi buton <code>but_modifica</code>, schimbandu-i imaginea in
<code>save_sus.bmp</code> cand intra in editare — verificat pe cod, <code>rulaje.vc2:4716-4773</code>.
Se copiaza reteta de acolo.
</p>
<div class="tbl">
<table class="doc">
<thead><tr><th>Actiune</th><th>Ce salveaza</th><th>Cum</th></tr></thead>
<tbody>
<tr><td><b>Butonul de antet, a doua apasare</b></td>
<td>tot antetul, adica exact cele <b>14 campuri</b> pe care le stie procedura: ruta,
delegat, agent, masina, data/ora expedierii, adresa de facturare, listare detaliata,
text aditional, tip SAF-T, <b>eFactura</b>, plus serie / numar / data / scadenta</td>
<td><span class="pill keep">pe loc</span> <code>pack_facturare.modifica_date_factura</code>.
Nu atinge articolele si nu recalculeaza nicio suma. Zece campuri se scriu neconditionat
in <code>VANZARI</code>, deci apelul trimite antetul intreg, nu doar ce s-a schimbat;
cele patru de identitate se propaga dupa <code>ID_FACT</code> in inca cinci tabele.</td></tr>
<tr><td><b>Termina</b></td>
<td>tot documentul, ca azi</td>
<td>ruta se alege dupa ce s-a schimbat — vezi sectiunea 7</td></tr>
</tbody>
</table>
</div>
<p class="meta">
Asta acopera cazul in care vrei sa corectezi doar delegatul sau data scadentei: apesi creionul,
corectezi, apesi discheta, inchizi. Articolele nici nu se ating.
</p>
<p class="sub" style="margin-top:22px">
<b>Ce deschide efectiv butonul — si de ce nu chiar tot, deocamdata.</b>
„Tot antetul” ramane intentia, dar campurile nu au aceeasi ruta de scriere. S-a cautat exhaustiv,
si in Oracle si in tot codul VFP: pentru o parte din ele <b>nu exista nicio procedura care sa le
schimbe pe un document deja emis</b>. Nu e o scapare de proiectare, e starea codului de azi.
</p>
<div class="tbl">
<table class="doc">
<thead><tr><th>Grup de campuri</th><th>Etapa I</th><th>Etapa II, cu regenerare</th></tr></thead>
<tbody>
<tr><td>cele <b>14</b> — serie, numar, data, scadenta, ruta, delegat, masina, agent,
data/ora expedierii, adresa de facturare, text aditional, listare detaliata, tip SAF-T,
<b>eFactura</b></td>
<td><span class="pill keep">se deschid</span> salvate pe loc</td>
<td>la fel</td></tr>
<tr><td>tip document, client, valuta, zi curs, sursa, gestiune sursa, politica de preturi,
si incasarea</td>
<td><span class="pill">blocate</span> cu explicatie la hover</td>
<td><span class="pill regen">se deschid</span> modificarea lor marcheaza documentul pentru
regenerare, aplicata la <i>Termina</i></td></tr>
<tr><td>analiticele — venit / cheltuiala, sectie, responsabil, lucrare</td>
<td colspan="2"><span class="pill">doar afisare</span> se modifica din editarea notei
contabile, nu de aici</td></tr>
</tbody>
</table>
</div>
<p class="meta">
Alegerea de a le tine <b>blocate</b> in etapa I, in loc sa se deschida cu avertisment: un camp
care se lasa modificat dar nu se salveaza e o capcana. O modificare pierduta in tacere e mai rea
decat un camp inca blocat, iar hover-ul spune de ce.
</p>
<h2><span class="n">3</span>Un singur buton de adaugare, cu meniu</h2>
<p class="sub">
In loc de doua butoane („adauga tot” si „alege”), unul singur care deschide un meniu — acelasi
tipar folosit deja de butonul de modificare din lista de facturi. Optiunile se schimba dupa sursa
documentului, cu doua constante: <b>ultimele doua optiuni sunt aceleasi peste tot</b> —
<i>Cauta in lista de preturi…</i>, cu pretul din politici, si <i>Alege din nomenclator…</i>, cu
pretul tastat. Sursa umple documentul, nu il inchide: pe o factura din comanda se poate adauga
oricand un articol liber, si se poate si sterge — clientul mai vrea ceva, sau vrea sa schimbe.
</p>
<div class="two">
<div>
<p class="meta" style="margin:0 0 8px"><b>Factura din comanda</b></p>
<div class="menu">
<div class="mh">Adauga articole</div>
<div class="mi on">Adauga tot din comanda</div>
<div class="mi">Alege din comanda…</div>
<div class="mi">Cauta in lista de preturi…</div>
<div class="mi">Alege din nomenclator…</div>
</div>
</div>
<div>
<p class="meta" style="margin:0 0 8px"><b>Factura din contract</b></p>
<div class="menu">
<div class="mh">Adauga articole</div>
<div class="mi">Adauga tot din contract</div>
<div class="mi on">Alege ratele de facturat…</div>
<div class="mi">Cauta in lista de preturi…</div>
<div class="mi">Alege din nomenclator…</div>
</div>
</div>
</div>
<div class="two">
<div>
<p class="meta" style="margin:0 0 8px"><b>Factura din avize</b></p>
<div class="menu">
<div class="mh">Adauga articole</div>
<div class="mi on">Adauga tot din avize</div>
<div class="mi">Alege avizele…</div>
<div class="mi">Alege liniile din avize…</div>
<div class="mi">Cauta in lista de preturi…</div>
<div class="mi">Alege din nomenclator…</div>
</div>
</div>
<div>
<p class="meta" style="margin:0 0 8px"><b>Factura din lista de preturi</b></p>
<div class="menu">
<div class="mh">Adauga articole</div>
<div class="mi on">Cauta in lista de preturi…</div>
<div class="mi">Alege din nomenclator…</div>
<div class="mi">Retur de articole…</div>
<div class="mi dim">Fara document sursa</div>
</div>
</div>
</div>
<div class="two">
<div>
<p class="meta" style="margin:0 0 8px"><b>Factura de retur</b> <span class="pill have">exista deja</span></p>
<div class="menu">
<div class="mh">Adauga articole</div>
<div class="mi on">Alege facturile de returnat…</div>
<div class="mi">Alege liniile de returnat…</div>
<div class="mi new">Cauta in lista de preturi… <span class="tag">nou aici</span></div>
<div class="mi new">Alege din nomenclator… <span class="tag">nou aici</span></div>
</div>
</div>
<div>
<p class="meta" style="margin:0 0 8px"><b>Factura venita din ROAAUTO</b> <span class="pill check">la modificare</span></p>
<div class="menu">
<div class="mh">Adauga articole</div>
<div class="mi on">Cauta in lista de preturi…</div>
<div class="mi">Alege din nomenclator…</div>
<div class="mi dim">Liniile devizului nu se ating</div>
</div>
</div>
</div>
<div class="tbl">
<table class="doc">
<thead><tr><th>Cele doua mecanisme de retur</th><th>Cum e azi</th><th>Ce se schimba</th></tr></thead>
<tbody>
<tr><td><b>Factura de retur</b><br><span class="stlbl">document de sine statator</span></td>
<td><span class="pill have">exista deja</span> alegi facturile clientului dintr-un browse cu
selectie multipla, iar liniile se populeaza din ele: <b>gestiunea si pretul de achizitie
vin neschimbate din linia originala</b>, pretul de vanzare se recalculeaza pe curs doar
daca moneda nu e nationala. Antetul primeste singur textul „RETUR FACTURA …”.</td>
<td>se muta ca atare. Nu se reproiecteaza nimic din ce functioneaza — in special nu
mostenirea gestiunii si a pretului de achizitie.</td></tr>
<tr><td><b>Retur de articole</b><br><span class="stlbl">intr-o factura de vanzare normala</span></td>
<td>alt mecanism, complet separat: factura sursa se alege <b>per articol</b>, iar gestiunea
nu vine din factura sursa, ci se alege. Butonul e vizibil doar pe facturile din lista de
preturi.</td>
<td>capata si alegerea la nivel de document, dupa modelul de mai sus; calea per-articol
ramane, pentru cand returnezi un singur lucru</td></tr>
<tr><td><b>Cantitate partiala si stergere</b></td>
<td><span class="pill have">exista deja</span> coloana isi schimba capul in
<i>Cant. max. de returnat</i>, serverul calculeaza maximul, iar o linie stearsa isi
elibereaza cantitatea inapoi</td>
<td>nimic — se pastreaza intocmai, ca si interdictia de retur dintr-un retur</td></tr>
<tr><td><b>Articole din afara facturilor sursa</b></td>
<td><span class="pill check">nu se poate</span> lista de articole <i>este</i> continutul
facturilor alese, deci nu ai de unde alege altceva — aceeasi cauza ca la comanda</td>
<td>optiunea din lista de preturi devine disponibila si aici. <b>O linie de retur fara
factura originala e permisa</b>, ca pe orice alt document — returul nu face exceptie.
Consecinta: pe acele linii <b>gestiunea si pretul de achizitie se aleg</b>, nu se
mostenesc, iar maximul returnabil calculat pe server nu se aplica, pentru ca nu exista
cantitate originala fata de care sa se limiteze.</td></tr>
</tbody>
</table>
</div>
<p class="meta">
„Alege…” deschide un dialog de selectie cu o coloana de bifat si criterii de cautare, dupa modelul
importului din ROAACNPRO: buton activ doar cand documentul are sursa, populare aditiva in cursorul
local, nicio scriere in baza pana la salvare. Spre deosebire de modelul acela, la zero rezultate
se spune de ce, nu se inchide in tacere.
</p>
<p class="meta">
Azi „adauga tot” exista, dar e o iconita fara caption si fara tooltip, asezata lateral intre doua
griduri — si <b>nu acopera contractele</b>: tipurile 2, 6, 26 si 52 lipsesc din conditiile lui de
vizibilitate, desi avizele sunt acolo.
</p>
<p class="meta">
<span class="pill have">decis</span> <b>„Adauga tot din comanda” / „Adauga tot din avize” raman
incarcari complete — S4 nu se restrange la o lista de preturi (decizia 39).</b> Grila care le
alimenteaza (<code>crsarticole</code>) nu e doar sursa listei: e si <b>registrul cantitatii ramase de
facturat</b>, citit ca sa se decida inchiderea automata a comenzii sau a avizului cand o linie se
sterge. Cautarea pe server ramane cum se vede mai sus (fara incarcare in masa); ce se decupleaza e
bookkeeping-ul cantitatii ramase, intr-un registru propriu — ca sa poata disparea incarcarea si pe
comanda si pe aviz fara sa strice inchiderea automata a documentului sursa.
</p>
<h2><span class="n">4</span>Valuta si data cursului</h2>
<p class="sub">
Doua concepte diferite, care azi impart acelasi camp mereu vizibil. Campul „Data curs valutar”
nu e eliminat niciodata in functie de valuta — doar pe retur — deci apare si pe facturi in lei
unde nu are ce cauta.
</p>
<div class="tbl">
<table class="doc">
<thead><tr><th>Caz</th><th>Ce e in document</th><th>Ce arata antetul</th></tr></thead>
<tbody>
<tr>
<td><b>Factura in lei,<br>articole in lei</b></td>
<td>tot in lei, niciun pret din politica in valuta</td>
<td><span class="pill">fara valuta</span> <span class="pill">fara data curs</span><br>
Nimic de ales, nimic de convertit.</td>
</tr>
<tr>
<td><b>Factura in lei,<br>articole cu pret in valuta</b></td>
<td>documentul e in lei; unele articole au pretul din politica in valuta si se convertesc</td>
<td><span class="pill check">apare Data curs valutar</span><br>
Cu explicatia langa el: <i>preturile in valuta se convertesc in lei la cursul acestei
zile; documentul si contabilitatea raman in lei</i>.</td>
</tr>
<tr>
<td><b>Factura in valuta</b><br><span class="pill">Invoice, credit note, retur valuta, factura fiscala valuta pe contract</span></td>
<td>documentul insusi e in valuta; articolele au pret in valuta</td>
<td><span class="pill">Valuta</span> <span class="pill">Data curs valutar</span><br>
Amandoua, ca azi.</td>
</tr>
</tbody>
</table>
</div>
<p class="meta">
Al treilea caz nu se alege din formular: e decis de <b>tipul documentului</b> la deschidere, iar
selectorul de valuta e scos din formular cand documentul nu e de tip valuta. Deci „factura in
valuta” nu e o bifa pe care o pune operatorul, ci felul documentului.
</p>
<p class="meta">
<b>Unificarea rezolva o problema care azi nu e rezolvabila.</b> Cazul al doilea nu se poate sti la
deschiderea antetului — se afla abia dupa ce se incarca articolele, cand antetul de azi e deja
inchis. In formularul unificat antetul si articolele sunt in aceeasi fereastra, deci campul poate
aparea in momentul in care intra pe grid primul articol cu pret in valuta. Din acelasi motiv
dispare si mecanismul bug-ului #16: nu mai exista un antet inchis la care sa te intorci din
formularul de curs.
</p>
<p class="meta">
<span class="pill have">decis</span> <b>Validarea cursurilor se restrange la valuta cautata (decizia
42).</b> Pe varianta filtrata a cursoarelor, <code>verifica_cursuri_valute</code> nu mai ruleaza
global la deschiderea formularului, ci doar pe valuta articolului adus in grid. Un curs lipsa pe
<b>alta</b> valuta nu mai e semnalat la deschidere, ci abia cand se ajunge la un articol pe acea
valuta — diferenta e asumata, se consemneaza la testare, nu e regresie.
</p>
<h2><span class="n">5</span>Discountul pe linie</h2>
<p class="sub">
Verificat pe formularul de azi si pe tabela. Raspunsul e mai simplu decat parea: si procentul, si
valoarea exista deja — dar nu in grid.
</p>
<div class="tbl">
<table class="doc">
<thead><tr><th>Ce</th><th>Cum e azi</th><th>Ce se schimba</th></tr></thead>
<tbody>
<tr>
<td><b>Procent</b> si <b>valoare unitara</b>, ca intrare pentru operator</td>
<td><span class="pill have">exista deja</span> in dialogul de articol care se deschide la
fiecare adaugare: trei campuri — procent, suma in lei, suma in valuta — orice tastezi in
unul recalculeaza pe celelalte.</td>
<td>Dialogul dispare odata cu unificarea. Cele doua campuri devin <b>coloane in grid</b>,
cu acelasi calcul in spate.</td>
</tr>
<tr>
<td><b>Ce se stocheaza</b></td>
<td><span class="pill have">o singura coloana</span> <code>VANZARI_DETALII.DISCOUNT_UNITAR</code>,
<code>NUMBER(22,6)</code> — valoare absoluta pe unitate. Nu exista coloana de procent.
Aceeasi coloana e si pe politica de pret, deci discountul poate veni din politica.</td>
<td>Nimic. Modelul de date nu se atinge — procentul ramane doar mod de introducere.</td>
</tr>
<tr>
<td><b>Discountul in grid, azi</b></td>
<td><span class="pill check">inconsecvent</span> pe factura in lei coloana e read-only; pe
factura in valuta e editabila, dar nu are handler de recalcul — o editare directa in
celula schimba valoarea fara sa refaca totalurile.</td>
<td>Se repara odata cu mutarea in grid: aceleasi validari ca in dialogul de azi.</td>
</tr>
</tbody>
</table>
</div>
<p class="meta">
De verificat separat, inainte de a incepe: daca discountul unitar apare pe rapoartele tiparite si
daca e transmis in eFactura si SAF-T. Daca nu apare pe hartie, documentul tiparit nu explica
totalul.
</p>
<p class="meta">
<span class="pill have">decis</span> <b>Discountul de DOCUMENT (nu cel de linie, de mai sus) se
repartizeaza proportional pe cote de TVA, nu pe cota maxima cum face codul de azi (decizia 59).</b>
E automat, nu cere nimic de la operator. In banda de totaluri (sectiunea 1) se vede o singura suma;
pe factura tiparita, cu cote mixte, pot aparea mai multe randuri „Discount X % Factura", cate unul
per cota.
</p>
<h2><span class="n">6</span>De unde se intra in formular</h2>
<p class="sub">
Cerinta e ca formularul sa <b>poata</b> fi deschis cu sursa deja completata, fara sa o mai alegi.
Doua cai fac deja exact asta.
</p>
<div class="flow">
<div class="fl"><h4><span class="pill have">exista</span> Din pagina Comenzi</h4>
<p>Butonul de pe randul de comanda trimite comanda selectata si deschide formularul cu ea
completata. Ascuns cand comanda e deja facturata.</p></div>
<div class="fl"><h4><span class="pill have">exista</span> Din programul de contracte</h4>
<p>Butonul de pe grila de contracte trimite contractul selectat si deschide acelasi formular,
cu contractul completat. Nu mai alegi nimic.</p></div>
<div class="fl"><h4><span class="pill">generic</span> Din meniu</h4>
<p>Fara sursa precompletata — alegi comanda sau contractul in formular, ca pana acum.</p></div>
</div>
<p class="meta">
Ce merita schimbat, si atat: sursa se transmite azi prin <b>variabile globale</b>, nu ca parametru.
De aceea calea generica de comanda e obligata sa goleasca explicit globalul inainte de apel, ca sa
nu ramana precompletata cu ce era in sesiune — iar calea de contract nu face acelasi lucru.
Un parametru explicit inchide subiectul. <b>Nu presupune nicio integrare noua de contracte.</b>
</p>
<hr class="rule">
<h2><span class="n">7</span>Ce se scrie la Termina</h2>
<p class="sub">
Un singur formular, dar nu o singura cale de scriere. <b><code>ID_FACT</code> se pastreaza in
toate cazurile.</b>
</p>
<div class="tbl">
<table class="doc">
<thead><tr><th>Ce s-a schimbat</th><th>Cum se scrie</th><th>Efect</th></tr></thead>
<tbody>
<tr>
<td>Antet — <b>cele 14 campuri</b> pe care le stie procedura</td>
<td><span class="pill keep">pe loc</span> <code>modifica_date_factura</code></td>
<td>aceeasi procedura ca butonul de antet pe a doua apasare; propaga serie / numar / data dupa <code>ID_FACT</code></td>
</tr>
<tr>
<td>Antet — <b>tip document, client, valuta, zi curs, sursa, gestiune sursa, politica de preturi</b>,
si tot ce tine de <b>incasare</b></td>
<td><span class="pill regen">regenerare</span></td>
<td>verificat pe cod: <b>nu exista nicio cale de a le scrie pe un document emis</b> — nici in
Oracle, nici in VFP. Singura ruta e drumul de emitere, adica regenerarea. Pana cand ea
exista (etapa II), campurile raman blocate.</td>
</tr>
<tr>
<td>Antet — <b>analiticele</b>: venit / cheltuiala, sectie, responsabil, lucrare</td>
<td><span class="pill">nu de aici</span></td>
<td>se editeaza din <b>editarea notei contabile</b>, care le trateaza la nivel de linie de
nota. Formularul unificat le arata, nu le scrie — ca sa nu existe doua ferestre care
modifica acelasi camp cu intelesuri diferite.</td>
</tr>
<tr>
<td>Explicatia si codul fiscal al unei linii</td>
<td><span class="pill keep">pe loc</span> <code>modifica_explicatie_articol</code></td>
<td>doua coloane, nicio suma</td>
</tr>
<tr>
<td>Cantitati, preturi, linii adaugate sau sterse, discount, gestiune, cota TVA</td>
<td><span class="pill regen">regenerare</span> stergere + reemitere, in aceeasi tranzactie</td>
<td>documentul vechi <code>sters = 1</code>; cel nou scris pe drumul normal de emitere; notele si rulajele refacute</td>
</tr>
<tr>
<td>Nimic</td>
<td><span class="pill">nimic</span></td>
<td>documentul ramane neatins</td>
</tr>
</tbody>
</table>
</div>
<p class="meta">
<span class="pill have">decis</span> <b>Un singur cod de scriere contabila (decizia 35).</b>
Regenerarea de mai sus scrie pe acelasi drum <b>si la emitere, si la editare</b> (etapa II):
<code>scrie_factura2</code> → <code>contabilizeaza_articol</code>, cu parametrul de cont de la
sectiunea 10. Canalul <code>oscrie_in_fisiere</code>, folosit azi de #6, <b>nu intra in #13</b> —
doua implementari ale aceleiasi reguli de contare, una in pachet si alta in VFP, ar trebui tinute in
pas manual la fiecare schimbare. Nu exista in acest formular editare directa a randului din
<code>ACT_TEMP</code>.
</p>
<h2><span class="n">8</span>Ce trebuie verificat inainte</h2>
<ul class="tight">
<li><span class="pill check">de verificat</span>
<b><code>ID_FACT</code> refolosit la reemitere.</b> Azi se ia din secventa, neconditionat.
Varianta care il cauta dupa numar, serie si data exista in pachet, dar e comentata — si
filtreaza <code>STERS = 0</code>, deci trebuie citita inainte de stergere.</li>
<li><span class="pill check">de verificat</span>
<b>Stergerea si reemiterea in aceeasi tranzactie</b>, fara commit intre ele.</li>
<li><span class="pill have">decis</span>
<b>La reemitere se scriu valorile din formular, nu se reciteste sursa (decizia 54).</b> Intrebarea
nu mai e ce garda punem peste re-derivare — e daca re-derivarea chiar se produce; raspunsul lui
Marius: nu trebuie sa se produca. Fara avertizare si fara confirmare, a fost respinsa explicit.</li>
<li><span class="pill have">decis</span>
<b>Atasamentul PDF al documentului vechi se sterge la reemitere, nu se remigreaza (decizia 53).</b>
Documentul reemis porneste curat; PDF-ul se regenereaza la prima listare.</li>
<li><span class="pill have">decis</span>
<b>Facturile de marfa in custodie (tipurile 48 si 49) sunt editabile prin #13 (decizia 60).</b>
Cu restrictia pastrata: pe ele nu se pot adauga articole gestionabile
(<code>IN_STOC &lt;&gt; 0</code>).</li>
<li><span class="pill have">decis</span>
<b>Singura restrictie de modificare e ca documentul sa nu fi fost trimis in eFactura (decizia
62).</b> Fara nicio conditie de data, fara retroactivitate.</li>
<li><span class="pill have">decis</span>
<b>Auditul (data + utilizator pentru adaugare, modificare si stergere) se afiseaza in gridul din
<code>frm_facturi</code>, nu in formularul unificat (deciziile 63 si 65).</b> Formularul nu capata
niciun control nou din cerinta de audit.</li>
<li><span class="pill have">decis</span>
<b><code>do_modifica</code> de pe <code>frm_facturi</code> ramane activ pentru multi-selectie
(decizia 52).</b> Formularul unificat preia doar cazul cu un singur document.</li>
<li><span class="pill check">de verificat</span>
<b>Descarcarea de gestiune pe proforma</b>, pe partea Oracle.</li>
<li><span class="pill check">de verificat</span>
<b>Discountul unitar in listari si in eFactura / SAF-T.</b></li>
<li><span class="pill check">de verificat</span>
<b>Validarea datei de curs pe avizul de lucrare</b> — acolo e ceruta neconditionat, deci
ascunderea campului ar bloca finalizarea. Se repara impreuna, nu doar se ascunde.</li>
<li><span class="pill check">de verificat</span>
<b>Legatura dintre linia de retur si linia originala.</b> In program se acumuleaza perechi
articol-factura si se trimit la salvare, dar daca serverul le pastreaza intr-o coloana nu se
poate stabili din codul de aici. De asta depinde daca formularul poate arata din ce factura
vine fiecare linie de retur.</li>
<li><span class="pill have">raspuns</span>
<b>Ce face pachetul ROAAUTO</b> cand factura primeste o linie pe care devizul nu o stie:
<b>nimic</b> — nu citeste deloc tabelele de vanzari. Nu mai blocheaza nicio estimare, vezi
sectiunea 9.</li>
<li><span class="pill have">raspuns</span>
<b>Nepotrivirea de afisare ROAAUTO</b> intre ecranul de deviz si factura retiparita —
<b>decizia 28: acceptata.</b> Conditia e ca <b>MANOPERA si MATERIALE sa fie conform devizului</b>;
restul articolelor pot exista pe factura fara sa apara pe deviz. Nu se cere cod nou in ROAAUTO.
Vezi sectiunea 9.</li>
<li><span class="pill have">raspuns</span>
<b>Stergerea unei linii venite din comanda</b> — <b>decizia 29: fara protectie.</b> Se sterge
ca oricare alta; comanda ramane cu cantitatea nefacturata si va aparea, corect, facturata
partial. Nu se cere confirmare, nu se marcheaza „refuzat”.</li>
<li><span class="pill have">raspuns</span>
<b>Coordonarea cu #6</b> — <b>decizia 30: nu se coordoneaza.</b> #13 incepe dupa ce #6 se
termina, deci nu exista doi scriitori simultan pe acelasi fisier. Decizia 26 (analiticele
read-only in #13) ramane — motivul ei e semantic, nu de calendar. <b>Decizia 38:</b> fluxul de
editare al lui #6 (editare directa a randului din <code>ACT_TEMP</code>, prin
<code>oscrie_in_fisiere</code>) nu se retrage odata cu #13 — coexista cu regenerarea prin
<code>pack_facturare</code>, iar decizia despre unificarea lor se ia mai tarziu, dupa ce #13
livreaza si se vede in practica daca intretinerea celor doua drumuri doare cu adevarat.</li>
<li><span class="pill have">decis</span>
<b>Bug-ul de dezalocare POS</b> se repara in trecere, odata cu mutarea antetului din sectiunea 2
(decizia 40) — nu e o mutare pur mecanica, testarea trebuie sa acopere si dezalocarea POS pe
calea veche.</li>
<li><span class="pill have">raspuns</span>
<b>Cu ce cont de venit intra un articol fara politica de pret.</b> Nu printr-o politica de pret
implicita — <b>decizia 24 s-a retras</b>. <b>Decizia 27:</b> contul de venit se <b>deriva</b>,
din <code>CORESP_CONT_VENCHELT</code> pentru articolele gestionabile si din
<code>NOM_ARTICOLE.CONT</code> (sau, implicit, <b>704</b>) pentru cele negestionabile; derivarea
se face <b>in VFP</b> (decizia 27-bis), <code>pack_facturare</code> ramane neatins. Reteta si
costurile: sectiunea 10.</li>
</ul>
<h2><span class="n">9</span>Facturile venite din ROAAUTO</h2>
<p class="sub">
ROAAUTO emite facturi din formularul lui de devize, dar prin acelasi pachet si in aceleasi tabele.
Formularul unificat le vede fara niciun cod special. Ce lipseste nu e recunoasterea, ci scrierea.
</p>
<div class="tbl">
<table class="doc">
<thead><tr><th>Intrebare</th><th>Raspunsul de pe cod</th></tr></thead>
<tbody>
<tr><td>Scrie in aceleasi tabele?</td>
<td><span class="pill have">da</span> acelasi <code>PACK_FACTURARE</code>, acelasi drum prin
tabela de staging catre <code>VANZARI_DETALII</code>. Tip de document <code>-12</code>.</td></tr>
<tr><td>Se vad in editorul nou?</td>
<td><span class="pill have">da</span> deja, testat pe date reale — detectia liniilor nu
filtreaza dupa tipul documentului.</td></tr>
<tr><td>Se pot adauga articole la emitere?</td>
<td><span class="pill have">da</span> prin <i>Alte servicii</i>, la emiterea facturii finale.
Articolele vin din <b>nomenclatorul brut</b>, sunt limitate la cele <b>fara stoc</b>, iar
<b>pretul se tasteaza</b> — nu vine din politici. Raman linii proprii, nu se cumuleaza in
manopera sau materiale.</td></tr>
<tr><td>Se pot modifica dupa emitere?</td>
<td><span class="pill check">nu</span> butonul se blocheaza imediat ce comanda are numar de
factura, metoda de stornare a comenzii e goala, iar gridul din editorul nou e read-only.
Singurul instrument asupra unei facturi emise e stergerea ei intreaga. <b>Asta e
capacitatea care se cere.</b></td></tr>
<tr><td>Cum arata liniile lor?</td>
<td>cele venite din deviz nu sunt articole: sunt sume cumulate pe categorii — manopera,
materiale, avans, discount — pe pseudo-articole cu cod negativ. Langa ele pot sta articole
reale. <b>Niciunele nu au gestiune</b>, nici macar cele reale.</td></tr>
</tbody>
</table>
</div>
<p class="meta">
Ce se cere: <b>aceeasi adaugare de articole si la modificarea documentului</b>, nu doar la emitere —
si nu numai pentru facturile auto, ci pentru orice tip de factura, din lista de preturi sau direct
din nomenclator.
</p>
<p class="meta">
<span class="pill check">corectie</span> <b>„Alte servicii” nu e jumatatea de drum pe care o
credeam.</b> Mecanismul acela functioneaza tocmai pentru ca <b>ocoleste contabilizarea</b>:
facturile de deviz merg pe o cale paralela, care nu genereaza nicio nota contabila de venit.
Pe fluxul normal de facturare, unde nota <b>se</b> genereaza, un articol fara politica de pret e
respins cu eroare. Deci nu se generalizeaza un mecanism existent — se rezolva altfel (mai jos).
</p>
<p class="meta">
<span class="pill have">rezolvat</span> <b>Devizul nu se dezechilibreaza.</b> Pachetul ROAAUTO
<b>nu citeste deloc</b> tabelele de vanzari — nici antetul, nici liniile. Legatura pe care o face
dupa emitere e in sens invers: pune numarul documentului pe comenzile si lucrarile lui. Deci o
linie adaugata din formularul unificat nu strica niciun total si nu cere niciun apel suplimentar
catre ROAAUTO.
</p>
<p class="meta">
<span class="pill have">decis</span> <b>Nepotrivirea de afisare e acceptata (decizia 28).</b>
Totalul devizului se calculeaza din structura proprie ROAAUTO, deci <b>nu va arata niciodata</b>
linia adaugata; in schimb <b>factura retiparita o va arata</b>, pentru ca relistarea citeste
direct liniile documentului. Conditia ceruta de Marius e alta: <b>MANOPERA si MATERIALE sa fie
conform devizului</b> — restul articolelor pot exista pe factura fara sa apara in ecranul de
deviz. Nu se cere cod nou in ROAAUTO ca sa aduca ecranul de deviz la zi.
</p>
<hr class="rule">
<h2><span class="n">10</span>Contul de venit pentru articole adaugate din nomenclator</h2>
<p class="sub">
Intrebarea ramasa deschisa in sectiunea 8: cu ce cont de venit intra un articol adaugat
„Alege din nomenclator…”, fara politica de pret. Decizia 27 (mai jos) nu s-a schimbat; reteta prin
care ajungea la <code>pack_facturare</code> s-a abandonat intre runda 8 si runda 9-10, in favoarea
unui parametru nou.
</p>
<p class="meta">
<span class="pill check">respins</span> <s><b>Decizia 24</b> — articolul ales din nomenclator
primeste <code>id_pol</code>-ul unei politici de pret implicite.</s> Retrasa in runda 8: evita cod
nou in <code>pack_facturare</code>, dar cu pretul unei configurari cu contabilul (care politica,
cu ce <code>SCC</code>) si al unui cont de venit uniform pentru orice articol adaugat asa.
Inlocuita de decizia 27.
</p>
<h3>Decizia 27 — contul de venit se deriva, pe doua ramuri</h3>
<div class="tbl">
<table class="doc">
<thead><tr><th>Articol</th><th>Sursa contului de venit</th></tr></thead>
<tbody>
<tr><td><b>gestionabil</b><br><span class="stlbl">cont de gestiune clasa 3xx</span></td>
<td><code>CORESP_CONT_VENCHELT.CONT_VENIT</code>, cautat pe <code>CONT</code> = contul de
gestiune al liniei</td></tr>
<tr><td><b>negestionabil</b></td>
<td><code>NOM_ARTICOLE.CONT</code>, daca e deja cont de clasa <b>6xx</b> sau <b>7xx</b>;
altfel, implicit <b>704</b></td></tr>
</tbody>
</table>
</div>
<p class="meta">
<span class="pill check">respins</span> <s><b>Decizia 27-bis</b> — reteta VFP in 4 pasi: calculeaza
contul, cauta o politica a carei nota il are deja, insereaza articolul in ea cu
<code>pack_preturi.adauga_politica_pret_art</code>, trimite <code>id_pol</code>.</s> Abandonata in
runda 9 (decizia 34): intrebarea deschisa era cum alege programul nota contabila de vanzare pe
factura din comanda, care nu are politica de pret (decizia 32) — iar raspunsul lui Marius se
refoloseste direct pentru articolul ad-hoc. Nu mai e nevoie de politica tehnica, nici de
interogarea inversa pe <code>SCC</code>, nici de inserarea articolului intr-o politica.
</p>
<h3>Decizia 34 — <code>contabilizeaza_articol</code> primeste contul, printr-un parametru nou</h3>
<p class="meta">
Marius, textual: „poti sa adaugi parametrul contul contabil la <code>contabilizeaza_articol</code>.”
Verdictul de proiectare, in trei randuri, pentru ca schimba forma literala a cererii:
<code>contabilizeaza_articol</code> ia azi <b>un singur parametru</b>,
<code>detalii_articol VANZARI_DETALII_TEMP%ROWTYPE</code> — contul nu intra pe el literal, ar fi
cosmetic. Intra ca <b>coloana noua</b> <code>VANZARI_DETALII_TEMP.CONT_VENIT VARCHAR2(4) NULL</code>,
populata printr-un <b>parametru nou</b> <code>V_CONT_VENIT IN VARCHAR2 DEFAULT NULL</code>, adaugat
la <b>coada</b> lui <code>adauga_articol_factura</code> (procedura chemata direct din VFP) —
<code>contabilizeaza_articol</code> il primeste automat, fara sa i se schimbe semnatura.
Precedentul e in aceeasi lista de parametri: <code>V_TAXCODE</code> si <code>V_LOT</code> sunt deja
doi parametri adaugati ulterior, la coada, cu <code>DEFAULT NULL</code>, iar apelul VFP e pozitional
si se opreste la <code>V_LOT</code>.
</p>
<p class="meta">
<b>Cei trei apelanti interni nu se ating deloc</b> — <code>scrie_factura2</code>,
<code>scrie_factura_avize_retur</code> si <code>scrie_aviz_retur</code> fac
<code>SELECT * BULK COLLECT</code> intr-un <code>TABLE OF ...%ROWTYPE</code>, deci coloana noua le
traverseaza fara nicio schimbare de cod. Ramura noua se activeaza doar pe
<code>detalii_articol.cont_venit IS NOT NULL</code>: infasoara blocul <code>FACT-024</code> (garda
ramane litera cu litera pe ramura veche — o linie fara politica <b>si</b> fara cont trimis continua
sa cada pe eroare), n-are cursor deloc, deci <code>descarca_gestiune</code> ruleaza <b>exact o data
prin constructie</b> — bug-ul de set multi-rand din ramura veche nu se mosteneste, fara sa se repare
ramura veche.
</p>
<p class="meta">
<span class="pill check">de retinut la implementare</span> Parametrul se cableaza in <b>doua locuri
VFP</b>, nu unul: <code>frm_facturare_articole.do_scrie_articole</code> si
<code>frm_facturare_articole2.do_scrie_articole</code> sunt doua clase distincte, fiecare cu apelul
ei RPC propriu. Daca se vrea <code>CONT_VENIT</code> pastrat si dupa fapt in
<code>VANZARI_DETALII</code>, lista de coloane explicita din <code>scrie_in_vanzari</code> (24 de
coloane azi) trebuie extinsa — altfel coloana traieste doar in <code>VANZARI_DETALII_TEMP</code> si
<code>ACT_TEMP</code>. Articolul compus nu e o gaura aici: e exclus structural — proprietatea
<code>COMPUS</code> traieste pe perechea (articol, politica), prin <code>ID_POL_ART</code>, iar o
linie fara politica n-are asa ceva.
</p>
<h3>Decizia 36 — <code>SCD</code> si <code>CU_TVA</code> pe ramura fara politica</h3>
<p class="meta">
Nota veche mai furniza si <code>SCD</code>, <code>CU_TVA</code>, <code>IN_VALUTA</code>,
<code>EXPLICATIE</code>, <code>ID_VENCHELT</code>, <code>ID_SECTIE</code> — nu doar contul.
Verificarea n-a gasit nicio sursa alternativa in cod pentru primele doua (nici optiune de firma
existenta, nici cont pe partener, nici flag de scutire pe articol sau client), deci sunt decizii de
produs, si Marius le-a luat:
</p>
<div class="tbl">
<table class="doc">
<thead><tr><th>Camp</th><th>Sursa noua</th></tr></thead>
<tbody>
<tr><td><code>SCD</code></td>
<td>o <b>optiune de firma noua</b>, cu <code>4111</code> ca implicit — acelasi tipar in trei
niveluri deja folosit de <code>pack_facturare.scrie_incasare2</code> pentru
<code>RF_CONT_INCASARE_*</code>: parametru explicit → optiune de firma → constanta
hardcodata daca optiunea lipseste. Mecanismul (tabelul <code>OPTIUNI</code>,
<code>PACK_SESIUNE.getoptiunefirma</code>, ecranul generic <code>frm_optiuni</code>) exista
de 15+ ani, deci cheia noua nu cere niciun cod VFP nou, doar randul in tabel.
<code>ASCD</code> nu se atinge — se calculeaza deja din <code>V_SCD</code>.</td></tr>
<tr><td><code>CU_TVA</code></td>
<td><b>derivat din cota liniei</b>, nu fixat: <code>1</code> daca <code>proc_tvav > 0</code>,
altfel <code>0</code>. Elimina prin constructie riscul gasit la verificarea adversariala: cu
<code>CU_TVA = 1</code> fixat, o linie scutita ar fi intrat in comparatia de maxim din
<code>nproc_tva_max</code> si ar fi putut imprumuta coloana si taxcode-ul ei liniei de
discount a intregii facturi. Diferenta fata de ce face azi nota e intentionata, se
consemneaza la testare.</td></tr>
</tbody>
</table>
</div>
<p class="meta">
Lista de parametri noi ramane la <b>unul singur</b>, <code>V_CONT_VENIT</code>: <code>SCD</code>
vine din configurare, <code>CU_TVA</code> se deriva in pachet din date deja prezente pe rand.
</p>
<h3>Decizia 37 — cheia optiunii de firma</h3>
<p class="meta">
<code>RF_CONT_ART_FARA_POL</code>, aliniata la familia <code>RF_CONT_INCASARE_*</code> — aceleasi
optiuni care alimenteaza azi <code>SCD</code> in acelasi pachet, deci apar grupate alaturi in
ecranul de optiuni. <code>VARTYPE = 'CHARACTER'</code>, <code>VARVALUE = '4111'</code>,
<code>PROGRAM = 'ROAFACTURARE'</code>, dar <code>PROGRAME</code> larg — apelul traieste in
<code>COMUN\clase\ofacturare.vc2</code>, prezent in toate cele sapte produse ale suitei.
<b>Fara validare de cont</b>, nici la salvare nici la citire — acelasi tipar ca
<code>RF_CONT_INCASARE_*</code>, care nu valideaza de 15 ani. Garda gratuita ramane lungimea: un
<code>VARVALUE</code> peste 4 caractere da <code>ORA-12899</code> la
<code>INSERT INTO ACT_TEMP</code> — esec zgomotos, nu cont tacut gresit. Un cont inexistent in
planul de conturi, scris din greseala in ecran, ajunge pe nota neschimbat — risc acceptat constient,
acelasi pe care produsul il are deja pe optiunile de tip cont.
</p>
<p class="meta">
<b>Intrebarea lui Marius, verificata:</b> „In ROAACNPRO si pe factura din comanda / contract se
adauga articole fara politica — de ce nu si aici?” <b>Raspuns, neschimbat fata de v7:</b>
<b>ROAACNPRO</b> nu cheama deloc <code>contabilizeaza_articol</code> — are propria contabilizare,
<code>pack_acn.salveaza_regdoc</code>. Pe <b>contract</b>, articolele vin din
<code>cursor_contract</code> / <code>cursor_preturi</code>, cu <code>id_pol</code> deja atasat de
cursor. Deci <b><code>FACT-024</code> ramane blocantul</b> pe linia ad-hoc — parametrul de mai sus e
cum se evita, nu un motiv sa fie sarit.
</p>
<h3>Ce nu e gratuit</h3>
<ul class="tight">
<li><b>Regresie pe toata suita, nu doar ROAFACTURARE.</b> <code>pack_facturare</code> e comun la
ROACONT / ROAGEST / ROACONTRACTE / ROAAUTO / ROAACNPRO, si ramura noua e atinsa de apelul comun
din <code>ofacturare.vc2</code>.</li>
<li><b>Doua clase VFP cablate separat.</b> <code>frm_facturare_articole.do_scrie_articole</code> si
<code>frm_facturare_articole2.do_scrie_articole</code> isi construiesc fiecare propriul apel RPC —
parametrul se adauga in ambele, nu o singura data.</li>
<li><b>Lista de coloane a lui <code>scrie_in_vanzari</code></b> trebuie extinsa explicit daca se
vrea <code>CONT_VENIT</code> pastrat si dupa fapt in <code>VANZARI_DETALII</code>, nu doar in
<code>VANZARI_DETALII_TEMP</code> / <code>ACT_TEMP</code>.</li>
<li><b>Un cont fara precedent</b> (cazul <code>704</code>) intra direct pe linie, fara sa mai treaca
printr-o politica sau o nota existenta — spre deosebire de reteta veche, nu mai cere configurare
cu contabilul, dar nici nu mai e validat impotriva planului de conturi (decizia 37).</li>
</ul>
<hr class="rule">
<h2><span class="n">11</span>Puncte marunte ramase</h2>
<p class="sub">
Nu blocheaza nimic din ce e mai sus; se inchid la implementarea povestii respective. Enumerate ca sa
nu se piarda intre runde — <span class="pill check">se merge pe recomandare</span> daca Marius nu
spune altfel.
</p>
<div class="tbl">
<table class="doc">
<thead><tr><th>Punct</th><th>Poveste</th><th>Se merge pe</th></tr></thead>
<tbody>
<tr><td>Textul tooltip-urilor pentru analiticele read-only si pentru grupul de incasare blocat</td>
<td>S3b</td><td>formularea propusa in raport, sectiunile 2.2 si 5.3</td></tr>
<tr><td>Eager vs. lazy pentru lookup-urile Oracle din <code>Init</code> (delegat / masina
ultimei facturi, casa)</td>
<td>S3b, S3</td><td><b>lazy</b>, ca sa nu se plateasca la fiecare depliere</td></tr>
<tr><td><code>_checkbox1</code> vs. <code>chkDetaliat</code> — campul unic de „listare
detaliata”</td>
<td>S3b, S1</td><td><b>nedecis</b> — se inchide pe cod la implementare, nu prin alegere</td></tr>
<tr><td>Forma lui <code>toSursa</code>: obiect scatter (duck-typing) sau clasa dedicata</td>
<td>S3c</td><td><b>duck-typing</b>, ca azi — o clasa noua n-ar schimba nimic functional</td></tr>
<tr><td>Conversia comenzii si a contractului: un commit sau doua</td>
<td>S3c</td><td><b>un singur commit</b> — aceleasi trei fisiere comune, separarea nu reduce
regresia</td></tr>
<tr><td><code>goComanda = ''</code> redundant la <code>Cw3.do_actiune</code> dupa conversie</td>
<td>S3c</td><td><b>se lasa</b>, marcat explicit „intentionat” in diff</td></tr>
<tr><td>Contractul cu doua meniuri (articole vs. rate): eticheta generica sau diferentiata pe
<code>OPT_FACTURARE</code></td>
<td>S4b</td><td><b>diferentiata</b> — „Alege ratele de facturat…” e gresita pe contractele cu
articole</td></tr>
<tr><td>„Alege facturile de returnat…” — ramane doar la antet sau capata incarcare aditiva din
bara</td>
<td>S4b</td><td><b>ramane la antet</b> in etapa I; mutarea e poveste separata</td></tr>
<tr><td><code>But_renunt1</code> / <code>But_reset1</code> capata <code>Caption</code> pentru
consistenta cu bara etichetata</td>
<td>S4b</td><td><b>da</b> — decizia 13 cere etichete, nu iconite mute</td></tr>
<tr><td>Ordinea si formularea optiunilor din <code>xmenu()</code> per sursa</td>
<td>S4b</td><td>tabelul din sectiunea 3 a raportului</td></tr>
<tr><td>UX-ul contractului cu doua surse pe acelasi grid conceptual (<code>crsarticole</code>
filtrat + <code>crsarticole1</code>)</td>
<td>S4</td><td>de confirmat vizual la mockup, nu pe hartie</td></tr>
</tbody>
</table>
</div>
</div>