Corretta contabilizzazione movimenti di regolarizzazione IVA (reverse charge)

git-svn-id: svn://10.65.10.50/branches/R_10_00@22898 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2013-09-11 09:52:54 +00:00
parent 4acae88bb6
commit 07764a97e8
7 changed files with 181 additions and 25 deletions

View File

@ -88,7 +88,7 @@ bool TCopia_interattiva::load()
TConfig ini(_ini_name, "Transaction");
const char provv = ini.get_char("ProvvOut");
const int anno = ini.get_int("AnnoOut");
const TString16 codnum(ini.get("CodNumOut"));
const TString4 codnum = ini.get("CodNumOut");
const long numdoc = ini.get_long("NDocOut");
const TElaborazione_esterna ee(ini.get("Action"));

View File

@ -395,25 +395,33 @@ int TLista_clifo::add(long cod)
// TParametri_elaborazione
///////////////////////////////////////////////////////////
void TParametri_elaborazione::set(const char * name, const char * val)
void TParametri_elaborazione::set(const char* name, const char* val)
{
_par.add(name, new TString(val), TRUE);
_par.add(name, new TString(val), true);
}
const TString & TParametri_elaborazione::get(const char * name) const
{
TObject *val = _par.objptr(name);
if (val == NULL)
return EMPTY_STRING;
else
return (const TString &) *val;
const TObject* val = _par.objptr(name);
return val ? *(const TString*)val : EMPTY_STRING;
}
///////////////////////////////////////////////////////////
// TElaborazione
///////////////////////////////////////////////////////////
const TString& TElaborazione::tipo_iniziale(int i) const
{
if (i >= 0 && i < 10)
{
const TString& t = get("S2").mid(i*4, 4);
if (t.full())
return ((TString&)t).rtrim();
}
return EMPTY_STRING;
}
bool TElaborazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo)
{
SORRY_BOX();
@ -430,17 +438,13 @@ TElaborazione::TElaborazione(const char* cod) : TRectype(LF_TABCOM)
int TElaborazione::read(const char* cod)
{
int err = NOERR;
TRectype::operator=(cache().get("%ELD", cod));
if (empty())
{
yesnofatal_box("Codice elaborazione non valido: %s", cod);
err = _iskeynotfound;
}
return err;
}
bool TElaborazione::is_document_ok(const TRectype & doc) const
bool TElaborazione::is_document_ok(const TRectype& doc) const
{
bool ok = false;
const TString4 codnum(doc.get(DOC_CODNUM));

View File

@ -189,12 +189,12 @@ public:
bool calcola_scarti() const { return get_bool("B11"); }
bool reload_prices() const { return get_bool("B13"); }
bool reload_descriptions() const { return reload_prices() && get_bool("B14"); }
const TString & num_riferimenti_in() const { return get("S11"); }
const TString& num_riferimenti_in() const { return get("S11"); }
int intestazioni_sheet() const { return get_int("I1"); }
const TString& codice_numerazione_iniziale() const { return get("S5"); }
const TString tipo_iniziale(int i) const { return get("S2").smid(i*4, 4).rtrim(); }
const TString& tipo_iniziale(int i) const;
const char stato_iniziale(int i) const { return i < 5 ? get("S7")[i] : get("S10")[i - 5]; }
const TString& tipo_finale() const { return get("S8"); }
const TString& stato_finale_doc_iniziale() const { return get("S4"); }
@ -502,6 +502,7 @@ protected:
bool valid_row_type(const char* rt) const;
virtual void export_movimento(TMovimentoPN_VE & mov, TViswin & v) {};
virtual bool exporting() { return false; }
bool dispatch_transaction(TMovimentoPN& movimento, const char* action) const;
public:
// Cambia lo stato del documento

View File

@ -16,8 +16,10 @@
#include <dongle.h>
#include <execp.h>
#include <postman.h>
#include <printer.h>
#include <viswin.h>
#include <utility.h>
void TMovimentoPN_VE::destroy_iva_row(int i)
{
@ -3013,6 +3015,74 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc, bool recontabiliz
return _error;
}
static void rec2ini(const TRectype& rec, TConfig& ini)
{
for (int i = 0; i < rec.items(); i++)
{
const char* fname = rec.fieldname(i);
const TString& val = rec.get(fname);
if (val.full())
{
if (val.find(' ') >= 0 && rec.type(fname) == _alfafld)
{
TString quoted; quoted << '"' << val << '"';
ini.set(fname, quoted);
}
else
ini.set(fname, val);
}
}
}
bool TContabilizzazione::dispatch_transaction(TMovimentoPN& movimento, const char* action) const
{
const TRectype& head = movimento.curr();
bool done = ::can_dispatch_transaction(head);
if (!done)
return false;
TFilename tmpini; tmpini.temp("cnt", "ini");
if (done) // dummy test
{
TConfig ini(tmpini, "Transaction");
ini.set("Firm", prefix().get_codditta(), "Transaction");
ini.set("User", user());
ini.set("HostName", get_hostname());
ini.set("Action", action);
ini.set("Mode", "Auto");
int year, release, tag, patch;
if (TApplication::get_version_info(year, release, tag, patch))
{
TString80 ver;
ver.format("%d %d.%d-%d", year, release, tag, patch);
ini.set("Version", ver);
}
TString16 para; para << head.num();
ini.set_paragraph(para);
rec2ini(head, ini);
for (int i = 0; i < movimento.cg_items(); i++)
{
para.format("%d,%d", LF_RMOV, i+1);
ini.set_paragraph(para);
rec2ini(movimento.cg(i), ini);
}
for (int i = 0; i < movimento.iva_items(); i++)
{
para.format("%d,%d", LF_RMOVIVA, i+1);
ini.set_paragraph(para);
rec2ini(movimento.iva(i), ini);
}
}
done = ::dispatch_transaction(head, tmpini);
tmpini.fremove();
return done;
}
error_type TContabilizzazione::write_all(TDocumento& doc, TMovimentoPN_VE & movimento)
// Scrive il movimento e le scadenze, gestendo la rinumerazione se il movimento e' gia presente
{
@ -3054,9 +3124,15 @@ error_type TContabilizzazione::write_all(TDocumento& doc, TMovimentoPN_VE & movi
if (oldmov.read() == NOERR)
aggiorna_saldi(saldo, oldmov, false); // Leggo i vecchi saldi
err = movimento.rewrite();
if (err == NOERR)
dispatch_transaction(movimento, "MODIFY");
}
else
{
err = movimento.write();
if (err == NOERR)
dispatch_transaction(movimento, "INSERT");
}
if (err != NOERR)
{
error_box("*** Errore %d scrivendo il movimento contabile %ld.", err, numreg);
@ -3146,8 +3222,10 @@ error_type TContabilizzazione::write_all_re(TDocumento& doc, TMovimentoPN_VE & m
error_box("*** Errore %d scrivendo il movimento contabile %ld.", err, numreg);
return generic_error;
}
// Aggiorno subito i saldi
aggiorna_saldi(saldo, movimento, true);
dispatch_transaction(movimento, old_numreg > 0 ? "MODIFY": "INSERT");
if (good() && (dongle().active(CMAUT) || dongle().active(CAAUT)))
write_anal(doc, movimento);
@ -3376,7 +3454,7 @@ error_type TContabilizzazione::write_pagamento_anticipo(TDocumento& doc)
const TRectype& mov = _anticipo->curr();
const int anno = mov.get_date(MOV_DATAREG).year();
const long numreg = mov.get_long(MOV_NUMREG);
const TString8 numpart(mov.get(MOV_NUMDOC)); // Nessun controllo se prot.iva o numdoc xche' tanto proviene dal mov precedentemente scritto
const TString8 numpart = mov.get(MOV_NUMDOC); // Nessun controllo se prot.iva o numdoc xche' tanto proviene dal mov precedentemente scritto
TPartita* partita = new TPartita(_co_cliente,anno,numpart);
partita->allinea();
@ -3587,9 +3665,15 @@ error_type TContabilizzazione::write_anticipo(TDocumento& doc)
if (oldant.read() == NOERR)
aggiorna_saldi(saldo, oldant, false);
err = _anticipo->rewrite();
if (err == NOERR)
dispatch_transaction(*_anticipo, "MODIFY");
}
else
{
err = _anticipo->write();
if (err == NOERR)
dispatch_transaction(*_anticipo, "INSERT");
}
if (err != NOERR)
{
error_box("Errore %d scrivendo il movimento di anticipo pagamento %ld.",
@ -3597,6 +3681,8 @@ error_type TContabilizzazione::write_anticipo(TDocumento& doc)
return generic_error;
}
aggiorna_saldi(saldo, *_anticipo, true);
}
delete _anticipo;
_anticipo = NULL;
@ -4109,7 +4195,12 @@ error_type TContabilizzazione::write_regolarizzazione(const TDocumento& doc, TMo
}
}
const TString4 codcaus = _caus->causale_reg_iva();
const TDate datareg = _movimento->curr().get(MOV_DATAREG);
const TCausale caus(codcaus, datareg.year());
error_type error = no_error;
long protiva = 0;
if (do_insert)
{
error = get_next_reg_num(nr);
@ -4119,9 +4210,6 @@ error_type TContabilizzazione::write_regolarizzazione(const TDocumento& doc, TMo
const TCli_for& clifor = doc.clifor();
const TString4 codcaus = _caus->causale_reg_iva();
const TDate datareg = _movimento->curr().get(MOV_DATAREG);
const TCausale caus(codcaus, datareg.year());
TRectype& head = mov.curr();
head.put(MOV_NUMREG,nr);
@ -4131,19 +4219,22 @@ error_type TContabilizzazione::write_regolarizzazione(const TDocumento& doc, TMo
{
mov.read(_isequal, _lock);
aggiorna_saldi(saldo, mov, false);
protiva = head.get_long(MOV_PROTIVA);
}
if (protiva <= 0)
protiva = caus.reg().protocol()+1;
head.put(MOV_DATAREG, datareg);
head.put(MOV_DATACOMP, _movimento->curr().get(MOV_DATACOMP));
head.put(MOV_ANNOES, _movimento->curr().get(MOV_ANNOES));
head.put(MOV_ANNOIVA, _movimento->curr().get(MOV_ANNOIVA));
head.put(MOV_REG, caus.reg().name());
head.put(MOV_NUMDOC, doc.get(DOC_NDOC));
head.put(MOV_DATADOC, doc.get(DOC_DATADOC));
head.put(MOV_NUMDOC, doc.get(DOC_NUMDOCRIF));
head.put(MOV_DATADOC, doc.get(DOC_DATADOCRIF));
head.put(MOV_CODCAUS, caus.codice());
head.put(MOV_TIPODOC, caus.tipo_doc());
head.put(MOV_PROTIVA, caus.reg().protocol());
head.put(MOV_PROTIVA, protiva);
TString descr;
descr << TR("Regolarizzazione ") << doc.get(DOC_CODNUM) << '/' << doc.numero() << TR(" del ") << doc.get(DOC_DATADOC);
@ -4171,6 +4262,7 @@ error_type TContabilizzazione::write_regolarizzazione(const TDocumento& doc, TMo
if (err == NOERR)
{
aggiorna_saldi(saldo, mov, true);
dispatch_transaction(mov, do_insert ? "INSERT" : "MODIFY");
}
else
{

View File

@ -1787,7 +1787,15 @@ void TDocumento_mask::update_giacenza()
}
}
}
const TString& annoes = get(F_ANNO);
TString4 annoes = get(F_ANNO);
const TDate datadoc = get(F_DATADOC);
if (datadoc.ok())
{
TEsercizi_contabili esc;
annoes.format("%04d", esc.date2esc(datadoc));
}
TArticolo_giacenza& art = cached_article_balances(codart);
giac = art.disponibilita(annoes, codmag, livello, TRUE);

View File

@ -21,6 +21,11 @@
#define ATR_CODART 123
#define ATR_DESCART 124
#define ATR_CODARTDISP 125
#define ATR_DESCARTDISP 126
#define ATR_TIPORADISP 127
#define ATR_PREZZODISP 128
#define ATR_CDC_V1 211
#define ATR_CDC_V2 212
#define ATR_CDC_V3 213

View File

@ -129,7 +129,7 @@ BEGIN
OUTPUT ATR_DESCART DESCR
CHECKTYPE NORMAL
FLAGS "U"
FIELD S2
FIELD S2[1,20]
END
STRING ATR_DESCART 50 34
@ -245,6 +245,52 @@ BEGIN
ADD RUN CG0 -0
END
STRING ATR_CODARTDISP 20
BEGIN
PROMPT 2 15 "Art. dispon. "
COPY USE ATR_CODART
INPUT CODART ATR_CODARTDISP
COPY DISPLAY ATR_CODART
OUTPUT ATR_CODARTDISP CODART
OUTPUT ATR_DESCARTDISP DESCR
CHECKTYPE NORMAL
FLAGS "U"
FIELD S2[21,40]
MODULE ci
END
STRING ATR_DESCARTDISP 50 34
BEGIN
PROMPT 40 15 ""
COPY USE ATR_DESCART
INPUT DESCR ATR_DESCARTDISP
COPY DISPLAY ATR_DESCART
COPY OUTPUT ATR_CODARTDISP
CHECKTYPE NORMAL
FLAGS "U"
MODULE ci
END
STRING ATR_TIPORADISP 2
BEGIN
PROMPT 2 16 "Tipo ora "
USE &CIORE
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT ATR_TIPORADISP CODTAB
CHECKTYPE NORMAL
MODULE ci
FIELD S9
END
CURRENCY ATR_PREZZODISP 12
BEGIN
PROMPT 22 16 "Prezzo disponibilità "
FLAGS "U"
FIELD R11
MODULE ci
END
ENDPAGE
PAGE "Analitica" 11 60 14