diff --git a/ps/pd6142.cpp b/ps/pd6142.cpp new file mode 100755 index 000000000..34d63c317 --- /dev/null +++ b/ps/pd6142.cpp @@ -0,0 +1,18 @@ +#include +#include + +#include "pd6142.h" + +int main(int argc,char** argv) +{ + const int n = (argc > 1) ? atoi(&argv[1][1]) : 0; + + switch(n) + { + case 0: + pd6142100(argc, argv); break; + default: + error_box("Usare: pd6142 -0");break; + } + return 0; +} diff --git a/ps/pd6142.h b/ps/pd6142.h new file mode 100755 index 000000000..b4a96badd --- /dev/null +++ b/ps/pd6142.h @@ -0,0 +1,6 @@ +#ifndef __PD6142_H +#define __PD6142_H + +int pd6142100(int argc, char** argv); + +#endif // __PD6142_H diff --git a/ps/pd6142.men b/ps/pd6142.men new file mode 100755 index 000000000..4d336d2b3 --- /dev/null +++ b/ps/pd6142.men @@ -0,0 +1,6 @@ +[CGADDON] +Caption = "Personalizzazioni" +Picture = +Module = 0 +Flags = "" +Item_01 = "Liquidazione riepilogativa IVA", "pd6142 -0", "" diff --git a/ps/pd6142100.cpp b/ps/pd6142100.cpp new file mode 100755 index 000000000..099da729f --- /dev/null +++ b/ps/pd6142100.cpp @@ -0,0 +1,433 @@ +// pd6142100.cpp Programma personalizzato per Istituto Suore: Liquidazione riepilogativa IVA +// Che cosa fa: +// prende un serie di codici ditta in input, piu' un anno ed un mese (da 1 a 13) +// e copia tutti i movimenti (mov, rmoviva) in una unica ditta ricevente. +// (il mese 13 copia tutti i movimenti dell'anno). + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pd6142100a.h" + +// La parte di selezione delle ditte e' tratta dal programma di liquidazione IVA (cg4300.cpp) +class TCopia_movimenti : public TApplication +{ + TArray_sheet *_ditte; // Array sheet delle ditte selezionabili + TLocalisamfile *_nditte; // File delle ditte + TTable *_lia; // Tabella LIA per controllare i parametri liquidazione + long _rcv_firm, // Ditta ricevente + _firm; // Ditta iniziale, da ripristinare alla fine di tutto + int _anno; // Anno da copiare + int _mese; // Mese da copiare (13 == tutti) + + virtual bool check_autorization() const {return false;} + virtual const char * extra_modules() const {return "cg";} + +protected: + virtual bool menu(MENU_TAG) ; + static bool fr_ditt_handler(TMask_field& f, KEY key); + static bool to_ditt_handler(TMask_field& f, KEY key); + static bool select_button (TMask_field& f, KEY key); + static bool reset_button (TMask_field& f, KEY key); + static bool firm_handler (TMask_field& f, KEY key); + static TCopia_movimenti& app() { return (TCopia_movimenti&)main_app(); } + +public: + virtual bool create(); + virtual bool destroy(); + TArray_sheet* get_ditte_sheet() { return _ditte; } + bool look_lia(long codditta, int anno); + long select_firm_range(long from, long to); + void build_ditte_sheet(); + void reset_choices(TMask&); + void set_choice_limits(TMask&); + void copia_mov(); + + TCopia_movimenti() {}; + virtual ~TCopia_movimenti() {}; +}; + +bool TCopia_movimenti::look_lia(long ditta, int year) +{ + if (year == 0) year = _anno; + if (ditta == 0l) ditta = get_firm(); + TString16 y; y.format("%05ld%04d", ditta, year); + + _lia->zero(); + _lia->put("CODTAB", y); + _lia->read(); + return _lia->good(); +} + +bool TCopia_movimenti::firm_handler(TMask_field& f, KEY k) +{ + if (k == K_ENTER && f.to_check(k)) + { + const long codditta = atol(f.get()); + const int anno = f.mask().get_int(F_ANNO); + if (!prefix().exist(codditta)) + return f.error_box("La ditta specificata non e' abilitata in contabilita'."); + if (!app().look_lia(codditta,anno)) + return f.error_box("Non esistono i parametri di liquidazione per la ditta specificata."); + } + if (k == K_TAB && f.to_check(k)) + { + const long codditta = atol(f.get()); + TArray_sheet* s = app()._ditte; + const long items = s->items(); + for (long j=0;jrow(j).get_long(1); + if (ditta == codditta) + { + s->uncheck(j); + s->disable_row(j); + } + else + if (ditta == app()._rcv_firm) + s->enable_row(j); + } + app()._rcv_firm = codditta; + app().set_choice_limits(f.mask()); + } + return TRUE; +} + +bool TCopia_movimenti::to_ditt_handler(TMask_field& f, KEY key) +{ + TMask& m = f.mask(); + if (key == K_F9) + { + TArray_sheet* sh = app().get_ditte_sheet(); + + sh->disable_check(); + sh->disable(DLG_USER); + if (sh->run() == K_ENTER) + { + app().select_firm_range(m.get_long(F_DFR),sh->row(sh->selected()).get_long(1)); + app().set_choice_limits(m); + } + sh->enable(DLG_USER); + } + if (key == K_TAB && f.focusdirty()) + { + const long l = app().select_firm_range(m.get_long(F_DFR), m.get_long(F_DTO)); + app().set_choice_limits(m); + m.set(F_SELECTED, l); + } + return TRUE; +} + +bool TCopia_movimenti::fr_ditt_handler(TMask_field& f, KEY key) +{ + TMask& m = f.mask(); + if (key == K_F9) + { + TMask& m = f.mask(); + TArray_sheet* sh = app().get_ditte_sheet(); + + sh->disable_check(); + sh->disable(DLG_USER); + if (sh->run() == K_ENTER) + { + app().select_firm_range(sh->row(sh->selected()).get_long(1), m.get_long(F_DTO)); + app().set_choice_limits(m); + } + sh->enable(DLG_USER); + } + else if (key == K_TAB && f.focusdirty()) + { + const long l = app().select_firm_range(m.get_long(F_DFR), m.get_long(F_DTO)); + app().set_choice_limits(m); + m.set(F_SELECTED, l); + } + return TRUE; +} + +void TCopia_movimenti::set_choice_limits(TMask& m) +{ + long first = -1l, last = -1l; + const long items = _ditte->items(); + for (long i = 0; i < items; i++) + { + if (_ditte->checked(i)) + { + const long dit = _ditte->row(i).get_long(1); + if (first == -1l) first = dit; + if (last < dit) last = dit; + } + } + if (first != -1) m.set(F_DFR, first); + if (last != -1) m.set(F_DTO, last); + m.set(F_SELECTED, _ditte->checked()); +} + +void TCopia_movimenti::reset_choices(TMask& m) +{ + m.reset(F_SELECTED); + m.reset(F_DFR); + m.reset(F_DTO); + _ditte->check(-1, FALSE); +} + +long TCopia_movimenti::select_firm_range(long from, long to) +{ + if (to == 0l) to = 99999L; + const long items = _ditte->items(); + for (long i = 0; i < items; i++) + { + if (_ditte->row_disabled(i)) + continue; + + const long cod = _ditte->row(i).get_long(1); + if (cod >= from && cod <= to) + _ditte->check(i); + else + _ditte->uncheck(i); + } + return _ditte->checked(); +} + +void TCopia_movimenti::build_ditte_sheet() +{ + // ricostruisce l'array_sheet delle ditte slezionabili + _ditte->destroy(); + TLocalisamfile& dt = *_nditte; + + for (dt.first(); !dt.eof(); dt.next()) + { + TToken_string* d = new TToken_string(64); + d->add(" "); + d->add(dt.get(NDT_CODDITTA)); + d->add(dt.get(NDT_RAGSOC)); + const long pos = _ditte->add(d); + if (prefix().exist(dt.get_long(NDT_CODDITTA))) + _ditte->enable_row(pos); + else + _ditte->disable_row(pos); + } +} + +bool TCopia_movimenti::select_button(TMask_field& f, KEY key) +{ + if (key == K_SPACE) + { + app()._ditte->enable_check(); + // seleziona e aggiungi alle gia' selezionate + if (app()._ditte->run() == K_ENTER) + app().set_choice_limits(f.mask()); + } + return TRUE; +} + +bool TCopia_movimenti::reset_button(TMask_field& f, KEY key) +{ + if (key == K_SPACE) + app().reset_choices(f.mask()); + return TRUE; +} + +bool TCopia_movimenti::menu(MENU_TAG m) +{ + TMask msk("pd6142100a"); + msk.set_handler(F_DFR, fr_ditt_handler); + msk.set_handler(F_DTO, to_ditt_handler); + msk.set_handler(F_RCVFIRM, firm_handler); + msk.set_handler(FBUT_SELECT,select_button); + msk.set_handler(FBUT_RESET,reset_button); + KEY k; + do + { + k = msk.run(); + if (k == K_ENTER) + { + if (msk.get_int(F_SELECTED) == 0) + { + error_box("Selezionare le ditte invianti."); + continue; + } + _anno = msk.get_int(F_ANNO); + _mese = msk.get_int(F_MESE); + _rcv_firm = msk.get_long(F_RCVFIRM); + if (yesno_box("E' stata selezionata la ditta %ld come ditta ricevente. Continuo?",_rcv_firm)) + { + copia_mov(); + message_box("Copia movimenti completata."); + } + } + } while(k == K_ENTER); + + return FALSE; +} + +void TCopia_movimenti::copia_mov() +{ + TFilename t1,t2; + t1.tempdir(); + t1.insert("%"); + t2 = t1; + t1 << "/tmov"; + t2 << "/trmoviva"; + + long numreg = 0L; // numero di registrazione progressivo + long count = 0L; // numero di items (mov+rmoviva) totali + TIsamtempfile tmov(LF_MOV,t1,TRUE); + TIsamtempfile trmoviva(LF_RMOVIVA,t2,TRUE); + tmov.set_autodel(); + trmoviva.set_autodel(); + int err=NOERR; + { + set_firm(_ditte->row(0).get_long(1)); // Per evitare fastidiosi fatal in caso non sia settata nemmeno una ditta + + TLocalisamfile m(LF_MOV); // necessario per allocare i records + TRectype from(LF_MOV),to(LF_MOV); + TDate inizio(1,_mese == 13 ? 1 : _mese,_anno); + TDate fine(inizio); + + if (_mese == 13) fine.set_month(12); + fine.set_end_month(); + from.put(MOV_DATAREG,inizio); + to.put(MOV_DATAREG,fine); + TRelation rel(LF_MOV); + rel.add(LF_RMOVIVA,"NUMREG=NUMREG"); + TCursor cur(&rel,"",2,&from,&to); + + const long items = _ditte->items(); + + TProgind p(items,"Copia movimenti ditte...", FALSE,TRUE); + TString msg; + + for (long i=0; ichecked(i)) + { + const long codditta = _ditte->row(i).get_long(1); + set_firm(codditta); + msg.format("Copia movimenti ditta %ld in corso...",codditta); + p.setstatus(i); + p.set_text(msg); + const TRecnotype recs = cur.items(); + for (TRecnotype j=0; j 0) + { + set_firm(_rcv_firm); // setta la ditta ricevente + // Zappa i files + { + TDir d; + d.get(LF_MOV); + d.set_eod(0); + d.put(LF_MOV); + d.get(LF_RMOVIVA); + d.set_eod(0); + d.put(LF_RMOVIVA); + TSystemisamfile m(LF_MOV),r(LF_RMOVIVA); + err = m.pack(); + if (err == NOERR) + err = r.pack(); + } + if (err == NOERR) + { + TIsamfile mov(LF_MOV); + TIsamfile rmoviva(LF_RMOVIVA); + + err = mov.open(_excllock); + if (err == NOERR) + err = rmoviva.open(_excllock); + if (err == NOERR) // Scrive sui files della ditta ricevente + { + long j=0L; + TProgind p(count,"Trasferimento movimenti...",FALSE,TRUE); + for (tmov.first(); tmov.good(); tmov.next()) + { + p.setstatus(j++); + mov.write(tmov.curr()); + } + for (trmoviva.first(); trmoviva.good(); trmoviva.next()) + { + p.setstatus(j++); + rmoviva.write(trmoviva.curr()); + } + } + else + error_box("Errore %d tentando di aprire in modo esclusivo i files della ditta ricevente",err); + } + else + error_box("Errore %d azzerando i files della ditta ricevente",err); + } + + // Il distruttore di TIsamtempfile rimuove i files temporanei automaticamente + // dato che e' stato settato l'apposito flag + set_firm(_firm); // ripristina la ditta +} + +bool TCopia_movimenti::create() +{ + _ditte = new TArray_sheet(-1, -1, -4, -4, "Selezione Ditte", + "@1|Cod.@5R|Ragione Sociale@50"); + _nditte = new TLocalisamfile(LF_NDITTE); + _lia = new TTable("%LIA"); + _firm = TApplication::get_firm(); + build_ditte_sheet(); + dispatch_e_menu (BAR_ITEM(1)); + + return TRUE; +} + +bool TCopia_movimenti::destroy() +{ + delete _ditte; + delete _nditte; + delete _lia; + return TRUE; +} + +int pd6142100 (int argc, char** argv) +{ + TCopia_movimenti a; + a.run(argc,argv,"Liquidazione riepilogativa IVA"); + return 0; +} + diff --git a/ps/pd6142100a.h b/ps/pd6142100a.h new file mode 100755 index 000000000..f8ab5d47f --- /dev/null +++ b/ps/pd6142100a.h @@ -0,0 +1,10 @@ +#define F_DFR 101 +#define F_DTO 102 +#define F_SELECTED 103 +#define FBUT_SELECT 104 +#define FBUT_RESET 105 +#define F_MESE 106 +#define F_ANNO 107 +#define F_RCVFIRM 108 +#define F_DESRCVFIRM 109 + diff --git a/ps/pd6142100a.uml b/ps/pd6142100a.uml new file mode 100755 index 000000000..be08116e1 --- /dev/null +++ b/ps/pd6142100a.uml @@ -0,0 +1,86 @@ +#include "pd6142100a.h" + +TOOLBAR "topbar" 0 0 0 2 +#include +ENDPAGE + +PAGE "Liquidazione riepilogativa IVA" 0 2 0 0 + +LIST F_MESE 15 +BEGIN + PROMPT 2 1 "Periodo " + ITEM "13|Annuale" + FLAGS "AM" +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 35 1 "Anno " + FLAGS "A" + CHECKTYPE REQUIRED +END + +GROUPBOX DLG_NULL 76 3 +BEGIN + PROMPT 2 3 "Ditta ricevente" +END + +NUMBER F_RCVFIRM 5 +BEGIN + PROMPT 3 4 "Codice " + USE LF_NDITTE + INPUT CODDITTA F_RCVFIRM + DISPLAY "Codice" CODDITTA + DISPLAY "Ragione sociale@50" RAGSOC + OUTPUT F_RCVFIRM CODDITTA + OUTPUT F_DESRCVFIRM RAGSOC + CHECKTYPE REQUIRED +END + +STRING F_DESRCVFIRM 50 +BEGIN + PROMPT 22 4 "" + USE LF_NDITTE KEY 2 + INPUT RAGSOC F_DESRCVFIRM + DISPLAY "Ragione sociale@50" RAGSOC + DISPLAY "Codice" CODDITTA + COPY OUTPUT F_RCVFIRM + CHECKTYPE REQUIRED +END + +GROUPBOX DLG_NULL 40 5 +BEGIN + PROMPT 2 6 "Ditte invianti" +END + +NUMBER F_DFR 5 +BEGIN + PROMPT 3 7 "Da codice " + FLAGS "B" +END + +NUMBER F_DTO 5 +BEGIN + PROMPT 3 8 "A codice " + FLAGS "B" +END + +STRING F_SELECTED 5 +BEGIN + PROMPT 3 9 "Scelte n. " + FLAGS "DR" +END + +BUTTON FBUT_SELECT 10 2 +BEGIN + PROMPT 25 7 "~Selezione" + PICTURE BMP_SELECT +END + +BUTTON FBUT_RESET 10 +BEGIN + PROMPT 25 9 "A~zzera" +END + +ENDPAGE +ENDMASK