fbce256e5d
Files correlati : pr0.exe pr0700b.msk pr1.exe pr1100.msk pr1100a.frm pr1300a.frm pr1300a.msk Ricompilazione Demo : [ ] Commento : GF20035 Le stampe vengono visualizzate, ma se vengono inviate alla stampante non stampa nulla e poi uscendo dalle voci di menù appare il messaggio: "PR1 questo programma ha eseguito un'operazione non valida e sarà terminato". GF20036 Vengono riportati gli importi solo delle provvigioni da liquidare al momento della fatturazione, mentre per quelli da liquidare al momento del pagamento non viene riporatto nulla. GF20037 Se clicco due volte sulla riga che riporata gli estremi della fattura sulla quale la provvigione è stata calcolata i tasti ANNULLA / CONFERMA / ELIMINA non sono allineati correttamente. GF20038 La % di provvigione che mi presenta nella relativa colonna in riferimento in corrispondenza della rata non numerata non è corretta. (allego l'area dati d'esempio sulla quale si può notare l'errore). Secondo me dovrebbe essere zero git-svn-id: svn://10.65.10.50/trunk@11233 c028cbd2-c16b-5b4b-a496-9718f37d4682
245 lines
6.9 KiB
C++
Executable File
245 lines
6.9 KiB
C++
Executable File
#include <applicat.h>
|
|
#include <form.h>
|
|
#include <mask.h>
|
|
#include <printer.h>
|
|
#include <progind.h>
|
|
|
|
#include "provv.h"
|
|
#include "pr1300a.h"
|
|
#include "..\ve\velib.h"
|
|
|
|
class TStampa_schedeprovv_form : public TForm
|
|
{
|
|
TString _basecalcolo;
|
|
TPagamento _pagamento;
|
|
|
|
protected:
|
|
virtual bool validate(TForm_item &, TToken_string &);
|
|
|
|
public:
|
|
void set_basecalcolo(const TString& s) { _basecalcolo = s; }
|
|
TStampa_schedeprovv_form(const char* name);
|
|
virtual ~TStampa_schedeprovv_form(){};
|
|
};
|
|
|
|
TStampa_schedeprovv_form::TStampa_schedeprovv_form(const char* name) : TForm(name)
|
|
{ }
|
|
|
|
bool TStampa_schedeprovv_form::validate(TForm_item &cf, TToken_string &s)
|
|
{
|
|
const TString code = s.get(0);
|
|
if (code == "_BASECALCOLO")
|
|
{
|
|
real valore;
|
|
if (_basecalcolo.empty())
|
|
{
|
|
const real cambio = TForm::find_field('B', odd_page, 666).get();
|
|
valore = TForm::cursor()->curr().get_real(PROV_IMPRATA)*cambio;
|
|
}
|
|
else
|
|
{
|
|
const int nriga = TForm::cursor()->curr().get_int(PROV_NRIGA);
|
|
if (nriga == 1)
|
|
{
|
|
TDocumento doc(TForm::cursor()->curr(LF_DOC));
|
|
_pagamento = doc.pagamento();
|
|
real importo = doc.get(_basecalcolo);
|
|
if (doc.tipo().nota_credito())
|
|
importo = -importo;
|
|
_pagamento.set_total(importo,0,0);
|
|
_pagamento.set_rate_auto();
|
|
}
|
|
const int nrata = TForm::cursor()->curr().get_int(PROV_NRATA);
|
|
if (nrata > 0 && nrata <= _pagamento.n_rate())
|
|
valore = _pagamento.importo_rata(nrata-1);
|
|
else
|
|
valore = ZERO;
|
|
}
|
|
cf.set(valore.string());
|
|
}
|
|
return TForm::validate(cf, s);
|
|
}
|
|
|
|
class TStampa_schedeprovv : public TSkeleton_application
|
|
{
|
|
TMask * _m;
|
|
void riporta_pagamenti(TCursor &cur);
|
|
|
|
protected:
|
|
virtual bool create();
|
|
virtual bool destroy();
|
|
virtual void main_loop();
|
|
};
|
|
|
|
bool TStampa_schedeprovv::create()
|
|
{
|
|
open_files(LF_CFVEN, LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG,
|
|
LF_SCONTI, LF_UMART, LF_TAB, LF_TABCOM, LF_CLIFO, LF_INDSP,
|
|
LF_OCCAS, LF_PCON, LF_MOVMAG, LF_RMOVMAG, LF_MAG, LF_SVRIEP,
|
|
LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0);
|
|
|
|
_m= new TMask ("pr1300a");
|
|
|
|
return TSkeleton_application::create();
|
|
}
|
|
|
|
bool TStampa_schedeprovv::destroy()
|
|
{
|
|
delete _m;
|
|
return TSkeleton_application::destroy();
|
|
}
|
|
|
|
void TStampa_schedeprovv::riporta_pagamenti(TCursor &cur)
|
|
{
|
|
if (cur.items()==0) return;
|
|
const TRelation * r=cur.relation();
|
|
TLocalisamfile& prov = r->lfile();
|
|
TProgind barra(cur.items(),"Registro le provvigioni pagate");
|
|
for (int c=0; c<cur.items(); c++)
|
|
{
|
|
cur=c;
|
|
barra.setstatus(c);
|
|
// stampa definitiva: riporta le provvigioni maturate sulle provv. pagate
|
|
real provv_pag, pag_pag;
|
|
provv_pag = prov.get_real(PROV_PROVVMAT);
|
|
pag_pag = prov.get_real(PROV_PAGMAT);
|
|
if (!provv_pag.is_zero() &&
|
|
!prov.get_bool(PROV_SALDATA)) // this should never happen!
|
|
{
|
|
prov.reread(_lock);
|
|
provv_pag += prov.get_real(PROV_PROVVPAG);
|
|
pag_pag += prov.get_real(PROV_PAGATO);
|
|
prov.put(PROV_PROVVPAG,provv_pag);
|
|
prov.put(PROV_PROVVMAT,0);
|
|
prov.put(PROV_PAGATO,pag_pag);
|
|
prov.put(PROV_PAGMAT,0);
|
|
if (provv_pag>=prov.get_real(PROV_IMPPROVV))
|
|
prov.put(PROV_SALDATA,"X");
|
|
prov.rewrite();
|
|
}
|
|
}
|
|
}
|
|
|
|
void TStampa_schedeprovv::main_loop()
|
|
{
|
|
TStampa_schedeprovv_form frm("pr1300a");
|
|
|
|
const int hh = 7;
|
|
const int fh = 1;
|
|
const int fl = printer().formlen();
|
|
|
|
int rows[4]; // Righe orizzontali
|
|
rows[0] = hh-3;
|
|
rows[1] = hh;
|
|
rows[2] = fl-1;
|
|
rows[3] = 0;
|
|
frm.genera_intestazioni(odd_page, hh-2);
|
|
frm.genera_fincatura(odd_page, hh-3, fl-1, rows);
|
|
|
|
|
|
while (_m->run()!=K_QUIT)
|
|
{
|
|
|
|
// filtro e regione
|
|
TString filter;
|
|
|
|
if (_m->get(F_FILTRO).not_empty())
|
|
{
|
|
filter = PROV_SALDATA;
|
|
if (_m->get(F_FILTRO)[0]=='P')
|
|
filter << "==\"X\"" ;
|
|
else
|
|
filter << "!=\"X\"" ;
|
|
}
|
|
if (_m->get_bool(F_NOZERO))
|
|
{
|
|
bool not_empty = filter.not_empty();
|
|
if (not_empty)
|
|
{
|
|
filter.insert("(");
|
|
filter << ") && (";
|
|
}
|
|
filter << "(" << PROV_IMPPRDOC << "!= 0)";
|
|
if (not_empty)
|
|
filter << ")";
|
|
}
|
|
if (_m->get(F_DADATA).not_empty() || _m->get(F_ADATA).not_empty())
|
|
{
|
|
TDate datam;
|
|
bool not_empty = filter.not_empty();
|
|
if (not_empty)
|
|
{
|
|
filter.insert("(");
|
|
filter << ") && (";
|
|
}
|
|
if (_m->get(F_DADATA).not_empty())
|
|
{
|
|
datam = _m->get_date(F_DADATA);
|
|
filter << "(ANSI(" << PROV_DATADOC << ")>=\"" << datam.string(ANSI) << "\")";
|
|
if (_m->get(F_ADATA).not_empty())
|
|
filter << " && ";
|
|
}
|
|
if (_m->get(F_ADATA).not_empty())
|
|
{
|
|
datam = _m->get_date(F_ADATA);
|
|
filter << "(ANSI(" << PROV_DATADOC << ")<=\"" << datam.string(ANSI) << "\")";
|
|
}
|
|
if (not_empty)
|
|
filter << ")";
|
|
}
|
|
|
|
// aggiungo comunque il file alla relazione perche' mi serve avere il documento sempre
|
|
frm.cursor()->relation()->add(LF_DOC, "CODNUM==CODNUM|ANNO==ANNO|PROVV==\"D\"|NDOC==NDOC");
|
|
|
|
const TString & tipodoc = _m->get(F_TIPODOC);
|
|
if (tipodoc.not_empty())
|
|
{
|
|
//frm.cursor()->relation()->add(LF_DOC, "CODNUM==CODNUM|ANNO==ANNO|PROVV==\"D\"|NDOC==NDOC");
|
|
bool not_empty = filter.not_empty();
|
|
|
|
if (not_empty)
|
|
{
|
|
filter.insert("(");
|
|
filter << ") && (";
|
|
}
|
|
|
|
filter << LF_DOC << "->TIPODOC == \"" << tipodoc << "\"";
|
|
|
|
if (not_empty)
|
|
filter << ")";
|
|
|
|
frm.cursor()->setfilter(filter, TRUE);
|
|
}
|
|
else
|
|
frm.cursor()->setfilter(filter);
|
|
|
|
TRectype start(LF_PROVV),end(LF_PROVV);
|
|
if (_m->get(F_DAAGE).not_empty())
|
|
start.put(PROV_CODAGE,_m->get(F_DAAGE));
|
|
if (_m->get(F_AAGE).not_empty())
|
|
end.put(PROV_CODAGE,_m->get(F_AAGE));
|
|
frm.cursor()->setregion(start,end);
|
|
|
|
frm.set_basecalcolo(_m->get(F_FORMULA));
|
|
|
|
// abilita le sezioni dei totali
|
|
frm.find_field('B',odd_page,"CLIENTI").show(!_m->get_bool(F_RAGGCLI));
|
|
frm.find_field('B',odd_page,"HCLIENTI").show(!_m->get_bool(F_RAGGDOC));
|
|
frm.find_field('B',odd_page,"DOCUMENTI").show(!_m->get_bool(F_RAGGDOC));
|
|
frm.find_field('B',odd_page,"HDOCUMENTI").show(!_m->get_bool(F_RAGGRATE));
|
|
frm.find_field('B',odd_page,"RATEDOC").show(!_m->get_bool(F_RAGGRATE));
|
|
frm.print();
|
|
if (_m->get(F_DEFINITIVA)[0]=='D')
|
|
{
|
|
riporta_pagamenti(*frm.cursor());
|
|
}
|
|
}
|
|
}
|
|
|
|
int pr1300(int argc, char* argv[])
|
|
{
|
|
TStampa_schedeprovv a;
|
|
a.run(argc,argv,"Stampa schede di provvigione");
|
|
return 0;
|
|
}
|