git-svn-id: svn://10.65.10.50/branches/R_10_00@22700 c028cbd2-c16b-5b4b-a496-9718f37d4682
486 lines
11 KiB
C++
486 lines
11 KiB
C++
#include <applicat.h>
|
||
#include <automask.h>
|
||
#include <colors.h>
|
||
#include <recarray.h>
|
||
#include <dongle.h>
|
||
#include <progind.h>
|
||
#include <textset.h>
|
||
#include <reputils.h>
|
||
#include <relation.h>
|
||
#include <utility.h>
|
||
|
||
#include "ve2800.h"
|
||
#include "../mg/anamag.h"
|
||
#include "rcondv.h"
|
||
|
||
////////////////////////////////////////////////////////
|
||
// MASCHERA
|
||
////////////////////////////////////////////////////////
|
||
|
||
class TRicarico_listini_mask : public TAutomask
|
||
{
|
||
TBit_array _dirty;
|
||
bool _loading;
|
||
TString4 _curlis;
|
||
|
||
protected:
|
||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||
void load();
|
||
void save();
|
||
bool save_if_dirty();
|
||
void recalc();
|
||
bool import();
|
||
void set_dirty();
|
||
|
||
public:
|
||
TRicarico_listini_mask() : TAutomask("ve2800a"), _loading(false) {}
|
||
};
|
||
|
||
void TRicarico_listini_mask::set_dirty()
|
||
{
|
||
if (is_running() && !_loading)
|
||
{
|
||
TSheet_field& s = sfield(F_LISTINO);
|
||
const int row = s.selected();
|
||
if (!_dirty[row])
|
||
{
|
||
s.set_back_and_fore_color(EASY_RIDER_COLOR, NORMAL_COLOR, row, -1);
|
||
_dirty.set(row);
|
||
s.force_update(row);
|
||
enable(DLG_SAVEREC);
|
||
disable(DLG_RECALC);
|
||
}
|
||
}
|
||
}
|
||
|
||
void TRicarico_listini_mask::save()
|
||
{
|
||
TSheet_field& s = sfield(F_LISTINO);
|
||
|
||
TFast_isamfile anamag(LF_ANAMAG);
|
||
TFast_isamfile rcondv(LF_RCONDV);
|
||
|
||
TProgind pi(s.items(), TR("Salvataggio modifiche"), false, true);
|
||
FOR_EACH_SHEET_ROW(s, r, row) if (_dirty[r])
|
||
{
|
||
if (!pi.setstatus(r))
|
||
break;
|
||
|
||
const TString80 codart = row->get(s.cid2index(F_CODART));
|
||
const real sconto = row->get(s.cid2index(F_SCONTO));
|
||
const real costo = row->get(s.cid2index(F_COSTO));
|
||
const TString8 ricarico = row->get(s.cid2index(F_RICARICO));
|
||
const real prezzo = row->get(s.cid2index(F_OLDPRICE));
|
||
|
||
if (costo.is_zero() && prezzo.is_zero())
|
||
{
|
||
rcondv.zero();
|
||
rcondv.put(RCONDV_TIPO, "L");
|
||
rcondv.put(RCONDV_COD, _curlis);
|
||
rcondv.put(RCONDV_TIPORIGA, "A");
|
||
rcondv.put(RCONDV_CODRIGA, codart);
|
||
rcondv.remove();
|
||
}
|
||
else
|
||
{
|
||
anamag.put(ANAMAG_CODART, codart);
|
||
if (anamag.read() == NOERR)
|
||
{
|
||
anamag.put(ANAMAG_ULTCOS1, costo);
|
||
anamag.put(ANAMAG_USER3, ricarico);
|
||
anamag.rewrite();
|
||
}
|
||
|
||
rcondv.zero();
|
||
rcondv.put(RCONDV_TIPO, "L");
|
||
rcondv.put(RCONDV_COD, _curlis);
|
||
rcondv.put(RCONDV_TIPORIGA, "A");
|
||
rcondv.put(RCONDV_CODRIGA, codart);
|
||
if (rcondv.read() == NOERR)
|
||
{
|
||
rcondv.put(RCONDV_SCONTO, sconto);
|
||
rcondv.put(RCONDV_PREZZO, prezzo);
|
||
rcondv.rewrite();
|
||
}
|
||
}
|
||
}
|
||
_dirty.reset();
|
||
disable(DLG_SAVEREC);
|
||
enable(DLG_RECALC);
|
||
}
|
||
|
||
void TRicarico_listini_mask::recalc()
|
||
{
|
||
TSheet_field& s = sfield(F_LISTINO);
|
||
TFast_isamfile rcondv(LF_RCONDV);
|
||
TProgind pi(s.items(), TR("Aggiornamento prezzi"), true, true);
|
||
FOR_EACH_SHEET_ROW(s, r, row)
|
||
{
|
||
if (!pi.setstatus(r))
|
||
break;
|
||
|
||
const real oldprice = row->get(s.cid2index(F_OLDPRICE));
|
||
const real newprice = row->get(s.cid2index(F_NEWPRICE));
|
||
if (oldprice != newprice)
|
||
{
|
||
const TString80 codart = row->get(s.cid2index(F_CODART));
|
||
rcondv.zero();
|
||
rcondv.put(RCONDV_TIPO, "L");
|
||
rcondv.put(RCONDV_COD, _curlis);
|
||
rcondv.put(RCONDV_TIPORIGA, "A");
|
||
rcondv.put(RCONDV_CODRIGA, codart);
|
||
if (rcondv.read() == NOERR)
|
||
{
|
||
rcondv.put(RCONDV_PREZZO, newprice);
|
||
rcondv.rewrite();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
bool TRicarico_listini_mask::save_if_dirty()
|
||
{
|
||
bool done = true;
|
||
const long n = _dirty.ones();
|
||
if (n > 0)
|
||
{
|
||
const KEY k = yesnocancel_box(FR("Si desiderano registrare le %ld righe modificate?"), n);
|
||
switch (k)
|
||
{
|
||
case K_YES: save(); break;
|
||
case K_NO : break;
|
||
default : done = false; break;
|
||
}
|
||
}
|
||
return done;
|
||
}
|
||
|
||
void TRicarico_listini_mask::load()
|
||
{
|
||
_loading = true;
|
||
_curlis = get(F_CODLIS);
|
||
|
||
TSheet_field& s = sfield(F_LISTINO);
|
||
TMask& sm = s.sheet_mask();
|
||
|
||
TLocalisamfile deslin(LF_DESLIN);
|
||
deslin.setkey(2);
|
||
|
||
s.destroy();
|
||
TString query;
|
||
query << "USE RCONDV";
|
||
|
||
if (!field(F_FILTRIC).empty())
|
||
query << " SELECT ANAMAG.USER3==\"" << get(F_FILTRIC) << '"';
|
||
|
||
query << "\nJOIN ANAMAG INTO CODART==CODRIGA";
|
||
query << "\nFROM TIPO=L TIPORIGA=A COD=" << _curlis;
|
||
if (!field(F_FROMCOD).empty())
|
||
query << " CODRIGA=" << get(F_FROMCOD);
|
||
|
||
query << "\nTO TIPO=L TIPORIGA=A COD=" << _curlis;
|
||
if (!field(F_TOCOD).empty())
|
||
query << " CODRIGA=" << get(F_TOCOD);
|
||
|
||
TISAM_recordset rcondv(query);
|
||
|
||
TProgind pi(rcondv.items(), TR("Caricamento..."), false, true);
|
||
const TRelation& rel = *rcondv.cursor()->relation();
|
||
for (bool ok = rcondv.move_first(); ok; ok = rcondv.move_next())
|
||
{
|
||
if (!pi.addstatus(1))
|
||
break;
|
||
FOR_EACH_MASK_FIELD(sm, i, f) if (f->field())
|
||
{
|
||
const char* val = f->field()->read(rel);
|
||
f->set(val);
|
||
}
|
||
|
||
const TString& codart = sm.get(F_CODART);
|
||
const char cod[4] = "FGD";
|
||
for (int lingua = 0; lingua < 3; lingua++)
|
||
{
|
||
deslin.put("CODART", codart);
|
||
deslin.put("CODLIN", cod[lingua]);
|
||
if (deslin.read() == NOERR)
|
||
sm.set(F_DESCFRA+lingua, deslin.get("DESCR"));
|
||
}
|
||
|
||
TToken_string& r = s.row(-1);
|
||
if (r.empty()) // Dummy test
|
||
{
|
||
sm.field(F_RICARICO).on_hit();
|
||
sm.field(F_OLDPRICE).on_hit();
|
||
sm.field(F_NEWPRICE).on_hit();
|
||
FOR_EACH_MASK_FIELD(sm, i, f)
|
||
{
|
||
const short id = f->dlg();
|
||
if (id >= 101 && id < 200)
|
||
r.add(f->get(), (id % 100) -1);
|
||
}
|
||
}
|
||
}
|
||
s.force_update();
|
||
_dirty.reset();
|
||
disable(DLG_SAVEREC);
|
||
enable(DLG_RECALC);
|
||
|
||
_loading = false;
|
||
}
|
||
|
||
bool TRicarico_listini_mask::import()
|
||
{
|
||
TRecnotype n = 0;
|
||
TFilename name;
|
||
name.tempdir();
|
||
name.add("*.csv");
|
||
if (!input_filename(name) || !name.exist())
|
||
return false;
|
||
|
||
TString msg;
|
||
msg << TR("Importazione ") << name;
|
||
TLog_report log(msg);
|
||
|
||
TCSV_recordset txt(name);
|
||
|
||
if (txt.items() > 0)
|
||
{
|
||
TFast_isamfile rcondv(LF_RCONDV);
|
||
TFast_isamfile anamag(LF_ANAMAG);
|
||
|
||
TAssoc_array codarts;
|
||
|
||
TProgind pi(txt.items(), msg);
|
||
for (bool ok = txt.move_first(); ok; ok = txt.move_next())
|
||
{
|
||
if (!pi.addstatus(1))
|
||
break;
|
||
TString80 codart = txt.get(0L).as_string();
|
||
codart.trim();
|
||
if (codart.not_empty() && !codarts.is_key(codart))
|
||
{
|
||
codarts.add(codart);
|
||
anamag.put(ANAMAG_CODART, codart);
|
||
if (anamag.read() == NOERR)
|
||
{
|
||
rcondv.zero();
|
||
rcondv.put(RCONDV_TIPO, "L");
|
||
rcondv.put(RCONDV_COD, _curlis);
|
||
rcondv.put(RCONDV_TIPORIGA, "A");
|
||
rcondv.put(RCONDV_CODRIGA, codart);
|
||
if (rcondv.write() != NOERR)
|
||
{
|
||
msg = codart;
|
||
msg << TR(" articolo gi<67> a listino");
|
||
log.log(1, msg);
|
||
}
|
||
else
|
||
n++;
|
||
}
|
||
else
|
||
{
|
||
msg = codart;
|
||
msg << TR(" articolo non presente in anagrafica");
|
||
log.log(2, msg);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
msg.format(FR("Sono stati importati %ld nuovi articoli su %ld righe"), n, txt.items());
|
||
log.log(0, "");
|
||
log.log(0, msg);
|
||
log.preview();
|
||
|
||
return n > 0;
|
||
}
|
||
|
||
bool TRicarico_listini_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||
{
|
||
switch (o.dlg())
|
||
{
|
||
case F_CODLIS:
|
||
if (e == fe_init || e == fe_modify)
|
||
{
|
||
const bool good = !o.empty();
|
||
enable(DLG_NEWREC, good);
|
||
enable(DLG_PRINT, good);
|
||
}
|
||
case F_FILTRIC:
|
||
case F_FROMCOD:
|
||
case F_TOCOD:
|
||
if (e == fe_modify)
|
||
{
|
||
if (save_if_dirty())
|
||
load();
|
||
}
|
||
break;
|
||
case F_COSTO:
|
||
case F_RICARICO:
|
||
if (e == fe_modify && jolly)
|
||
{
|
||
TSheet_field& s = sfield(F_LISTINO);
|
||
TMask& sm = s.sheet_mask();
|
||
const real costo = sm.get(F_COSTO);
|
||
real price = 0.10;
|
||
if (costo > 0.03)
|
||
{
|
||
const real ricarico = cache().get("&RIC", sm.get(F_RICARICO), "R0");
|
||
const TPrice p = costo * (CENTO + ricarico) / CENTO;
|
||
price = p.get_num();
|
||
}
|
||
sm.set(F_NEWPRICE, price, 0x3);
|
||
}
|
||
break;
|
||
case F_SCONTO:
|
||
if (e == fe_modify && jolly)
|
||
{
|
||
on_field_event(o.mask().efield(F_OLDPRICE), e, jolly);
|
||
on_field_event(o.mask().efield(F_NEWPRICE), e, jolly);
|
||
}
|
||
break;
|
||
case F_OLDPRICE:
|
||
case F_NEWPRICE:
|
||
if (e == fe_modify && jolly)
|
||
{
|
||
TMask& sm = o.mask();
|
||
const real costo = sm.get(F_COSTO);
|
||
const real sconto = sm.get(F_SCONTO);
|
||
const real prezzo = o.get();
|
||
real scontato = prezzo * (CENTO - sconto) / CENTO;
|
||
scontato.round(2);
|
||
real margine = (scontato > ZERO) ? CENTO * (scontato - costo) / scontato : ZERO;
|
||
sm.set(o.dlg() + (F_NEWMARGIN-F_NEWPRICE), margine, 0x3);
|
||
|
||
const real oldprice = sm.get(F_OLDPRICE);
|
||
if (oldprice> ZERO)
|
||
{
|
||
const real newprice = sm.get(F_NEWPRICE);
|
||
const real delta = (newprice - oldprice) * CENTO / oldprice;
|
||
sm.set(F_DELTAPRICE, delta);
|
||
}
|
||
const real deltam = sm.get_real(F_NEWMARGIN) - sm.get_real(F_OLDMARGIN);
|
||
sm.set(F_DELTAMARGIN, deltam);
|
||
}
|
||
break;
|
||
case F_LISTINO:
|
||
switch (e)
|
||
{
|
||
case se_notify_modify:
|
||
set_dirty();
|
||
break;
|
||
case se_query_add:
|
||
send_key(K_SPACE, DLG_NEWREC, &o);
|
||
case se_query_del:
|
||
return false;
|
||
default:
|
||
break;
|
||
}
|
||
break;
|
||
case DLG_EDIT:
|
||
if (e == fe_button && jolly == 1)
|
||
{
|
||
TMask& msk = o.mask();
|
||
msk.reset(F_SCONTO);
|
||
msk.reset(F_COSTO);
|
||
msk.reset(F_RICARICO);
|
||
msk.reset(F_OLDPRICE);
|
||
}
|
||
break;
|
||
case DLG_EXPORT:
|
||
if (e == fe_button && jolly == 0)
|
||
{
|
||
TSheet_field& s = sfield(F_LISTINO);
|
||
s.esporta();
|
||
}
|
||
break;
|
||
case DLG_SAVEREC:
|
||
if (e == fe_button && jolly == 0 && _dirty.first_one() >= 0)
|
||
{
|
||
save();
|
||
load();
|
||
}
|
||
break;
|
||
case DLG_RECALC:
|
||
if (e == fe_button && jolly == 0 && _dirty.first_one() < 0)
|
||
{
|
||
const TSheet_field& s = sfield(F_LISTINO);
|
||
if (yesno_box(FR("Si desidera aggiornare il prezzo di %ld articoli"), s.items()))
|
||
{
|
||
recalc();
|
||
load();
|
||
}
|
||
}
|
||
break;
|
||
case DLG_NEWREC:
|
||
if (e == fe_button && jolly == 0)
|
||
{
|
||
if (save_if_dirty() && import())
|
||
load();
|
||
}
|
||
break;
|
||
case DLG_PRINT:
|
||
case DLG_PREVIEW:
|
||
if (e == fe_button && jolly == 0)
|
||
{
|
||
TReport rep;
|
||
if (rep.load("ve2800"))
|
||
{
|
||
rep.recordset()->set_var("#COD", _curlis);
|
||
if (o.dlg() == DLG_PRINT)
|
||
rep.print();
|
||
else
|
||
rep.preview();
|
||
}
|
||
else
|
||
cantread_box("ve2800.rep");
|
||
}
|
||
break;
|
||
case DLG_CANCEL:
|
||
case DLG_QUIT:
|
||
if (e == fe_button && jolly == 0)
|
||
save_if_dirty();
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
////////////////////////////////////////////////////////
|
||
// APPLICAZIONE
|
||
////////////////////////////////////////////////////////
|
||
|
||
class TRicarico_listini : public TSkeleton_application
|
||
{
|
||
protected:
|
||
virtual bool create();
|
||
|
||
public:
|
||
virtual void main_loop();
|
||
};
|
||
|
||
|
||
void TRicarico_listini::main_loop()
|
||
{
|
||
TRicarico_listini_mask mask;
|
||
while (mask.run() == K_ENTER);
|
||
}
|
||
|
||
bool TRicarico_listini::create()
|
||
{
|
||
Tdninst dninst;
|
||
if (!dninst.can_I_run(true))
|
||
return error_box(TR("Programma non autorizzato!"));
|
||
TSheet_field::set_line_number_width(4);
|
||
return TSkeleton_application::create();
|
||
}
|
||
|
||
int ve2800(int argc, char* argv[])
|
||
{
|
||
TRicarico_listini a;
|
||
a.run(argc, argv, TR("Ricarico Listini"));
|
||
return 0;
|
||
}
|
||
|