1fe4f39307
- Gestione agenti - Gestione provvigioni - Gestione tabelle Da fare: stampe varie git-svn-id: svn://10.65.10.50/trunk@5108 c028cbd2-c16b-5b4b-a496-9718f37d4682
290 lines
7.8 KiB
C++
Executable File
290 lines
7.8 KiB
C++
Executable File
#include "prlib.h"
|
|
#include "provv.h"
|
|
#include <doc.h>
|
|
|
|
// TProvvigioni_agente
|
|
|
|
|
|
TProvvigioni_agente::TProvvigioni_agente()
|
|
{
|
|
_rows = new TRecord_array(LF_PROVV,PROV_NRIGA);
|
|
}
|
|
|
|
TProvvigioni_agente::TProvvigioni_agente(const char* agente)
|
|
{
|
|
_rows = new TRecord_array(LF_PROVV,PROV_NRIGA);
|
|
read(agente);
|
|
}
|
|
|
|
TProvvigioni_agente::~TProvvigioni_agente()
|
|
{
|
|
delete _rows;
|
|
}
|
|
|
|
int TProvvigioni_agente::read(const char* agente)
|
|
{
|
|
int err = NOERR;
|
|
TRectype rec(LF_PROVV);
|
|
|
|
rec.put(PROV_CODAGE,agente);
|
|
_agente = agente;
|
|
_rate.destroy();
|
|
_rows->destroy_rows();
|
|
err = _rows->read(rec); // Legge tutte le righe provvigionali di codesto agente
|
|
|
|
if (err != NOERR)
|
|
return err;
|
|
|
|
const int rows = _rows->rows();
|
|
int anno;
|
|
long ndoc;
|
|
TString key,codnum;
|
|
for (int i = 1; i <= rows; i++) // Compila l'assoc_array per documenti/rate
|
|
{
|
|
TRectype& r = _rows->row(i,FALSE);
|
|
anno = r.get_int(DOC_ANNO);
|
|
codnum = r.get(DOC_CODNUM);
|
|
ndoc = r.get_long(DOC_NDOC);
|
|
key.format("%4d%4s%7ld",anno,(const char*)codnum,ndoc); // Compone la chiave
|
|
|
|
const bool exist = _rate.is_key(key); // Guarda se esiste gia' questo documento
|
|
TRate_doc com_rata(r);
|
|
TRate_doc& rd = exist ? (TRate_doc&) _rate[key] : com_rata;
|
|
TRata* rt = new TRata(r);
|
|
rd.add_rata(rt);
|
|
|
|
_rate.add(key,rd,exist); // Sostituisce/aggiunge l'elemento
|
|
}
|
|
|
|
// Dopo aver letto le righe, ordina le rate per ogni documento
|
|
for (TRate_doc* rd = (TRate_doc*) _rate.first_item(); rd != NULL; rd = (TRate_doc*) _rate.succ_item())
|
|
rd->sort_rate();
|
|
|
|
return err;
|
|
}
|
|
|
|
void TProvvigioni_agente::rate2rows()
|
|
{
|
|
_rows->destroy_rows();
|
|
// Setta la chiave del TRecord_array
|
|
TRectype* chiave = new TRectype(LF_PROVV);
|
|
chiave->put(PROV_CODAGE, _agente);
|
|
_rows->set_key(chiave);
|
|
// Scorre gli elementi di _rate (TDoc_rate) uno ad uno
|
|
// per settare le righe provvigionali
|
|
TString_array kl;
|
|
const int items = documenti(kl); // Prende l'elenco dei documenti
|
|
kl.sort(); // ordina per documento
|
|
int nrow = 1;
|
|
for (int i = 0; i < items; i++)
|
|
{
|
|
TRate_doc& rd = (TRate_doc&)_rate[kl.row(i)];
|
|
const int ritems = rd.items(); // Ciclo per rate di questo documento
|
|
for (int j = 0; j < ritems; j++)
|
|
{
|
|
TRata& rt = rd[j];
|
|
TRectype* record = new TRectype(LF_PROVV);
|
|
record->put(PROV_CODAGE,_agente);
|
|
record->put(PROV_NRIGA,nrow++);
|
|
record->put(PROV_ANNO,rd.anno());
|
|
record->put(PROV_CODNUM,rd.codnum());
|
|
record->put(PROV_NDOC,rd.ndoc());
|
|
record->put(PROV_NRATA,rt.rata());
|
|
record->put(PROV_GENERATA,rt.generata());
|
|
record->put(PROV_SALDATA,rt.saldata());
|
|
record->put(PROV_TIPOPAGPR,rt.tipopagpr());
|
|
record->put(PROV_DATADOC,rd.datadoc());
|
|
record->put(PROV_IMPDOC,rd.impdoc());
|
|
record->put(PROV_IMPPRDOC,rd.impprdoc());
|
|
record->put(PROV_IMPNETDOC,rd.impnet());
|
|
record->put(PROV_CODCLI,rd.codcf());
|
|
record->put(PROV_TIPOPAG,rd.tipo());
|
|
record->put(PROV_CODVAL,rd.codval());
|
|
record->put(PROV_DATACAMBIO,rd.datacam());
|
|
record->put(PROV_CAMBIO,rd.cambio());
|
|
record->put(PROV_DATASCAD,rt.datascad());
|
|
record->put(PROV_IMPRATA,rt.imprata());
|
|
record->put(PROV_IMPPROVV,rt.impprovv());
|
|
record->put(PROV_PAGATO,rt.pagato());
|
|
record->put(PROV_PROVVPAG,rt.provvpag());
|
|
record->put(PROV_PAGMAT,rt.pagmat());
|
|
record->put(PROV_PROVVMAT,rt.provvmat());
|
|
_rows->add_row(record);
|
|
}
|
|
}
|
|
}
|
|
|
|
int TProvvigioni_agente::write(bool rows)
|
|
{
|
|
if (!rows)
|
|
rate2rows();
|
|
return _rows->write();
|
|
}
|
|
|
|
int TProvvigioni_agente::rewrite(bool rows)
|
|
{
|
|
if (!rows)
|
|
rate2rows();
|
|
return _rows->rewrite();
|
|
}
|
|
|
|
int TProvvigioni_agente::remove(bool rows)
|
|
{
|
|
if (!rows)
|
|
rate2rows();
|
|
return _rows->remove();
|
|
}
|
|
|
|
TRate_doc& TProvvigioni_agente::rate(int anno, const char* codnum, long ndoc, bool create)
|
|
{
|
|
TString k;
|
|
|
|
k.format("%4d%4s%7ld",anno,codnum,ndoc);
|
|
return rate(k,create);
|
|
}
|
|
|
|
TRate_doc& TProvvigioni_agente::rate(const char* key, bool create)
|
|
{
|
|
const bool exist = _rate.is_key(key);
|
|
if (!exist)
|
|
{
|
|
if (create)
|
|
{
|
|
TRectype r(LF_PROVV);
|
|
TString k(key);
|
|
r.put(PROV_ANNO,k.sub(0,4));
|
|
r.put(PROV_CODNUM,k.sub(4,8));
|
|
r.put(PROV_NDOC,k.sub(8));
|
|
TRate_doc* rd = new TRate_doc(r);
|
|
_rate.add(key,rd);
|
|
}
|
|
else
|
|
fatal_box("Impossibile trovare l'elemento %s tra le righe provvigionali",key);
|
|
}
|
|
return (TRate_doc&) _rate[key];
|
|
}
|
|
|
|
void TProvvigioni_agente::remove_rate(int anno, const char* codnum, long ndoc)
|
|
{
|
|
TString k;
|
|
|
|
k.format("%4d%4s%7ld",anno,codnum,ndoc);
|
|
remove_rate(k);
|
|
}
|
|
|
|
void TProvvigioni_agente::remove_rate(const char* key)
|
|
{
|
|
const bool exist = _rate.is_key(key);
|
|
if (exist)
|
|
_rate.remove(key);
|
|
else
|
|
fatal_box("Impossibile trovare l'elemento %s tra le righe provvigionali", key);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
// TRate_doc
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
TRate_doc::TRate_doc(TRectype& rec)
|
|
{
|
|
set(rec); // bleah!
|
|
}
|
|
|
|
bool TRate_doc::ok_provvigione()
|
|
{
|
|
real totprov;
|
|
const int its = items();
|
|
|
|
for (int i = 0; i < its; i++) // Somma le provvigioni di tutte le rate
|
|
totprov += row(i).impprovv();
|
|
|
|
return totprov <= _impprdoc; // controlla che tale somma e' compresa nel totale provvigione del documento
|
|
}
|
|
|
|
void TRate_doc::set(TRectype& rec)
|
|
{
|
|
CHECK(rec.num() == LF_PROVV,"Il record non ha il tracciato di LF_PROVV");
|
|
_anno = rec.get_int(PROV_ANNO);
|
|
_codnum = rec.get(PROV_CODNUM);
|
|
_codval = rec.get(PROV_CODVAL);
|
|
_ndoc = rec.get_long(PROV_NDOC);
|
|
_codcf = rec.get_long(PROV_CODCLI);
|
|
_datadoc = rec.get_date(PROV_DATADOC);
|
|
_datacambio = rec.get_date(PROV_DATACAMBIO);
|
|
_tipopag = rec.get_char(PROV_TIPOPAG);
|
|
_impdoc = rec.get_real(PROV_IMPDOC);
|
|
_impprdoc = rec.get_real(PROV_IMPPRDOC);
|
|
_impnetdoc = rec.get_real(PROV_IMPNETDOC);
|
|
_cambio = rec.get_real(PROV_CAMBIO);
|
|
}
|
|
|
|
void TRate_doc::set(TToken_string& t)
|
|
{
|
|
CHECK(t.items() >= 12, "Numero di items non valido");
|
|
_anno = t.get_int(0);
|
|
_codnum = t.get(1);
|
|
_ndoc = t.get_long(2);
|
|
_datadoc = t.get(3);
|
|
_impdoc = t.get(4);
|
|
_impprdoc = t.get(5);
|
|
_impnetdoc = t.get(6);
|
|
_codcf = t.get_long(7);
|
|
_tipopag = t.get_char(8);
|
|
_codval = t.get(9);
|
|
_cambio = t.get(10);
|
|
_datacambio = t.get(11);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
// TRata
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
int TRata::compare(const TSortable& s) const
|
|
{
|
|
const TRata& r = (const TRata&) s;
|
|
|
|
if (_nrata > r.rata())
|
|
return 1; // Numero maggiore
|
|
else
|
|
if (_nrata < r.rata());
|
|
return -1; // Numero minore
|
|
|
|
return 0; // Stesso numero di rata
|
|
}
|
|
|
|
void TRata::set(TToken_string& t)
|
|
{
|
|
CHECK(t.items() == 10, "Troppi pochi elementi nella token string");
|
|
_nrata = t.get_int(0);
|
|
_datascad = t.get(1);
|
|
_imprata = t.get(2);
|
|
_impprovv = t.get(3);
|
|
_pagmat = t.get(4);
|
|
_provvmat = t.get(5);
|
|
_pagato = t.get(6);
|
|
_provvpag = t.get(7);
|
|
_saldata = t.get(8)[0] == 'X' ? TRUE : FALSE;
|
|
_tipopagpr = t.get_int(9);
|
|
}
|
|
|
|
void TRata::set(TRectype& rec)
|
|
{
|
|
CHECK(rec.num() == LF_PROVV,"Il record non ha il tracciato di LF_PROVV");
|
|
_datascad = rec.get_date(PROV_DATASCAD);
|
|
_imprata = rec.get_real(PROV_IMPRATA);
|
|
_impprovv = rec.get_real(PROV_IMPPROVV);
|
|
_pagato = rec.get_real(PROV_PAGATO);
|
|
_provvpag = rec.get_real(PROV_PROVVPAG);
|
|
_pagmat = rec.get_real(PROV_PAGMAT);
|
|
_provvmat = rec.get_real(PROV_PROVVMAT);
|
|
_saldata = rec.get_bool(PROV_SALDATA);
|
|
_nrata = rec.get_int(PROV_NRATA);
|
|
_generata = rec.get_char(PROV_GENERATA);
|
|
_tipopagpr = rec.get_int(PROV_TIPOPAGPR);
|
|
}
|
|
|
|
TRata::TRata(TRectype& rec)
|
|
{
|
|
set(rec);
|
|
}
|
|
|