versione definitiva gestione listini con ricarico per Gianni Ferrari

git-svn-id: svn://10.65.10.50/branches/R_10_00@22699 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2012-07-10 13:51:26 +00:00
parent e1c6fbb7f0
commit f680273e2b
6 changed files with 891 additions and 617 deletions

View File

@ -7,8 +7,8 @@ int ve2300(int argc, char* argv[]); // righe listini/contratti/offerte
int ve2400(int argc, char* argv[]); // anagrafica di magazzino int ve2400(int argc, char* argv[]); // anagrafica di magazzino
int ve2500(int argc, char* argv[]); // gestione semplificata (ovvero comprensibile) listini int ve2500(int argc, char* argv[]); // gestione semplificata (ovvero comprensibile) listini
int ve2600(int argc, char* argv[]); // relazioni articoli livelli di giacenza int ve2600(int argc, char* argv[]); // relazioni articoli livelli di giacenza
int ve2700(int argc, char* argv[]); // aggirnamento multiplo listini figli (Baisena) int ve2700(int argc, char* argv[]); // aggiornamento multiplo listini figli (Baisena)
int ve2800(int argc, char* argv[]); // aggirnamento ricarico listini (Gianni Ferrari) int ve2800(int argc, char* argv[]); // aggiornamento ricarico listini (Gianni Ferrari)
#endif #endif

View File

