Correzioni varie su lavanderie:

Aggiunto nuovo tipo di fatturazione con importo totale minimo
Aggiunto flag per non riportare le note da bolla a fattura
Aggiunte colonne di dotazione a buoni di ritiro
Aggiunta nuova proposta causale di consegna su nuovo documento

git-svn-id: svn://10.65.10.50/branches/R_10_00@22806 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2013-02-14 10:19:59 +00:00
parent 6cac0698e0
commit 82b76f399a
13 changed files with 189 additions and 102 deletions

View File

@ -96,6 +96,7 @@
#define F_AGGHEAD 275
#define F_DESTHEAD 276
#define F_ZERONOTE 277
#define F_BACKUP 300

View File

@ -179,10 +179,16 @@ END
BOOLEAN F_RIFTEST
BEGIN
PROMPT 2 6 "Scrivi riferimenti in testata documento"
PROMPT 2 6 "Riportare riferimenti in testata documento"
FIELD RifTest
END
BOOLEAN F_ZERONOTE
BEGIN
PROMPT 42 6 "Non riportare note da bolle a fatture"
FIELD ZeroNote
END
STRING F_FELAB_DIF 8
BEGIN
PROMPT 2 7 "Tipo fatt. definitiva"

View File

@ -1,6 +1,5 @@
#include <automask.h>
#include <colmask.h>
#include <defmask.h>
#include <execp.h>
#include <progind.h>
#include <relapp.h>
@ -695,8 +694,6 @@ bool TContratti_msk::on_field_event(TOperable_field& o,TField_event e,long jolly
}
}
//se ho scritto un articolo diverso da quello che esisteva prima
//e se si desidera veramente modificarlo, allora permetto la modifica
//e forzo l'updatre della riga, altrimenti riscrivo l'articolo che c'era prima
@ -1106,8 +1103,8 @@ bool TContratti_app:: user_create()
_codart = "";
const TDate oggi(TODAY);
if (esercizi().date2esc(oggi) == 0)
return error_box("Attenzione non esiste l'esercizio corrispondente al %s", oggi.string());
if (esercizi().date2esc(oggi) <= 0)
error_box("Non esiste l'esercizio corrispondente al %s", oggi.string());
_rel=new TRelation (LF_LVCONDV);
_msk= new TContratti_msk;

View File

@ -429,6 +429,8 @@ BEGIN
MESSAGE DISABLE,F_RAGART|ENABLE,F_IMPFIX|SHOW,F_CANFIX|HIDE,F_NOLCICTE
ITEM "2|% sul val. conv. per cli."
MESSAGE DISABLE,F_RAGART|DISABLE,F_IMPFIX|HIDE,F_CANFIX|SHOW,F_NOLCICTE
ITEM "3|Importo minimo"
MESSAGE DISABLE,F_RAGART|ENABLE,F_IMPFIX|SHOW,F_CANFIX|HIDE,F_NOLCICTE
FIELD TIPOCAN
END

View File

