campo-sirio/ci/ci1500.cpp
guy c3d63f12b2 Esportazione rilevazione ore a paghe
git-svn-id: svn://10.65.10.50/branches/R_10_00@23073 c028cbd2-c16b-5b4b-a496-9718f37d4682
2015-04-30 09:42:59 +00:00

187 lines
5.1 KiB
C++

#include <applicat.h>
#include "../ve/velib04.h"
#include "ci1.h"
///////////////////////////////////////////////////////////
// Applicazione
///////////////////////////////////////////////////////////
class TMovimenti_interni_app : public TSkeleton_application
{
TFilename _trans;
protected:
TDoc_key find_correlated(const TDocumento& din) const;
void delete_doc(TDocumento& doc) const;
public:
virtual bool create();
virtual void main_loop();
};
TDoc_key TMovimenti_interni_app::find_correlated(const TDocumento& din) const
{
TDoc_key dk;
TString query, filter;
filter << ' ' << RDOC_DAPROVV << '=' << din.get(DOC_PROVV)
<< ' ' << RDOC_DAANNO << '=' << din.get(DOC_ANNO)
<< ' ' << RDOC_DACODNUM << '=' << din.get(DOC_CODNUM)
<< ' ' << RDOC_DANDOC << '=' << din.get(DOC_NDOC);
query << "USE 34 KEY 4" << "\nFROM " << filter << "\nTO " << filter;
TISAM_recordset rset(query);
if (rset.move_first())
{
const char provv = rset.get(RDOC_PROVV).as_string()[0];
const int anno = rset.get(RDOC_ANNO).as_int();
const TString4 codnum = rset.get(RDOC_CODNUM).as_string();
const long ndoc = rset.get(RDOC_NDOC).as_int();
dk = TDoc_key(anno, codnum, ndoc, provv);
}
return dk;
}
void TMovimenti_interni_app::delete_doc(TDocumento& doc) const
{
doc.remove();
}
bool TMovimenti_interni_app::create()
{
const TFixed_string a2 = argc() >= 2 ? argv(2) : "";
if (a2.starts_with("-i", true) || a2.starts_with("/i", true))
_trans = a2.mid(2);
#ifdef DBG
if (_trans.blank())
{
const TDate oggi(TODAY);
_trans.tempdir();
_trans.add(name());
_trans.ext("ini");
TConfig ini(_trans, "Transaction");
ini.set("DataElab", oggi.string());
ini.set("ProvvOut", "D");
ini.set("AnnoOut", 2014);
ini.set("CodNumOut", "TRAS");
ini.set("NDocOut", "");
ini.set_paragraph("33");
ini.set(DOC_PROVV, "D");
ini.set(DOC_ANNO, 2014);
ini.set(DOC_CODNUM, "TRAS");
ini.set(DOC_NDOC, 1);
}
#endif
if (!_trans.exist())
return cantread_box(_trans);
open_files(LF_TABCOM, LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_CODCORR, 0);
return TSkeleton_application::create();
}
void TMovimenti_interni_app::main_loop()
{
TConfig ini(_trans, "Transaction");
const TString8 codelab = ini.get("Action");
const TDate oggi = ini.get("DataElab");
ini.set_paragraph("33");
const char provv = ini.get_char(DOC_PROVV);
const int anno = ini.get_int(DOC_ANNO);
const TString& codnum = ini.get(DOC_CODNUM);
const long ndoc = ini.get_long(DOC_NDOC);
TElaborazione_esterna mi(codelab);
const TString4 tipo_correlato = mi.tipo_finale();
TDocumento din(provv, anno, codnum, ndoc);
TDoc_key kout = find_correlated(din);
const bool is_new = kout.empty_items();
if (is_new)
kout = TDoc_key(anno, codnum, 0, provv);
TDocumento dout(kout.provv(), kout.anno(), kout.codnum(), kout.ndoc());
if (ini.get(DOC_NOTE) == "DELETING")
{
delete_doc(dout);
ini.set("Result", "SUCCESS");
return;
}
dout.copy_contents(din, true);
dout.put(DOC_TIPODOC, tipo_correlato);
dout.put(DOC_CODCMS, din.get(DOC_COMMPREL));
dout.put(DOC_FASCMS, din.get(DOC_FASEPREL));
dout.put(DOC_COMMPREL, din.get(DOC_CODCMS));
dout.put(DOC_FASEPREL, din.get(DOC_FASCMS));
const TString16 qtafld = din.tipo().field_qta();
FOR_EACH_PHYSICAL_RDOC(dout, r, rdoc)
{
const real qta = rdoc->get_real(qtafld);
if (!qta.is_zero())
rdoc->put(qtafld, -qta);
rdoc->put(RDOC_CODCMS, dout.get(DOC_CODCMS));
rdoc->put(RDOC_FASCMS, dout.get(DOC_FASCMS));
}
ini.set_paragraph("Transaction");
if (dout.write(!is_new) == NOERR)
{
ini.set("Result", "OUTDOC");
ini.set("NDocOut", dout.get(DOC_NDOC));
ini.set(DOC_STATO, mi.stato_finale_doc_iniziale(), "33");
}
else
{
ini.set("Result", "ERROR");
}
if (ca_config().get_int("Authorizations") > 0)
{
TString8 codelab;
TString query;
query << "USE %ELD SELECT I0=7";
TISAM_recordset eld(query);
for (bool ok = eld.move_first(); ok; ok = eld.move_next())
{
const TString8 cod = eld.get("CODTAB").as_string();
if (codelab.blank())
codelab = cod;
TContabilizzazione_analitica ca(cod);
if (ca.is_document_ok(dout))
{
codelab = cod;
break;
}
}
TContabilizzazione_analitica ca(codelab);
TLista_documenti lista_in, lista_out;
lista_in.add(din);
lista_in.add(dout);
if (ca.elabora(lista_in, lista_out, oggi, false))
{
// Forza stato corretto a documento principale
din.put(DOC_STATO, mi.stato_finale_doc_iniziale());
din.rewrite();
// Forza stato bloccato a documento correlato
dout.put(DOC_STATO, mi.stato_finale());
dout.rewrite();
}
}
}
int ci1500(int argc, char* argv[])
{
TMovimenti_interni_app mi;
mi.run(argc, argv, TR("Movimenti interni"));
return 0;
}