campo-sirio/ps/ps0430300.cpp
guy ab083a1e95 Personalizzazioni per Cigno
git-svn-id: svn://10.65.10.50/branches/R_10_00@22727 c028cbd2-c16b-5b4b-a496-9718f37d4682
2012-09-18 10:35:36 +00:00

1316 lines
38 KiB
C++
Executable File

// Stampa dettaglio disponibilita' articoli
#include <applicat.h>
#include <automask.h>
#include <colors.h>
#include <defmask.h>
#include <execp.h>
#include <progind.h>
#include <reprint.h>
#include <utility.h>
#include "../or/orlib.h"
#include "../cg/cglib01.h"
#include "../mg/anamag.h"
#include "../ve/velib07.h"
#include "ps0430300a.h"
#include <clifo.h>
#include <cfven.h>
///////////////////////////////////////////////////////////
// TArticoli_recordset
///////////////////////////////////////////////////////////
class TArticoli_recordset : public TISAM_recordset
{
static TString8 __codmag;
static int __codes;
bool _sottoscorta;
protected:
static bool filtra_sottoscorta(const TRelation* rel);
public:
virtual TCursor* cursor() const;
TArticoli_recordset(const char* use, bool sottoscorta, int codes, const char * codmag) : TISAM_recordset(use), _sottoscorta(sottoscorta) { __codes = codes; __codmag = codmag;}
virtual ~TArticoli_recordset() {}
};
TString8 TArticoli_recordset::__codmag;
int TArticoli_recordset::__codes;
bool TArticoli_recordset::filtra_sottoscorta(const TRelation* rel)
{
((TRelation*)rel)->save_status();
const char* codart = rel->curr(LF_ANAMAG).get(ANAMAG_CODART);
TArticolo_giacenza artgiac(codart);
const real giac = artgiac.giacenza_anno(__codmag, NULL, __codes);
const bool ok = giac < artgiac.scorta_minima(__codmag, NULL, __codes);
((TRelation*)rel)->restore_status();
return ok;
}
TCursor* TArticoli_recordset::cursor() const
{
TCursor* c = TISAM_recordset::cursor();
if (c != NULL && _sottoscorta)
c->set_filterfunction(filtra_sottoscorta);
return c;
}
///////////////////////////////////////////////////////////
// TConsumi_report
///////////////////////////////////////////////////////////
class TConsumi_report : public TDocument_report
{
protected:
virtual bool use_mask() { return false; }
public:
TConsumi_report();
};
TConsumi_report::TConsumi_report()
{
load("ps0430300a");
}
///////////////////////////////////////////////////////////
// TGenera_ordini_mask
///////////////////////////////////////////////////////////
class TGenera_ordini_mask : public TAutomask
{
TString _anamag_query;
TString _disable_expr;
TString8 _disable_num;
TExpression _dis;
TString _doc_filter;
int _days_interval;
int _riga_da_selezionare;
bool _filter_changed, _order_changed;
private:
void serialize(bool bSave);
void load_user_defs();
void update_sheet();
void update_orders();
void reconstruction(const TDocumento& doc2delete);
protected:
bool on_sheet_event(TOperable_field& o, TField_event e, long jolly);
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
virtual void next_page(int p);
virtual void on_idle();
public:
TGenera_ordini_mask();
~TGenera_ordini_mask();
};
///////////////////////////////////////////////////////////
// TCreazione_ordini
///////////////////////////////////////////////////////////
class TCreazione_ordini : public TSkeleton_application
{
TGenera_ordini_mask* _mask;
protected:
virtual const char * extra_modules() const {return "or";}
TString_array _userfld;
void aggiorna_stato_doc_orig(const TRectype& rdoc);
public:
void generate_orders();
void generate_carics();
virtual bool create();
virtual void main_loop();
virtual bool destroy();
virtual void print();
void print_doc(const TRectype & doc);
};
inline TCreazione_ordini & capp() { return (TCreazione_ordini &) main_app();}
///////////////////////////////////////////////////////////
// TGenera_ordini_mask
///////////////////////////////////////////////////////////
void TGenera_ordini_mask::update_sheet()
{
_filter_changed = false;
TWait_cursor hourglass;
const TDate oggi(TODAY);
TSheet_field& sf = sfield(F_ARTICLES);
TEsercizi_contabili esc;
TString query(_anamag_query);
TString16 grmerc(get(F_GRMERC));
const int pos = query.find("KEY ");
TArticolo_giacenza art;
TString8 codmag(get(F_MAG));
const TString4 codnum(get(F_CODNUM));
const bool check_expr = codnum == _disable_num;
int anno = get_int(F_ANNO);
if (anno <= 0)
anno = oggi.year();
codmag.left_just(3);
codmag << get(F_DEP);
codmag.trim();
grmerc.left_just(3);
grmerc << get(F_SGRMERC);
grmerc.trim();
if (grmerc.full())
{
if (pos > 0)
query[pos + 4] = '3';
query << "\nFROM GRMERC=#GRMERC\nTO GRMERC=#GRMERC";
}
else
if (pos > 0)
query[pos + 4] = '2';
TString select;
const TString & codart = get(F_SCODART);
if (codart.full())
select << "(UPPER(" << ANAMAG_CODART << ")?=UPPER(\"" << codart << "\"))";
const TString & desart = get(F_SDESART);
if (desart.full())
{
if (select.full())
select << "&&";
select << "(UPPER(" << ANAMAG_DESCR << ")?=UPPER(\"" << desart << "\"))";
}
const TString& desagg = get(F_SDESAGG);
if (desagg.full())
{
if (select.full())
select << "&&";
select << "(UPPER(" << ANAMAG_DESCRAGG << ")?=UPPER(\"" << desagg << "\"))";
}
const TString& codforn = get(F_SCODFOR);
if (codforn.full())
{
if (select.full())
select << "&&";
select << "(" << ANAMAG_CODFORN << "==\"" << codforn << "\")";
}
const TString& ragsoc = get(F_SRAGSOC);
if (ragsoc.full())
{
if (select.full())
select << "&&";
select << "(UPPER(CLIFO.RAGSOC)?=UPPER(\"" << ragsoc << "\"))";
}
if (select.full())
{
int pos = query.find("SELECT ");
if (pos > 0)
{
const int acapo = query.find('\n', pos);
query.insert("((", pos+7);
select.insert(")&&(");
select << "))";
query.insert(select, acapo+2);
}
else
{
pos = query.find('\n');
select.insert("\nSELECT ");
query.insert(select, pos);
}
}
TArticoli_recordset recset(query, get_bool(F_SOTTOSCORTA), esc.date2esc(oggi), get(F_MAG));
TVariant var ;
var = grmerc;
recset.set_var("#GRMERC", var);
var = user();
recset.set_var("#USER", var);
TString8 codes; codes.format("%04d", esc.date2esc(oggi));
var = codmag;
recset.set_var("#CODMAG", var);
var = (long)anno;
recset.set_var("#ANNOES", var);
int i = 0;
sf.destroy();
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
TToken_string & row = sf.row(i);
const TString & codart = recset.get(LF_ANAMAG, ANAMAG_CODART).as_string();
row.add(codart, sf.cid2index(F_CODART));
art.read(codart);
const real giac = art.giacenza_anno(codmag, "", anno);
row.add(recset.get(LF_ANAMAG, ANAMAG_DESCR).as_string(), sf.cid2index(F_DESCR));
row.add(recset.get("UMART.UM").as_string(), sf.cid2index(F_UM));
const long codforn = recset.get(LF_ANAMAG, ANAMAG_CODFORN).as_int();
row.add(codforn, sf.cid2index(F_FORNITORE));
row.add(recset.get("CLIFO.RAGSOC").as_string(), sf.cid2index(F_RAGSOC));
row.add(recset.get(LF_ANAMAG, ANAMAG_GIORNIRIOR).as_string(), sf.cid2index(F_LEADTIME));
row.add(recset.get(LF_ANAMAG, ANAMAG_LOTTORIOR).as_string(), sf.cid2index(F_LOTTOMIN));
row.add(recset.get(LF_ANAMAG, ANAMAG_DESCRAGG).as_string(), sf.cid2index(F_DESCRAGG));
row.add(giac.string(), sf.cid2index(F_GIACENZA));
row.add(recset.get(LF_ANAMAG, ANAMAG_PPCONF).as_string(), sf.cid2index(F_PPCONF));
row.add(recset.get(LF_ANAMAG, ANAMAG_USER1).as_string(), sf.cid2index(F_USER1));
row.add(recset.get(LF_ANAMAG, ANAMAG_USER2).as_string(), sf.cid2index(F_USER2));
row.add(recset.get(LF_ANAMAG, ANAMAG_USER3).as_string(), sf.cid2index(F_USER3));
row.add(recset.get(LF_ANAMAG, ANAMAG_USER4).as_string(), sf.cid2index(F_USER4));
row.add(recset.get(LF_ANAMAG, ANAMAG_USER5).as_string(), sf.cid2index(F_USER5));
row.add(recset.get(LF_ANAMAG, ANAMAG_USER6).as_string(), sf.cid2index(F_USER6));
row.add(recset.get(LF_ANAMAG, ANAMAG_USER7).as_string(), sf.cid2index(F_USER7));
row.add(recset.get(LF_ANAMAG, ANAMAG_USER8).as_string(), sf.cid2index(F_USER8));
row.add(recset.get(LF_ANAMAG, ANAMAG_USER9).as_string(), sf.cid2index(F_USER9));
row.add(recset.get(LF_ANAMAG, ANAMAG_USER10).as_string(), sf.cid2index(F_USER10));
const real disp = art.disponibilita(codes, get(F_MAG), NULL);
row.add(disp.string(), sf.cid2index(F_DISPON));
sf.check_row(i);
if (check_expr)
{
for (int j = _dis.numvar() - 1; j >= 0; j--)
{
const TString16 varn =_dis.varname(j);
if (varn == "GIAC")
_dis.setvar(j, giac.string());
else
if (varn == "USER")
_dis.setvar(j, user());
else
_dis.setvar(j, recset.get(varn).as_string());
}
if (_dis.as_bool())
sf.disable_row(i);
}
i++;
}
sf.force_update();
}
void TGenera_ordini_mask::update_orders()
{
_order_changed = false;
TWait_cursor hourglass;
TSheet_field& sh = sfield(F_ORDERS);
sh.destroy();
TString query;
query << "USE RDOC\n";
query << "SELECT (CODARTMAG!=\"\")&&(CODCMS==#CODCMS)"
<< "&&(BETWEEN(33.STATO,#DASTATO,#ASTATO))"
<< "&&(RIGAEVASA!=\"X\")\n";
query << "JOIN ANAMAG INTO CODART==CODART\n";
query << "JOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC\n";
query << "JOIN CLIFO TO DOC INTO TIPOCF=\"F\" CODCF==CODCF\n";
query << "FROM CODNUM=#CODNUM ANNO=#DAANNO\n";
query << "TO CODNUM=#CODNUM ANNO=#ADANNO\n";
const long anno = get_int(F_ANNO);
TISAM_recordset orders(query);
orders.set_var("#DASTATO", TVariant(get(F_DASTATO)));
orders.set_var("#ASTATO", TVariant(get(F_ASTATO)));
orders.set_var("#CODCMS", TVariant(get(F_CDCT)));
orders.set_var("#CODNUM", TVariant(get(F_CODNUM)));
orders.set_var("#DAANNO", TVariant(anno-2L));
orders.set_var("#ADANNO", TVariant(anno));
TMask& m = sh.sheet_mask();
TRelation& rel = *orders.cursor()->relation();
const int status_pos = sh.cid2index(S_STATODOC);
for (bool ok = orders.move_first(); ok; ok = orders.move_next())
{
TToken_string& row = sh.row(-1);
FOR_EACH_MASK_FIELD(m, i, f)
{
const TFieldref* fr = f->field();
if (fr != NULL)
{
const int j = sh.cid2index(f->dlg());
row.add(fr->read(rel), j);
}
}
const int nrow = sh.items()-1;
switch (row.get_int(status_pos))
{
case 1: sh.set_back_and_fore_color(NORMAL_BACK_COLOR, NORMAL_COLOR, nrow); break;
case 2: sh.set_back_and_fore_color(REQUIRED_BACK_COLOR, NORMAL_COLOR, nrow); break;
default: sh.set_back_and_fore_color(DISABLED_BACK_COLOR, DISABLED_COLOR, nrow); break;
}
sh.check_row(nrow);
}
sh.force_update();
}
void TGenera_ordini_mask::next_page(int p)
{
TAutomask::next_page(p);
if (_filter_changed)
{
const TSheet_field& sf = sfield(F_ARTICLES);
if (win() == sf.parent())
update_sheet();
}
if (_order_changed)
{
const TSheet_field& sf = sfield(F_ORDERS);
if (win() == sf.parent())
update_orders();
}
}
bool TGenera_ordini_mask::on_sheet_event(TOperable_field& o, TField_event e, long jolly)
{
switch(e)
{
case se_query_del:
case se_query_add:
return false;
case fe_init:
if (o.dlg() == F_ARTICLES)
update_sheet();
else
update_orders();
break;
case se_notify_modify:
if (o.dlg() == F_ARTICLES)
{
TEdit_field& cc = efield(F_CAZ_CODART);
cc.reset();
cc.set_focus();
}
break;
default:
break;
}
return true;
}
void TGenera_ordini_mask::reconstruction(const TDocumento& doc2delete)
{
const char* const defpar = "or";
TConfig c(CONFIG_USER, defpar);
const char statoini = c.get_char("OR14_STATOINI");
const int rows = doc2delete.rows();
for (int i=1; i<=rows; i++)
{
const TRiga_documento& r = doc2delete[i];
const TRectype* original_doc = r.find_original_doc();
if (original_doc != NULL)
{
TDocumento d(*original_doc);
const long nriga = r.get_long(RDOC_DAIDRIGA);
if (nriga != 0)
{
TRiga_documento& original_row = d[nriga];
const real qta = r.quantita();
const TString& name = original_row.field_qtaevasa();
real qtaevasa = original_row.get_real(name) - qta;
if (qtaevasa < ZERO)
qtaevasa = ZERO;
original_row.put(name, qtaevasa);
if (qtaevasa < original_row.quantita())
original_row.zero(RDOC_RIGAEVASA);
else
original_row.put(RDOC_RIGAEVASA, "X");
if (statoini != ' ')
d.stato(statoini);
d.rewrite();
}
}
}
}
bool TGenera_ordini_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
bool ok = true;
switch (o.dlg())
{
case F_GRMERC:
case F_SGRMERC:
case F_SOTTOSCORTA:
case F_SCODART:
case F_SDESART:
case F_SDESAGG:
case F_SCODFOR:
case F_SRAGSOC:
if (e == fe_modify)
_filter_changed = true;
break;
case F_CODNUM:
if (e == fe_modify)
{
_order_changed = true;
_filter_changed = true;
}
break;
case F_TIPODOC:
if (e == fe_init || e == fe_modify)
{
const TTipo_documento tipodoc(o.get());
const bool is_ordine = tipodoc.is_ordine();
enable(DLG_ELABORA, is_ordine);
}
break;
case F_ANNO:
if (e == fe_init && o.empty())
{
const TDate oggi(TODAY);
TString4 anno; anno << oggi.year();
o.set(anno);
}
if (e == fe_modify)
_filter_changed = true;
// continue
case F_DASTATO:
case F_ASTATO:
if (e == fe_modify)
update_orders();
break;
case F_CAZ_CODART: //ricerca riga da codart in testa alla maschera
if (e == fe_modify)
{
int found = -1;
bool non_esiste = true;
const TString& selected_codart = o.get();
//ricerca sui codici articolo in anagrafica possibili (sono quelli sullo sheet)
TSheet_field& sf_righe = sfield(F_ARTICLES);
FOR_EACH_SHEET_ROW(sf_righe, r, row)
{
const TString& riga_codart = row->get(0);
if (selected_codart == riga_codart)
{
found = r;
break;
}
}
//se non lo pesca in anagrafica tenta con i codici articolo fornitore (CODCORR_CODARTALT)
if (found < 0)
{
FOR_EACH_SHEET_ROW(sf_righe, r, row)
{
const TString& riga_codart = row->get(0);
TString query;
query << "USE CODCORR";
query << "\nSELECT CODARTALT=#CODARTALT";
query << "\nFROM CODART=#CODART";
query << "\nTO CODART=#CODART";
TISAM_recordset recset(query);
recset.set_var("#CODARTALT", selected_codart);
recset.set_var("#CODART", riga_codart);
const int items = recset.items();
//usando la chiave 1 -> items puo' essere 1 o 0 per ogni riga dello sheet
if (items == 1)
{
if (found < 0)
found = r;
else
{
error_box(FR("Il codice %s puo' riferirsi alle righe %d e %d!\nRisolvere l'ambiguita' in anagrafica articoli."),
(const char*)selected_codart, found + 1, r + 1);
found = -1;
non_esiste = false;
break;
}
} //if(items==1...
} //FOR_EACH_SHEET_ROW(sf_righe,...
} //if(found<0...
//ha trovato l'articolo nello sheet e si posiziona sulla sua riga
if (found >= 0)
{
_riga_da_selezionare = found;
}
else //se non l'ha trovato -> segnala che l'articolo selezionato non esiste nello sheet
{
if (non_esiste)
error_box(TR("L'articolo %s selezionato non esiste nella lista"), (const char*)selected_codart);
}
}
break;
case DLG_PRINT:
if (e == fe_button)
{
TConsumi_report cr;
cr.mask2report(*this);
TReport_book book;
book.add(cr);
book.print_or_preview();
ok = false; // Non uscire
}
break;
case DLG_PRINTDOC:
if (e == fe_button)
{
TString query;
query << "USE 33 ";
if (_doc_filter.full())
query << "SELECT " << _doc_filter; // CODCMS=#CODCMS\n"
query << "\n"
<< "JOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF\n"
<< "FROM PROVV=D ANNO=#ANNO CODNUM=#CODNUM\n"
<< "TO PROVV=D ANNO=#ANNO CODNUM=#CODNUM";
TISAM_recordset rset(query);
rset.set_var("#CODCMS", TVariant(get(F_CDCT)));
rset.set_var("#ANNO", TVariant(get(F_ANNO)));
rset.set_var("#CODNUM", TVariant(get(F_CODNUM)));
TCursor* c = rset.cursor();
TCursor_sheet sht(c, " |CODNUM|NDOC|DATADOC|DATACONS|CODCF|20->RAGSOC", TR("Selezione Documenti"),
HR("@1|Ordine@6|Numero\nDoc.@7|Data\nDoc.@10|Data\nConsegna@10|Fornitore|Ragione Sociale@50"),0,1);
sht.uncheck(-1);
if (sht.run() && sht.one_checked())
{
const int items = c->items();
for (*c = 0L; c->pos() < items; ++(*c)) if (sht.checked(c->pos()))
capp().print_doc(c->curr());
update_sheet();
update_orders();
}
ok = false; // Non uscire
}
break;
case DLG_DELREC:
if (e == fe_button)
{
TString query;
TString select;
query << "USE 33";
if (_doc_filter.full())
select << "(" << _doc_filter << ')'; // CODCMS=#CODCMS\n"
if (_days_interval > 0)
{
TDate datalim(TODAY);
datalim -= _days_interval;
if (select.full())
select << "&&";
select << "(STR(NUM(ANSI(DATADOC))>" << datalim.date2ansi() << "))";
}
if (select.full())
query << " SELECT " << select;
query << "\n"
<< "JOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF\n"
<< "FROM PROVV=D ANNO=#ANNO CODNUM=#CODNUM\n"
<< "TO PROVV=D ANNO=#ANNO CODNUM=#CODNUM";
TISAM_recordset rset(query);
rset.set_var("#CODCMS", TVariant(get(F_CDCT)));
rset.set_var("#ANNO", TVariant(get(F_ANNO)));
rset.set_var("#CODNUM", TVariant(get(F_CODNUM)));
TCursor* c = rset.cursor();
TCursor_sheet sht(c, " |CODNUM|NDOC|DATADOC|DATACONS|CODCF|20->RAGSOC", TR("Selezione Documenti"),
HR("@1|Ordine@6|Numero\nDoc.@7|Data\nDoc.@10|Data\nConsegna@10|Fornitore|Ragione Sociale@50"),0,1);
sht.uncheck(-1);
if (sht.run() && sht.one_checked() && yesno_box("Si desidera cancellare %d documenti", sht.checked()))
{
const int items = c->items();
c->freeze();
for (*c = 0; c->pos() < items; ++(*c)) if (sht.checked(c->pos()))
{
TDocumento doc(c->curr());
reconstruction(doc); // funzione che ricostruisce la situazione precedente al documento
doc.remove();
}
update_sheet();
update_orders();
}
ok = false; // Non uscire
}
break;
case DLG_OK:
if (e == fe_button && jolly == 0)
{
capp().generate_orders();
update_orders();
update_sheet();
ok = false;
}
break;
case DLG_ELABORA:
if (e == fe_button && jolly == 0)
{
capp().generate_carics();
update_orders();
update_sheet();
ok = false;
}
break;
default:
if (o.is_kind_of(CLASS_SHEET_FIELD))
ok = on_sheet_event(o, e, jolly);
break;
}
return ok;
}
void TGenera_ordini_mask::serialize(bool bSave)
{
const char* const defpar = "or";
TConfig ini(CONFIG_DITTA, defpar);
for (int i = fields()-1; i >= 0; i--)
{
TMask_field& f = fld(i);
const TFieldref* fr = f.field();
if (fr != NULL)
{
if (bSave)
fr->write(ini, defpar, f.get());
else
f.set(fr->read(ini, defpar));
}
}
}
void TGenera_ordini_mask::load_user_defs()
{
const char* const defpar = "or";
TConfig ini(CONFIG_USER, defpar);
for (int i = fields()-1; i >= 0; i--)
{
TMask_field& f = fld(i);
const TFieldref* fr = f.field();
if (fr != NULL)
{
const char * val = fr->read(ini, defpar);
if (*val)
{
f.set(val);
f.disable();
}
}
}
}
void TGenera_ordini_mask::on_idle()
{
TAutomask::on_idle();
if (_riga_da_selezionare >= 0)
{
//si posiziona sulla qta
TSheet_field& sf_righe = sfield(F_ARTICLES);
const int column = sf_righe.cid2index(F_QTA);
sf_righe.select(_riga_da_selezionare, column, true);
_riga_da_selezionare = -1;
sf_righe.set_focus();
}
}
TGenera_ordini_mask::TGenera_ordini_mask()
: TAutomask("ps0430300a"), _filter_changed(false), _order_changed(false)
{
serialize(false);
load_user_defs();
TConfig c(CONFIG_DITTA, "or");
_anamag_query = c.get("OR14_QUERY");
if (_anamag_query.blank())
{
_anamag_query = "USE ANAMAG KEY 2\nJOIN UMART INTO CODART==CODART NRIGA==1";
_anamag_query << "\nJOIN CLIFO INTO TIPOCF==\"F\" CODCF==CODFORN";
}
else
_anamag_query = esc(_anamag_query);
_disable_num = esc(c.get("OR14_DISNUM"));
_disable_expr = esc(c.get("OR14_DISABLE"));
_dis.set(_disable_expr);
_doc_filter = c.get("OR14_FILTER");
if (_doc_filter.empty() && !field(F_CDCT).empty())
_doc_filter = "CODCMS=#CODCMS"; // Utile al Cigno
_days_interval = c.get_int("OR14_DAYS");
TSheet_field& sh = sfield(F_ARTICLES);
TMask& sh_mask = sh.sheet_mask();
TString prompt;
for (int i = 1; i <= 10; i++)
{
const int col = sh.cid2index(F_USER1 + i -1);
TEditable_field & f = sh_mask.efield(F_USER1 + i - 1);
if (c.get_bool("CHK_USER", "ve", i) && c.get_bool("USERDEF", "or", i))
{
prompt = c.get("PROMPT_USER", "ve", i);
prompt.rpad(20);
f.set_prompt(prompt);
sh.set_column_header(col, prompt);
}
else
{
f.hide();
sh.delete_column(col);
}
}
//resetta l'indicatore di riga da selezionare
_riga_da_selezionare = -1;
}
TGenera_ordini_mask::~TGenera_ordini_mask()
{
// serialize(true);
}
///////////////////////////////////////////////////////////
// TCreazione_ordini
///////////////////////////////////////////////////////////
bool TCreazione_ordini::create()
{
open_files(LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG, LF_SCONTI, LF_UMART, LF_DESLIN, LF_CODCORR,
LF_TAB, LF_TABCOM, LF_CLIFO, LF_CFVEN, LF_INDSP, LF_OCCAS, LF_PCON, LF_MOV, LF_STOMAG,
LF_MOVMAG, LF_RMOVMAG, LF_MAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0);
TConfig c(CONFIG_DITTA);
for (int i = 0; i < 10; i++ )
_userfld.add(c.get("USERFLD", NULL, i + 1), i);
_mask = new TGenera_ordini_mask;
return TSkeleton_application::create();
}
bool TCreazione_ordini::destroy()
{
delete _mask;
return TSkeleton_application::destroy();
}
void TCreazione_ordini::print()
{
_mask->field(DLG_PRINT).on_hit();
}
void TCreazione_ordini::print_doc(const TRectype & doc)
{
const TTipo_documento tipo(doc.get(DOC_TIPODOC));
TFilename rep; tipo.main_print_profile(rep, 0);
rep.ext("rep");
TString commandline;
if (rep.custom_path()) // Esiste il nuovo report :-)
commandline = "ve1 -2";
else // Esiste il vecchio form :-(
commandline = "ve1 -0";
commandline << ' ' << doc.get(DOC_CODNUM) << ' ' << doc.get(DOC_ANNO) << ' ';
commandline << doc.get(DOC_PROVV) << ' ' << doc.get(DOC_NDOC) << ' ' << doc.get(DOC_NDOC);
commandline << " D";
const int ncopie = tipo.ncopie();
if (ncopie > 0)
commandline << ' ' << ncopie;
TExternal_app interattivo( commandline );
interattivo.run();
}
void TCreazione_ordini::aggiorna_stato_doc_orig(const TRectype& rdoc)
{
const char provv = rdoc.get_char(RDOC_PROVV);
const int anno = rdoc.get_int(RDOC_ANNO);
const TString8 codnum = rdoc.get(RDOC_CODNUM);
const long ndoc = rdoc.get_long(RDOC_NDOC);
TDocumento doc_orig(provv, anno, codnum, ndoc);
if (doc_orig.is_evaso())
{
const char* const defpar = "or";
TConfig c(CONFIG_USER, defpar);
const char statoevaso = c.get_char("OR14_STATOEVASO");
if (statoevaso != ' ')
{
doc_orig.stato(statoevaso);
doc_orig.rewrite();
}
}
}
void TCreazione_ordini::generate_carics()
{
TGenera_ordini_mask& mask = *_mask;
TSheet_field& sf = mask.sfield(F_ORDERS);
long minforn = 999999L;
long maxforn = 0L;
TAssoc_array orders;
if (sf.items() > 0)
{
const TDate datadoc = mask.get_date(F_DATADOCCAR);
const char* const defpar = "or";
TConfig c(CONFIG_USER, defpar);
const TString& codnum = c.get("OR14_NUMCAR");
const TString& tipodoc = c.get("OR14_TIPCAR");
const TTipo_documento tipo(tipodoc);
//const bool ultimo_prezzo = mask.get(F_PREZZO) == "U";
const TString& commessat = mask.get(F_CDCT);
const TString& faset = mask.get(F_FSCT);
//TString8 codmag(mask.get(F_MAG));
//codmag.right_just(3);
//codmag << mask.get(F_DEP);
//TString8 codmagc(mask.get(F_MAGC));
//codmagc.right_just(3);
//codmagc << mask.get(F_DEPC);
TLocalisamfile righedoc(LF_RIGHEDOC);
TProgind pi(sf.items(), TR("Generazione documenti di carico"), true, true);
FOR_EACH_SHEET_ROW(sf, n, row)
{
if (!pi.setstatus(n))
break;
if (row->get_char(sf.cid2index(S_DAEVADERE) == 'X'))
{
const real qta = row->get(sf.cid2index(S_QTADAEVADERE));
if (!qta.is_zero())
{
const TString8 codforn(row->get(sf.cid2index(S_FORNITORE)));
const long cod = atol(codforn);
TString8 key; key.format("F|%ld", cod);
const TRectype& forn = cache().get(LF_CLIFO, key);
const TDate datacons(row->get(sf.cid2index(S_DATACONS)));
const TString4 codval(forn.get(CLI_CODVAL));
const TRectype& forven = cache().get(LF_CFVEN, key);
const TString4 codiva(forven.get(CFV_ASSFIS));
const TString commessa = row->get(sf.cid2index(S_CDC));
const TString fase = row->get(sf.cid2index(S_FSC));
TDocumento* d = (TDocumento*)orders.objptr(codforn);
if (d == NULL)
{
d = new TDocumento('D', datadoc.year(), codnum, 0L);
d->put(DOC_TIPODOC, tipodoc);
d->put(DOC_TIPOCF, "F");
d->put(DOC_CODCF, codforn);
d->put(DOC_DATADOC, datadoc);
d->put(DOC_DATACONS, datacons);
d->put(DOC_CODVAL, codval);
d->put(DOC_CODLIN, forn.get(CLI_CODLIN));
d->put(DOC_CODPAG, forn.get(CLI_CODPAG));
d->put(DOC_CODABIA, forn.get(CLI_CODABI));
d->put(DOC_CODCABA, forn.get(CLI_CODCAB));
d->put(DOC_IBAN, forn.get(CLI_IBAN));
d->put(DOC_CODABIP, forven.get(CFV_CODABIPR));
d->put(DOC_CODCABP, forven.get(CFV_CODCABPR));
d->put(DOC_RAGGR, forven.get(CFV_RAGGDOC));
d->put(DOC_RAGGREFF, forven.get(CFV_RAGGEFF));
d->put(DOC_CODINDSP, forven.get(CFV_CODINDSP));
d->put(DOC_CODAG, forven.get(CFV_CODAG));
d->put(DOC_ZONA, forven.get(CFV_CODZONA));
d->put(DOC_CODSPMEZZO, forven.get(CFV_CODSPMEZZO));
d->put(DOC_CODPORTO, forven.get(CFV_CODPORTO));
d->put(DOC_CODNOTESP1, forven.get(CFV_CODNOTESP1));
d->put(DOC_CODNOTESP2, forven.get(CFV_CODNOTESP2));
d->put(DOC_CODNOTE, forven.get(CFV_CODNOTE));
d->put(DOC_CODVETT1, forven.get(CFV_CODVETT1));
d->put(DOC_CODVETT2, forven.get(CFV_CODVETT2));
d->put(DOC_CODVETT3, forven.get(CFV_CODVETT3));
d->put(DOC_PERCSPINC, forven.get(CFV_PERCSPINC));
d->put(DOC_ADDBOLLI, forven.get(CFV_ADDBOLLI));
d->put(DOC_CATVEN, forven.get(CFV_CATVEN));
d->put(DOC_CODLIST, forven.get(CFV_CODLIST));
d->put(DOC_CODCMS, commessat);
// le note non dovrebbero servire
//d->put(DOC_NOTE, mask.get(F_NOTE));
const TString& causmag = tipo.caus_mov();
d->put(DOC_CAUSMAG, causmag);
orders.add(codforn, d);
if (cod < minforn)
minforn = cod;
if (cod > maxforn)
maxforn = cod;
}
TRiga_documento& rdoc = d->new_row("01");
/* guy si e' molto arrabbiato nel leggere queste righe di pseudo codice (attenzione, morde!)
const TString codart(row->get(sf.cid2index(S_CODART)));
//rdoc.put(RDOC_CODMAG, codmag);
//rdoc.put(RDOC_CODMAGC, codmagc);
rdoc.put(RDOC_CODART, codart);
rdoc.put(RDOC_CODARTMAG, codart);
rdoc.put(RDOC_CHECKED, "X");
rdoc.put(RDOC_DESCR, row->get(sf.cid2index(S_DESCART)));
//const TString descr_agg(row->get(sf.cid2index(S_DESCRAGG)));
//if (descr_agg.full())
//{
// rdoc.put(RDOC_DESCLUNGA, "X");
// rdoc.put(RDOC_DESCEST, descr_agg);
//}
rdoc.put(RDOC_UMQTA, row->get(sf.cid2index(S_UM)));
rdoc.put(RDOC_QTA, qta);
rdoc.put(RDOC_DATACONS, datacons);
const TRectype& articolo = cache().get(LF_ANAMAG, codart);
//TPrice prezzo;
//if (ultimo_prezzo)
// prezzo = articolo.get_real(ANAMAG_ULTCOS1);
//else
// prezzo = articolo.get_real(ANAMAG_COSTSTD);
//prezzo.change_value(codval);
//rdoc.put(RDOC_PREZZO, prezzo.get_num());
if (codiva.full())
rdoc.put(RDOC_CODIVA, codiva);
else
rdoc.put(RDOC_CODIVA, articolo.get(ANAMAG_CODIVA));
rdoc.put(RDOC_CODCMS, commessa);
rdoc.put(RDOC_FASCMS, fase);
for (int i = 0; i < 10 ; i++)
if (_userfld.row(i).full())
rdoc.put(_userfld.row(i), mask.get(F_USER1 + i));
rdoc.put(RDOC_CODAGG1, row->get(sf.cid2index(F_CODAGG1)));
rdoc.put(RDOC_CODAGG2, row->get(sf.cid2index(F_CODAGG2)));
*/
const TDate dataord = row->get(sf.cid2index(S_DATADOC));
const long ndoc = row->get_long(sf.cid2index(S_NUMDOC));
const int nriga = row->get_int(sf.cid2index(S_NUMRIGA));
TRectype& rigord = righedoc.curr();
rigord.put(RDOC_PROVV, 'D');
rigord.put(RDOC_ANNO, dataord.year());
rigord.put(RDOC_CODNUM, mask.get(F_CODNUM));
rigord.put(RDOC_NDOC, ndoc);
rigord.put(RDOC_NRIGA, nriga);
int err = righedoc.read(_isequal, _lock);
if (err == NOERR)
{
d->copy_data(rdoc, rigord);
rdoc.put(rdoc.field_qta(), qta);
rigord.add(rdoc.field_qtaevasa(), qta);
if (rigord.get_real(rdoc.field_qtaevasa()) >= rigord.get_real(rdoc.field_qta()))
rigord.put(RDOC_RIGAEVASA, true);
rdoc.put(RDOC_DACODNUM, rigord.get(RDOC_CODNUM));
rdoc.put(RDOC_DAANNO, rigord.get(RDOC_ANNO));
rdoc.put(RDOC_DAPROVV, rigord.get(RDOC_PROVV));
rdoc.put(RDOC_DANDOC, rigord.get(RDOC_NDOC));
rdoc.put(RDOC_DAIDRIGA, rigord.get(RDOC_NRIGA));
err = righedoc.rewrite();
if (err == NOERR)
aggiorna_stato_doc_orig(rigord);
}
if (err != NOERR)
error_box(FR("Impossibile aggiornare la riga %d del doc. %ld"), nriga, ndoc);
}
}
}
}
if (orders.items() > 0)
{
TProgind pi(orders.items(), TR("Registrazione documenti di carico"), true, true);
TString cmdline;
int cnt = 0;
TString8 key;
long mindoc = 0, maxdoc = 0;
for (long cod = minforn; cod <= maxforn; cod++)
{
key.format("%ld", cod);
TDocumento* d = (TDocumento*)orders.objptr(key);
if (d != NULL)
{
if (!pi.addstatus(1))
break;
if (d->write() == NOERR)
{
if (cmdline.blank())
{
const TTipo_documento& tipo = d->tipo();
TFilename rep;
tipo.main_print_profile(rep, 1);
rep.ext("rep");
if (rep.custom_path()) // Esiste il nuovo report :-)
cmdline = "ve1 -2";
else // Esiste il vecchio form :-(
cmdline = "ve1 -0";
}
cnt++;
const long ndoc = d->get_long(DOC_NDOC);
if (mindoc <= 0 || ndoc < mindoc)
mindoc = ndoc;
if (ndoc > maxdoc)
maxdoc = ndoc;
}
}
}
if (yesno_box(TR("Sono stati generati %d documenti:\nSi desidera stamparli ora?"), cnt))
{
const TString& codnum = mask.get(F_CODNUM);
const TDate datadoc(TODAY);
const int anno = datadoc.year();
cmdline << " " << codnum << ' ' << anno << " D " << mindoc << ' ' << maxdoc;
TExternal_app prg(cmdline);
prg.run(true, true, false);
}
}
}
void TCreazione_ordini::generate_orders()
{
TGenera_ordini_mask& mask = *_mask;
TSheet_field& sf = mask.sfield(F_ARTICLES);
long minforn = 999999L;
long maxforn = 0L;
TAssoc_array orders;
if (sf.items() > 0)
{
const TDate datadoc = mask.get_date(F_DATADOC);
const TString& codnum = mask.get(F_CODNUM);
const TString& tipodoc = mask.get(F_TIPODOC);
const TTipo_documento tipo(tipodoc);
const bool ultimo_prezzo = mask.get(F_PREZZO) == "U";
const TString& commessat = mask.get(F_CDCT);
const TString& faset = mask.get(F_FSCT);
TString8 codmag(mask.get(F_MAG));
codmag.right_just(3);
codmag << mask.get(F_DEP);
TString8 codmagc(mask.get(F_MAGC));
codmagc.right_just(3);
codmagc << mask.get(F_DEPC);
TProgind pi(sf.items(), TR("Generazione ordini"), true, true);
FOR_EACH_SHEET_ROW(sf, n, row)
{
if (!pi.setstatus(n))
break;
const real qta = row->get(sf.cid2index(F_QTA));
if (!qta.is_zero())
{
const TString8 codforn(row->get(sf.cid2index(F_FORNITORE)));
const long cod = atol(codforn);
TString8 key; key.format("F|%ld", cod);
const TRectype& forn = cache().get(LF_CLIFO, key);
const TDate datacons(row->get(sf.cid2index(F_DATACONS)));
const TString4 codval(forn.get(CLI_CODVAL));
const TRectype& forven = cache().get(LF_CFVEN, key);
const TString4 codiva(forven.get(CFV_ASSFIS));
const TString commessa = row->get(sf.cid2index(F_CDC));
const TString fase = row->get(sf.cid2index(F_FSC));
TDocumento* d = (TDocumento*)orders.objptr(codforn);
if (d == NULL)
{
d = new TDocumento('D', datadoc.year(), codnum, 0L);
d->put(DOC_TIPODOC, tipodoc);
d->put(DOC_TIPOCF, "F");
d->put(DOC_CODCF, codforn);
d->put(DOC_DATADOC, datadoc);
d->put(DOC_DATACONS, datacons);
d->put(DOC_CODVAL, codval);
d->put(DOC_CODLIN, forn.get(CLI_CODLIN));
d->put(DOC_CODPAG, forn.get(CLI_CODPAG));
d->put(DOC_CODABIA, forn.get(CLI_CODABI));
d->put(DOC_CODCABA, forn.get(CLI_CODCAB));
d->put(DOC_IBAN, forn.get(CLI_IBAN));
d->put(DOC_CODABIP, forven.get(CFV_CODABIPR));
d->put(DOC_CODCABP, forven.get(CFV_CODCABPR));
d->put(DOC_RAGGR, forven.get(CFV_RAGGDOC));
d->put(DOC_RAGGREFF, forven.get(CFV_RAGGEFF));
d->put(DOC_CODINDSP, forven.get(CFV_CODINDSP));
d->put(DOC_CODAG, forven.get(CFV_CODAG));
d->put(DOC_ZONA, forven.get(CFV_CODZONA));
d->put(DOC_CODSPMEZZO, forven.get(CFV_CODSPMEZZO));
d->put(DOC_CODPORTO, forven.get(CFV_CODPORTO));
d->put(DOC_CODNOTESP1, forven.get(CFV_CODNOTESP1));
d->put(DOC_CODNOTESP2, forven.get(CFV_CODNOTESP2));
d->put(DOC_CODNOTE, forven.get(CFV_CODNOTE));
d->put(DOC_CODVETT1, forven.get(CFV_CODVETT1));
d->put(DOC_CODVETT2, forven.get(CFV_CODVETT2));
d->put(DOC_CODVETT3, forven.get(CFV_CODVETT3));
d->put(DOC_PERCSPINC, forven.get(CFV_PERCSPINC));
d->put(DOC_ADDBOLLI, forven.get(CFV_ADDBOLLI));
d->put(DOC_CATVEN, forven.get(CFV_CATVEN));
d->put(DOC_CODLIST, forven.get(CFV_CODLIST));
d->put(DOC_CODCMS, commessat);
d->put(DOC_NOTE, mask.get(F_NOTE));
const TString& causmag = tipo.caus_mov();
d->put(DOC_CAUSMAG, causmag);
orders.add(codforn, d);
if (cod < minforn)
minforn = cod;
if (cod > maxforn)
maxforn = cod;
}
TRiga_documento& rdoc = d->new_row("01");
const TString codart(row->get(sf.cid2index(F_CODART)));
rdoc.put(RDOC_CODMAG, codmag);
rdoc.put(RDOC_CODMAGC, codmagc);
rdoc.put(RDOC_CODART, codart);
rdoc.put(RDOC_CODARTMAG, codart);
rdoc.put(RDOC_CHECKED, "X");
rdoc.put(RDOC_DESCR, row->get(sf.cid2index(F_DESCR)));
const TString descr_agg(row->get(sf.cid2index(F_DESCRAGG)));
if (descr_agg.full())
{
rdoc.put(RDOC_DESCLUNGA, "X");
rdoc.put(RDOC_DESCEST, descr_agg);
}
rdoc.put(RDOC_UMQTA, row->get(sf.cid2index(F_UM)));
rdoc.put(RDOC_QTA, qta);
rdoc.put(RDOC_DATACONS, datacons);
const TRectype& articolo = cache().get(LF_ANAMAG, codart);
TPrice prezzo;
if (ultimo_prezzo)
prezzo = articolo.get_real(ANAMAG_ULTCOS1);
else
prezzo = articolo.get_real(ANAMAG_COSTSTD);
prezzo.change_value(codval);
rdoc.put(RDOC_PREZZO, prezzo.get_num());
if (codiva.full())
rdoc.put(RDOC_CODIVA, codiva);
else
rdoc.put(RDOC_CODIVA, articolo.get(ANAMAG_CODIVA));
rdoc.put(RDOC_CODCMS, commessa);
rdoc.put(RDOC_FASCMS, fase);
for (int i = 0; i < 10 ; i++)
if (_userfld.row(i).full())
rdoc.put(_userfld.row(i), mask.get(F_USER1 + i));
rdoc.put(RDOC_CODAGG1, row->get(sf.cid2index(F_CODAGG1)));
rdoc.put(RDOC_CODAGG2, row->get(sf.cid2index(F_CODAGG2)));
}
}
}
if (orders.items() > 0)
{
TProgind pi(orders.items(), TR("Registrazione ordini"), true, true);
TString cmdline;
int cnt = 0;
TString8 key;
long mindoc = 0, maxdoc = 0;
for (long cod = minforn; cod <= maxforn; cod++)
{
key.format("%ld", cod);
TDocumento* d = (TDocumento*)orders.objptr(key);
if (d != NULL)
{
if (!pi.addstatus(1))
break;
if (d->write() == NOERR)
{
if (cmdline.blank())
{
const TTipo_documento& tipo = d->tipo();
TFilename rep;
tipo.main_print_profile(rep, 0);
rep.ext("rep");
if (rep.custom_path()) // Esiste il nuovo report :-)
cmdline = "ve1 -2";
else // Esiste il vecchio form :-(
cmdline = "ve1 -0";
}
cnt++;
const long ndoc = d->get_long(DOC_NDOC);
if (mindoc <= 0 || ndoc < mindoc)
mindoc = ndoc;
if (ndoc > maxdoc)
maxdoc = ndoc;
}
}
}
if (yesno_box(TR("Sono stati generati %d documenti:\nSi desidera stamparli ora?"), cnt))
{
const TString& codnum = mask.get(F_CODNUM);
const TDate datadoc(TODAY);
const int anno = datadoc.year();
cmdline << " " << codnum << ' ' << anno << " D " << mindoc << ' ' << maxdoc;
TExternal_app prg(cmdline);
prg.run(true, true, false);
}
}
}
void TCreazione_ordini::main_loop()
{
KEY tasto = K_ENTER;
while (tasto == K_ENTER)
tasto = _mask->run();
}
int ps0430300(int argc, char* argv[])
{
TCreazione_ordini a;
a.run(argc,argv,TR("Generazione Ordini a fornitore"));
return 0;
}