git-svn-id: svn://10.65.10.50/branches/R_10_00@23025 c028cbd2-c16b-5b4b-a496-9718f37d4682
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;
|
||
}
|
||
|
||
|