1177 lines
70 KiB
HTML
1177 lines
70 KiB
HTML
<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. %</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 <> 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>
|