@ -102,7 +102,7 @@ TObject* TCalc_02_data::dup() const
////////////////////////////////////////
//Classe TFatturazione_lavanderie
class TFatturazione_lavanderie:public TFatturazione_bolle
class TFatturazione_lavanderie : public TFatturazione_bolle
{
TDate _data_elab;
TToken_string _campi_raggruppamento;
@ -509,6 +509,7 @@ void TFatturazione_lavanderie::post_process(TLista_documenti& doc_out, TLista_do
{
const bool use_indsp = ini_get_bool(CONFIG_DITTA, "mg", "MOV_INDSPED");
const bool riftest = ini_get_bool(CONFIG_DITTA, "lv", "RifTest");
const bool zero_note = ini_get_bool(CONFIG_DITTA, "lv", "ZeroNote");
//scorro tutti i documenti di output generati precedentemente
for (int id = 0; id < doc_out.items(); id++)
@ -560,6 +561,9 @@ void TFatturazione_lavanderie::post_process(TLista_documenti& doc_out, TLista_do
doc.destroy_row(1, true);
}
if (zero_note)
doc.zero(DOC_NOTE);
//se devo mettere i riferimenti della bolla in testata, prendo la descrizione della prima riga
//e la metto sulla testata del documento, poi cancello la prima riga del documento
if (rifbol && riftest)
@ -740,8 +744,8 @@ void TFatturazione_lavanderie::post_process(TLista_documenti& doc_out, TLista_do
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();
real dot;
//instanzio il TArticolo_lavanderia
//cerco la giacenza per articolo dell'articolo esaminato
@ -809,7 +813,7 @@ void TFatturazione_lavanderie::post_process(TLista_documenti& doc_out, TLista_do
warning_box(TR("Manca l'unità di misura di riferimento"));
break;
}
if(umrif != umkg)
if (umrif != umkg)
{
warning_box(TR("L'unità di misura di riferimento non è quella dei Kg"));
break;
@ -817,7 +821,7 @@ void TFatturazione_lavanderie::post_process(TLista_documenti& doc_out, TLista_do
//leggo e controllo il fattore di conversione
fatconv = unita.get_real("R10");
if(fatconv == ZERO)
if (fatconv.is_zero())
{
warning_box(TR("Manca il fattore di conversione"));
break;
@ -934,13 +938,13 @@ void TFatturazione_lavanderie::post_process(TLista_documenti& doc_out, TLista_do
if (tipovalconv == 'A')
{
//leggo la quantità consegnata e calcolo consumo e importo convenzionale secondo le formule
//CONSUMO = QTA * PREZZO(dalla riga documento)
//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;
const real impconv = dot * rcont.get_real(LVRCONDV_VALCONV) * rcont.get_real(LVRCONDV_FORFPERCL) / CENTO;
impvconv += impconv;
impvconv += impconv;
consvconv += consumo;
}
else
@ -965,7 +969,7 @@ void TFatturazione_lavanderie::post_process(TLista_documenti& doc_out, TLista_do
const TString80 codart = riga.get(RDOC_CODART);
const TRectype & rcont = contr.row(codart);
const char tipvalconvcli = rcont.get_char(LVRCONDV_VCARTCLI);
char lavtype = riga.get_char("LVTYPE");
const char lavtype = riga.get_char("LVTYPE");
if (tipvalconvcli == 'C' && lavtype != 'D')
{
if (arts.objptr(codart) == NULL)
@ -987,7 +991,7 @@ void TFatturazione_lavanderie::post_process(TLista_documenti& doc_out, TLista_do
consumotot += riga.get_real(RDOC_QTA) * riga.get_real(RDOC_PREZZO);
}
}
//se il consumo è minore del ciclaggio, allora
//se il consumo è minore dell'importo convenzionale, allora
if (consumotot < impconvtot)
{
const bool cicl2rig=contr.get_bool(LVCONDV_CICLAGGIO);
@ -1073,52 +1077,79 @@ void TFatturazione_lavanderie::post_process(TLista_documenti& doc_out, TLista_do
}
}
//se il consumo è minore del ciclaggio, allora
if (impvconv - consvconv > ZERO)
if (tipocan == 3)
{
const bool cicl2rig = contr.get_bool(LVCONDV_CICLAGGIO);
const int rows = doc.physical_rows();
//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
TRiga_documento& congrow = doc.new_row("01");
const TString80 codartcon = ini_get_string(CONFIG_DITTA, "lv", "Codartcofix");
congrow.put(RDOC_CODART, codartcon);
congrow.put(RDOC_CHECKED, "X");
congrow.put(RDOC_CODARTMAG, codartcon);
congrow.put(RDOC_DESCR, "Conguaglio valore convenzionale");
congrow.put(RDOC_QTA, UNO);
TString8 codiva = doc.clifor().vendite().get(CFV_ASSFIS);
if (codiva.blank())
codiva = cache().get(LF_ANAMAG, codartcon, ANAMAG_CODIVA);
congrow.put(RDOC_CODIVA, codiva);
if (cicl2rig)
congrow.put(RDOC_PREZZO, impvconv - consvconv);
else
const real canfis = contr.get_real(LVCONDV_IMPFIX);
const real imponibile = doc.imponibile();
if (canfis > imponibile)
{
congrow.put(RDOC_PREZZO, impvconv);
for (int k = rows - 1; k >= 1; k--)
{
TRiga_documento& delrow = doc[k];
const TString80 codart = delrow.get(RDOC_CODART);
const TRectype& rcont = contr.row(codart);
const int tipoforf = rcont.get_int(LVRCONDV_TIPOFORF);
char lavtype = delrow.get_char("LVTYPE");
if (tipoforf == 4 && lavtype != 'D')
doc.destroy_row(k, true);
}
TRiga_documento& congrow = doc.new_row("01");
const TString80 codartcon = ini_get_string(CONFIG_DITTA, "lv", "Codartcofix");
congrow.put(RDOC_CODART, codartcon);
congrow.put(RDOC_CHECKED, "X");
congrow.put(RDOC_CODARTMAG, codartcon);
congrow.put(RDOC_DESCR, "Conguaglio valore convenzionale");
congrow.put(RDOC_QTA, UNO);
TString4 codiva = doc.clifor().vendite().get(CFV_ASSFIS);
if (codiva.blank())
codiva = cache().get(LF_ANAMAG, codartcon, ANAMAG_CODIVA);
congrow.put(RDOC_CODIVA, codiva);
congrow.put(RDOC_PREZZO, canfis - imponibile);
}
}
else
{
//se il consumo è minore del ciclaggio, allora
if (impvconv > consvconv)
{
const bool cicl2rig = contr.get_bool(LVCONDV_CICLAGGIO);
const int rows = doc.physical_rows();
//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
TRiga_documento& congrow = doc.new_row("01");
const TString80 codartcon = ini_get_string(CONFIG_DITTA, "lv", "Codartcofix");
congrow.put(RDOC_CODART, codartcon);
congrow.put(RDOC_CHECKED, "X");
congrow.put(RDOC_CODARTMAG, codartcon);
congrow.put(RDOC_DESCR, "Conguaglio valore convenzionale");
congrow.put(RDOC_QTA, UNO);
TString8 codiva = doc.clifor().vendite().get(CFV_ASSFIS);
if (codiva.blank())
codiva = cache().get(LF_ANAMAG, codartcon, ANAMAG_CODIVA);
congrow.put(RDOC_CODIVA, codiva);
if (cicl2rig)
congrow.put(RDOC_PREZZO, impvconv - consvconv);
else
{
congrow.put(RDOC_PREZZO, impvconv);
for (int k = rows - 1; k >= 1; k--)
{
TRiga_documento& delrow = doc[k];
const TString80 codart = delrow.get(RDOC_CODART);
const TRectype& rcont = contr.row(codart);
const int tipoforf = rcont.get_int(LVRCONDV_TIPOFORF);
char lavtype = delrow.get_char("LVTYPE");
if (tipoforf == 4 && lavtype != 'D')
doc.destroy_row(k, true);
}
}
}
}
}
if (redditivita > ZERO && fatt_02() && !ragart && tipocan != 1)
if (redditivita > ZERO && fatt_02() && !ragart && tipocan != 1)
{
const real totdoc = doc.totale_doc();
const real provvigione1 = doc.provvigione();
@ -2513,14 +2544,14 @@ void TFatturazione_lav_app::main_loop()
numdocgen += elab.write_fatt_ragg(_solototali);
TString str;
const char* const parolapl = _solototali ? "generate" : "elaborate";
const char* const parolasi = _solototali ? "generata" : "elaborata";
const char* const parolapl = _solototali ? TR("generate") : TR("elaborate");
const char* const parolasi = _solototali ? TR("generata") : TR("elaborata");
switch (numdocgen)
{
case 0: str << "Non e' stata " << parolasi << " alcuna fattura"; break;
case 1: str << "E' stata " << parolasi << " una fattura"; break;
default: str << "Sono state " << parolapl << ' ' << numdocgen << " fatture"; break;
case 0: str << TR("Non è stata ") << parolasi << TR(" alcuna fattura"); break;
case 1: str << TR("E' stata ") << parolasi << TR(" una fattura"); break;
default: str << TR("Sono state ") << parolapl << ' ' << numdocgen << TR(" fatture"); break;
}
if (numdocgen <= 0)
warning_box(str);

View File

@ -7,7 +7,6 @@ int main(int argc, char** argv)
const int r = (argc > 1) ? argv[1][1] - '0' : 0;
switch (r)
{
case 0: lv3100(argc, argv); break; // gestione manuale bolle lv3100
case 1: lv3200(argc, argv); break; // evasione buoni di prelievo lv3200
case 2: lv3300(argc, argv); break; // gestione manuale buoni di prelievo lv3300
case 3: lv3400(argc, argv); break; // evasione buoni di prelievo terminale lv3400

View File

@ -16,6 +16,24 @@
#define FOR_EACH_DOC_ROW_BACK(d, r, row) const TRiga_documento* row = NULL; for (int r = d.rows(); r > 0 && (row = &d[r]) != NULL; r--)
HIDDEN bool doc_is_buono_ritiro(const TDocumento& doc)
{
const TString4 codnum = doc.get(DOC_CODNUM);
const TString4 tipo = doc.get(DOC_TIPODOC);
for (int i = 0; ; i++)
{
const TString& n = ini_get_string(CONFIG_DITTA, "lv", "NUM_RIT", "", i);
const TString& t = ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_RIT", "", i);
if (n.blank() || t.blank())
break;
if ((codnum.blank() || codnum == n) && tipo == t)
return true;
}
return false;
}
//////////////////////////////////////////
//// CLASSE TGESTIONE_BOLLE_MSK ////
//////////////////////////////////////////
@ -411,8 +429,13 @@ bool TGestione_bolle_msk::lv_bolla_handler(TMask_field& f, KEY k)
default: break;
}
TGestione_bolle_msk& dmsk = (TGestione_bolle_msk&)f.mask();
if(dmsk.mode() == MODE_INS)
bool init_consegna = false;
if (dmsk.mode() == MODE_INS)
{
dmsk.set(F_CODAG, dmsk.proponi_autista());
init_consegna = !doc_is_buono_ritiro(dmsk.doc());
}
if (ok && k == K_TAB && ((dmsk.insert_mode() && f.to_check(k, true)) || f.focusdirty()) && dmsk.mode() != MODE_MOD )
{
@ -489,10 +512,7 @@ bool TGestione_bolle_msk::lv_bolla_handler(TMask_field& f, KEY k)
//recupero i dati di interesse dalla riga del contratto e li inserisco sullo sheet
const TString80 codart = rcont.get(LVRCONDV_CODART).as_string();
TString4 causale = rcont.get(LVRCONDV_CAUSLAV).as_string();
if (causale.blank() || atoi(causale) == 0)
causale = ini_get_string(CONFIG_DITTA, "lv", "CAUSLAV");
const TString4 causale = lv_get_causale_from_rcontr(rcont.cursor()->curr(), init_consegna);
//instanzio una cache sulle anagrafice di magazzino
const TRectype& anamag = cache().get(LF_ANAMAG,codart);
@ -756,10 +776,7 @@ bool TGestione_bolle_msk::lv_codart_handler(TMask_field& f, KEY k)
const TRectype& rcont = cont.row(codart);
//cerco la causale relativa all'articolo; se non la trovo prendo quella standard
TString4 causale = rcont.get(LVRCONDV_CAUSLAV);
if (causale.blank() || atoi(causale) == 0 )
causale = ini_get_string(CONFIG_DITTA, "lv", "CAUSLAV");
TString4 causale = lv_get_causale_from_rcontr(rcont, false);
if (rdoc.get("DOTOD").empty())
{
//gestione campi dotazione odierna e dotazione temporanea
@ -1015,7 +1032,7 @@ bool TGestione_bolle_msk::lv_causale_handler(TMask_field& f, KEY k)
TString16 tmp;
tmp << dotmp;
if(msk.field(FR_TIPORIGA).get_long() != 22)
if(msk.get_int(FR_TIPORIGA) != 22)
{
msk.field(FR_JOLLY2).set(tmp);
//setto le date di inizio e fine della dotazione temporanea
@ -1292,13 +1309,15 @@ TMask* TGestione_bolle_app::get_mask( int mode )
TGestione_bolle_msk* m = new TGestione_bolle_msk(tipodoc);
TSheet_field& sheet = m->sfield(F_SHEET);
if (sheet.exist_column(FR_JOLLY1))
{
//setto l'allineamento a destra dei campi incriminati e pure criminali
sheet.set_column_justify(sheet.cid2index(FR_JOLLY1), true);
sheet.set_column_justify(sheet.cid2index(FR_JOLLY2), true);
//setto l'allineamento a destra dei campi incriminati e pure criminali
// Dotazione Odierna Temporanea Iniziale
const short id_dot[4] = { FR_JOLLY1, FR_JOLLY2, FR_JOLLY5, 0 };
for (int i = 0; id_dot[i]; i++)
{
if (sheet.exist_column(id_dot[i]))
sheet.set_column_justify(sheet.cid2index(id_dot[i]), true);
}
_doc_masks.add(tipodoc, m);
const TTipo_documento& tdoc = m->doc().tipo();
const TString_array& handlers = tdoc.handlers();
@ -1338,9 +1357,7 @@ void TGestione_bolle_app::salva_conguaglio(const TDocumento_mask& mask)
const TLaundry_contract cont(codcf, indsped, datadoc);
const int codcont = cont.get_int(LVCONDV_CODCONT);
const bool is_buono_ritiro = mask.get(F_CODNUM) == ini_get_string(CONFIG_DITTA, "lv", "NUM_RIT(0)") &&
mask.get(F_TIPODOC) == ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_RIT(0)");
const bool is_buono_ritiro = doc_is_buono_ritiro(d);
TLocalisamfile rcondv(LF_LVRCONDV);
FOR_EACH_DOC_ROW_BACK(d, r, row)
@ -1499,9 +1516,8 @@ void TGestione_bolle_app::init_insert_mode(TMask &m)
_giac.reset(d);
//se sto leggendo o generando un buono di ritiro, abilito questo campo
bool enable_dataprco = mask.get(F_CODNUM) == ini_get_string(CONFIG_DITTA, "lv", "NUM_RIT(0)") &&
mask.get(F_TIPODOC) == ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_RIT(0)");
const bool enable_dataprco = doc_is_buono_ritiro(d);
mask.field(F_LVDATAPRCO).enable(enable_dataprco);
mask.reset_var_mask();
@ -1513,10 +1529,10 @@ void TGestione_bolle_app::init_insert_mode(TMask &m)
//ridefinisco il metodo init_query_mode della TMotore_application
void TGestione_bolle_app::init_modify_mode(TMask& mask)
{
TGestione_bolle_msk& m = (TGestione_bolle_msk&) mask;
//se sto leggendo o generando un buono di ritiro, abilito questo campo
bool enable_dataprco = mask.get(F_CODNUM) == ini_get_string(CONFIG_DITTA, "lv", "NUM_RIT(0)") &&
mask.get(F_TIPODOC) == ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_RIT(0)");
const bool enable_dataprco = doc_is_buono_ritiro(m.doc());
mask.field(F_LVDATAPRCO).enable(enable_dataprco);
mask.first_focus(F_CODCF, false);

View File

@ -414,7 +414,8 @@ bool TGestione_buoni_msk::set_righe_buono_handler(TMask_field& f, KEY k)
}
TGestione_buoni_msk& dmsk = (TGestione_buoni_msk&)f.mask();
if(dmsk.mode() == MODE_INS)
const bool ins_mode = dmsk.mode() == MODE_INS;
if (ins_mode)
dmsk.set(F_CODAG, dmsk.proponi_autista());
if (ok && k == K_TAB && ((dmsk.insert_mode() && f.to_check(k, true)) || f.focusdirty()) && dmsk.mode() != MODE_MOD)
@ -492,11 +493,8 @@ bool TGestione_buoni_msk::set_righe_buono_handler(TMask_field& f, KEY k)
//recupero i dati di interesse dalla riga del contratto e li inserisco sullo sheet
const TString80 codart = rcont.get(LVRCONDV_CODART).as_string();
TString4 causale = rcont.get(LVRCONDV_CAUSLAV).as_string();
if (causale.blank() || atoi(causale) == 0)
causale = ini_get_string(CONFIG_DITTA, "lv", "CAUSLAV");
const TString4 causale = lv_get_causale_from_rcontr(rcont.cursor()->curr(), ins_mode);
//instanzio una cache sulle anagrafice di magazzino
const TRectype& anamag = cache().get(LF_ANAMAG,codart);
@ -1485,7 +1483,6 @@ TGiac_per_cli& TGestione_buoni_app::giacenza()
int lv3300( int argc, char* argv[])
{
TGestione_buoni_app a;
a.run( argc, argv, TR("Buoni di Prelievo"));
return 0;
}

View File

@ -200,11 +200,13 @@ Col(5)=FR_DESCR||28
Col(6)=FR_CAULAV|Caus.|5
Col(7)=FR_RITIRO|Ritiro|6
Col(8)=FR_QTA|Rotti|6
Col(9)=FR_TIPORIGA|Tipo|4
Col(10)=FR_CODMAG
Col(11)=FR_CODDEP
Col(12)=FR_CODMAGC
Col(13)=FR_CODDEPC
Col(9)=FR_JOLLY1|Dot.Od.|7
Col(10)=FR_JOLLY5|Dot.In.|7
Col(11)=FR_TIPORIGA|Tipo|4
Col(12)=FR_CODMAG
Col(13)=FR_CODDEP
Col(14)=FR_CODMAGC
Col(15)=FR_CODDEPC
[RIGHE]

View File

@ -120,6 +120,25 @@ long lv_find_contract(const long codcf, const long indsped, const TDate& data)
return cod;
}
const TString& lv_get_causale_from_rcontr(const TRectype& rcont, bool is_consegna)
{
TString4 causale = rcont.get(LVRCONDV_CAUSLAV);
if (causale.blank() || atoi(causale) == 0)
causale = ini_get_string(CONFIG_DITTA, "lv", "CAUSLAV");
if (is_consegna)
{
const TString& causale_consegna = cache().get("&CAU", causale, "S5");
if (causale_consegna.full())
causale = causale_consegna;
}
return get_tmp_string() = causale;
}
///////////////////////////////////////////////////////////
// TLaundry_contract
///////////////////////////////////////////////////////////

View File

@ -16,6 +16,8 @@ void lv_set_update_info(TRectype& rec);
long lv_find_contract(const long codcf, const long indsped, const TDate& data);
bool lv_is_holiday(const TDate& data);
bool lv_is_02_active();
const TString& lv_get_causale_from_rcontr(const TRectype& lvcontr, bool is_consegna);
const TFilename & lv_backup_path();
class TLaundry_contract : public TRectype

View File

@ -1,10 +1,6 @@
#ifndef __LVLIB2_H
#define __LVLIB2_H
#ifndef __ISAM_H
#include <isam.h>
#endif
#ifndef __RECSET_H
#include <recset.h>
#endif

View File

@ -195,6 +195,25 @@ BEGIN
FIELD PREZZO
END
GR -1 78 4
BE
PR 1 10 "@bDotazioni"
EN
NU 155 7
BE
PR 2 11 "Dotazione Odierna "
FI DOTOD
FL "D"
EN
NU 159 7
BE
PR 2 12 "Dotazione iniziale "
FI DOTIN
FL "D"
EN
STRING FR_CAULAV 3
BEGIN
PROMPT 2 7 "Cau.Lav. "