@ -4,8 +4,10 @@
#include <recarray.h> #include <recarray.h>
#include <dongle.h> #include <dongle.h>
#include <progind.h> #include <progind.h>
#include <recset.h> #include <textset.h>
#include <reputils.h>
#include <relation.h> #include <relation.h>
#include <utility.h>
#include "ve2800.h" #include "ve2800.h"
#include "../mg/anamag.h" #include "../mg/anamag.h"
@ -18,30 +20,35 @@
class TRicarico_listini_mask : public TAutomask class TRicarico_listini_mask : public TAutomask
{ {
TBit_array _dirty; TBit_array _dirty;
bool _loading;
TString4 _curlis;
protected: protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void load(); void load();
void save(); void save();
void save_if_dirty(); bool save_if_dirty();
void set_dirty(TOperable_field& o); void recalc();
bool import();
void set_dirty();
public: public:
TRicarico_listini_mask() : TAutomask("ve2800a") {} TRicarico_listini_mask() : TAutomask("ve2800a"), _loading(false) {}
}; };
void TRicarico_listini_mask::set_dirty(TOperable_field& o) void TRicarico_listini_mask::set_dirty()
{ {
if (is_running()) if (is_running() && !_loading)
{ {
TSheet_field& s = sfield(F_LISTINO); TSheet_field& s = sfield(F_LISTINO);
const int row = s.selected(); const int row = s.selected();
if (!_dirty[row]) if (!_dirty[row])
{ {
const int col = (o.dlg() % 100) - 1; s.set_back_and_fore_color(EASY_RIDER_COLOR, NORMAL_COLOR, row, -1);
s.set_back_and_fore_color(EASY_RIDER_COLOR, NORMAL_COLOR, row, col);
_dirty.set(row); _dirty.set(row);
s.force_update(row);
enable(DLG_SAVEREC); enable(DLG_SAVEREC);
disable(DLG_RECALC);
} }
} }
} }
@ -59,46 +66,106 @@ void TRicarico_listini_mask::save()
if (!pi.setstatus(r)) if (!pi.setstatus(r))
break; break;
const TString& codlis = get(F_CODLIS);
const TString80 codart = row->get(s.cid2index(F_CODART)); 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); anamag.put(ANAMAG_CODART, codart);
if (anamag.read() == NOERR) if (anamag.read() == NOERR)
{ {
anamag.put(ANAMAG_ULTCOS1, row->get(s.cid2index(F_COSTO))); anamag.put(ANAMAG_ULTCOS1, costo);
anamag.put(ANAMAG_USER3, row->get(s.cid2index(F_RICARICO))); anamag.put(ANAMAG_USER3, ricarico);
anamag.rewrite(); anamag.rewrite();
} }
rcondv.zero(); rcondv.zero();
rcondv.put(RCONDV_TIPO, "L"); rcondv.put(RCONDV_TIPO, "L");
rcondv.put(RCONDV_COD, codlis); rcondv.put(RCONDV_COD, _curlis);
rcondv.put(RCONDV_TIPORIGA, "A"); rcondv.put(RCONDV_TIPORIGA, "A");
rcondv.put(RCONDV_CODRIGA, codart); rcondv.put(RCONDV_CODRIGA, codart);
if (rcondv.read() == NOERR) if (rcondv.read() == NOERR)
{ {
rcondv.put(RCONDV_PREZZO, row->get(s.cid2index(F_OLDPRICE))); rcondv.put(RCONDV_PREZZO, prezzo);
rcondv.rewrite(); rcondv.rewrite();
} }
} }
}
_dirty.reset(); _dirty.reset();
disable(DLG_SAVEREC); disable(DLG_SAVEREC);
enable(DLG_RECALC);
} }
void TRicarico_listini_mask::save_if_dirty() 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(); const long n = _dirty.ones();
if (n > 0 && yesno_box(FR("Si desiderano registrare le %ld righe modificate?"), n)) if (n > 0)
save(); {
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() void TRicarico_listini_mask::load()
{ {
_loading = true;
_curlis = get(F_CODLIS);
TSheet_field& s = sfield(F_LISTINO); TSheet_field& s = sfield(F_LISTINO);
TMask& sm = s.sheet_mask(); TMask& sm = s.sheet_mask();
s.destroy(); TLocalisamfile deslin(LF_DESLIN);
deslin.setkey(2);
s.destroy();
TString query; TString query;
query << "USE RCONDV"; query << "USE RCONDV";
@ -106,16 +173,15 @@ void TRicarico_listini_mask::load()
query << " SELECT ANAMAG.USER3==\"" << get(F_FILTRIC) << '"'; query << " SELECT ANAMAG.USER3==\"" << get(F_FILTRIC) << '"';
query << "\nJOIN ANAMAG INTO CODART==CODRIGA"; query << "\nJOIN ANAMAG INTO CODART==CODRIGA";
query << "\nFROM TIPO=L COD=#COD TIPORIGA=A"; query << "\nFROM TIPO=L TIPORIGA=A COD=" << _curlis;
if (!field(F_FROMCOD).empty()) if (!field(F_FROMCOD).empty())
query << " CODRIGA=" << get(F_FROMCOD); query << " CODRIGA=" << get(F_FROMCOD);
query << "\nTO TIPO=L COD=#COD TIPORIGA=A"; query << "\nTO TIPO=L TIPORIGA=A COD=" << _curlis;
if (!field(F_TOCOD).empty()) if (!field(F_TOCOD).empty())
query << " CODRIGA=" << get(F_TOCOD); query << " CODRIGA=" << get(F_TOCOD);
TISAM_recordset rcondv(query); TISAM_recordset rcondv(query);
rcondv.set_var("#COD", get(F_CODLIS));
TProgind pi(rcondv.items(), TR("Caricamento..."), false, true); TProgind pi(rcondv.items(), TR("Caricamento..."), false, true);
const TRelation& rel = *rcondv.cursor()->relation(); const TRelation& rel = *rcondv.cursor()->relation();
@ -128,6 +194,17 @@ void TRicarico_listini_mask::load()
const char* val = f->field()->read(rel); const char* val = f->field()->read(rel);
f->set(val); 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); TToken_string& r = s.row(-1);
if (r.empty()) // Dummy test if (r.empty()) // Dummy test
{ {
@ -145,6 +222,75 @@ void TRicarico_listini_mask::load()
s.force_update(); s.force_update();
_dirty.reset(); _dirty.reset();
disable(DLG_SAVEREC); 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à 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) bool TRicarico_listini_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
@ -152,12 +298,18 @@ bool TRicarico_listini_mask::on_field_event(TOperable_field& o, TField_event e,
switch (o.dlg()) switch (o.dlg())
{ {
case F_CODLIS: 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_FILTRIC:
case F_FROMCOD: case F_FROMCOD:
case F_TOCOD: case F_TOCOD:
if (e == fe_modify) if (e == fe_modify)
{ {
save_if_dirty(); if (save_if_dirty())
load(); load();
} }
break; break;
@ -172,10 +324,17 @@ bool TRicarico_listini_mask::on_field_event(TOperable_field& o, TField_event e,
if (costo > 0.03) if (costo > 0.03)
{ {
const real ricarico = cache().get("&RIC", sm.get(F_RICARICO), "R0"); const real ricarico = cache().get("&RIC", sm.get(F_RICARICO), "R0");
price = costo * (CENTO + ricarico) / CENTO; const TPrice p = costo * (CENTO + ricarico) / CENTO;
price = p.get_num();
} }
sm.set(F_NEWPRICE, price, 0x3); sm.set(F_NEWPRICE, price, 0x3);
set_dirty(o); }
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; break;
case F_OLDPRICE: case F_OLDPRICE:
@ -190,7 +349,6 @@ bool TRicarico_listini_mask::on_field_event(TOperable_field& o, TField_event e,
scontato.round(2); scontato.round(2);
real margine = (scontato > ZERO) ? CENTO * (scontato - costo) / scontato : ZERO; real margine = (scontato > ZERO) ? CENTO * (scontato - costo) / scontato : ZERO;
sm.set(o.dlg() + (F_NEWMARGIN-F_NEWPRICE), margine, 0x3); sm.set(o.dlg() + (F_NEWMARGIN-F_NEWPRICE), margine, 0x3);
set_dirty(o);
const real oldprice = sm.get(F_OLDPRICE); const real oldprice = sm.get(F_OLDPRICE);
if (oldprice> ZERO) if (oldprice> ZERO)
@ -203,6 +361,37 @@ bool TRicarico_listini_mask::on_field_event(TOperable_field& o, TField_event e,
sm.set(F_DELTAMARGIN, deltam); sm.set(F_DELTAMARGIN, deltam);
} }
break; 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: case DLG_SAVEREC:
if (e == fe_button && jolly == 0 && _dirty.first_one() >= 0) if (e == fe_button && jolly == 0 && _dirty.first_one() >= 0)
{ {
@ -210,6 +399,41 @@ bool TRicarico_listini_mask::on_field_event(TOperable_field& o, TField_event e,
load(); load();
} }
break; 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_CANCEL:
case DLG_QUIT: case DLG_QUIT:
if (e == fe_button && jolly == 0) if (e == fe_button && jolly == 0)

View File

@ -20,4 +20,6 @@
#define F_OLDMARGIN 109 #define F_OLDMARGIN 109
#define F_NEWMARGIN 110 #define F_NEWMARGIN 110
#define F_DELTAMARGIN 111 #define F_DELTAMARGIN 111
#define F_DESCFRA 112
#define F_DESCENG 113
#define F_DESCDEU 114

View File

@ -4,23 +4,46 @@ TOOLBAR "Toolbar" 0 0 0 2
BUTTON DLG_SAVEREC 2 2 BUTTON DLG_SAVEREC 2 2
BEGIN BEGIN
PROMPT 1 1 "~Salva" PROMPT 1 1 "Salva"
PICTURE TOOL_SAVEREC PICTURE TOOL_SAVEREC
FLAGS "D" FLAGS "D"
END END
BUTTON DLG_NULL 4 2 BUTTON DLG_RECALC 2 2
BEGIN BEGIN
PROMPT 2 1 "" PROMPT 2 1 "Aggiorna Prezzi"
PICTURE 0 PICTURE TOOL_RECALC
END END
BUTTON DLG_NEWREC 2 2 BUTTON DLG_NEWREC 2 2
BEGIN BEGIN
PROMPT 5 1 "+Articoli" PROMPT 3 1 "+Articoli"
PICTURE TOOL_IMPORT PICTURE TOOL_IMPORT
END END
BUTTON DLG_NULL 2 2
BEGIN
PROMPT 4 1 ""
END
BUTTON DLG_EXPORT 2 2
BEGIN
PROMPT 5 1 "Excel"
PICTURE TOOL_EXCEL
END
BUTTON DLG_PREVIEW 2 2
BEGIN
PROMPT 5 1 "Anteprima"
PICTURE TOOL_PREVIEW
END
BUTTON DLG_PRINT 2 2
BEGIN
PROMPT 6 1 "Stampa"
PICTURE TOOL_PRINT
END
#include <helpbar.h> #include <helpbar.h>
ENDPAGE ENDPAGE
@ -39,6 +62,8 @@ BEGIN
OUTPUT F_CODLIS COD OUTPUT F_CODLIS COD
OUTPUT F_DESLIS COD OUTPUT F_DESLIS COD
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
FLAGS "U"
ADD RUN ve2 -1
END END
STRING F_DESLIS 50 STRING F_DESLIS 50
@ -58,6 +83,7 @@ BEGIN
OUTPUT F_FILTRIC CODTAB OUTPUT F_FILTRIC CODTAB
OUTPUT F_DESRIC S0 OUTPUT F_DESRIC S0
CHEKTYPE NORMAL CHEKTYPE NORMAL
FLAGS "U"
END END
STRING F_DESRIC 50 STRING F_DESRIC 50
@ -78,6 +104,7 @@ BEGIN
OUTPUT F_FROMCOD CODART OUTPUT F_FROMCOD CODART
OUTPUT F_FROMDES DESCR OUTPUT F_FROMDES DESCR
CHECKTYPE SEARCH CHECKTYPE SEARCH
FLAGS "U"
END END
STRING F_FROMDES 50 STRING F_FROMDES 50
@ -102,6 +129,7 @@ BEGIN
OUTPUT F_TOCOD CODART OUTPUT F_TOCOD CODART
OUTPUT F_TODES DESCR OUTPUT F_TODES DESCR
CHECKTYPE SEARCH CHECKTYPE SEARCH
FLAGS "U"
END END
STRING F_TODES 50 STRING F_TODES 50
@ -129,6 +157,9 @@ BEGIN
ITEM "Margine\nAttuale@7" ITEM "Margine\nAttuale@7"
ITEM "Margine\nNuovo@7" ITEM "Margine\nNuovo@7"
ITEM "Margine\nDelta@7" ITEM "Margine\nDelta@7"
ITEM "Descrizione\nFrancese@30"
ITEM "Descrizione\nInglese@30"
ITEM "Descrizione\nTedesco@30"
END END
ENDPAGE ENDPAGE
@ -136,7 +167,7 @@ ENDPAGE
ENDMASK ENDMASK
// maschera di riga sheet // maschera di riga sheet
PAGE "Riga aggiornamento listini" -1 -1 66 9 PAGE "Riga aggiornamento listini" -1 -1 66 12
STRING F_CODART 20 STRING F_CODART 20
BEGIN BEGIN
@ -167,7 +198,6 @@ END
NUMBER F_SCONTO 3 NUMBER F_SCONTO 3
BEGIN BEGIN
PROMPT 35 4 "Sconto " PROMPT 35 4 "Sconto "
FLAGS "D"
FIELD SCONTO FIELD SCONTO
END END
@ -212,30 +242,48 @@ BEGIN
FLAGS "DUG" FLAGS "DUG"
END END
NUMBER F_DELTAPRICE 3 NUMBER F_DELTAPRICE 6 2
BEGIN BEGIN
PROMPT 50 6 "" PROMPT 50 6 ""
FLAGS "D" FLAGS "D"
END END
NUMBER F_OLDMARGIN 4 NUMBER F_OLDMARGIN 6 2
BEGIN BEGIN
PROMPT 2 7 "@bMargine " PROMPT 2 7 "@bMargine "
FLAGS "D" FLAGS "D"
END END
NUMBER F_NEWMARGIN 4 NUMBER F_NEWMARGIN 6 2
BEGIN BEGIN
PROMPT 32 7 "" PROMPT 32 7 ""
FLAGS "D" FLAGS "D"
END END
NUMBER F_DELTAMARGIN 4 NUMBER F_DELTAMARGIN 6 2
BEGIN BEGIN
PROMPT 50 7 "" PROMPT 50 7 ""
FLAGS "D" FLAGS "D"
END END
STRING F_DESCFRA 50
BEGIN
PROMPT 1 9 "Descr. FRA "
FLAGS "D"
END
STRING F_DESCENG 50
BEGIN
PROMPT 1 10 "Descr. ENG "
FLAGS "D"
END
STRING F_DESCDEU 50
BEGIN
PROMPT 1 11 "Descr. DEU "
FLAGS "D"
EN
ENDPAGE ENDPAGE
TOOLBAR "topbar" 0 0 0 2 TOOLBAR "topbar" 0 0 0 2
@ -245,10 +293,10 @@ BEGIN
PROMPT 1 1 "" PROMPT 1 1 ""
END END
BUTTON DLG_USER 2 2 BUTTON DLG_EDIT 2 2
BEGIN BEGIN
PROMPT 2 1 "A~zzera" PROMPT 2 1 "Azzera"
PICTURE TOOL_CELLULAR PICTURE TOOL_RESET
END END
BUTTON DLG_CANCEL 2 2 BUTTON DLG_CANCEL 2 2

View File

@ -308,7 +308,7 @@ MESSAGE ENABLE,51</prescript>
<field x="0.5" type="Stringa" bg_color="#CFCFCF" width="10.5" id="51" pattern="1"> <field x="0.5" type="Stringa" bg_color="#CFCFCF" width="10.5" id="51" pattern="1">
<source>34.CODART</source> <source>34.CODART</source>
</field> </field>
<field x="11.5" type="Stringa" bg_color="#D4D4D4" dynamic_height="1" width="57.5" height="22" id="52" pattern="1"> <field x="11.5" type="Stringa" bg_color="#D4D4D4" dynamic_height="1" width="36" height="22" id="52" pattern="1">
<prescript description="B1.52 PRESCRIPT">MESSAGE _DESCRIGA</prescript> <prescript description="B1.52 PRESCRIPT">MESSAGE _DESCRIGA</prescript>
</field> </field>
<field x="48.5" type="Stringa" bg_color="#C0C0C0" width="3" id="53" pattern="1"> <field x="48.5" type="Stringa" bg_color="#C0C0C0" width="3" id="53" pattern="1">