diff --git a/CLAUDE.md b/CLAUDE.md index 1e77633..c4efa39 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -39,3 +39,14 @@ Orice modificare de continut se face in **toate 4**. foloseste `.encode('ascii','replace')`. - `pdftotext` pierde diacriticele la afisare. E doar o problema de afisare, PDF-ul e corect. - Versiunea anterioara a PDF-ului (pentru diff la istoric) e cea din `D:\ROA\ROAAUTO\Help\` inainte de copiere. + +## Manual ROAIMOB - docx + pdf (fara md/txt) + +| Fisier | Rol | +|---|---| +| `build_manual_ROAIMOB.py` | genereaza `manualROAIMOB.docx` (stil clonat din `manual_ROAAUTO.docx`, poze din `pozeROAIMOB\`) | +| `manualROAIMOB.pdf` | generat din docx cu soffice (comanda de mai sus) | + +- Modificarile se fac in **script**, nu direct in docx. Ruleaza `python build_manual_ROAIMOB.py`, apoi soffice, apoi verificarea vizuala. +- Versiunea si istoricul urmeaza aceleasi reguli ca la ROAAUTO. +- Livrare: copiezi pdf-ul in `D:\ROA\ROAIMOB\Help\manual_ROAIMOB.pdf` (comis in SVN). Se deschide din Ajutor -> Instructiuni de utilizare (`lansare_help_meniu`, COMUN r18244). La release, Marius il copiaza in `Y:\ROAUPDATE\ROAIMOB\Help\`, ca sa intre in zip-ul de update. diff --git a/build_manual_ROAIMOB.py b/build_manual_ROAIMOB.py new file mode 100644 index 0000000..833bd15 --- /dev/null +++ b/build_manual_ROAIMOB.py @@ -0,0 +1,642 @@ +# Genereaza manualROAIMOB.docx in stilul manual_ROAAUTO.docx (clonare elemente model, doar textul se schimba). +# Rulare: python build_manual_ROAIMOB.py (din D:\ROA\Manual ROA) +import copy +import os +import re + +import docx +from docx.shared import Cm +from docx.oxml import OxmlElement +from docx.oxml.ns import qn +from docx.text.paragraph import Paragraph +from docx.enum.text import WD_ALIGN_PARAGRAPH +from PIL import Image + +BASE = os.path.dirname(os.path.abspath(__file__)) +POZE = os.path.join(BASE, 'pozeROAIMOB') +OUT = os.path.join(BASE, 'manualROAIMOB.docx') + +doc = docx.Document(os.path.join(BASE, 'manual_ROAAUTO.docx')) +body = doc.element.body +els = list(body.iterchildren()) +W = qn + + +def tpl(i): + return copy.deepcopy(els[i]) + + +# Elemente model din manual_ROAAUTO.docx (indici in body) +T = dict(title=tpl(0), ver=tpl(1), sub=tpl(2), h1=tpl(3), h2=tpl(4), empty=tpl(6), body=tpl(8), + h3=tpl(56), note=tpl(58), num=tpl(50), tbl=tpl(5), warn=tpl(25), info=tpl(60), code=tpl(37), + footer=tpl(141)) + + +def rpr_of(el, path): + return copy.deepcopy(el.findall('.//' + W('w:r'))[path].find(W('w:rPr'))) + + +tr_hdr = T['tbl'].findall(W('w:tr'))[0] +tr_row = T['tbl'].findall(W('w:tr'))[1] +R = dict( + body=rpr_of(T['body'], 0), + bodyb=rpr_of(tpl(21), 0), + num=rpr_of(T['num'], 0), + cell=rpr_of(tr_row, 0), + path=rpr_of(tr_row, 2), + arrow=rpr_of(tr_row, 3), + hdr=rpr_of(tr_hdr, 0), +) + + +def bold(rpr): + r = copy.deepcopy(rpr) + if r.find(W('w:b')) is None: + b = OxmlElement('w:b') + r.insert(1, b) + r.insert(2, OxmlElement('w:bCs')) + return r + + +def mkrun(text, rpr): + r = OxmlElement('w:r') + r.append(copy.deepcopy(rpr)) + t = OxmlElement('w:t') + t.set('{http://www.w3.org/XML/1998/namespace}space', 'preserve') + t.text = text + r.append(t) + return r + + +def fill(p, text, base='body'): + """Inlocuieste run-urile lui p. Markup: **bold**, `Cale → Meniu` (Courier rosu, sageti gri).""" + for r in p.findall(W('w:r')): + p.remove(r) + rn = R['cell'] if base == 'cell' else R['body'] + rb = bold(rn) + for tok in re.split(r'(\*\*.+?\*\*|`.+?`)', text): + if not tok: + continue + if tok.startswith('**'): + p.append(mkrun(tok[2:-2], rb)) + elif tok.startswith('`'): + parts = tok[1:-1].split(' → ') + for k, part in enumerate(parts): + if k: + p.append(mkrun(' → ', R['arrow'])) + p.append(mkrun(part, R['path'])) + else: + p.append(mkrun(tok, rn)) + return p + + +sectPr = body.find(W('w:sectPr')) +for el in list(body): + if el is not sectPr: + body.remove(el) + + +def add(el): + sectPr.addprevious(el) + return el + + +def keep_next(p): + Paragraph(p, doc).paragraph_format.keep_with_next = True + return p + + +def para(kind, text=''): + p = copy.deepcopy(T[kind]) + if kind in ('title', 'ver', 'sub', 'footer', 'note', 'h1', 'h2', 'h3'): + for r in p.findall(W('w:r'))[1:]: + p.remove(r) + p.find('.//' + W('w:t')).text = text + else: + fill(p, text) + if kind in ('h1', 'h2', 'h3'): + keep_next(p) + return add(p) + + +def H1(t): return para('h1', t) +def H2(t): return para('h2', t) +def H3(t): return para('h3', t) +def P(t): return para('body', t) +def NOTE(t): return para('note', t) +def EMPTY(): return add(copy.deepcopy(T['empty'])) + + +def STEPS(items): + for i, t in enumerate(items, 1): + p = copy.deepcopy(T['num']) + fill(p, t) + p.insert(1, mkrun('%d. ' % i, R['num'])) + add(p) + + +def set_shd(tc, fill_color): + tc.find(W('w:tcPr')).find(W('w:shd')).set(W('w:fill'), fill_color) + + +def TABLE(headers, rows, widths): + t = copy.deepcopy(T['tbl']) + for tr in t.findall(W('w:tr')): + t.remove(tr) + grid = t.find(W('w:tblGrid')) + for g in list(grid): + grid.remove(g) + for w in widths: + g = OxmlElement('w:gridCol') + g.set(W('w:w'), str(w)) + grid.append(g) + + def mkrow(tr_t, cells, color=None, hdr=False): + tr = copy.deepcopy(tr_t) + tcs = tr.findall(W('w:tc')) + tc_t = tcs[0] + for tc in tcs: + tr.remove(tc) + if not hdr: + trPr = tr.find(W('w:trPr')) + if trPr is None: + trPr = OxmlElement('w:trPr') + tr.insert(0, trPr) + trPr.append(OxmlElement('w:cantSplit')) + for text, w in zip(cells, widths): + tc = copy.deepcopy(tc_t) + tc.find(W('w:tcPr')).find(W('w:tcW')).set(W('w:w'), str(w)) + if color: + set_shd(tc, color) + p = tc.find(W('w:p')) + if hdr: + for r in p.findall(W('w:r')): + p.remove(r) + p.append(mkrun(text, R['hdr'])) + else: + fill(p, text, 'cell') + tr.append(tc) + return tr + + t.append(mkrow(tr_hdr, headers, hdr=True)) + for i, row in enumerate(rows): + t.append(mkrow(tr_row, row, 'FFFFFF' if i % 2 == 0 else 'F2F4F8')) + if len(rows) <= 12: # tabel scurt: nu se rupe intre pagini + for tr in t.findall(W('w:tr'))[:-1]: + for p in tr.iter(W('w:p')): + keep_next(p) + add(t) + EMPTY() + + +def no_split(t): + tr = t.find(W('w:tr')) + trPr = tr.find(W('w:trPr')) + if trPr is None: + trPr = OxmlElement('w:trPr') + tr.insert(0, trPr) + trPr.append(OxmlElement('w:cantSplit')) + return t + + +def BOX(text, kind='warn'): + t = no_split(copy.deepcopy(T[kind])) + fill(t.find('.//' + W('w:p')), text) + add(t) + EMPTY() + + +def CODE(lines): + t = no_split(copy.deepcopy(T['code'])) + tc = t.find('.//' + W('w:tc')) + ps = tc.findall(W('w:p')) + for p in ps[1:]: + tc.remove(p) + for line in lines: + p = copy.deepcopy(ps[0]) + p.find('.//' + W('w:t')).text = line + tc.append(p) + tc.remove(ps[0]) + add(t) + EMPTY() + + +def poza(nr): + for f in os.listdir(POZE): + if f.split('_')[0] == str(nr) or f.split(' ')[0] == str(nr): + return os.path.join(POZE, f) + raise FileNotFoundError(nr) + + +IMG_LOG = [] + + +def IMG(nr, caption, max_w=16.0, max_h=9.0): + path = poza(nr) + w_px, h_px = Image.open(path).size + w = min(max_w, w_px / 96 * 2.54) + h = w * h_px / w_px + if h > max_h: + w = max_h * w_px / h_px + p = doc.add_paragraph() # se insereaza inaintea sectPr, deci in ordine + p.alignment = WD_ALIGN_PARAGRAPH.CENTER + p.paragraph_format.keep_with_next = True + p.paragraph_format.space_before = Cm(0.2) + p.paragraph_format.space_after = Cm(0) + p.add_run().add_picture(path, width=Cm(w)) + c = para('note', caption) + Paragraph(c, doc).alignment = WD_ALIGN_PARAGRAPH.CENTER + IMG_LOG.append((nr, caption)) + + +# ============================================================ CONTINUT +para('title', 'Manual ROAIMOB — Imobilizări') +para('ver', 'v. 01.10.2026') +para('sub', 'Evidența imobilizărilor corporale, necorporale și în curs — de la intrarea în patrimoniu ' + 'până la ieșirea din gestiune.') + +# ---------------------------------------------------------------- Quickstart +H1('Quickstart — Operații uzuale') +NOTE('Capturile de ecran sunt din versiuni mai vechi ale programului. Aspectul poate diferi puțin, ' + 'dar denumirile și pașii sunt aceiași.') +P('**Firma, anul și luna contabilă** le schimbi cu **click dreapta pe imaginea de fundal** a aplicației. ' + 'Se deschide formularul „Alegeți firma / anul / luna”: alegi **Firma**, **Anul** și **Luna**, apoi ' + 'confirmi cu butonul **Terminare** (Ctrl+F).') + +H2('Scenariul 1 — Introducere mijloc fix nou') +P('Folosești **Introducere** când achiziția nu este încă înregistrată în contabilitate.') +TABLE(['Pas', 'Ce faci', 'Unde'], [ + ['1', 'Deschizi formularul de introducere', '`Imobilizări corporale → Introducere`'], + ['2', 'Completezi denumirea, codul din catalog, durata normală de serviciu (DNS), contul și numărul de inventar', + 'Formularul „Introducere imobilizări”'], + ['3', 'Completezi documentul de achiziție: număr, dată, valoare', 'Tot în formular'], + ['4', 'Completezi numărul și data PIF, tipul de amortizare, gestiunea, responsabilul', 'Tot în formular'], + ['5', 'Bifezi, dacă e cazul, „Bun de capital” și „Amort. max. deductibil”', 'Tot în formular'], + ['6', 'Validezi cu butonul verde ✓. Programul întreabă dacă mai introduci o imobilizare', '—'], +], [600, 4700, 3900]) +P('Din 2026, pragul fiscal pentru mijloc fix este **5.000 lei** (vezi Capcane frecvente). ' + 'Programul nu verifică pragul la introducere.') +IMG(4, 'Formularul de introducere a unei imobilizări noi') + +H2('Scenariul 2 — Preluare din contabilitate') +P('Folosești **Preluare din contabilitate** când achiziția este deja înregistrată în ROACONT. ' + 'Numărul, data și valoarea documentului se preiau din contabilitate.') +TABLE(['Pas', 'Ce faci', 'Unde'], [ + ['1', 'Deschizi lista documentelor de achiziție', '`Imobilizări corporale → Preluare din contabilitate`'], + ['2', 'Alegi documentul de achiziție din listă', 'Fereastra „Documente achiziție”'], + ['3', 'Completezi ce lipsește: cod, DNS, tip amortizare, gestiune, responsabil', 'Formularul de introducere'], + ['4', 'Validezi cu butonul verde ✓', '—'], +], [600, 4700, 3900]) +P('Se preia și contul analitic din nota contabilă. Apar și documentele cu dată de achiziție din lunile ' + 'anterioare, înregistrate în luna curentă.') + +H2('Scenariul 3 — Amortizare lunară, verificare și notă de închidere') +P('Rata lunară se calculează de program pentru luna contabilă deschisă. Tu verifici și listezi nota.') +TABLE(['Pas', 'Ce faci', 'Unde'], [ + ['1', 'Deschizi lista și verifici rata lunii (coloana „Amortizment lunar”)', + '`Imobilizări corporale → Vizualizare amortizare contabilă`'], + ['2', 'Apeși butonul **Verifică** (două semne de exclamare, dreapta sus). Compară conturile cu ROACONT', + 'Lista imobilizărilor'], + ['3', 'Dacă apar diferențe, corectezi conturile indicate', 'ROAIMOB sau ROACONT'], + ['4', 'Listezi nota de închidere a amortizării', + '`Situații analitice → Rapoarte → Închidere imobilizări corporale`'], + ['5', 'Repeți pentru imobilizările necorporale', '`Imobilizări necorporale`'], +], [600, 4700, 3900]) +IMG(7, 'Verificare cu contabilitatea: valorile sunt egale') +IMG(8, 'Verificare cu contabilitatea: conturile cu diferențe') +IMG(9, 'Meniul pentru nota de închidere a amortizării') +IMG(10, 'Nota de închidere a amortizării imobilizărilor corporale') + +H2('Scenariul 4 — Transformare imobilizare în curs în mijloc fix') +TABLE(['Pas', 'Ce faci', 'Unde'], [ + ['1', 'Deschizi lista imobilizărilor în curs', '`Imobilizări în curs → Vizualizare`'], + ['2', 'Bifezi coloana „Ales” la imobilizările care formează mijlocul fix', 'Lista imobilizărilor în curs'], + ['3', 'Modifici „Valoare reținută” dacă nu transformi toată valoarea', 'Tot în listă'], + ['4', 'Apeși **Operațiuni** și alegi tipul transformării (tabelul de mai jos)', 'Tot în listă'], + ['5', 'Completezi formularul mijlocului fix, ca la introducere, și validezi cu ✓', '—'], +], [600, 4700, 3900]) +TABLE(['Opțiune din Operațiuni', 'Rezultat'], [ + ['Transformare în imobilizare corporală / necorporală', 'Un mijloc fix nou, cu valoarea egală cu suma valorilor reținute'], + ['Adăugare la imobilizare corporală / necorporală', 'Majorare pe un mijloc fix existent. Scade valoarea imobilizării în curs'], + ['Transformare în N imobilizări corporale / necorporale', + 'N mijloace fixe identice dintr-o singură imobilizare în curs (vezi capitolul Imobilizări în curs)'], +], [4200, 5000]) +IMG(11, 'Alegerea imobilizărilor în curs care se transformă (ecran vechi; azi bifezi coloana „Ales” din listă)') +IMG(12, 'Formularul mijlocului fix obținut din imobilizări în curs') + +H2('Scenariul 5 — Ieșire din gestiune (vânzare, casare)') +TABLE(['Pas', 'Ce faci', 'Unde'], [ + ['1', 'Selectezi mijlocul fix', '`Imobilizări corporale → Vizualizare amortizare contabilă`'], + ['2', 'Apeși **Operațiuni** și alegi „ieșire din gestiune”', 'Fereastra „Alegeți operațiunea”'], + ['3', 'Completezi data și numărul documentului, tipul (vânzare, casare etc.), explicația și data ieșirii', + 'Fereastra „Ieșire din gestiune”'], + ['4', 'Validezi cu butonul verde ✓', '—'], + ['5', 'Tipărești procesul-verbal de casare', 'Lista → **Listare** → „Proces-verbal de casare”'], +], [600, 4700, 3900]) +IMG(6, 'Ieșire din gestiune: documentul, tipul și data ieșirii') + +H2('Scenariul 6 — Operații pe durata de folosire') +TABLE(['Pas', 'Ce faci', 'Unde'], [ + ['1', 'Selectezi mijlocul fix', '`Imobilizări corporale → Vizualizare amortizare contabilă`'], + ['2', 'Apeși **Operațiuni**', 'Lista imobilizărilor'], + ['3', 'Alegi operația și validezi cu ✓', 'Fereastra „Alegeți operațiunea”'], + ['4', 'Completezi documentul și valorile cerute, apoi validezi', 'Fereastra operației'], +], [600, 4700, 3900]) +TABLE(['Operație', 'Când o folosești'], [ + ['majorarea valorii de intrare', 'Investiții care modifică valoarea (pozitiv sau negativ)'], + ['reevaluarea valorii de intrare', 'Reevaluarea mijlocului fix'], + ['conservare / scoatere din conservare', 'Mijlocul fix intră în conservare sau iese din conservare'], + ['schimbare DNS', 'Se modifică durata normală de serviciu'], + ['schimbare DNS + reevaluare', 'Modifici împreună valoarea de inventar, amortizarea totală, DNS, uzura totală, valoarea reziduală'], + ['ieșire / intrare în gestiune', 'Vânzare, casare etc. (Scenariul 5); intrarea anulează o ieșire'], +], [3800, 5400]) +IMG(5, 'Fereastra „Alegeți operațiunea” deschisă din lista imobilizărilor corporale') + +H2('Scenariul 7 — Copiere imobilizare') +P('Copiezi când introduci un mijloc fix asemănător cu unul existent.') +TABLE(['Pas', 'Ce faci', 'Unde'], [ + ['1', 'Selectezi mijlocul fix sursă', '`Imobilizări corporale → Vizualizare amortizare contabilă`'], + ['2', 'Apeși butonul **Copiază** (dreapta sus)', 'Lista imobilizărilor'], + ['3', 'Se deschide formularul de introducere, completat cu situația din luna curentă', 'Titlul „Copie după nr. inv. …”'], + ['4', 'Modifici ce diferă (denumire, număr de inventar, valori) și validezi cu ✓', 'Tot în formular'], + ['5', 'Programul întreabă dacă mai creezi o copie după același mijloc fix', '—'], +], [600, 4700, 3900]) + +H2('Scenariul 8 — Rapoarte') +TABLE(['Ce cauți', 'Unde'], [ + ['Amortizări lunare, fișe, listă de inventar pentru selecția din listă', 'Lista → **Listare**'], + ['Situația lunară, lista fișelor, lista de inventar, evidența MF', '`Imobilizări corporale → Rapoarte`'], + ['Rulajul și totalul amortismentelor', '`Situații analitice → Rulaj amortismente`'], + ['Nota de închidere a amortizării', '`Situații analitice → Rapoarte`'], + ['Datele din listă în Excel', 'Lista → butonul **Excel**'], +], [4600, 4600]) +IMG(13, 'Raportul „Evidența mijloacelor fixe” în previzualizare') +IMG(14, 'Meniul Rapoarte al paginii Imobilizări corporale') +IMG(15, 'Evidența mijloacelor fixe listată din meniul Rapoarte') + +H2('Capcane frecvente') +BOX('**Pragul fiscal pentru mijloc fix este 5.000 lei începând cu anul fiscal 2026** (anterior 2.500 lei). ' + 'Codul fiscal art. 28 alin. (2) lit. b), modificat prin OUG 8/2026 (MO nr. 147/25.02.2026), art. 6 pct. 7 ' + 'și art. 10 alin. (2). Mijloacele fixe cu valoarea fiscală de intrare între 2.500 și 5.000 lei, existente ' + 'la 31.12.2025, se amortizează în continuare pe durata normală rămasă (art. 45 alin. (21³)). ' + 'OUG 8/2026 nu modifică reglementările contabile: pragul contabil îl stabilește politica contabilă a ' + 'firmei. Programul nu verifică pragul.') +BOX('**Numărul de inventar duplicat nu este blocat.** Programul te avertizează la introducere, dar permite ' + 'salvarea. Verifică „Registrul numerelor de inventar” înainte să confirmi.') +BOX('**Autoturismele din contul 2133 au amortizarea deductibilă limitată.** Pentru vehiculele de categoria M1 ' + '(cel mult 9 locuri, inclusiv șoferul), Codul fiscal (art. 28 alin. (14)) limitează amortizarea deductibilă ' + 'la 1.500 lei/lună, cu excepțiile prevăzute de lege (taxi, curierat, închiriere, agenți de vânzări etc.). ' + 'Bifezi „Amort. max. deductibil” și completezi plafonul lunar. Nota de închidere separă partea ' + 'deductibilă de cea nedeductibilă.') +BOX('**Fără bifa „Amort. max. deductibil”, toată amortizarea este deductibilă.** Cu bifa activă și valoarea 0, ' + 'toată amortizarea este nedeductibilă. Folosești 0 de exemplu la un mijloc fix amortizat integral și reevaluat.') +BOX('**O singură operație de valoare pe mijloc fix pe lună.** Două operații pe același mijloc fix în aceeași lună ' + '(de exemplu majorare și reevaluare) pot da calcule greșite. Cumulează-le într-o singură operație.') +BOX('**Operațiile se fac doar din „Vizualizare amortizare contabilă”.** Dacă ștergi o operație din lista ' + 'contabilă, o ștergi și din „Vizualizare amortizare fiscală”. Altfel cele două situații nu mai corespund.') + +# ---------------------------------------------------------------- Privire de ansamblu +H1('Fluxul de lucru — Privire de ansamblu') +CODE(['[1] Introducere sau preluare din contabilitate', + ' ↓', + '[2] Amortizare lunară (calculată de program) + verificare cu ROACONT', + ' ↓', + '[3] Operații: majorare, reevaluare, conservare, DNS, gestiune', + ' ↓', + '[4] Nota de închidere a amortizării', + ' ↓', + '[5] Ieșire din gestiune: vânzare, casare']) + +H2('Accesul în aplicație') +P('Pornești ROAIMOB din lansatorul ROA: `Managementul imobilizărilor → Imobilizări`. ' + 'Firma, anul și luna se schimbă cu **click dreapta pe imaginea de fundal**, în formularul ' + '„Alegeți firma / anul / luna”.') +IMG(1, 'Lansarea aplicației din lansatorul ROA') + +H2('Cele două axe ale ecranului') +P('**Axa orizontală** conține, de sus în jos:') +STEPS(['Bara de informare: aplicația, firma și luna contabilă', 'Meniul: Utile, Editare, Inițializare, Ajutor', + 'Iconițele de acces rapid în celelalte aplicații ROA, pe aceeași firmă și lună', + 'Paginile: Situații analitice, Imobilizări corporale, Imobilizări necorporale, Imobilizări în curs']) +P('**Axa verticală** se schimbă cu pagina aleasă. Conține operațiile, vizualizarea și rapoartele paginii.') +IMG(2, 'Axa orizontală și bara verticală a paginii Imobilizări în curs') +TABLE(['Pagina', 'Bara verticală'], [ + ['**Situații analitice**', 'Istoric operații, Rulaj amortismente, Total amortismente, Rapoarte (nota de închidere)'], + ['**Imobilizări corporale**', 'Introducere, Preluare din contabilitate, Vizualizare amortizare contabilă, ' + 'Vizualizare amortizare fiscală, Rapoarte, Bunuri de capital'], + ['**Imobilizări necorporale**', 'La fel ca la corporale, fără Bunuri de capital'], + ['**Imobilizări în curs**', 'Introducere, Preluare din contabilitate, Vizualizare, Rapoarte'], +], [3000, 6200]) +IMG(3, 'Bara verticală a paginii Imobilizări corporale') + +H2('Amortizare contabilă și amortizare fiscală') +P('Pentru imobilizările corporale și necorporale programul ține separat amortizarea contabilă și amortizarea ' + 'fiscală. Le vezi în două liste: „Vizualizare amortizare contabilă” și „Vizualizare amortizare fiscală”.') +BOX('**Toate operațiile se fac din „Vizualizare amortizare contabilă”.** Lista fiscală nu are butoanele ' + 'Operațiuni, Modifică, Copiază și Șterge.', 'info') + +H2('Meniul aplicației') +TABLE(['Meniu', 'Ce găsești'], [ + ['`Utile`', 'Intrare, Calculator, Notepad, Ieșire'], + ['`Inițializare → Serii`', 'Seriile de numere, inclusiv pentru numerele de inventar'], + ['`Ajutor`', 'Instrucțiuni de utilizare, Despre program, Jurnal modificări'], +], [3400, 5800]) + +# ---------------------------------------------------------------- Corporale +H1('Imobilizări corporale') + +H2('Introducere și preluare') +P('Pașii sunt în Scenariile 1 și 2. Câmpurile principale ale formularului:') +TABLE(['Câmp', 'Ce completezi'], [ + ['**Denumire, Cod, Cont**', 'Denumirea, codul din catalogul de imobilizări și contul contabil'], + ['**Nr. inventar**', 'Se propune din serie (`Inițializare → Serii`). La duplicat primești avertizare'], + ['**Document achiziție**', 'Numărul, data și valoarea de achiziție'], + ['**Nr. și data PIF**', 'Punerea în funcțiune'], + ['**DNS, Tip amortizare**', 'Durata normală de serviciu, în luni, și metoda de amortizare'], + ['**Amortizare și uzură precedentă**', 'Pentru mijloacele fixe parțial amortizate înainte de introducere'], + ['**Valoare reziduală**', 'Valoarea care nu se amortizează'], + ['**Gestiune, Secție, Responsabil, Lucrare**', 'Locul și persoana care răspunde de mijlocul fix'], + ['**Amort. max. deductibil**', 'Plafonul lunar deductibil (vezi Capcane frecvente)'], + ['**Bun de capital**', 'Urmărește ajustarea TVA dedus; cere cota TVA, prorata și baza TVA'], +], [3400, 5800]) +P('Grupa „01. Obiecte de inventar” permite urmărirea obiectelor de inventar amortizate într-o singură lună.') + +H2('Lista imobilizărilor') +P('Deschizi lista din `Imobilizări corporale → Vizualizare amortizare contabilă`. Bifezi criteriile ' + '(număr document, denumire, număr de inventar, gestiune, cont etc.), completezi valorile și apeși **Caută**. ' + '**Reset** golește criteriile. Click dreapta pe capul de tabel deschide filtrul rapid.') +TABLE(['Buton', 'Ce face'], [ + ['**Operațiuni**', 'Operațiile cu istoric (Scenariul 6)'], + ['**Istoric Mișcări**', 'Operațiile și ratele mijlocului fix. Adaugi, modifici sau ștergi o operație, inclusiv numărul și data documentului'], + ['**Modifică**', 'Atributele mijlocului fix: gestiune, responsabil, secție, lucrare etc.'], + ['**Copiază**', 'Mijloc fix nou cu datele celui selectat (Scenariul 7)'], + ['**Șterge**', 'Elimină mijlocul fix, după confirmare'], + ['**Verifică**', 'Compară valorile pe conturi cu contabilitatea'], + ['**Listare / Excel**', 'Rapoarte pentru selecția din listă / export în Excel'], +], [2600, 6600]) +P('Operațiuni și Istoric Mișcări apar doar dacă ai drept de modificare.') + +H2('Operații cu istoric') +P('Operațiile se aleg din **Operațiuni**, pe mijlocul fix selectat. Lista lor e în Scenariul 6.') +STEPS(['**Majorare:** introduci suma majorării; programul calculează valoarea nouă de intrare.', + '**Schimbare DNS + reevaluare:** modifici împreună valoarea de inventar, amortizarea totală, DNS, ' + 'uzura totală și valoarea reziduală.', + '**Conservare:** pentru un mijloc fix aflat în conservare, opțiunea devine „scoatere din conservare”.', + '**Ieșire din gestiune:** pentru un mijloc fix ieșit, opțiunea devine „intrare în gestiune”.']) +P('O operație greșită se corectează sau se șterge din **Istoric Mișcări**.') + +H2('Copiere imobilizare') +P('Butonul **Copiază** deschide formularul de introducere completat cu situația mijlocului fix din luna curentă:') +STEPS(['Denumirea, contul, codul, DNS, gestiunea, responsabilul și celelalte atribute.', + 'Valoarea, amortizarea precedentă și uzura, fără rata lunii curente.', + 'Numărul și data documentului de achiziție.']) +P('Toate câmpurile se pot modifica. Numărul de inventar se alocă la fel ca la o introducere nouă. Salvarea ' + 'creează un mijloc fix nou; sursa rămâne neschimbată. Butonul nu apare în lista fiscală.') + +H2('Verificare cu contabilitatea') +P('Butonul **Verifică** compară, pe fiecare cont, valoarea imobilizărilor și amortizarea cu soldurile din ' + 'ROACONT. Dacă valorile sunt egale, primești un mesaj de confirmare. Altfel vezi conturile și diferențele.') +NOTE('Opțiunea „IMOB_OBI” din Definirea Companiei stabilește dacă verificarea include și contul 303.') + +H2('Bunuri de capital') +P('Pentru imobilizările marcate „Bun de capital”, programul urmărește ajustarea TVA dedus la intrare, în ' + 'funcție de activitatea efectivă. Registrul se deschide din `Imobilizări corporale → Bunuri de capital`.') + +H2('Rapoarte') +TABLE(['Raport', 'Unde', 'Ce conține'], [ + ['Listare situație lunară', '`Rapoarte`', 'Situația lunii, ordonată după data și numărul PIF'], + ['Lista fișelor', '`Rapoarte`', 'Fișa fiecărui mijloc fix: standard sau cu lista operațiilor'], + ['Lista de inventar', '`Rapoarte`', 'Ordonată după număr de inventar, denumire sau data PIF'], + ['Evidența MF', '`Rapoarte`', 'Evidența mijloacelor fixe; se salvează și în format xls'], + ['Registrul numerelor de inventar', '`Rapoarte`', 'Numerele de inventar folosite'], + ['Situația reevaluărilor', '`Rapoarte`', 'Reevaluările și diferențele de valoare'], + ['Diferențe amortizare contabilă / fiscală', '`Rapoarte`', 'Listare sau Excel'], + ['Amortizări lunare, amortizare luna curentă', 'Lista → **Listare**', 'Pe interval sau pe luna curentă; grupat pe gestiune și cont sau pe cont'], + ['Situația reevaluărilor / majorărilor / modificărilor', 'Lista → **Listare**', 'Pentru selecție sau pentru toate imobilizările'], + ['Proces-verbal de casare', 'Lista → **Listare**', 'Câte un proces-verbal pentru fiecare document de casare'], +], [3300, 2000, 3900]) + +# ---------------------------------------------------------------- Necorporale +H1('Imobilizări necorporale') +P('Pagina funcționează la fel ca Imobilizări corporale: introducere, preluare, lista contabilă și fiscală, ' + 'operații, copiere, verificare și rapoarte. Diferențele:') +TABLE(['Element', 'Diferență'], [ + ['Bunuri de capital', 'Nu există în bara verticală'], + ['Lista fișelor', 'O singură variantă'], + ['Nota de închidere', '`Situații analitice → Rapoarte → Închidere imobilizări necorporale`'], +], [3000, 6200]) + +# ---------------------------------------------------------------- In curs +H1('Imobilizări în curs') + +H2('Introducere și preluare') +P('Imobilizările în curs se introduc din `Imobilizări în curs → Introducere` sau se preiau din contabilitate. ' + 'Completezi denumirea, contul și contul analitic, numărul de inventar, documentul și valoarea de achiziție, ' + 'gestiunea, responsabilul, secția și lucrarea.') + +H2('Lista imobilizărilor în curs') +P('Deschizi lista din `Imobilizări în curs → Vizualizare`. Culoarea rândului arată starea:') +TABLE(['Culoare', 'Înseamnă'], [ + ['Negru', 'Imobilizare netransformată'], + ['Verde', 'Transformată parțial'], + ['Albastru', 'Transformată integral (valoare rămasă 0)'], +], [2600, 6600]) +TABLE(['Buton', 'Ce face'], [ + ['**Operațiuni**', 'Transformări în mijloace fixe și adăugări la mijloace fixe existente'], + ['**Istoric Mișcări**', 'Adaugi, modifici sau ștergi operații. Așa ajustezi valoarea rămasă'], + ['**Modifică / Șterge**', 'Modifici sau elimini imobilizarea în curs'], + ['**Verifică**', 'Compară doar valoarea de inventar cu soldul din balanță'], + ['**Listare / Excel**', 'Listare simplă sau grupată pe lucrări / export în Excel'], +], [2600, 6600]) + +H2('Transformare în mijloc fix') +P('Pașii sunt în Scenariul 4. Bifezi „Ales” la una sau mai multe imobilizări în curs. „Valoare reținută” ' + 'trebuie să fie cel mult egală cu valoarea rămasă. Ce nu transformi rămâne în curs.') +P('Mijlocul fix nou apare în lista imobilizărilor corporale sau necorporale, cu valoarea egală cu suma ' + 'valorilor reținute.') + +H2('Transformare în N mijloace fixe') +P('Creezi N mijloace fixe identice dintr-o singură imobilizare în curs. De exemplu, 10 laptopuri cumpărate pe ' + 'aceeași factură.') +STEPS(['Bifezi „Ales” la **o singură** imobilizare în curs.', + 'Apeși **Operațiuni** → „Transformare în N imobilizări corporale” (sau necorporale).', + 'Introduci numărul de mijloace fixe, între 2 și 999.', + 'Confirmi împărțirea: valoarea totală, numărul de bucăți și valoarea pe bucată.', + 'Completezi formularul o singură dată. Titlul arată „Transformare în N mijloace fixe — valoare pe bucată”.', + 'Validezi cu ✓ și alegi cum se dau numerele de inventar.']) +TABLE(['Regulă', 'Cum funcționează'], [ + ['Valoarea', 'Se împarte egal la N. Ultima bucată ia restul, ca suma să fie exactă'], + ['Denumirea', 'Primește sufixul „01” … „N”, de exemplu „Laptop 01”, „Laptop 02”'], + ['Nr. inventar, cu serie configurată', '**Da** = numere diferite, alocate din serie. **Nu** = același număr pentru toate bucățile'], + ['Nr. inventar, fără serie', 'Numere consecutive, începând cu numărul din formular'], + ['La final', 'Mesaj cu numărul de mijloace fixe create și numerele de inventar'], +], [3300, 5900]) +BOX('**Dacă o bucată dă eroare, nu se salvează nimic.** Toate cele N mijloace fixe se creează într-o singură ' + 'tranzacție. La eroare primești mesajul „Eroare la MF k din N”, iar imobilizarea în curs rămâne neschimbată.') + +H2('Adăugare la un mijloc fix existent') +P('„Adăugare la imobilizare corporală / necorporală” face o majorare pe un mijloc fix existent și scade ' + 'valoarea imobilizării în curs.') +BOX('**Anularea unei adăugări:** ștergi din Istoric Mișcări atât majorarea de pe mijlocul fix, cât și ' + 'operațiile de transformare de pe imobilizările în curs.', 'info') + +H2('Rapoarte') +TABLE(['Raport', 'Ce conține'], [ + ['Lista imobilizărilor în curs', 'Listare simplă sau grupată pe lucrări'], + ['Registrul numerelor de inventar', 'Numerele de inventar ale imobilizărilor în curs'], + ['Situația reevaluărilor', 'Reevaluările imobilizărilor în curs'], +], [4000, 5200]) + +# ---------------------------------------------------------------- Inchiderea lunii +H1('Închiderea lunii și trecerea la luna următoare') +STEPS(['Verifici că toate intrările, operațiile și ieșirile lunii sunt introduse.', + 'Apeși **Verifică** în lista imobilizărilor corporale, necorporale și în curs. Rezolvi diferențele.', + 'Listezi nota de închidere: `Situații analitice → Rapoarte → Închidere imobilizări corporale` ' + '(apoi necorporale). Programul întreabă dacă defalcă nota pe secție; dacă folosești câmpul ' + '„Lucrare”, și pe lucrare.', + 'Dacă nu lucrezi cu ROACONT, introduci nota manual în contabilitate.', + 'Pentru luna următoare, dai **click dreapta pe imaginea de fundal**. În formularul „Alegeți firma / ' + 'anul / luna” alegi **Luna** nouă (și **Anul**, la trecerea în anul următor) și confirmi cu **Terminare**.']) +BOX('**Nota de închidere separă amortizarea deductibilă de cea nedeductibilă.** Pentru mijloacele fixe cu ' + '„Amort. max. deductibil” (de exemplu autoturismele din 2133), partea peste plafon apare pe rând separat.', 'info') +BOX('**Luna blocată nu mai acceptă introduceri.** Dacă luna este închisă, programul afișează „Luna este ' + 'blocată!” și nu permite introduceri sau transformări.') + +# ---------------------------------------------------------------- Rezumat, FAQ, istoric +H1('Rapoarte disponibile — Rezumat') +TABLE(['Categorie', 'Rapoarte disponibile'], [ + ['**Amortizare**', 'Amortizări lunare, amortizare luna curentă (pe gestiune și cont, pe cont), rulaj și total amortismente'], + ['**Închidere**', 'Nota de închidere a amortizării, corporale și necorporale'], + ['**Evidență**', 'Situație lunară, lista fișelor, lista de inventar, evidența MF'], + ['**Numere de inventar**', 'Registrul numerelor de inventar, pe fiecare pagină'], + ['**Operații**', 'Situația reevaluărilor, majorărilor și modificărilor; istoric operații'], + ['**Contabil / fiscal**', 'Diferențe între amortizarea contabilă și cea fiscală'], + ['**Ieșiri**', 'Proces-verbal de casare'], + ['**În curs**', 'Lista imobilizărilor în curs, simplă sau grupată pe lucrări'], +], [2800, 6400]) + +H1('Întrebări frecvente (FAQ)') +H2('Î: Am introdus greșit o operație. Cum o anulez?') +P('**R:** Selectezi mijlocul fix în „Vizualizare amortizare contabilă” și apeși **Istoric Mișcări**. Modifici ' + 'sau ștergi operația. Dacă o ștergi, o ștergi și din „Vizualizare amortizare fiscală”.') +H2('Î: De ce nu văd butoanele Operațiuni și Istoric Mișcări?') +P('**R:** Apar doar dacă ai drept de modificare. În lista fiscală, Operațiuni nu apare deloc.') +H2('Î: Transformarea în N mijloace fixe a dat eroare. Ce s-a salvat?') +P('**R:** Nimic. Imobilizarea în curs rămâne neschimbată. Corectezi cauza și reiei transformarea.') +H2('Î: Cum schimb firma, anul sau luna contabilă?') +P('**R:** Dai click dreapta pe imaginea de fundal a aplicației. Se deschide formularul „Alegeți firma / anul / ' + 'luna”. Alegi **Firma**, **Anul** și **Luna** și confirmi cu **Terminare** (Ctrl+F).') +H2('Î: Pot crea mai multe copii după același mijloc fix?') +P('**R:** Da. După fiecare salvare programul întreabă dacă mai creezi o copie după același mijloc fix.') + +H1('Istoric versiuni') +P('**v. 01.10.2026** — Manual refăcut în format nou; adăugate Copiere și Transformare în N MF; schimbarea ' + 'firmei/lunii prin click dreapta pe fundal; plafonul de 1.500 lei verificat pentru 2026; pragul fiscal de 5.000 lei pentru mijloace fixe ' + '(OUG 8/2026).') +P('**v. 07.2021** — Versiunea anterioară, în format vechi.') +EMPTY() +para('footer', 'Manual generat pe baza documentației tehnice ROAIMOB') + +doc.core_properties.title = 'Manual ROAIMOB' +doc.save(OUT) +print('OK', len(IMG_LOG), 'imagini') diff --git a/manualROAIMOB.doc b/manualROAIMOB.doc deleted file mode 100644 index 18462b8..0000000 Binary files a/manualROAIMOB.doc and /dev/null differ diff --git a/manualROAIMOB.docx b/manualROAIMOB.docx new file mode 100644 index 0000000..ed98574 Binary files /dev/null and b/manualROAIMOB.docx differ diff --git a/manualROAIMOB.pdf b/manualROAIMOB.pdf index ece41a9..01a8acd 100644 Binary files a/manualROAIMOB.pdf and b/manualROAIMOB.pdf differ