165 lines
5.7 KiB
C++
165 lines
5.7 KiB
C++
|
#include "halib.h"
|
|||
|
|
|||
|
#include "../ve/velib04.h"
|
|||
|
|
|||
|
class TElaborazione_NAC_definitive : public TElaborazione
|
|||
|
{
|
|||
|
protected:
|
|||
|
int find_contratti_cliente(long codcfatt, const TDate& data_elab, TArray& contratti_cliente);
|
|||
|
|
|||
|
public:
|
|||
|
virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out,
|
|||
|
const TDate& data_elab, bool interattivo);
|
|||
|
|
|||
|
TElaborazione_NAC_definitive(const TString& codelab) : TElaborazione(codelab) { }
|
|||
|
};
|
|||
|
|
|||
|
//metodo che riempie un array con tutti i contratti del cliente passatogli (in base alla tipologia di contratti da elaborare)
|
|||
|
int TElaborazione_NAC_definitive::find_contratti_cliente(long codcfatt, const TDate& data_elab,
|
|||
|
TArray& contratti_cliente)
|
|||
|
{
|
|||
|
contratti_cliente.destroy();
|
|||
|
|
|||
|
//settaggio delle variabili
|
|||
|
//il codice numerazione lo trova nella configurazione Hardy, e lo deve scegliere in base alla tipologia di contratti che sta esaminando!
|
|||
|
TConfig config(CONFIG_DITTA, "ha");
|
|||
|
|
|||
|
const TString4 tip_ant = config.get("CoAntTip");
|
|||
|
const TString4 tip_rifa = config.get("CoRifaTip");
|
|||
|
const TString4 tip_post = config.get("CoPostTip");
|
|||
|
|
|||
|
TAssoc_array cod_num_cont;
|
|||
|
cod_num_cont.add(config.get("CoAntNum"));
|
|||
|
cod_num_cont.add(config.get("CoRifaNum"));
|
|||
|
cod_num_cont.add(config.get("CoPostNum"));
|
|||
|
|
|||
|
FOR_EACH_ASSOC_OBJECT(cod_num_cont, h, k, o)
|
|||
|
{
|
|||
|
//deve cercare tutti i contratti del cliente e metterli nell'array
|
|||
|
TString query;
|
|||
|
query << "USE DOC KEY 5";
|
|||
|
query << "\nSELECT ((TIPODOC=#A_TIPODOC)||(TIPODOC=#R_TIPODOC)||(TIPODOC=#P_TIPODOC))&&(STR(DOC2=#CODCF))";
|
|||
|
query << "\nFROM PROVV=D CODNUM=" << k;
|
|||
|
query << "\nTO PROVV=D CODNUM=" << k;
|
|||
|
|
|||
|
TISAM_recordset recset(query);
|
|||
|
|
|||
|
recset.set_var("#A_TIPODOC", tip_ant);
|
|||
|
recset.set_var("#R_TIPODOC", tip_rifa);
|
|||
|
recset.set_var("#P_TIPODOC", tip_post);
|
|||
|
|
|||
|
recset.set_var("#CODCF", codcfatt);
|
|||
|
|
|||
|
const long n_contratti = recset.items(); //questo serve solo al sagace programmatore
|
|||
|
|
|||
|
//aggiunge i contratti all'array: solo quelli in auge nel periodo di calcolo selezionato sulla maschera!
|
|||
|
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
|
|||
|
{
|
|||
|
//contratti anticipo 'A': datainizio esiste sempre, datafine non esiste (va ad esaurimento)
|
|||
|
//contratti posticipo 'P': datainizio esiste sempre, datafine pu<70> non esistere
|
|||
|
//contratti rifatturazione 'R': come contratti anticipo
|
|||
|
|
|||
|
//controlla validit<69> del contratto con le date scelte per l'elaborazione dei documenti
|
|||
|
const TDate data_ini_contratto = recset.get(DOC_DATACOMP).as_date();
|
|||
|
|
|||
|
//quindi la datainizio vale per tutti allo stesso modo (<28> obbligatoria nei contratti)
|
|||
|
//se l'elaborazione finisce prima che cominci il contratto -> il contratto non serve a nulla
|
|||
|
if (data_ini_contratto > data_elab)
|
|||
|
continue;
|
|||
|
|
|||
|
//la data fine vale invece solo per i contratti 'P' e potrebbe non esserci (contratti senza scadenza)
|
|||
|
TDate data_fine_contratto;
|
|||
|
|
|||
|
//se la data fine contratto non <20> valida (ma <20> presente!) non dobbiamo fare nulla, perch<63> il contratto non va elaborato
|
|||
|
data_fine_contratto = recset.get(DOC_DATAFCOMP).as_date();
|
|||
|
if (data_fine_contratto.ok())
|
|||
|
{
|
|||
|
if (data_fine_contratto < data_elab)
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
TContratto_premi* curr_contratto = new TContratto_premi(recset.cursor()->curr());
|
|||
|
contratti_cliente.add(curr_contratto);
|
|||
|
}
|
|||
|
}
|
|||
|
return contratti_cliente.items();
|
|||
|
}
|
|||
|
|
|||
|
bool TElaborazione_NAC_definitive::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out,
|
|||
|
const TDate& data_elab, bool interattivo)
|
|||
|
{
|
|||
|
TArray contratti;
|
|||
|
bool done = false;
|
|||
|
for (int i = 0; i < doc_in.items(); i++)
|
|||
|
{
|
|||
|
TDocumento& doc = doc_in[i];
|
|||
|
const long codcf = doc.codcf();
|
|||
|
const TDate data = doc.get(DOC_DATADOC);
|
|||
|
|
|||
|
FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc)
|
|||
|
{
|
|||
|
const TRectype* contr = rdoc->find_original_doc();
|
|||
|
if (contr == NULL && find_contratti_cliente(codcf, data, contratti) == 1)
|
|||
|
contr = (TContratto_premi*)contratti.objptr(0);
|
|||
|
|
|||
|
if (contr)
|
|||
|
{
|
|||
|
TContratto_premi cp(*contr);
|
|||
|
FOR_EACH_PHYSICAL_RDOC_BACK(cp, c, rc)
|
|||
|
{
|
|||
|
if (rc->tipo().codice() == HARDY_TIPORIGA_SOMMA)
|
|||
|
{
|
|||
|
rc->add(RCA_2_RESO_STORICO, rdoc->importo(false, false, 2));
|
|||
|
done = cp.rewrite() == NOERR;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return done;
|
|||
|
}
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////
|
|||
|
// main
|
|||
|
///////////////////////////////////////////////////////////
|
|||
|
|
|||
|
class TNac_def_app : public TSkeleton_application
|
|||
|
{
|
|||
|
protected:
|
|||
|
virtual void main_loop();
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
void TNac_def_app::main_loop()
|
|||
|
{
|
|||
|
if (argc() >= 2 && toupper(argv(2)[1]) == 'I')
|
|||
|
{
|
|||
|
open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_DOC, LF_RIGHEDOC, 0);
|
|||
|
TConfig ini(argv(2)+2, "Transaction");
|
|||
|
const TString16 codelab = ini.get("Action");
|
|||
|
ini.set_paragraph("33");
|
|||
|
const char provv = ini.get_char(DOC_PROVV);
|
|||
|
const int anno = ini.get_int(DOC_ANNO);
|
|||
|
const TString4 codnum = ini.get(DOC_CODNUM);
|
|||
|
const long ndoc = ini.get_long(DOC_NDOC);
|
|||
|
TDocumento* doc = new TDocumento(provv, anno, codnum, ndoc);
|
|||
|
|
|||
|
TLista_documenti doc_in, doc_out;
|
|||
|
doc_in.add(doc);
|
|||
|
|
|||
|
const TDate oggi(TODAY);
|
|||
|
TElaborazione_NAC_definitive end(codelab);
|
|||
|
const bool done = end.elabora(doc_in, doc_out, oggi, false);
|
|||
|
|
|||
|
ini.set("Result", done ? "SUCCESS" : "ERROR", "Transaction");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
int ha0700(int argc, char* argv[])
|
|||
|
{
|
|||
|
TNac_def_app app;
|
|||
|
app.run(argc, argv, TR("NAC definitive"));
|
|||
|
return 0;
|
|||
|
}
|