campo-sirio/ps/pd5317100.cpp
guy f9ce0db0d8 Personalizzazione stampa listino carrelli Sailog
git-svn-id: svn://10.65.10.50/branches/R_10_00@22695 c028cbd2-c16b-5b4b-a496-9718f37d4682
2012-07-10 13:47:59 +00:00

590 lines
19 KiB
C++
Executable File

#include <applicat.h>
#include <automask.h>
#include <currency.h>
#include <progind.h>
#include <relation.h>
#include <reprint.h>
#include <textset.h>
#include <utility.h>
#include "pd5317.h"
#include "pd5317100.h"
#include <doc.h>
#include <mov.h>
#include "../ca/rmovana.h"
//Stampa Listino Carrelli
//lvietri
class TCarrelli_recordset: public TCSV_recordset
{
public:
TCarrelli_recordset(): TCSV_recordset("CSV(\"\t\")") {}
};
//DEFINIZIONE DELLA STRUTTURA
struct TStruttura_carrelli: public TObject
{
const TString _articolo;
TString _user1;
TString _user2;
TString _user3;
TString _user4;
TString _user5;
TString _user6;
TString _user7;
TString _user8;
TString _user9;
TString _user10;
TString _user11;
TString _user12;
TString _user13;
TString _user14;
TDate _data_doc;
TString16 _num_doc;
TCurrency _importob;
TDate _data_gara;
TCurrency _prezzoAcq;
TString _descr_conto;
TString _modello;
TCurrency _noleggio;
TCurrency _revisione, _manutenzione;
TString _venduto_a;
TCurrency _prezzo_vend;
TCurrency _prezzo_p1;
TCurrency _prezzo_autom;
TCurrency _prezzo_recup;
TStruttura_carrelli() {}
TStruttura_carrelli(TString articolo,TString user[],TDate dataDoc, const TString& numDoc,
TCurrency importob, TDate data_gara, TCurrency prezzoAcq,TString descrAcq,
TString modello,TCurrency noleggio,TCurrency revisione,TCurrency manutenzione, TString venduto_a,
TCurrency prezzoVend,TCurrency prezzo_p1, TCurrency prezzo_autom,
TCurrency prezzo_recup):
_articolo(articolo),_user1 (user[0 ]),_user2 (user[1 ]),_user3 (user[2 ]),
_user4 (user[3 ]),_user5 (user[4 ]),_user6 (user[5 ]),_user7 (user[6 ]),
_user8 (user[7 ]),_user9 (user[8 ]),_user10(user[9 ]),_user11(user[10]),
_user12(user[11]),_user13(user[12]),_user14(user[13]),_data_doc(dataDoc), _num_doc(numDoc),
_importob(importob),_data_gara(data_gara) ,_prezzoAcq(prezzoAcq),
_descr_conto(descrAcq), _modello(modello),_noleggio(noleggio), _revisione(revisione),
_manutenzione(manutenzione),_venduto_a(venduto_a), _prezzo_vend(prezzoVend),
_prezzo_p1(prezzo_p1), _prezzo_autom(prezzo_autom),_prezzo_recup(prezzo_recup)
{}
};
class TCarrelli_mask: public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TCarrelli_mask():TAutomask("pd5317100"){}
};
bool TCarrelli_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
return true;
}
class TCarrelli_report : public TReport
{
protected:
virtual bool use_mask() { return false; }
public:
TCarrelli_report();
};
TCarrelli_report::TCarrelli_report()
{
load("pd5317100");
set_recordset(new TCarrelli_recordset());
}
class TCarrelli_app: public TSkeleton_application
{
protected:
virtual void main_loop();
void elabora(const TMask& mask) const;
const TString& get_query(int tipo, bool venduto = false, const TString& commessa = EMPTY_STRING) const;
const TString& get_query_saldana(const char* codice, const char* operatore = "==") const;
const char* extra_modules() const { return "mg"; }
};
const TString& TCarrelli_app::get_query_saldana(const char* codice, const char* operatore) const
{
//Stringhe x composizione query
TString& query = get_tmp_string();
query << "USE SALDANA KEY 2\n"
<< "SELECT ((CONTO" << operatore<< "'" << codice << "')&&"
<< "(BETWEEN(COMMESSA,#COMM,#COMM)))";
return query;
}
const TString& TCarrelli_app::get_query(int tipo, bool venduto, const TString& commessa) const
{
//Stringhe x composizione query
TString select, between, join, order_by;
if(tipo==0)//query su analitica\articoli\commesse
{
const char* operConto = venduto ? "==" : "!=";
select << "USE SALDANA KEY 2\n";
select << "SELECT ((CONTO" << operConto << "'004076000003')&&";
between << "(ANAMAG.CODART!='')&&";
between << "(BETWEEN(COMMESSA,#FROM,#TO)))\n";
order_by<< "BY COMMESSA\n";
join << "JOIN ANAMAG TO SALDANA INTO CODART==COMMESSA \n";
join << "JOIN COMMESSE TO SALDANA INTO CODCMS==COMMESSA \n";
if (venduto)
{
join << "FROM CONTO='004076000003' \n";
join << "TO CONTO='004076000003' \n";
}
}
else if(tipo==1)//query su articolo\doc.
{
/*
select << "USE DOC KEY 3\n";
select << "SELECT ((TIPODOC='B01')&&";
between << "(BETWEEN(CODCMS,#COMM,#COMM)))\n";
join << "JOIN CLIFO TO DOC INTO TIPOCF==TIPOCF CODCF==CODCF\n";
join << "JOIN INDSPED TO DOC INTO TIPOCF==TIPOCF CODCF==CODCF CODIND==CODINDSP\n";
join << "JOIN COMUNI TO CLIFO INTO COM==COMCF \n";
*/
select << "USE RDOC KEY 6 SELECT DOC.TIPODOC='B01'\n";
join << "JOIN DOC INTO PROVV=PROVV ANNO=ANNO CODNUM==CODNUM NDOC==NDOC\n";
join << "FROM CODCMS=#COMM\n";
join << "TO CODCMS=#COMM\n";
}
else if(tipo==2)//query su saldana ACQUISTO DA
{
select << "USE SALDANA KEY 2\n";
select << "SELECT (((CONTO ?='003081*')||(CONTO =='003071000002'))&&";
between << "(BETWEEN(COMMESSA,#COMM,#COMM)))";
join << "\nFROM CONTO=003071000002";
join << "\nTO CONTO=003081999999";
}
else if(tipo==3)//query su piano dei conti.
{
select << "USE PCON\n"
<< "SELECT ((GRUPPO=#GRUPPO1)&&(CONTO=#CONTO1)&&(SOTTOCONTO=#SOTTOCONTO1))";
}
else if(tipo==4)//query su multirel per sapere se cespite
{
select << "USE MULTIREL KEY 2\n";
select << "SELECT ((COD =='CEMAT')&&";
between << "(BETWEEN(SECOND,#COMM,#COMM)))";
}
else if(tipo==5)//query su movimenti x recupero fornitore
{
select << "USE RMOVANA KEY 2\n"
<< "SELECT ((CODCMS == '" << commessa << "')&&(CODCONTO='003071000002')) \n";
join << "JOIN MOVANA TO RMOVANA INTO NUMREG==NUMREG \n"
<< "JOIN MOV TO MOVANA INTO NUMREG=NUMREGCG \n"
<< "JOIN CLIFO TO MOV INTO TIPOCF==TIPO CODCF==CODCF \n"
<< "FROM CODCONTO='003071000002' \n"
<< "TO CODCONTO='003071000002' \n";
}
TString& query = get_tmp_string();
query << select << between << order_by << join;
return query;
}
class TRiepCarrelli: public TArray
{
public:
void add(const TString& articolo, TString user[], TDate dataDoc, const TString& numDoc,
TCurrency importob, TDate data_gara, TCurrency prezzoAcq,TString descrAcq,
TString modello,TCurrency noleggio,TCurrency revisione, TCurrency manutenzione,
TString venduto_a, TCurrency prezzoVend, TCurrency prezzo_p1, TCurrency prezzo_autom,
TCurrency prezzo_recup);
};
void TRiepCarrelli::add(const TString& articolo,TString user[],TDate dataDoc, const TString& numDoc,
TCurrency importob, TDate data_gara,
TCurrency prezzoAcq,TString descrAcq,
TString modello,TCurrency noleggio,
TCurrency revisione, TCurrency manutenzione,
TString venduto_a, TCurrency prezzoVend,
TCurrency prezzo_p1, TCurrency prezzo_autom,
TCurrency prezzo_recup)
{
TStruttura_carrelli* struttura = new TStruttura_carrelli(
articolo,user,dataDoc,numDoc,importob,data_gara,
prezzoAcq,descrAcq,modello, noleggio, revisione, manutenzione,
venduto_a,prezzoVend,prezzo_p1,prezzo_autom, prezzo_recup);
TArray::add(struttura);
}
//metodo principale di elaborazione
void TCarrelli_app::elabora(const TMask& mask)const
{
bool search = true;
const bool venduto = mask.get_bool(F_VENDUTO);
if(!venduto && !mask.field(F_COD_CMS).empty() && mask.get(F_COD_CMS)==mask.get(F_COD_CMS_TO))
{
TISAM_recordset carico(get_query(0,true));
//inserire parametri filtri
carico.set_var("#FROM",TVariant(mask.get(F_COD_CMS)));//
carico.set_var("#TO",TVariant(mask.get(F_COD_CMS_TO)));//
carico.set_var("#F_VEN",TVariant(mask.get(F_VENDUTO)));//
carico.set_var("#F_CAR",TVariant(mask.get(F_CARICO)));//
for(bool ok = carico.move_first();ok;ok=carico.move_next())
{
search = warning_box (TR("Attenzione:Il carrello risulta venduto!"));
break;
}
}
if (search)
{
TISAM_recordset riep(get_query(0,venduto));
//inserire parametri filtri
riep.set_var("#FROM", mask.get(F_COD_CMS));
riep.set_var("#TO", mask.get(F_COD_CMS_TO));
riep.set_var("#F_VEN", mask.get(F_VENDUTO));
riep.set_var("#F_CAR", mask.get(F_CARICO));
TRiepCarrelli riepilogo;
//inizializzazione variabili da utilizzare nella struttura
TString articolo;
TString user[14];
TString campo;
TString16 numDoc;
TDate dataDoc;
TDate data_gara;
TString descr_conto;
TString conto;
TString modello;
TString descr_null;
TCurrency importob;
TCurrency prezzoAcq;
TString venduto_a;
TCurrency prezzoVend;
TCurrency noleggio;
TCurrency manutenzione, revisione;
TCurrency prezzo_null;
TString commessa, commessaOld;
TProgind pi(riep.items(), title());
for (bool ok = riep.move_first();ok;ok=riep.move_next())
{
if (!pi.addstatus(1))
break;
commessa = riep.get("SALDANA.COMMESSA").as_string();
articolo = riep.get("ANAMAG.CODART").as_string();//A
if(commessa==commessaOld || commessa.empty() || articolo.empty())
continue;
commessaOld=commessa;
if (!venduto)
{
TISAM_recordset carico(get_query(0,true));
//inserire parametri filtri
carico.set_var("#FROM",commessa);//
carico.set_var("#TO",commessa);//
carico.set_var("#F_VEN",TVariant(mask.get(F_VENDUTO)));//
carico.set_var("#F_CAR",TVariant(mask.get(F_CARICO)));//
if (carico.move_first())
continue;
}
//if(articolo.not_empty())
{
for(int a = 0; a<14; a++) //da B a N
{
campo = "ANAMAG.USER";
campo << (a+1);
user[a] = riep.get(campo).as_string();
}
dataDoc= "";//O
TISAM_recordset bolle(get_query(1));
bolle.set_var("#COMM",TVariant(articolo));
if (bolle.move_last())
{
dataDoc= bolle.get("DOC.DATADOC").as_date();
numDoc = bolle.get("DOC.NDOC").as_string();
}
importob = riep.get("COMMESSE.IMPORTOB").as_real();//P
data_gara = riep.get("COMMESSE.DATAGARA").as_string();//Q
modello = riep.get("COMMESSE.DESCRIZ").as_string();//T
prezzoAcq= ZERO; //R
conto="";
TISAM_recordset saldana(get_query(2));
saldana.set_var("#COMM",TVariant(articolo));
for(bool ok3 = saldana.move_first();ok3;ok3=saldana.move_next())
{
prezzoAcq += saldana.get("SALDANA.SALDO").as_real();
conto = saldana.get("SALDANA.CONTO").as_string();
}
/*if(conto.not_empty())
{
gruppo1 = atoi(conto.sub(0,3));
conto1 = atoi(conto.sub(3,6));
sottoGruppo1 = atoi(conto.sub(6));
TISAM_recordset pconto(get_query(3));
pconto.set_var("#GRUPPO1",TVariant(long (gruppo1)));//
pconto.set_var("#CONTO1",TVariant(long (conto1)));//
pconto.set_var("#SOTTOCONTO1",TVariant(long (sottoGruppo1)));//
for(bool ok3 = pconto.move_first();ok3;ok3=pconto.move_next())
{
descr_conto = pconto.get("PCON.DESCR").as_string();
break;
}
}*/
//RECUPERO FORNITORE
descr_conto=descr_null;//S
TISAM_recordset fornitore(get_query(5,false,commessa));
if (fornitore.move_last())
{
if (fornitore.get("MOVANA.NUMREGCG").as_int() > 0)
descr_conto = fornitore.get("CLIFO.RAGSOC").as_string();
}
//NOLEGGIO
noleggio = ZERO; //U
TISAM_recordset noleg(get_query_saldana("004076000004"));
noleg.set_var("#COMM",TVariant(articolo));
for(bool ok2 = noleg.move_first();ok2;ok2=noleg.move_next())
{
noleggio = noleggio + noleg.get("SALDANA.SALDO").as_real();
}
//MANUTENZIONE
revisione = manutenzione = ZERO;
TString query;
query << "USE RMOVANA KEY 4 SELECT CODCONTO='003071000003'"
<< "\nJOIN MOVANA INTO NUMREG==NUMREG"
<< "\nFROM CODCMS=#COMM\nTO CODCMS=#COMM";
TISAM_recordset manut2(query);
manut2.set_var("#COMM", articolo);
for(bool ok2 = manut2.move_first();ok2;ok2=manut2.move_next())
{
const TString& dacodnum = manut2.get("MOVANA.DCODNUM").as_string();
const long numreg = manut2.get("MOVANA.NUMREG").as_int();
const real imp = manut2.get(RMOVANA_IMPORTO).as_real();
if (dacodnum == "PREV")
revisione += imp;
else
manutenzione += imp;
}
/*
Scaletta per il recupero del venduto:
1) user1 prelevato da anamag
2) se esiste su SALDANA con il conto 004 076 000003(Venduto)
3) controllo su multirel se si tratta di un cespite
4) se esiste su SALDANA con il conto 003 071 000002 (acquistato)
5) se esiste su SALDANA con il conto 003 081 000043
sino al 003 081 999999 (leasing)
*/
venduto_a = user[0];//W
prezzoVend = ZERO;//X
if (venduto_a.empty())
{
//VENDUTO
TISAM_recordset saldana(get_query_saldana("004076000003"));
saldana.set_var("#COMM",TVariant(articolo));
for(bool ok2 = saldana.move_last(); ok2; ok2=saldana.move_next())
{
venduto_a = "VENDUTO";
prezzoVend += saldana.get("SALDANA.SALDO").as_real();
}
if(venduto_a.empty())
{
//CESPITE
TISAM_recordset cespite(get_query(4));
cespite.set_var("#COMM",TVariant(articolo));
for(bool ok2 = cespite.move_last(); ok2; ok2=cespite.move_next())
{
venduto_a = "CESPITE";
break;
}
}
if(venduto_a.empty())
{
//ACQUISTATO
TISAM_recordset acquistato(get_query_saldana("003071000002"));
acquistato.set_var("#COMM",TVariant(articolo));
for(bool ok2 = acquistato.move_last();ok2;ok2=acquistato.move_next())
{
venduto_a = "ACQUISTATO";
break;
}
}
if(venduto_a.empty())
{
//LEASING
TISAM_recordset leasing(get_query_saldana("?=","003081*"));
leasing.set_var("#COMM",TVariant(articolo));
for(bool ok2 = leasing.move_last();ok2;ok2=leasing.move_next())
{
venduto_a = "LEASING";
break;
}
}
}
const TCurrency prezzo_p1 = (prezzoAcq + revisione+manutenzione)*1.1;//Y
const TCurrency prezzo_autom(real(prezzo_p1.get_num() * 1.2 - noleggio.get_num()*0.8)); //Z
//const TCurrency prezzo_recup = noleggio - prezzoVend - prezzo_p1; //AB Vecchio modo
const TCurrency prezzo_recup = prezzoVend + noleggio - prezzo_p1; //AB Nuovo modo
riepilogo.add(articolo,user,dataDoc,numDoc,importob,data_gara,
prezzoAcq,descr_conto,modello,
noleggio,revisione,manutenzione,venduto_a,prezzoVend,
prezzo_p1, prezzo_autom,prezzo_recup);
prezzoAcq = prezzo_null;
manutenzione = revisione = prezzo_null;
noleggio = prezzo_null;
prezzoVend = prezzo_null;
}
}
//gestione report
TCarrelli_report rep;
TCarrelli_recordset* riep_set = (TCarrelli_recordset*)rep.recordset();
//scandisce clienti e tiene buoni solo quelli valorizzati
FOR_EACH_ARRAY_ITEM(riepilogo,c,obj)
{
const TStruttura_carrelli& s = *(TStruttura_carrelli*)obj;
riep_set->new_rec();
int colonna = 0;
riep_set->set(colonna,s._articolo);//A
colonna++;
riep_set->set(colonna,s._user1);//B
colonna++;
riep_set->set(colonna,s._user2);//C
colonna++;
riep_set->set(colonna,s._user3);//D
colonna++;
riep_set->set(colonna,s._user4);//E
colonna++;
riep_set->set(colonna,s._user5);//F
colonna++;
riep_set->set(colonna,s._user6);//G
colonna++;
riep_set->set(colonna,s._user7);//H
colonna++;
riep_set->set(colonna,s._user8);//I
colonna++;
riep_set->set(colonna,s._user9);//J
colonna++;
riep_set->set(colonna,s._user10);//K
colonna++;
riep_set->set(colonna,s._user11);//L
colonna++;
riep_set->set(colonna,s._user12);//M
colonna++;
riep_set->set(colonna,s._user13);//N
colonna++;
riep_set->set(colonna,s._data_doc);//O
colonna++;
riep_set->set(colonna,s._importob.get_num());//P
colonna++;
riep_set->set(colonna,s._data_gara);//Q
colonna++;
riep_set->set(colonna,s._prezzoAcq.get_num());//R
colonna++;
riep_set->set(colonna,s._descr_conto);//S
colonna++;
riep_set->set(colonna,s._modello);//T
colonna++;
riep_set->set(colonna,s._noleggio.get_num());//U
colonna++;
riep_set->set(colonna,s._manutenzione.get_num());//V
colonna++;
riep_set->set(colonna,s._venduto_a);//W
colonna++;
riep_set->set(colonna,s._prezzo_vend.get_num());//X
colonna++;
riep_set->set(colonna,s._prezzo_p1.get_num());//Y
colonna++;
riep_set->set(colonna,s._prezzo_autom.get_num());//Z
colonna++;
riep_set->set(colonna,s._user14);//AA
colonna++;
riep_set->set(colonna,s._prezzo_recup.get_num());//AB
colonna++;
riep_set->set(colonna,s._revisione.get_num());//AC
colonna++;
riep_set->set(colonna,s._num_doc);//AD
colonna++;
}
//Crea file che contiene il recordset
//riep_set->save_as("c:\\riepilogoBolla.txt");
//carica tutte le variabili del report.
rep.mask2report(mask);
TReport_book b;
bool ok = b.add(rep);// Richiede parametri di stampa in base alla maschera omonima
if (ok)
{
//Se esiste almeno 1 pagina
if (b.pages() > 0)
b.print_or_preview(); // Stampa effettivamente
else
warning_box (TR("Nessun record estratto per i parametri inseriti"));
}
}
}
void TCarrelli_app::main_loop()
{
TCarrelli_mask mask;
//Setto come check iniziale il venduto a Si
mask.set("#F_VEN","X");
while (mask.run()==K_ENTER)
{
elabora(mask);
}
}
int pd5317100(int argc, char* argv[])
{
TCarrelli_app app;
app.run(argc, argv, TR("Stampa Listino Carrelli"));
return 0;
}