Patch level :10.0
Files correlati :lv2.exe Ricompilazione Demo : [ ] Commento : Implementata nella fatturazione, la gestione del tipo canone e relativi flag in testata git-svn-id: svn://10.65.10.50/trunk@19009 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
92c05aabaa
commit
5508c0a2a1
579
lv/lv2500.cpp
579
lv/lv2500.cpp
@ -129,261 +129,392 @@ void TFatturazione_lavanderie::post_process_output(TLista_documenti& doc_out)
|
||||
//flag per il calcolo sul valore convenzionale e sul fisso per dotazione iniziale
|
||||
bool valconvcli = false;
|
||||
bool fixdotin = false;
|
||||
bool stmpelcons = contr.get_bool(LVCONDV_ELCONS);
|
||||
bool stmpripcons = contr.get_bool(LVCONDV_RIPCONS);
|
||||
bool elcons = contr.get_bool(LVCONDV_ELCONS);
|
||||
bool rifbol = contr.get_bool(LVCONDV_RIFBOL);
|
||||
|
||||
if (doc.physical_rows()>0 && doc[1].is_descrizione())
|
||||
{
|
||||
if (stmpelcons)
|
||||
if (elcons)
|
||||
{
|
||||
TRiga_documento& rout = doc[1];
|
||||
rout.put(RDOC_DESCR, "COME DA ELENCO CONSEGNE");
|
||||
rout.put(RDOC_DESCLUNGA, false);
|
||||
rout.put(RDOC_DESCEST, "");
|
||||
}
|
||||
|
||||
if (!stmpelcons && stmpripcons)
|
||||
else
|
||||
if (!rifbol)
|
||||
doc.destroy_row(1,true);
|
||||
}
|
||||
|
||||
//per ogni documento, scorro tutte le sue righe
|
||||
for (int i = 1; i <= doc.physical_rows(); i++)
|
||||
{
|
||||
TRiga_documento& rout = doc[i];
|
||||
|
||||
const TString80 codart = rout.get(RDOC_CODART);
|
||||
//leggo dalla riga del contratto di questo articolo il tipo dotazione e
|
||||
//la scelta per la % sul val.conv su articolo <A> o cliente <C>
|
||||
const TRectype& rcont=contr.row(codart);
|
||||
const TString4 tipodot = rcont.get(LVRCONDV_NOLCIC);
|
||||
const TString4 artcli = rcont.get(LVRCONDV_VCARTCLI);
|
||||
real dot;
|
||||
const int annoes = _data_elab.year();
|
||||
//instanzio il TArticolo_lavanderia
|
||||
TArticolo_lavanderie artlav(codart, 'C', clifo, indsped);
|
||||
const bool ragart = contr.get_bool(LVCONDV_RAGART); // leggo il flag di testata raggruppa su unico articolo
|
||||
const int tipocan = contr.get_int(LVCONDV_TIPOCAN); // leggo il tipo canone
|
||||
|
||||
if (ragart)
|
||||
{
|
||||
real totmerc;
|
||||
const int rows=doc.physical_rows();
|
||||
|
||||
//cerco la giacenza per articolo dell'articolo esaminato
|
||||
const int index = artlav.find_clifomag(annoes);
|
||||
//se lo trovo e se il tipo dotazione è iniziale 'I', allora leggo la dotazione iniziale
|
||||
//dalle giacenze articolo per cliente, altrimenti leggo la dotazione odierna
|
||||
if (index >=0)
|
||||
{
|
||||
if (tipodot=="I")
|
||||
dot=artlav.clifomag(annoes)[index].get_real("DOTIN");
|
||||
else
|
||||
dot=artlav.clifomag(annoes)[index].get_real("DOTOD");
|
||||
}
|
||||
|
||||
//leggo dalla riga contratto il tipo forfait
|
||||
const int tipoforf = rcont.get_int(LVRCONDV_TIPOFORF);
|
||||
|
||||
switch (tipoforf)
|
||||
{
|
||||
case 0: //forfait = NESSUNO
|
||||
break;
|
||||
case 1: //forfait = A VALORE FISSO
|
||||
{
|
||||
rout.put(RDOC_QTA, UNO); //qta fissa a UNO
|
||||
rout.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_IMPFISART)); //prezzo letto dalla riga contratto
|
||||
// gestione in base codice per valore fisso ??? tolta la scelta dell'articolo o del cliente
|
||||
}
|
||||
break;
|
||||
case 2: //forfait = NOLO
|
||||
{
|
||||
//aggiungo una riga tipo merce, che contiene tutti i dati della riga del documento
|
||||
//di partenza, poi costruisco la descrizione in base alla periodicità di fatturazione,
|
||||
//metto la qta uguale alla dotazione che ho appena letto
|
||||
//e prendo il prezzo nolo dalla riga contratto
|
||||
TRiga_documento& nolorow = doc.insert_row(++i, "01");
|
||||
doc.copy_data(nolorow, rout);
|
||||
TString80 descr("Nolo");
|
||||
const int contrper = contr.get_int(LVCONDV_PERFAT);
|
||||
for (int i=1; i<=rows; i++) //calcolo totale merce
|
||||
{
|
||||
const TRiga_documento& riga = doc[i];
|
||||
if (riga.is_merce())
|
||||
totmerc += riga.importo(true,false);
|
||||
}
|
||||
|
||||
switch (contrper)
|
||||
{
|
||||
case 0:
|
||||
descr << " per il giorno";
|
||||
break;
|
||||
case 1:
|
||||
descr << " per la settimana";
|
||||
break;
|
||||
case 2:
|
||||
descr << " per la quindicina";
|
||||
break;
|
||||
case 3:
|
||||
descr << " per il mese";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
nolorow.put(RDOC_DESCR,descr);
|
||||
const int rigamerce = doc[1].is_descrizione()?2:1;
|
||||
|
||||
nolorow.put(RDOC_QTA, dot);
|
||||
nolorow.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_PREZNOL));
|
||||
}
|
||||
break;
|
||||
case 3: //forfait = CICLAGGIO
|
||||
{
|
||||
//leggo la quantità consegnata e calcolo consumo e ciclaggio secondo le formule
|
||||
//CONSUMO = QTA * PREZZO(dalla riga documento)
|
||||
//CLICLAGGIO = DOT * PREZZO(dalla riga contratto) * MINIMO CICLAGGIO
|
||||
const real qta = rout.get_real(RDOC_QTA);
|
||||
const real consumo = qta * rout.get_real(RDOC_PREZZO);
|
||||
const real ciclaggio = dot * rcont.get_real(LVRCONDV_PREZZO) * rcont.get_real(LVRCONDV_MINCIC);
|
||||
//se il consumo è minore del ciclaggio, allora
|
||||
if (consumo < ciclaggio)
|
||||
for (int i=rigamerce; i<=rows; i++)
|
||||
doc.destroy_row(i);
|
||||
|
||||
TRiga_documento& riga=doc.new_row("01");
|
||||
|
||||
const TString80 codartcfg = ini_get_int(CONFIG_DITTA, "lv", "Codartcafix");
|
||||
|
||||
// istanzio una token string e poi una cache per estrarre l'unità di misura dell articolo in configurazione da UMART
|
||||
TToken_string key;
|
||||
key.add(codartcfg);
|
||||
key.add(1);
|
||||
const TRectype& umart = cache().get(LF_UMART,key);
|
||||
const TString4 umcodart = umart.get(UMART_UM);
|
||||
|
||||
/* estraggo il codice IVA istanziando in primis una cache su CFVEN per analizzare il codice esenzione iva
|
||||
del cliente in questione. Se è >0 imposto il codiva a tale valore, altrimenti se è uguale a 0 istanzio
|
||||
un altra cache su ANAMAG e imposto il codiva uguale al codice iva dell articolo in questione */
|
||||
key = doc.get(DOC_TIPOCF);
|
||||
key.add(clifo);
|
||||
const TRectype& cfven = cache().get(LF_CFVEN,key);
|
||||
TString8 codiva = cfven.get(CFV_ASSFIS);
|
||||
|
||||
if (codiva.blank())
|
||||
{
|
||||
const TRectype& anamag = cache().get(LF_ANAMAG,codartcfg);
|
||||
codiva = anamag.get(ANAMAG_CODIVA);
|
||||
}
|
||||
|
||||
riga.put(RDOC_QTA,UNO);
|
||||
riga.put(RDOC_UMQTA,umcodart);
|
||||
riga.put(RDOC_PREZZO,totmerc);
|
||||
riga.put(RDOC_CODART,codartcfg);
|
||||
riga.put(RDOC_CODIVA,codiva);
|
||||
|
||||
break;
|
||||
}
|
||||
else
|
||||
if (tipocan==1) //se è selezionato tipo canone = importo fisso
|
||||
{
|
||||
// estraggo il canone fisso e l'articolo in configurazione
|
||||
const real canfis=contr.get_real(LVCONDV_CANFIX);
|
||||
const TString80 codartcfg = ini_get_int(CONFIG_DITTA, "lv", "Codartfix");
|
||||
|
||||
// istanzio una token string e poi una cache per estrarre l'unità di misura dell articolo in configurazione da UMART
|
||||
TToken_string key;
|
||||
key.add(codartcfg);
|
||||
key.add(1);
|
||||
const TRectype& umart = cache().get(LF_UMART,key);
|
||||
const TString4 umcodart = umart.get(UMART_UM);
|
||||
|
||||
/* estraggo il codice IVA istanziando in primis una cache su CFVEN per analizzare il codice esenzione iva
|
||||
del cliente in questione. Se è >0 imposto il codiva a tale valore, altrimenti se è uguale a 0 istanzio
|
||||
un altra cache su ANAMAG e imposto il codiva uguale al codice iva dell articolo in questione */
|
||||
key = doc.get(DOC_TIPOCF);
|
||||
key.add(clifo);
|
||||
const TRectype& cfven = cache().get(LF_CFVEN,key);
|
||||
TString8 codiva = cfven.get(CFV_ASSFIS);
|
||||
|
||||
if (codiva.blank())
|
||||
{
|
||||
const TRectype& anamag = cache().get(LF_ANAMAG,codartcfg);
|
||||
codiva = anamag.get(ANAMAG_CODIVA);
|
||||
}
|
||||
|
||||
const int rigamerce = doc[1].is_descrizione()?2:1;
|
||||
|
||||
TRiga_documento& fixrow=doc.insert_row(rigamerce, "01"); // creo una nuova riga in cima al documento e imposto i valori appena estratti
|
||||
|
||||
fixrow.put(RDOC_QTA,UNO);
|
||||
fixrow.put(RDOC_UMQTA,umcodart);
|
||||
fixrow.put(RDOC_PREZZO,canfis);
|
||||
fixrow.put(RDOC_CODART,codartcfg);
|
||||
fixrow.put(RDOC_CODIVA,codiva);
|
||||
|
||||
int tipocanfix = contr.get_int(LVCONDV_CANFIX);
|
||||
|
||||
const int rows = doc.physical_rows();
|
||||
|
||||
switch (tipocanfix)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
//leggo il flag del tipo ciclaggio
|
||||
const bool cicl2rig = contr.get_bool(LVCONDV_CICLAGGIO);
|
||||
//calcolo il valore cicl secondo la formula
|
||||
//CICL = MINIMO CICLAGGIO * DOT
|
||||
const real cicl = rcont.get_real(LVRCONDV_MINCIC) * dot;
|
||||
//se il ciclaggio è su due linee, allora aggiungo una riga merce, per pareggiare il minimo ciclaggio
|
||||
//che ha come quantità la differenza tra la quantità di minimo cilcaggio
|
||||
//e la quantità effettivamente consegnata e come prezzo il prezzo preso dalla riga contratto;
|
||||
//altimenti correggo quantità e prezzo direttamente sulla riga documento che sto analizzando
|
||||
if (cicl2rig)
|
||||
for (int k = rigamerce+1; k <= rows; k++)
|
||||
{
|
||||
TRiga_documento& congrow = doc.insert_row(++i, "01");
|
||||
doc.copy_data(congrow,rout);
|
||||
congrow.put(RDOC_DESCR,"Pareggio minimo ciclaggio");
|
||||
congrow.put(RDOC_QTA, cicl - qta);
|
||||
congrow.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_PREZZO));
|
||||
}
|
||||
else
|
||||
{
|
||||
rout.put(RDOC_QTA, cicl);
|
||||
rout.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_PREZZO));
|
||||
doc.destroy_row(k);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4: //forfait = % SUL VALORE CONVENZIONALE
|
||||
{
|
||||
//leggo dalla riga contratto la % sul val.conv su articolo <A> o cliente <C>
|
||||
const char tipovalconv = rcont.get_char(LVRCONDV_VCARTCLI);
|
||||
//se la percentuale sul valore convenzionale è sull'articolo, allora:
|
||||
if (tipovalconv == 'A')
|
||||
break;
|
||||
case 1:
|
||||
{
|
||||
//leggo la quantità consegnata e calcolo consumo e importo convenzionale secondo le formule
|
||||
//CONSUMO = QTA * PREZZO(dalla riga documento)
|
||||
//IMPCONV = DOT * PREZZO(dalla riga contratto) * PERCENTUALE DI FORFAIT CLIENTE
|
||||
const real qta = rout.get_real(RDOC_QTA);
|
||||
const real consumo = qta * rout.get_real(RDOC_PREZZO);
|
||||
const real impconv = dot * rcont.get_real(LVRCONDV_VALCONV) * rcont.get_real(LVRCONDV_FORFPERCL) / 100;
|
||||
for (int k = rigamerce+1; k <= rows; k++)
|
||||
{
|
||||
TRiga_documento& rout = doc[k];
|
||||
rout.zero(RDOC_PREZZO);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
for (int k = rigamerce+1; k <= rows; k++)
|
||||
{
|
||||
TRiga_documento& rout = doc[k];
|
||||
rout.zero(RDOC_PREZZO);
|
||||
rout.zero(RDOC_QTA);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
else // se il tipo canone è impostato a nessuno o % sul valore convenzionale per cliente vado in ambedue i casi ad eseguire il ciclo che analizza i tipi forfait
|
||||
{
|
||||
//per ogni documento, scorro tutte le sue righe
|
||||
for (int i = 1; i <= doc.physical_rows(); i++)
|
||||
{
|
||||
TRiga_documento& rout = doc[i];
|
||||
|
||||
const TString80 codart = rout.get(RDOC_CODART);
|
||||
//leggo dalla riga del contratto di questo articolo il tipo dotazione e
|
||||
//la scelta per la % sul val.conv su articolo <A> o cliente <C>
|
||||
const TRectype& rcont=contr.row(codart);
|
||||
const TString4 tipodot = rcont.get(LVRCONDV_NOLCIC);
|
||||
const TString4 artcli = rcont.get(LVRCONDV_VCARTCLI);
|
||||
real dot;
|
||||
const int annoes = _data_elab.year();
|
||||
//instanzio il TArticolo_lavanderia
|
||||
TArticolo_lavanderie artlav(codart, 'C', clifo, indsped);
|
||||
|
||||
//se il consumo è minore del ciclaggio, allora
|
||||
if (consumo < impconv)
|
||||
{
|
||||
const bool cicl2rig = contr.get_bool(LVCONDV_CICLAGGIO);
|
||||
//se il ciclaggio è su due linee, allora aggiungo una riga merce, che contiene
|
||||
//il conguaglio al valore convenzionale, che ha come quantità la costante UNO
|
||||
//e come prezzo la differenza tra l'importo convenzionale e il consumo;
|
||||
//altimenti correggo quantità e prezzo direttamente sulla riga documento che sto analizzando
|
||||
if (cicl2rig)
|
||||
{
|
||||
TRiga_documento& congrow = doc.insert_row(++i, "01");
|
||||
doc.copy_data(congrow, rout);
|
||||
congrow.put(RDOC_DESCR, "Conguaglio valore convenzionale");
|
||||
congrow.put(RDOC_QTA, UNO);
|
||||
congrow.put(RDOC_PREZZO, impconv - consumo);
|
||||
}
|
||||
else
|
||||
{
|
||||
rout.put(RDOC_QTA, UNO);
|
||||
rout.put(RDOC_PREZZO, impconv);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//se la percentuale sul valore convenzionale è sul cliente, allora se il flag valconvcli è false
|
||||
if (!valconvcli)
|
||||
{
|
||||
//pongo valconvcli a true in modo da non tornare più in questo if
|
||||
valconvcli = true;
|
||||
//instanzio i due real che andranno a contenere l'importo covenzionale totale e il consumo totale
|
||||
real impconvtot;
|
||||
real consumotot;
|
||||
//cerco la giacenza per articolo dell'articolo esaminato
|
||||
const int index = artlav.find_clifomag(annoes);
|
||||
//se lo trovo e se il tipo dotazione è iniziale 'I', allora leggo la dotazione iniziale
|
||||
//dalle giacenze articolo per cliente, altrimenti leggo la dotazione odierna
|
||||
if (index >=0)
|
||||
{
|
||||
if (tipodot=="I")
|
||||
dot=artlav.clifomag(annoes)[index].get_real("DOTIN");
|
||||
else
|
||||
dot=artlav.clifomag(annoes)[index].get_real("DOTOD");
|
||||
}
|
||||
|
||||
//leggo dalla riga contratto il tipo forfait
|
||||
const int tipoforf = rcont.get_int(LVRCONDV_TIPOFORF);
|
||||
|
||||
//scorro tutte le righe documento dalla riga in esame fino alla fine
|
||||
for (int j = i; j < doc.physical_rows(); j++)
|
||||
{
|
||||
//instanzio la riga documento e sommo ai totali gli importi solo se
|
||||
//la percentuale sul valore convenzionale è sul cliente
|
||||
TRiga_documento& riga = doc[j];
|
||||
const TString80 codart = riga.get(RDOC_CODART);
|
||||
const TRectype & rcont = contr.row(codart);
|
||||
const char tipvalconvcli = rcont.get_char(LVRCONDV_VCARTCLI);
|
||||
if (tipvalconvcli == 'C')
|
||||
switch (tipoforf)
|
||||
{
|
||||
case 0: //forfait = NESSUNO
|
||||
break;
|
||||
case 1: //forfait = A VALORE FISSO
|
||||
{
|
||||
rout.put(RDOC_QTA, UNO); //qta fissa a UNO
|
||||
rout.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_IMPFISART)); //prezzo letto dalla riga contratto
|
||||
// gestione in base codice per valore fisso ??? tolta la scelta dell'articolo o del cliente
|
||||
}
|
||||
break;
|
||||
case 2: //forfait = NOLO
|
||||
{
|
||||
//aggiungo una riga tipo merce, che contiene tutti i dati della riga del documento
|
||||
//di partenza, poi costruisco la descrizione in base alla periodicità di fatturazione,
|
||||
//metto la qta uguale alla dotazione che ho appena letto
|
||||
//e prendo il prezzo nolo dalla riga contratto
|
||||
TRiga_documento& nolorow = doc.insert_row(++i, "01");
|
||||
doc.copy_data(nolorow, rout);
|
||||
TString80 descr("Nolo");
|
||||
const int contrper = contr.get_int(LVCONDV_PERFAT);
|
||||
|
||||
switch (contrper)
|
||||
{
|
||||
case 0:
|
||||
descr << " per il giorno";
|
||||
break;
|
||||
case 1:
|
||||
descr << " per la settimana";
|
||||
break;
|
||||
case 2:
|
||||
descr << " per la quindicina";
|
||||
break;
|
||||
case 3:
|
||||
descr << " per il mese";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
nolorow.put(RDOC_DESCR,descr);
|
||||
|
||||
nolorow.put(RDOC_QTA, dot);
|
||||
nolorow.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_PREZNOL));
|
||||
}
|
||||
break;
|
||||
case 3: //forfait = CICLAGGIO
|
||||
{
|
||||
//leggo la quantità consegnata e calcolo consumo e ciclaggio secondo le formule
|
||||
//CONSUMO = QTA * PREZZO(dalla riga documento)
|
||||
//CLICLAGGIO = DOT * PREZZO(dalla riga contratto) * MINIMO CICLAGGIO
|
||||
const real qta = rout.get_real(RDOC_QTA);
|
||||
const real consumo = qta * rout.get_real(RDOC_PREZZO);
|
||||
const real ciclaggio = dot * rcont.get_real(LVRCONDV_PREZZO) * rcont.get_real(LVRCONDV_MINCIC);
|
||||
//se il consumo è minore del ciclaggio, allora
|
||||
if (consumo < ciclaggio)
|
||||
{
|
||||
impconvtot += dot * rcont.get_real(LVRCONDV_VALCONV) * rcont.get_real(LVRCONDV_FORFPERCL);
|
||||
consumotot += riga.get_real(RDOC_QTA) * riga.get_real(RDOC_PREZZO);
|
||||
//leggo il flag del tipo ciclaggio
|
||||
const bool cicl2rig = contr.get_bool(LVCONDV_CICLAGGIO);
|
||||
//calcolo il valore cicl secondo la formula
|
||||
//CICL = MINIMO CICLAGGIO * DOT
|
||||
const real cicl = rcont.get_real(LVRCONDV_MINCIC) * dot;
|
||||
//se il ciclaggio è su due linee, allora aggiungo una riga merce, per pareggiare il minimo ciclaggio
|
||||
//che ha come quantità la differenza tra la quantità di minimo cilcaggio
|
||||
//e la quantità effettivamente consegnata e come prezzo il prezzo preso dalla riga contratto;
|
||||
//altimenti correggo quantità e prezzo direttamente sulla riga documento che sto analizzando
|
||||
if (cicl2rig)
|
||||
{
|
||||
TRiga_documento& congrow = doc.insert_row(++i, "01");
|
||||
doc.copy_data(congrow,rout);
|
||||
congrow.put(RDOC_DESCR,"Pareggio minimo ciclaggio");
|
||||
congrow.put(RDOC_QTA, cicl - qta);
|
||||
congrow.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_PREZZO));
|
||||
}
|
||||
else
|
||||
{
|
||||
rout.put(RDOC_QTA, cicl);
|
||||
rout.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_PREZZO));
|
||||
}
|
||||
}
|
||||
}
|
||||
//se il consumo è minore del ciclaggio, allora
|
||||
if (consumotot < impconvtot)
|
||||
{
|
||||
const bool cicl2rig=contr.get_bool(LVCONDV_CICLAGGIO);
|
||||
//se il ciclaggio è su due linee, allora aggiungo una riga merce, che contiene
|
||||
//il conguaglio al valore convenzionale, che ha come quantità la costante UNO
|
||||
//e come prezzo la differenza tra l'importo convenzionale totale e il consumo totale;
|
||||
//altimenti correggo quantità e prezzo direttamente sulla riga documento che sto analizzando
|
||||
//e elimino tutte le righe che vanno a comporre il totale in modo che rimanga una riga sola
|
||||
//per mostrare l'importo del conguaglio al valore convenzionale
|
||||
if (cicl2rig)
|
||||
}
|
||||
break;
|
||||
case 4: //forfait = % SUL VALORE CONVENZIONALE
|
||||
{
|
||||
//leggo dalla riga contratto la % sul val.conv su articolo <A> o cliente <C>
|
||||
const char tipovalconv = rcont.get_char(LVRCONDV_VCARTCLI);
|
||||
//se la percentuale sul valore convenzionale è sull'articolo, allora:
|
||||
if (tipovalconv == 'A')
|
||||
{
|
||||
TRiga_documento& congrow=doc.insert_row(++i, "01");
|
||||
doc.copy_data(congrow, rout);
|
||||
congrow.put(RDOC_DESCR, "Conguaglio valore convenzionale");
|
||||
congrow.put(RDOC_QTA, UNO);
|
||||
congrow.put(RDOC_PREZZO, impconvtot - consumotot);
|
||||
//leggo la quantità consegnata e calcolo consumo e importo convenzionale secondo le formule
|
||||
//CONSUMO = QTA * PREZZO(dalla riga documento)
|
||||
//IMPCONV = DOT * PREZZO(dalla riga contratto) * PERCENTUALE DI FORFAIT CLIENTE
|
||||
const real qta = rout.get_real(RDOC_QTA);
|
||||
const real consumo = qta * rout.get_real(RDOC_PREZZO);
|
||||
const real impconv = dot * rcont.get_real(LVRCONDV_VALCONV) * rcont.get_real(LVRCONDV_FORFPERCL) / 100;
|
||||
|
||||
//se il consumo è minore del ciclaggio, allora
|
||||
if (consumo < impconv)
|
||||
{
|
||||
const bool cicl2rig = contr.get_bool(LVCONDV_CICLAGGIO);
|
||||
//se il ciclaggio è su due linee, allora aggiungo una riga merce, che contiene
|
||||
//il conguaglio al valore convenzionale, che ha come quantità la costante UNO
|
||||
//e come prezzo la differenza tra l'importo convenzionale e il consumo;
|
||||
//altimenti correggo quantità e prezzo direttamente sulla riga documento che sto analizzando
|
||||
if (cicl2rig)
|
||||
{
|
||||
TRiga_documento& congrow = doc.insert_row(++i, "01");
|
||||
doc.copy_data(congrow, rout);
|
||||
congrow.put(RDOC_DESCR, "Conguaglio valore convenzionale");
|
||||
congrow.put(RDOC_QTA, UNO);
|
||||
congrow.put(RDOC_PREZZO, impconv - consumo);
|
||||
}
|
||||
else
|
||||
{
|
||||
rout.put(RDOC_QTA, UNO);
|
||||
rout.put(RDOC_PREZZO, impconv);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rout.put(RDOC_QTA, UNO);
|
||||
rout.put(RDOC_PREZZO, impconvtot);
|
||||
for (int k = doc.physical_rows(); k > i; k--)
|
||||
//se la percentuale sul valore convenzionale è sul cliente, allora se il flag valconvcli è false
|
||||
if (!valconvcli)
|
||||
{
|
||||
TRiga_documento& delrow = doc[k];
|
||||
const TString80 codart = delrow.get(RDOC_CODART);
|
||||
const TRectype& rcont = contr.row(codart);
|
||||
const char tipvalconvcli = rcont.get_char(LVRCONDV_VCARTCLI);
|
||||
if (tipvalconvcli == 'C')
|
||||
doc.destroy_row(k, true);
|
||||
//pongo valconvcli a true in modo da non tornare più in questo if
|
||||
valconvcli = true;
|
||||
//instanzio i due real che andranno a contenere l'importo covenzionale totale e il consumo totale
|
||||
real impconvtot;
|
||||
real consumotot;
|
||||
|
||||
//scorro tutte le righe documento dalla riga in esame fino alla fine
|
||||
for (int j = i; j < doc.physical_rows(); j++)
|
||||
{
|
||||
//instanzio la riga documento e sommo ai totali gli importi solo se
|
||||
//la percentuale sul valore convenzionale è sul cliente
|
||||
TRiga_documento& riga = doc[j];
|
||||
const TString80 codart = riga.get(RDOC_CODART);
|
||||
const TRectype & rcont = contr.row(codart);
|
||||
const char tipvalconvcli = rcont.get_char(LVRCONDV_VCARTCLI);
|
||||
if (tipvalconvcli == 'C')
|
||||
{
|
||||
impconvtot += dot * rcont.get_real(LVRCONDV_VALCONV) * rcont.get_real(LVRCONDV_FORFPERCL);
|
||||
consumotot += riga.get_real(RDOC_QTA) * riga.get_real(RDOC_PREZZO);
|
||||
}
|
||||
}
|
||||
//se il consumo è minore del ciclaggio, allora
|
||||
if (consumotot < impconvtot)
|
||||
{
|
||||
const bool cicl2rig=contr.get_bool(LVCONDV_CICLAGGIO);
|
||||
//se il ciclaggio è su due linee, allora aggiungo una riga merce, che contiene
|
||||
//il conguaglio al valore convenzionale, che ha come quantità la costante UNO
|
||||
//e come prezzo la differenza tra l'importo convenzionale totale e il consumo totale;
|
||||
//altimenti correggo quantità e prezzo direttamente sulla riga documento che sto analizzando
|
||||
//e elimino tutte le righe che vanno a comporre il totale in modo che rimanga una riga sola
|
||||
//per mostrare l'importo del conguaglio al valore convenzionale
|
||||
if (cicl2rig)
|
||||
{
|
||||
TRiga_documento& congrow=doc.insert_row(++i, "01");
|
||||
doc.copy_data(congrow, rout);
|
||||
congrow.put(RDOC_DESCR, "Conguaglio valore convenzionale");
|
||||
congrow.put(RDOC_QTA, UNO);
|
||||
congrow.put(RDOC_PREZZO, impconvtot - consumotot);
|
||||
}
|
||||
else
|
||||
{
|
||||
rout.put(RDOC_QTA, UNO);
|
||||
rout.put(RDOC_PREZZO, impconvtot);
|
||||
for (int k = doc.physical_rows(); k > i; k--)
|
||||
{
|
||||
TRiga_documento& delrow = doc[k];
|
||||
const TString80 codart = delrow.get(RDOC_CODART);
|
||||
const TRectype& rcont = contr.row(codart);
|
||||
const char tipvalconvcli = rcont.get_char(LVRCONDV_VCARTCLI);
|
||||
if (tipvalconvcli == 'C')
|
||||
doc.destroy_row(k, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 5: //forfait = FISSO SU DOTAZIONE INIZIALE
|
||||
{
|
||||
// if (!fixdotin)
|
||||
// {
|
||||
// fixdotin=true;
|
||||
rout.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_IMPFISART));
|
||||
rout.put(RDOC_QTA, artlav.clifomag(annoes)[index].get_real("DOTIN"));
|
||||
/* for (int h = doc.physical_rows(); h > i; h--)
|
||||
{
|
||||
TRiga_documento& delrow = doc[h];
|
||||
const TString80 codart=delrow.get(RDOC_CODART);
|
||||
const TRectype & rcont=contr.row(codart);
|
||||
const int forfdotin = rcont.get_int(LVRCONDV_TIPOFORF);
|
||||
if (forfdotin == 5)
|
||||
doc.destroy_row(h,true);
|
||||
} */
|
||||
// }
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 5: //forfait = FISSO SU DOTAZIONE INIZIALE
|
||||
{
|
||||
// if (!fixdotin)
|
||||
// {
|
||||
// fixdotin=true;
|
||||
rout.put(RDOC_PREZZO, rcont.get_real(LVRCONDV_IMPFISART));
|
||||
rout.put(RDOC_QTA, artlav.clifomag(annoes)[index].get_real("DOTIN"));
|
||||
/* for (int h = doc.physical_rows(); h > i; h--)
|
||||
{
|
||||
TRiga_documento& delrow = doc[h];
|
||||
const TString80 codart=delrow.get(RDOC_CODART);
|
||||
const TRectype & rcont=contr.row(codart);
|
||||
const int forfdotin = rcont.get_int(LVRCONDV_TIPOFORF);
|
||||
if (forfdotin == 5)
|
||||
doc.destroy_row(h,true);
|
||||
} */
|
||||
// }
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//ADD_ROWS: per adesso un segnaposto
|
||||
void TFatturazione_lavanderie::add_rows(TRiga_documento & rout, TRiga_documento & rin)
|
||||
|
@ -37,9 +37,9 @@
|
||||
#define LVCONDV_STETITS "STETITS"
|
||||
#define LVCONDV_STDDTPTS "STDDTPTS"
|
||||
#define LVCONDV_IMPMINFAT "IMPMINFAT"
|
||||
#define LVCONDV_CANFIX "IMPFIX"
|
||||
#define LVCONDV_IMPFIX "IMPFIX"
|
||||
#define LVCONDV_CANFIX "CANFIX"
|
||||
#define LVCONDV_CANFIX "RAGART"
|
||||
#define LVCONDV_RAGART "RAGART"
|
||||
#define LVCONDV_PERCNOCONT "PERCNOCONT"
|
||||
#define LVCONDV_PERCTOLPES "PERCTOLPES"
|
||||
#define LVCONDV_RITAUDTTMP "RITAUDTTMP"
|
||||
|
Loading…
x
Reference in New Issue
Block a user