323 lines
9.0 KiB
C++
323 lines
9.0 KiB
C++
|
#include "sl0200.h"
|
|||
|
|
|||
|
#include "../ve/velib04.h"
|
|||
|
#include "../ca/commesse.h"
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////
|
|||
|
// TCertificazione
|
|||
|
///////////////////////////////////////////////////////////
|
|||
|
|
|||
|
class TCertificazione : public TElaborazione_esterna
|
|||
|
{
|
|||
|
protected:
|
|||
|
const TRectype& find_cert(const TDocumento& doc);
|
|||
|
void set_codiva(TRiga_documento& rdoc) const;
|
|||
|
|
|||
|
public:
|
|||
|
virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out,
|
|||
|
const TDate& data_elab, bool interattivo = false);
|
|||
|
TCertificazione(const TString& cod);
|
|||
|
};
|
|||
|
|
|||
|
const TRectype& TCertificazione::find_cert(const TDocumento& doc)
|
|||
|
{
|
|||
|
const TString& codnum = codice_numerazione_finale();
|
|||
|
TString query, limit;
|
|||
|
limit << RDOC_DAPROVV << '=' << doc.get(DOC_PROVV) << ' '
|
|||
|
<< RDOC_DAANNO << '=' << doc.get_int(DOC_ANNO) << ' '
|
|||
|
<< RDOC_DACODNUM << '=' << doc.get(DOC_CODNUM) << ' '
|
|||
|
<< RDOC_DANDOC << '=' << doc.get_long(DOC_NDOC);
|
|||
|
query << "USE 34 KEY 4"
|
|||
|
<< "\nSELECT CODNUM=\"" << codnum << '"'
|
|||
|
<< "\nFROM " << limit << "\nTO " << limit;
|
|||
|
|
|||
|
TISAM_recordset recset(query);
|
|||
|
const TRectype& rdoc = recset.cursor()->curr();
|
|||
|
TToken_string key;
|
|||
|
if (recset.move_first())
|
|||
|
{
|
|||
|
key = rdoc.get(RDOC_PROVV);
|
|||
|
key.add(rdoc.get(RDOC_ANNO));
|
|||
|
key.add(rdoc.get(RDOC_CODNUM));
|
|||
|
key.add(rdoc.get(RDOC_NDOC));
|
|||
|
}
|
|||
|
|
|||
|
return cache().get(LF_DOC, key);
|
|||
|
}
|
|||
|
|
|||
|
void TCertificazione::set_codiva(TRiga_documento& rdoc) const
|
|||
|
{
|
|||
|
TString4 codiva;
|
|||
|
|
|||
|
const TString80 codcms = rdoc.doc().get(DOC_CODCMS);
|
|||
|
if (codcms.full())
|
|||
|
{
|
|||
|
const TRectype& cms = cache().get(LF_COMMESSE, codcms);
|
|||
|
if (!cms.empty())
|
|||
|
{
|
|||
|
rdoc.put(RDOC_CODCMS, codcms);
|
|||
|
codiva = cms.get(COMMESSE_CODIVA);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
const TString80 codart = rdoc.get(RDOC_CODART);
|
|||
|
if (codart.full())
|
|||
|
{
|
|||
|
const TRectype& ana = cache().get(LF_ANAMAG, codart);
|
|||
|
if (!ana.empty())
|
|||
|
{
|
|||
|
rdoc.put(RDOC_CODARTMAG, codart);
|
|||
|
rdoc.put(RDOC_CHECKED, true);
|
|||
|
|
|||
|
TToken_string key; key.add(codart); key.add(1);
|
|||
|
const TString& um = cache().get(LF_UMART, key, UMART_UM);
|
|||
|
rdoc.put(RDOC_UMQTA, um);
|
|||
|
|
|||
|
if (codiva.blank())
|
|||
|
codiva = ana.get(ANAMAG_CODIVA);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
rdoc.put(RDOC_CODIVA, codiva);
|
|||
|
rdoc.importo(true, false); // Ricalcola IMPNS
|
|||
|
}
|
|||
|
|
|||
|
bool TCertificazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out,
|
|||
|
const TDate& data_elab, bool interattivo)
|
|||
|
{
|
|||
|
for (int i = 0; i < doc_in.items(); i++)
|
|||
|
{
|
|||
|
TDocumento& din = doc_in[i];
|
|||
|
|
|||
|
// Mi assicuro che ad ogni documento in ingresso ne corrisponda uno in uscita
|
|||
|
if (i >= doc_out.items())
|
|||
|
{
|
|||
|
const TRectype& cert = find_cert(din);
|
|||
|
if (!cert.empty())
|
|||
|
{
|
|||
|
if (interattivo)
|
|||
|
warning_box("Il documento S.A.L. aggiorner<65> il certificato %s %d/%ld",
|
|||
|
(const char*)cert.get(DOC_CODNUM), cert.get_int(DOC_ANNO), cert.get_long(DOC_NDOC));
|
|||
|
}
|
|||
|
|
|||
|
TDocumento* doc = NULL;
|
|||
|
if (cert.empty())
|
|||
|
{
|
|||
|
doc = new TDocumento('D', data_elab.year(), codice_numerazione_finale(), 0L);
|
|||
|
doc->put(DOC_TIPODOC, tipo_finale());
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
doc = new TDocumento(cert);
|
|||
|
doc->destroy_rows();
|
|||
|
}
|
|||
|
doc_out.add(doc);
|
|||
|
}
|
|||
|
|
|||
|
TDocumento& don = doc_out[i];
|
|||
|
|
|||
|
din.put(DOC_STATO, stato_finale_doc_iniziale());
|
|||
|
|
|||
|
don.put(DOC_NUMANT, din.get(DOC_NUMANT));
|
|||
|
don.put(DOC_TIPOCF, din.get(DOC_TIPOCF));
|
|||
|
don.put(DOC_CODCF, din.get(DOC_CODCF));
|
|||
|
don.put(DOC_DATADOC, data_elab);
|
|||
|
don.put(DOC_NOTE, din.get(DOC_NOTE));
|
|||
|
don.put(DOC_CODCMS, din.get(DOC_CODCMS));
|
|||
|
don.put(DOC_STATO, stato_finale());
|
|||
|
don.put(DOC_NUMDOCRIF, din.get(DOC_NDOC));
|
|||
|
don.put(DOC_DATADOCRIF, din.get(DOC_DATADOC));
|
|||
|
|
|||
|
// don.put(DOC_G1, din.get(DOC_G1));
|
|||
|
TToken_string g1(din.get(DOC_G1), '\n');
|
|||
|
FOR_EACH_TOKEN(g1, tok)
|
|||
|
{
|
|||
|
TToken_string fld(tok, '=');
|
|||
|
const char* name = fld.get(0);
|
|||
|
const char* value = fld.get();
|
|||
|
don.put(name, value);
|
|||
|
}
|
|||
|
|
|||
|
const bool is_cli = don.get_char(DOC_TIPOCF) != 'F';
|
|||
|
const real sal_sal = din.get("SAL_SAL");
|
|||
|
if (sal_sal > ZERO)
|
|||
|
{
|
|||
|
TRiga_documento& rdoc = don.new_row("01");
|
|||
|
rdoc.put(RDOC_CODART, ini_get_string(CONFIG_DITTA, "ci", is_cli ? "CODARTLC" : "CODARTLF"));
|
|||
|
rdoc.put(RDOC_QTA, UNO);
|
|||
|
rdoc.put(RDOC_DESCR, TR("Lavori eseguiti"));
|
|||
|
rdoc.put(RDOC_PREZZO, sal_sal);
|
|||
|
rdoc.set_original_rdoc_key(din[1]);
|
|||
|
set_codiva(rdoc);
|
|||
|
}
|
|||
|
|
|||
|
const real sal_gar = din.get("SAL_GAR");
|
|||
|
if (sal_gar > ZERO)
|
|||
|
{
|
|||
|
TRiga_documento& rdoc = don.new_row("01");
|
|||
|
rdoc.put(RDOC_CODART, ini_get_string(CONFIG_DITTA, "ci", is_cli ? "CODARTGC" : "CODARTGF"));
|
|||
|
rdoc.put(RDOC_QTA, -UNO);
|
|||
|
rdoc.put(RDOC_DESCR, TR("Ritenuta a garanzia"));
|
|||
|
rdoc.put(RDOC_PREZZO, sal_gar);
|
|||
|
rdoc.set_original_rdoc_key(din[1]);
|
|||
|
set_codiva(rdoc);
|
|||
|
}
|
|||
|
|
|||
|
const real sal_ant = din.get("SAL_ANT");
|
|||
|
if (sal_ant > ZERO)
|
|||
|
{
|
|||
|
TRiga_documento& rdoc = don.new_row("01");
|
|||
|
rdoc.put(RDOC_CODART, ini_get_string(CONFIG_DITTA, "ci", is_cli ? "CODARTAC" : "CODARTAF"));
|
|||
|
rdoc.put(RDOC_QTA, -UNO);
|
|||
|
rdoc.put(RDOC_DESCR, TR("Anticipi"));
|
|||
|
rdoc.put(RDOC_PREZZO, sal_ant);
|
|||
|
rdoc.set_original_rdoc_key(din[1]);
|
|||
|
set_codiva(rdoc);
|
|||
|
}
|
|||
|
|
|||
|
din.rewrite(); // Aggiorna codici fase nelle righe
|
|||
|
don.write(); // Salva ordine
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
TCertificazione::TCertificazione(const TString& cod) : TElaborazione_esterna(cod)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////
|
|||
|
// Utility pubbliche
|
|||
|
///////////////////////////////////////////////////////////
|
|||
|
|
|||
|
const TString& sl_trova_elaborazione(const TRectype& doc)
|
|||
|
{
|
|||
|
const TString& codnum = doc.get(DOC_CODNUM); // SAL
|
|||
|
TString str;
|
|||
|
str << "USE %ELD SELECT (STR(I0=\"0\"))&&(S3=\"sl0 -1\")&&(S5=\"" << codnum << "\")";
|
|||
|
|
|||
|
TRecordset* eld = create_recordset(str);
|
|||
|
if (eld != NULL)
|
|||
|
{
|
|||
|
TString16 cod;
|
|||
|
for (bool ok = eld->move_first(); ok; ok = eld->move_next())
|
|||
|
{
|
|||
|
const TString& c = eld->get("CODTAB").as_string();
|
|||
|
const TElaborazione e(c);
|
|||
|
if (e.is_document_ok(doc))
|
|||
|
{
|
|||
|
cod = c;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
delete eld;
|
|||
|
return get_tmp_string() = cod;
|
|||
|
}
|
|||
|
return EMPTY_STRING;
|
|||
|
}
|
|||
|
|
|||
|
const TString& sl_trova_elaborazione(const TMask& m)
|
|||
|
{
|
|||
|
TRectype doc(LF_DOC);
|
|||
|
doc.put(DOC_PROVV, 'D');
|
|||
|
doc.put(DOC_ANNO, m.get(DOC_ANNO));
|
|||
|
doc.put(DOC_CODNUM, m.get(DOC_CODNUM));
|
|||
|
doc.put(DOC_NDOC, m.get(DOC_NDOC));
|
|||
|
doc.put(DOC_TIPODOC, m.get(DOC_TIPODOC));
|
|||
|
doc.put(DOC_STATO, m.get(DOC_STATO));
|
|||
|
return sl_trova_elaborazione(doc);
|
|||
|
}
|
|||
|
|
|||
|
bool sl_genera_documento(TRectype& doc, const TString& cod)
|
|||
|
{
|
|||
|
TString16 codelab = cod;
|
|||
|
if (codelab.blank())
|
|||
|
codelab = sl_trova_elaborazione(doc);
|
|||
|
|
|||
|
TCertificazione e(codelab);
|
|||
|
|
|||
|
const TDate oggi(TODAY);
|
|||
|
TLista_documenti doc_in, doc_out;
|
|||
|
doc_in.add(new TDocumento(doc));
|
|||
|
|
|||
|
bool ok = e.elabora(doc_in, doc_out, oggi, true);
|
|||
|
if (ok)
|
|||
|
{
|
|||
|
int err = doc_in.rewrite();
|
|||
|
if (err == NOERR)
|
|||
|
{
|
|||
|
const TRectype& idoc = doc_in[0];
|
|||
|
for (int i = 0; i < idoc.items(); i++)
|
|||
|
{
|
|||
|
const char* fld = idoc.fieldname(i);
|
|||
|
const TString& val = idoc.get(fld);
|
|||
|
if (val.full())
|
|||
|
doc.put(fld, val);
|
|||
|
}
|
|||
|
|
|||
|
err = doc_out.write();
|
|||
|
if (err == NOERR)
|
|||
|
message_box(FR("E' stato generato il certificato %ld"), doc.get_long(DOC_NUMANT));
|
|||
|
else
|
|||
|
error_box(TR("Errore %d in scrittura del certificato"), err);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return ok;
|
|||
|
}
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////
|
|||
|
// TCertificazione_app
|
|||
|
///////////////////////////////////////////////////////////
|
|||
|
|
|||
|
class TCertificazione_app : public TSkeleton_application
|
|||
|
{
|
|||
|
protected:
|
|||
|
virtual void main_loop();
|
|||
|
};
|
|||
|
|
|||
|
void TCertificazione_app::main_loop()
|
|||
|
{
|
|||
|
TFilename ininame;
|
|||
|
if (argc() >= 2)
|
|||
|
{
|
|||
|
const TFixed_string arg = argv(2);
|
|||
|
ininame = arg.starts_with("-i", true) ? arg.mid(2) : arg;
|
|||
|
}
|
|||
|
|
|||
|
TConfig ini(ininame, "Transaction");
|
|||
|
const TString8 codelab = ini.get("Action");
|
|||
|
|
|||
|
ini.set_paragraph("33");
|
|||
|
TRectype doc(LF_DOC);
|
|||
|
doc.put(DOC_PROVV, ini.get(DOC_PROVV));
|
|||
|
doc.put(DOC_ANNO, ini.get(DOC_ANNO));
|
|||
|
doc.put(DOC_CODNUM, ini.get(DOC_CODNUM));
|
|||
|
doc.put(DOC_NDOC, ini.get(DOC_NDOC));
|
|||
|
|
|||
|
if (sl_genera_documento(doc, codelab))
|
|||
|
{
|
|||
|
ini.set_paragraph("Transaction");
|
|||
|
ini.set("Result", "OK");
|
|||
|
ini.set("Error", "0");
|
|||
|
|
|||
|
ini.set_paragraph("33");
|
|||
|
for (int i = 0; i < doc.items(); i++)
|
|||
|
{
|
|||
|
const char* fld = doc.fieldname(i);
|
|||
|
const TString& val = doc.get(fld);
|
|||
|
if (val.full())
|
|||
|
ini.set(fld, val);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
int sl0200(int argc, char* argv[])
|
|||
|
{
|
|||
|
TCertificazione_app a;
|
|||
|
a.run(argc, argv, TR("Certificazione di pagamento"));
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
|