campo-sirio/ve/ve6200.cpp
alex d8bb68b774 Patch level : 10.0 814
Files correlati     : ve0.exe ve6.exe
Ricompilazione Demo : [ ]
Commento            :

Bug 0001703: Fatturazione Bolle (ve6)

Nella gestione dei riferimenti in testa non viene scritto il flagh descrizione lunga per cui non si vedono i riferimenti delle bolla dalla seconda in poi (seganalato da Servizi informatici (SIPAG))

Bug	0001702: Documenti interattivi (ve0)

Agguingere una elaborazione al tipodocumento in modo da poter effettuare delle operazioni all' atto della registrazione. (HABA)

Per utilizzarla correttamente chi la configura deve configurarei stati dell elaborazione perche' venga chiamata quand serve.

Modificata anche la lettura dell stato attivo per le provvigioni, da verificare ka genreazioe dell provvigioni.


git-svn-id: svn://10.65.10.50/branches/R_10_00@20959 c028cbd2-c16b-5b4b-a496-9718f37d4682
2010-10-07 00:35:55 +00:00

399 lines
12 KiB
C++
Executable File

//#include <progind.h>
#include <recset.h>
#include "velib04.h"
#include "ve6200.h"
#include "ve6200a.h"
#include <doc.h>
///////////////////////////////////////////////////////////
// TFatturazione_bolle_app
///////////////////////////////////////////////////////////
bool TFatturazione_bolle_app::create()
{
open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_OCCAS, LF_INDSP, LF_CFVEN,
LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_CONDV, LF_SVRIEP,
LF_AGENTI, LF_PERCPROV, LF_CAUSALI, 0);
TConfig cfg(CONFIG_DITTA, "ve");
_default_selection = cfg.get("FATBOLSEL");
return TSkeleton_application::create();
}
bool TFatturazione_bolle_app::process(TIndwin& iw, TElaborazione & eld,
TLista_documenti& din, const TDate& data_elab)
{
// Crea documenti di output
TLista_documenti dout;
bool ok = true;
if (eld.elabora(din, dout, data_elab))
{
TString msg;
msg << din.items() << TR(" documenti raggruppati in ") << dout.items();
iw.set_text(msg); // Messaggio sul cliente
do_events(); // Attende visualizzazione
int err = dout.write(); // Scrive documenti di output
if (err == NOERR)
{
err = din.rewrite(); // Aggiorna stato dei documenti di input
if (err != NOERR)
ok = error_box("Errore %d durante la scrittura dei documenti raggruppati!", err);
}
else
ok = error_box("Errore %d durante l'aggiornamento dei documenti da raggruppare!", err);
}
else
return ok;
}
void TFatturazione_bolle_app::process_by_cli(const TMask& m)
{
TIndwin iw(0, "Inizializzazione...\n ", TRUE, FALSE, 60);
const TDate data_elab = m.get_date(F_DATA_ELAB);
const int anno = data_elab.year();
const long dc = m.get_long(F_CODICE_CLIFO_DA);
const long ac = m.get_long(F_CODICE_CLIFO_A);
const int da = m.get_int(F_CODICE_AGENTE_DA);
const int aa = m.get_int(F_CODICE_AGENTE_A);
const TString16 dz(m.get(F_CODICE_ZONA_DA));
const TString16 az(m.get(F_CODICE_ZONA_A));
const TDate dd = m.get_date(F_DATA_DOCUMENTO_DA);
TString st_da = m.get(F_DATA_DOCUMENTO_A); // qui verificare
const TDate ad = st_da.not_empty() ? (TDate)(const char*)st_da : data_elab;
const TString& codnum = m.get(F_CODICE_NUMERAZIONE);
const long dn = m.get_long(F_NUMERO_DOCUMENTO_DA);
const long an = m.get_long(F_NUMERO_DOCUMENTO_A);
TElaborazione * e = elab(m.get(F_CODICE_ELAB));
TElaborazione & eld = *e;
TToken_string tipidoc(24), statidoc(10);
eld.tipi_stati_iniziali(tipidoc, statidoc);
TTipo_documento t(eld.tipo_iniziale(0));
char tipocf(t.tipocf());
TLista_cf clienti(tipocf);
const int tot_cli = clienti.leggi(dc, ac, da, aa, dz, az);
TString msg(80);
for (int c = 0; c < tot_cli && !iw.iscancelled(); c++)
{
const long codcli = clienti[c]; // Codice cliente in esame
msg = "Elaborazione dei documenti del cliente ";
msg << codcli << " ...";
iw.set_text(msg); // Messaggio sul cliente
do_events(); // Attende visualizzazione
TLista_documenti din; // Legge tutti i documenti di input
din.read('D', tipocf, codcli, anno, tipidoc, statidoc, dd, ad, codnum, dn, an);
if (din.items() > 0 && !iw.iscancelled())
{
bool ok = process(iw, eld, din, data_elab);
if (!ok) // In caso di errore termina qui l'elaborazione.
break;
}
}
delete e;
}
void TFatturazione_bolle_app::process_by_ragsoc(const TMask& m)
{
TIndwin iw(0, "Inizializzazione...\n ", TRUE, FALSE, 60);
const TDate data_elab = m.get_date(F_DATA_ELAB);
const int anno = data_elab.year();
const TString dr = m.get(F_RAGSOC_CLIFO_DA);
const TString ar = m.get(F_RAGSOC_CLIFO_A);
const int da = m.get_int(F_CODICE_AGENTE_DA);
const int aa = m.get_int(F_CODICE_AGENTE_A);
const TString16 dz(m.get(F_CODICE_ZONA_DA));
const TString16 az(m.get(F_CODICE_ZONA_A));
const TDate dd = m.get_date(F_DATA_DOCUMENTO_DA);
TString st_da = m.get(F_DATA_DOCUMENTO_A); // qui verificare
const TDate ad = st_da.not_empty() ? (TDate)(const char*)st_da : data_elab;
const TString& codnum = m.get(F_CODICE_NUMERAZIONE);
const long dn = m.get_long(F_NUMERO_DOCUMENTO_DA);
const long an = m.get_long(F_NUMERO_DOCUMENTO_A);
TElaborazione * e = elab(m.get(F_CODICE_ELAB));
TElaborazione & eld = *e;
TToken_string tipidoc(24), statidoc(10);
eld.tipi_stati_iniziali(tipidoc, statidoc);
TTipo_documento t(eld.tipo_iniziale(0));
char tipocf(t.tipocf());
TLista_cf clienti(tipocf);
const int tot_cli = clienti.leggi_ragsoc(dr, ar, da, aa, dz, az);
TString msg(80);
for (int c = 0; c < tot_cli && !iw.iscancelled(); c++)
{
const long codcli = clienti[c]; // Codice cliente in esame
msg = "Elaborazione dei documenti del cliente ";
msg << codcli << " ...";
iw.set_text(msg); // Messaggio sul cliente
do_events(); // Attende visualizzazione
TLista_documenti din; // Legge tutti i documenti di input
din.read('D', tipocf, codcli, anno, tipidoc, statidoc, dd, ad, codnum, dn, an);
if (din.items() > 0 && !iw.iscancelled())
{
bool ok = process(iw, eld, din, data_elab);
if (!ok) // In caso di errore termina qui l'elaborazione.
break;
}
}
delete e;
}
void TFatturazione_bolle_app::process_by_doc(const TMask& m)
{
TIndwin iw(0, TR("Inizializzazione...\n "), TRUE, FALSE, 60);
const TDate data_elab = m.get_date(F_DATA_ELAB);
const int anno = data_elab.year();
long dc = m.get_long(F_CODICE_CLIFO_DA);
long ac = m.get_long(F_CODICE_CLIFO_A);
const int da = m.get_int(F_CODICE_AGENTE_DA);
const int aa = m.get_int(F_CODICE_AGENTE_A);
const TString8 dz(m.get(F_CODICE_ZONA_DA));
const TString8 az(m.get(F_CODICE_ZONA_A));
const TDate dd = m.get_date(F_DATA_DOCUMENTO_DA);
TDate ad = m.get_date(F_DATA_DOCUMENTO_A);
if (!ad.ok()) ad = data_elab;
const TString& codnum = m.get(F_CODICE_NUMERAZIONE);
const long dn = m.get_long(F_NUMERO_DOCUMENTO_DA);
const long an = m.get_long(F_NUMERO_DOCUMENTO_A);
TElaborazione * e = elab(m.get(F_CODICE_ELAB));
TElaborazione & eld = *e;
TToken_string tipidoc(24), statidoc(10);
eld.tipi_stati_iniziali(tipidoc, statidoc);
TTipo_documento t(eld.tipo_iniziale(0));
char tipocf(t.tipocf());
TLista_cf clienti(tipocf);
const int tot_cli = clienti.leggi(dc, ac);
TLista_documenti din, dout; // Legge tutti i documenti di input
TString msg(80);
for (int c = 0; c < tot_cli && !iw.iscancelled(); c++)
{
const long codcli = clienti[c]; // Codice cliente in esame
msg = TR("Elaborazione dei documenti del cliente");
msg << ' ' << codcli << "...";
iw.set_text(msg); // Messaggio sul cliente
do_events(); // Attende visualizzazione
TLista_documenti list;
list.read('D', tipocf, codcli, anno, tipidoc, statidoc, dd, ad, codnum, dn, an);
for (int i = list.items()-1; i >= 0; i--)
{
const TDocumento& doc = list[i];
bool to_del = FALSE;
const int agente = doc.get_int(DOC_CODAG);
if (agente > 0)
{
if (da > 0 && agente < da) to_del = true;
if (aa > 0 && agente > aa) to_del = true;
}
const TString8 zona = doc.get(DOC_ZONA);
if (zona.full())
{
if (dz.not_empty() && zona < dz) to_del = true;
if (az.not_empty() && zona > az) to_del = true;
}
if (to_del)
list.destroy(i);
}
const int items = list.items();
for (int j = 0; j < items; j++)
din.add(list[j]);
}
if (din.items() > 0 && !iw.iscancelled())
bool ok = process(iw, eld, din, data_elab);
delete e;
}
void TFatturazione_bolle_app::process_by_fatt(const TMask& m)
{
TWait_cursor hourglass;
TElaborazione* e = elab(m.get(F_CODICE_ELAB));
TElaborazione& eld = *e;
TToken_string tipidoc(24), statidoc(10);
eld.tipi_stati_iniziali(tipidoc, statidoc);
const TTipo_documento t(eld.tipo_iniziale(0));
const char tipocffatt = t.tipocf() == 'C' ? 'F' : 'C';
const TDate data_elab = m.get_date(F_DATA_ELAB);
const int anno = data_elab.year();
long dc = m.get_long(F_CODICE_CLIFO_DA);
long ac = m.get_long(F_CODICE_CLIFO_A);
const int da = m.get_int(F_CODICE_AGENTE_DA);
const int aa = m.get_int(F_CODICE_AGENTE_A);
const TString& dz = m.get(F_CODICE_ZONA_DA);
const TString& az = m.get(F_CODICE_ZONA_A);
const TString& codnum = m.get(F_CODICE_NUMERAZIONE);
const long dn = codnum.full() ? m.get_long(F_NUMERO_DOCUMENTO_DA) : 0;
const long an = codnum.full() ? m.get_long(F_NUMERO_DOCUMENTO_A) : 0;
TDate dd = m.get_date(F_DATA_DOCUMENTO_DA);
if (!dd.ok())
dd = TDate(1,1,anno);
TDate ad = m.get_date(F_DATA_DOCUMENTO_A);
if (!ad.ok())
ad = data_elab;
const int nkey = (dn > 0 || an > 0) ? 1 : 3;
TString query;
query << "USE DOC KEY " << nkey << " SELECT (TIPOCFFATT=\"" << tipocffatt << "\")";
if (dc > 0 || ac > 0)
query << "&&(BETWEEN(CODCFFATT," << dc << ',' << ac << "))";
query << "&&(BETWEEN(DATADOC," << dd.date2ansi() << ',' << ad.date2ansi() << "))";
if (da > 0 || aa > 0)
query << "&&(BETWEEN(CODAG," << da << "," << aa << "))";
if (dz.full() || az.full())
query << "&&(BETWEEN(ZONA,\"" << dz << "\",\"" << az << "\"))";
if (nkey == 3 && codnum.full())
query << "&&(CODNUM=\"" << codnum << "\")";
query << "\nBY " << DOC_CODCFFATT;
if (eld.usa_doc_rif())
query << ' ' << DOC_DATADOCRIF;
if (nkey == 1)
{
query << "\nFROM PROVV=D ANNO=" << anno << " CODNUM=" << codnum << " NDOC=" << dn;
query << "\nTO PROVV=D ANNO=" << anno << " CODNUM=" << codnum << " NDOC=" << an;
}
else
{
query << "\nFROM DATADOC=" << dd.date2ansi();
query << "\nTO DATADOC=" << ad.date2ansi();
}
TISAM_recordset docs(query);
const TRectype& head = docs.cursor()->curr();
TProgind iw(docs.items(), "Elaborazione documenti da fatturare", true, true);
long last_clifo = 0; // Ultimo cliente elaborato
TLista_documenti din; // Lista dei documenti dell'ultimo cliente
for (bool ok = docs.move_first(); ok; ok = docs.move_next())
{
const long clifo = docs.get(DOC_CODCFFATT).as_int();
if (clifo > 0 && clifo >= dc && (clifo <= ac || ac <= 0)) // Cliente da fatturare non nullo e valido
{
if (clifo != last_clifo) // Cambio cliente
{
if (din.items() > 0) // Ci sono documenti da elaborare?
{
process(iw, eld, din, data_elab); // Elaborali ...
din.destroy(-1); // ... e poi buttali
}
last_clifo = clifo;
}
if (!iw.addstatus(1))
break;
// Controlla se il documento e' in uno stato valido per l'elaborazione
const TString4 tipodoc = head.get(DOC_TIPODOC);
const TString4 statodoc = head.get(DOC_STATO);
for (int i = tipidoc.items()-1; i>=0; i--)
{
if (tipodoc == tipidoc.get(i) && statodoc == statidoc.get(i))
{
din.add(head);
break;
}
}
}
}
// Termina l'elaborazione dei documenti dell'ultimo cliente
if (din.items() > 0 && !iw.iscancelled())
process(iw, eld, din, data_elab);
delete e;
}
bool TFatturazione_bolle_app::clifo_da_fatt(const TMask& m) const
{
TElaborazione* e = elab(m.get(F_CODICE_ELAB));
TFatturazione_bolle& eld = *(TFatturazione_bolle*)e;
const bool yes = eld.change_clifo();
delete e;
return yes;
}
void TFatturazione_bolle_app::main_loop()
{
TMask m("ve6200a");
m.set(F_SELEZIONE, _default_selection);
while (m.run() == K_ENTER)
{
const TString& select_from = m.get(F_SELEZIONE);
if (select_from != _default_selection)
{
TConfig cfg(CONFIG_DITTA, "ve");
cfg.set("FATBOLSEL", _default_selection = select_from);
}
if (m.get(F_ORDINAMENTO) == "R")
process_by_ragsoc(m);
else
{
if (clifo_da_fatt(m))
{
process_by_fatt(m);
}
else
{
if (select_from == "D")
process_by_doc(m);
else
process_by_cli(m);
}
}
}
}
int ve6200 (int argc, char **argv)
{
TFatturazione_bolle_app a;
a.run (argc, argv, TR("Fatturazione Bolle"));
return TRUE;
}