1994-10-12 17:57:52 +00:00
|
|
|
// cg5300.cpp
|
|
|
|
// modifica parametri contabilita' relativi alla liquidazione
|
|
|
|
|
1994-11-28 10:57:59 +00:00
|
|
|
#include <config.h>
|
|
|
|
#include <msksheet.h>
|
1994-10-12 17:57:52 +00:00
|
|
|
#include <relapp.h>
|
|
|
|
#include <tabutil.h>
|
|
|
|
#include <urldefid.h>
|
|
|
|
#include <utility.h>
|
1994-11-28 10:57:59 +00:00
|
|
|
|
1994-10-12 17:57:52 +00:00
|
|
|
#include "cg5.h"
|
|
|
|
#include "cg5300a.h"
|
1994-11-28 10:57:59 +00:00
|
|
|
|
|
|
|
#include <attiv.h>
|
|
|
|
#include <nditte.h>
|
1995-02-15 08:52:47 +00:00
|
|
|
|
1995-02-13 17:20:26 +00:00
|
|
|
#define TAB_LIA "%LIA"
|
|
|
|
#define TAB_PLA "%PLA"
|
1995-02-15 08:52:47 +00:00
|
|
|
|
1995-02-13 17:20:26 +00:00
|
|
|
class TParaliq_app : public TRelation_application
|
1994-10-12 17:57:52 +00:00
|
|
|
{
|
|
|
|
TRelation * _rel;
|
|
|
|
TMask * _msk;
|
|
|
|
TLocalisamfile * _attiv;
|
|
|
|
TLocalisamfile * _ditte;
|
1994-10-28 16:29:49 +00:00
|
|
|
int _yearliq;
|
1994-10-12 17:57:52 +00:00
|
|
|
TTable * _pla;
|
1994-11-16 09:46:06 +00:00
|
|
|
|
1995-02-15 08:52:47 +00:00
|
|
|
protected: // Applicat
|
|
|
|
virtual void on_config_change();
|
1994-10-12 17:57:52 +00:00
|
|
|
|
1995-02-15 08:52:47 +00:00
|
|
|
protected: // Relapp
|
1994-10-12 17:57:52 +00:00
|
|
|
virtual bool user_create();
|
|
|
|
virtual bool user_destroy();
|
|
|
|
|
|
|
|
virtual TRelation* get_relation() const { return _rel; }
|
|
|
|
virtual TMask* get_mask(int mode) { return _msk; }
|
|
|
|
virtual bool changing_mask(int mode) { return FALSE; }
|
|
|
|
|
|
|
|
// file intertface
|
|
|
|
virtual bool remove() { return TRUE; }
|
|
|
|
virtual bool protected_record(TRectype&) { return TRUE; }
|
|
|
|
virtual void init_query_mode(TMask&);
|
|
|
|
virtual void init_insert_mode(TMask& m);
|
|
|
|
virtual int rewrite(const TMask& m);
|
|
|
|
// non si possono aggiungere record, se non ci sono vengono
|
|
|
|
// creati automaticamente
|
|
|
|
virtual int write(const TMask& m) { return rewrite(m);}
|
|
|
|
virtual int read(TMask& m);
|
1995-02-14 10:03:05 +00:00
|
|
|
|
1995-02-15 08:52:47 +00:00
|
|
|
protected:
|
1995-02-24 15:14:33 +00:00
|
|
|
void check_registers(int year);
|
|
|
|
void init_array(TMask& m, bool update);
|
1995-08-09 09:52:08 +00:00
|
|
|
static bool sheet_action(TSheet_field& s, int r, KEY k);
|
1994-10-12 17:57:52 +00:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
1995-02-24 15:14:33 +00:00
|
|
|
TParaliq_app() {}
|
1995-02-15 08:52:47 +00:00
|
|
|
virtual ~TParaliq_app() {}
|
1994-10-12 17:57:52 +00:00
|
|
|
};
|
1995-02-15 08:52:47 +00:00
|
|
|
|
1994-11-16 09:46:06 +00:00
|
|
|
|
1995-02-13 17:20:26 +00:00
|
|
|
void TParaliq_app::check_registers(int year)
|
1994-11-16 09:46:06 +00:00
|
|
|
{
|
1995-02-15 08:52:47 +00:00
|
|
|
// controlla che per ogni data attivita' esistano almeno un registro
|
|
|
|
// acquisti, vendite e giornale; warning appropriato in caso negativo
|
1995-02-24 15:14:33 +00:00
|
|
|
TSheet_field& sf = (TSheet_field&)_msk->field(F_SHEET_PLA);
|
1995-02-15 08:52:47 +00:00
|
|
|
TTable reg("REG");
|
|
|
|
TRecfield reg_year(reg.curr(), "CODTAB", 0,3);
|
|
|
|
|
|
|
|
const byte R_ACQ = 0x01;
|
|
|
|
const byte R_VEN = 0x02;
|
|
|
|
const byte R_ALL = R_ACQ | R_VEN;
|
|
|
|
|
1995-02-13 17:20:26 +00:00
|
|
|
byte flags = 0x00;
|
1994-11-18 11:40:45 +00:00
|
|
|
|
1995-02-24 15:14:33 +00:00
|
|
|
for (int i = 0; i < sf.items(); i++)
|
1995-02-15 08:52:47 +00:00
|
|
|
{
|
1995-02-24 15:14:33 +00:00
|
|
|
const TString16 att(sf.row(i).get(0));
|
1995-02-15 08:52:47 +00:00
|
|
|
for (reg.first(); !reg.eof(); reg.next())
|
|
|
|
{
|
|
|
|
if (atoi(reg_year) != year || att != reg.get("S8"))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
switch (reg.get_int("I0"))
|
|
|
|
{
|
|
|
|
case 1: // vendite
|
|
|
|
flags |= R_VEN;
|
|
|
|
break;
|
|
|
|
case 2: // acquisti
|
|
|
|
flags |= R_ACQ;
|
|
|
|
break;
|
1995-02-24 15:14:33 +00:00
|
|
|
default:
|
|
|
|
break;
|
1995-02-15 08:52:47 +00:00
|
|
|
}
|
1995-02-24 15:14:33 +00:00
|
|
|
if (flags == R_ALL) break;
|
1994-11-18 11:40:45 +00:00
|
|
|
}
|
1995-02-15 08:52:47 +00:00
|
|
|
if (flags < R_ALL)
|
|
|
|
{
|
|
|
|
TString wrn("I seguenti registri non esistono per l'attivita' ");
|
|
|
|
wrn << att << "(" << year << "):";
|
|
|
|
if ((flags & R_VEN) == 0x00) wrn << "\n\tregistro vendite";
|
|
|
|
if ((flags & R_ACQ) == 0x00) wrn << "\n\tregistro acquisti";
|
|
|
|
warning_box(wrn);
|
|
|
|
}
|
|
|
|
}
|
1994-11-16 09:46:06 +00:00
|
|
|
}
|
1995-02-15 08:52:47 +00:00
|
|
|
|
1994-10-12 17:57:52 +00:00
|
|
|
|
1995-02-24 15:14:33 +00:00
|
|
|
void TParaliq_app::init_array(TMask& m, bool update)
|
1995-02-15 08:52:47 +00:00
|
|
|
{
|
1995-02-24 15:14:33 +00:00
|
|
|
TSheet_field& sf = (TSheet_field&)m.field(F_SHEET_PLA);
|
|
|
|
|
1995-02-14 10:03:05 +00:00
|
|
|
const long newditta = m.get_long(F_CODDITTA);
|
1994-10-12 17:57:52 +00:00
|
|
|
|
1995-02-24 15:14:33 +00:00
|
|
|
_attiv->zero();
|
|
|
|
_attiv->put(ATT_CODDITTA, newditta);
|
|
|
|
TRectype r(_attiv->curr());
|
|
|
|
|
|
|
|
int i = 0;
|
|
|
|
for(_attiv->read(_isgteq);
|
|
|
|
_attiv->good() && _attiv->curr() == r;
|
|
|
|
_attiv->next(), i++)
|
|
|
|
{
|
|
|
|
TToken_string& tt = sf.row(i);
|
1995-02-13 17:20:26 +00:00
|
|
|
|
1995-02-24 15:14:33 +00:00
|
|
|
// istanzia array _atts on le attivita' della ditta corrente
|
|
|
|
tt = "";
|
|
|
|
tt.add(_attiv->get(ATT_CODATT));
|
|
|
|
tt.add(_attiv->get(ATT_TIPOATT));
|
|
|
|
tt.add("");
|
|
|
|
tt.add("");
|
|
|
|
tt.add("");
|
|
|
|
tt.add("");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (update)
|
|
|
|
{
|
|
|
|
sf.force_update();
|
1995-02-15 08:52:47 +00:00
|
|
|
|
|
|
|
TString16 freq;
|
|
|
|
_ditte->put(NDT_CODDITTA, newditta);
|
1994-10-12 17:57:52 +00:00
|
|
|
if (_ditte->read() == NOERR)
|
1995-02-15 08:52:47 +00:00
|
|
|
freq = _ditte->get(NDT_FREQVIVA);
|
|
|
|
m.set(F_FREQ_VERS, freq);
|
1995-02-24 15:14:33 +00:00
|
|
|
}
|
1994-10-12 17:57:52 +00:00
|
|
|
}
|
|
|
|
|
1995-02-15 08:52:47 +00:00
|
|
|
|
|
|
|
void TParaliq_app::on_config_change()
|
1994-10-12 17:57:52 +00:00
|
|
|
{
|
1994-10-28 16:29:49 +00:00
|
|
|
TConfig d(CONFIG_DITTA);
|
|
|
|
_yearliq = (int)d.get_long("AnLiIv");
|
1995-02-15 08:52:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool TParaliq_app::user_create()
|
|
|
|
{
|
1994-11-16 09:46:06 +00:00
|
|
|
_rel = new TRelation(TAB_LIA);
|
|
|
|
_pla = new TTable(TAB_PLA);
|
|
|
|
_attiv = new TLocalisamfile(LF_ATTIV);
|
|
|
|
_ditte = new TLocalisamfile(LF_NDITTE);
|
|
|
|
_msk = new TMask("cg5300a");
|
|
|
|
|
1994-10-12 17:57:52 +00:00
|
|
|
((TSheet_field&)_msk->field(F_SHEET_PLA)).set_notify(sheet_action);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
1995-02-13 17:20:26 +00:00
|
|
|
bool TParaliq_app::user_destroy()
|
1994-10-12 17:57:52 +00:00
|
|
|
{
|
|
|
|
delete _rel;
|
|
|
|
delete _attiv;
|
|
|
|
delete _ditte;
|
|
|
|
delete _msk;
|
|
|
|
delete _pla;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
1995-08-09 09:52:08 +00:00
|
|
|
bool TParaliq_app::sheet_action(TSheet_field& s, int r, KEY k)
|
1994-10-12 17:57:52 +00:00
|
|
|
{
|
|
|
|
// non si possono cancellare o aggiungere righe in PLA
|
|
|
|
return (k != K_DEL && k != K_INS);
|
|
|
|
}
|
|
|
|
|
1995-02-13 17:20:26 +00:00
|
|
|
void TParaliq_app::init_query_mode(TMask& m)
|
1994-10-12 17:57:52 +00:00
|
|
|
{
|
|
|
|
// svuota tutto
|
|
|
|
TSheet_field& sh = (TSheet_field&)m.field(F_SHEET_PLA);
|
|
|
|
sh.reset();
|
|
|
|
}
|
|
|
|
|
1995-02-13 17:20:26 +00:00
|
|
|
void TParaliq_app::init_insert_mode(TMask& m)
|
1994-10-12 17:57:52 +00:00
|
|
|
{
|
1995-02-15 08:52:47 +00:00
|
|
|
// Inizializza array delle attivita'
|
1995-02-24 15:14:33 +00:00
|
|
|
init_array(m, TRUE);
|
1994-10-12 17:57:52 +00:00
|
|
|
}
|
1995-02-15 08:52:47 +00:00
|
|
|
|
|
|
|
|
1995-02-13 17:20:26 +00:00
|
|
|
int TParaliq_app::rewrite(const TMask& m)
|
1994-10-12 17:57:52 +00:00
|
|
|
{
|
1995-02-13 17:20:26 +00:00
|
|
|
// scrive %LIA
|
|
|
|
// scrive tutte le righe di %PLA a partire dalle righe sheet
|
1994-11-16 09:46:06 +00:00
|
|
|
static int oldyear;
|
|
|
|
|
1994-10-12 17:57:52 +00:00
|
|
|
TSheet_field& sf = (TSheet_field&)m.field(F_SHEET_PLA);
|
1995-02-13 17:20:26 +00:00
|
|
|
const long firm = m.get_long(F_CODDITTA);
|
|
|
|
const int year = m.get_int(F_YEAR);
|
1994-11-16 09:46:06 +00:00
|
|
|
|
1994-10-12 17:57:52 +00:00
|
|
|
int err = NOERR;
|
1995-02-15 08:52:47 +00:00
|
|
|
bool was = FALSE;
|
1994-10-12 17:57:52 +00:00
|
|
|
|
1995-02-24 15:14:33 +00:00
|
|
|
for (int i = 0; err == NOERR && i < sf.items(); i++)
|
1994-10-12 17:57:52 +00:00
|
|
|
{
|
1995-02-24 15:14:33 +00:00
|
|
|
TToken_string& tt = sf.row(i);
|
|
|
|
const TString16 att = tt.get(0);
|
1994-11-16 09:46:06 +00:00
|
|
|
const TString16 tips(tt.get(1));
|
1995-02-24 15:14:33 +00:00
|
|
|
const TString16 codtab(format("%05ld%4d%s1", firm, year, (const char*)att));
|
1994-10-12 17:57:52 +00:00
|
|
|
|
|
|
|
_pla->zero();
|
1995-02-13 17:20:26 +00:00
|
|
|
_pla->put("CODTAB", codtab);
|
1995-02-15 08:52:47 +00:00
|
|
|
was =_pla->read() == NOERR;
|
|
|
|
if (!was) _pla->zero();
|
|
|
|
|
|
|
|
real prorata = _pla->get_real("R8");
|
|
|
|
real es_a8 = _pla->get_real("R5");
|
|
|
|
real es_a8b = _pla->get_real("R6");
|
|
|
|
real es_a9 = _pla->get_real("R7");
|
1994-10-12 18:59:59 +00:00
|
|
|
|
1995-02-13 17:20:26 +00:00
|
|
|
_pla->put("CODTAB", codtab);
|
1994-10-12 17:57:52 +00:00
|
|
|
// scrive i campi (vedi a read() per i nomi)
|
1995-02-15 08:52:47 +00:00
|
|
|
// in base alla riga sheet
|
1994-10-12 17:57:52 +00:00
|
|
|
_pla->put("S7", tips); // tipo attivita'
|
1994-11-16 09:46:06 +00:00
|
|
|
_pla->put("R8", tt.get()); // prorata
|
|
|
|
_pla->put("R5", tt.get()); // plafond art. 8
|
|
|
|
_pla->put("R6", tt.get()); // plafond art. 8bis
|
|
|
|
_pla->put("R7", tt.get()); // plafond art. 9
|
|
|
|
|
|
|
|
err = (was ? _pla->rewrite() : _pla->write());
|
|
|
|
|
|
|
|
// se si e' cambiato qualcosa..
|
|
|
|
if (prorata != _pla->get_real("R8") ||
|
1995-02-15 08:52:47 +00:00
|
|
|
es_a8 != _pla->get_real("R5") ||
|
|
|
|
es_a8b != _pla->get_real("R6") ||
|
|
|
|
es_a9 != _pla->get_real("R7") ||
|
|
|
|
m.field(F_CRED_PREC).dirty())
|
1995-02-13 17:20:26 +00:00
|
|
|
{
|
1995-02-15 08:52:47 +00:00
|
|
|
// invalida la prima liquidazione calcolata se ce n'e'
|
|
|
|
TTable lim("LIM");
|
|
|
|
|
|
|
|
TRecfield lim_anno(lim.curr(),"CODTAB",0,3);
|
|
|
|
|
|
|
|
for (lim.first(); !lim.eof(); lim.next())
|
|
|
|
{
|
|
|
|
if (year == atoi(lim_anno))
|
|
|
|
{
|
|
|
|
lim.put("B0","");
|
|
|
|
lim.rewrite();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
1995-02-13 17:20:26 +00:00
|
|
|
}
|
1994-10-12 17:57:52 +00:00
|
|
|
}
|
1995-02-13 17:20:26 +00:00
|
|
|
|
|
|
|
TTable& lia = (TTable&)_rel->lfile();
|
|
|
|
lia.put("CODTAB", format("%05ld%d", firm, year));
|
1994-10-12 18:59:59 +00:00
|
|
|
was = lia.read() == NOERR;
|
1994-10-28 16:29:49 +00:00
|
|
|
if (!was) lia.zero();
|
1995-02-13 17:20:26 +00:00
|
|
|
m.autosave(_rel);
|
1994-10-12 18:59:59 +00:00
|
|
|
if (err == NOERR) err = (was ? lia.rewrite() : lia.write());
|
1994-10-28 16:29:49 +00:00
|
|
|
if (err == NOERR && year == _yearliq)
|
|
|
|
{
|
1995-02-15 08:52:47 +00:00
|
|
|
_ditte->put(NDT_CODDITTA, firm);
|
1994-10-28 16:29:49 +00:00
|
|
|
if (_ditte->read() == NOERR)
|
|
|
|
{
|
|
|
|
_ditte->put(NDT_FREQVIVA, m.get(F_FREQ_VERS));
|
|
|
|
_ditte->rewrite();
|
|
|
|
}
|
1994-11-16 09:46:06 +00:00
|
|
|
}
|
1995-02-15 08:52:47 +00:00
|
|
|
|
1994-11-16 09:46:06 +00:00
|
|
|
// per ogni anno liquidazione controlla (una volta) l'esistenza
|
|
|
|
// dei registri fondamentali
|
1995-02-13 17:20:26 +00:00
|
|
|
if (year != oldyear && err == NOERR)
|
1995-02-15 08:52:47 +00:00
|
|
|
check_registers(year);
|
1995-02-13 17:20:26 +00:00
|
|
|
oldyear = year;
|
1994-11-16 09:46:06 +00:00
|
|
|
|
1994-10-12 17:57:52 +00:00
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
1995-02-13 17:20:26 +00:00
|
|
|
int TParaliq_app::read(TMask& m)
|
1994-10-12 17:57:52 +00:00
|
|
|
{
|
|
|
|
// legge da LIA (si istanziano i campi credito prec. e Freq. Vers
|
|
|
|
// prende le attivita' una per una da _atts e
|
|
|
|
// crea le righe sheet
|
1995-01-27 18:04:22 +00:00
|
|
|
m.autoload(get_relation());
|
1995-02-15 08:52:47 +00:00
|
|
|
|
1995-02-14 10:03:05 +00:00
|
|
|
const long firm = m.get_long(F_CODDITTA);
|
|
|
|
const int year = m.get_int(F_YEAR);
|
1994-10-12 17:57:52 +00:00
|
|
|
|
1995-02-15 08:52:47 +00:00
|
|
|
TSheet_field& sf = (TSheet_field&)m.field(F_SHEET_PLA);
|
1994-10-12 17:57:52 +00:00
|
|
|
sf.reset();
|
1995-02-15 08:52:47 +00:00
|
|
|
|
1995-02-24 15:14:33 +00:00
|
|
|
const TString16 ctab = format("%05ld%4d", firm, year);
|
1995-02-14 10:03:05 +00:00
|
|
|
_pla->put("CODTAB", ctab);
|
1995-02-24 15:14:33 +00:00
|
|
|
TToken_string tt(80);
|
|
|
|
|
|
|
|
init_array(m, FALSE); // Carica tutti i codici attivita'
|
1995-02-14 10:03:05 +00:00
|
|
|
|
1995-02-15 08:52:47 +00:00
|
|
|
for (_pla->read(_isgteq); _pla->good(); _pla->next())
|
1994-10-12 17:57:52 +00:00
|
|
|
{
|
1995-02-15 08:52:47 +00:00
|
|
|
if (strncmp(ctab, _pla->get("CODTAB"), 9) == 0)
|
1995-02-24 15:14:33 +00:00
|
|
|
{
|
|
|
|
tt = _pla->get("CODTAB").mid(9,5); // codice attivita'
|
|
|
|
|
|
|
|
for (int i = 0; i < sf.items(); i++) // Cerca riga corrispondente sullo sheet
|
|
|
|
if (tt == sf.row(i).get(0)) break;
|
|
|
|
|
1995-02-15 08:52:47 +00:00
|
|
|
tt.add(_pla->get("S7")); // tipo attivita'
|
|
|
|
tt.add(_pla->get("R8")); // prorata
|
|
|
|
tt.add(_pla->get("R5")); // plafond art. 8
|
|
|
|
tt.add(_pla->get("R6")); // plafond art. 8bis
|
|
|
|
tt.add(_pla->get("R7")); // plafond art. 9
|
1995-02-24 15:14:33 +00:00
|
|
|
sf.row(i) = tt;
|
1994-10-12 17:57:52 +00:00
|
|
|
}
|
1995-02-14 10:03:05 +00:00
|
|
|
else break;
|
1994-10-12 17:57:52 +00:00
|
|
|
}
|
1995-02-15 08:52:47 +00:00
|
|
|
sf.force_update();
|
1994-10-12 17:57:52 +00:00
|
|
|
|
|
|
|
return NOERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int cg5300(int argc, char* argv[])
|
|
|
|
{
|
1995-02-13 17:20:26 +00:00
|
|
|
TParaliq_app a;
|
1994-10-12 17:57:52 +00:00
|
|
|
a.run(argc, argv, "Parametri liquidazione");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1995-02-15 08:52:47 +00:00
|
|
|
|