diff --git a/ef/ef0600.cpp b/ef/ef0600.cpp index b0870e0c0..7abf66213 100755 --- a/ef/ef0600.cpp +++ b/ef/ef0600.cpp @@ -577,9 +577,13 @@ void TPrint_effetti_app::set_distinta() set_row(2,"@81g@pn@100g%s", FLD(LF_EFFETTI, EFF_IMPORTOVAL, PICTURE_IMPORTO), (const char *)valuta); - } - write_bancapp(); - for(int i = 0; i < _interline; i++) set_row(i+1,""); + } + else + { + set_row(2,"@100g%s", (const char *)TCurrency::get_firm_val()); + } + write_bancapp(); + for(int i = 0; i < _interline; i++) set_row(i+1,""); } // setta la pagina logica nel caso di stampa per cliente diff --git a/ef/rf900000.ini b/ef/rf900000.ini new file mode 100755 index 000000000..93177ca0c --- /dev/null +++ b/ef/rf900000.ini @@ -0,0 +1,525 @@ +[MAIN] +DECSEP = , +FIELDSEP = +RECORDSEP = +RECORDSIZE = 120 +SKIPLINES = 0 +TYPEFIELD = 1 +TYPELEN = -1 +TYPEPOS = -1 + +[TYPE FISSO] +ALIGN = +DATA = +DECIMAL = 0 +FILLER = ' ' +LENGTH = 0 +PICTURE = + +[TYPE IMPORTO] +ALIGN = R +DATA = N +DECIMAL = 1 +FILLER = 0 +LENGTH = 13 +PICTURE = @@@@@@@@@@@@@ + +[TYPE DATA] +ALIGN = +DATA = D +DECIMAL = 0 +FILLER = +LENGTH = 6 +PICTURE = 1442 + +[TYPE NUMERO] +ALIGN = R +DATA = N +DECIMAL = 0 +FILLER = '0' +LENGTH = 0 +PICTURE = + +[TYPE STRINGA] +ALIGN = L +DATA = S +DECIMAL = 0 +FILLER = ' ' +LENGTH = 0 +PICTURE = + +[HEADER RB] +NAME(0)=CAMPO BLANK +TYPE(0)=FISSO +POSITION(0)=0 +LENGTH(0)=1 + +NAME(1)=TIPO RECORD +POSITION(1)=1 +LENGTH(1)=2 +MESSAGE(1)=_FISSO,!PC + +NAME(2)=CODICE MITTENTE +POSITION(2)=3 +LENGTH(2)=5 +MESSAGE(2)=_CODSIA + +NAME(3)=CODICE DESTINATARIO +FIELD(3)=31->CODABIP +POSITION(3)=8 +LENGTH(3)=5 + +NAME(4)=DATA EMISSIONE +TYPE(4)=DATA +FIELD(4)=31->DATAEMISS +POSITION(4)=13 +LENGTH(4)=6 +MESSAGE(4) = _DATA + +NAME(5)=RAGIONE SOCIALE MITTENTE +TYPE(5)=STRINGA +POSITION(5)=19 +LENGTH(5)=26 +MESSAGE(5)=_DITTA,!RAGSOC,1 + +NAME(6)=FILLER +TYPE(6)=FISSO +POSITION(6)=45 +LENGTH(6)=68 + +NAME(7)=CODICE MONETA +TYPE(7)=STRINGA +POSITION(7)=113 +LENGTH(7)=1 +MESSAGE(7) = _CODMON + + +NAME(8)=FILLER +TYPE(8)=FISSO +POSITION(8)=114 +LENGTH(8)=6 + +NAME(9)=TIPO RECORD FINTO +POSITION(9)=1 +LENGTH(9)=2 +MESSAGE(9)=_FISSO,!PC + +[RECORD 10] +NAME(0) = CAMPO BLANK +TYPE(0) = FISSO +POSITION(0) = 0 +LENGTH(0) = 1 + +NAME(1) = TIPO RECORD +POSITION(1) = 1 +LENGTH(1) = 2 +MESSAGE(1) = _FISSO,!10 + +NAME(2) = NUMERO PROGRESSIVO RIBA +TYPE(2) = NUMERO +POSITION(2) = 3 +LENGTH(2) = 7 +MESSAGE(2) = _NRIBA,!NUM + +NAME(3) = CAMPO ALTERABILE +TYPE(3) = FISSO +POSITION(3) = 10 +LENGTH(3) = 6 + +NAME(4) = DATA ESECUZIONE +TYPE(4) = FISSO +// FIELD(4) = 31->DATADIST +POSITION(4) = 16 +LENGTH(4) = 6 + +NAME(5) = DATA VALUTA +TYPE(5) = DATA +FIELD(5) = 31->DATADIST +POSITION(5) = 22 +LENGTH(5) = 6 + +NAME(6) = CAUSALE +POSITION(6) = 28 +LENGTH(6) = 5 +MESSAGE(6) = _FISSO,!48000 + +NAME(7) = IMPORTO +TYPE(7) = IMPORTO +FIELD(7) = 31->IMPORTO +POSITION(7) = 33 +LENGTH(7) = 13 +MESSAGE(7)=_IMPORTO,!ADD + +NAME(8) = SEGNO +POSITION(8) = 46 +LENGTH(8) = 1 +MESSAGE(8) = _FISSO,!+ + +NAME(9) = CODABI BANCA PRESENTAZIONE +FIELD(9) = 31->CODABIP +POSITION(9) = 47 +LENGTH(9) = 5 + +NAME(10) = CODCAB BANCA PRESENTAZIONE +FIELD(10) = 31->CODCABP +POSITION(10) = 52 +LENGTH(10) = 5 + +NAME(11) = C/C n. ordinante +TYPE(11) = STRINGA +FIELD(11) = 403@->S0 +POSITION(11) = 57 +LENGTH(11) = 12 + +NAME(12) = CODICE ABI BANCA DOMICILIATARIA (FACOLTATIVO) +FIELD(12) = 20->CODABI +POSITION(12) = 69 +LENGTH(12) = 5 + +NAME(13) = CODICE CAB BANCA DOMICILIATARIA (FACOLTATIVO) +FIELD(13) = 20->CODCAB +POSITION(13) = 74 +LENGTH(13) = 5 + +NAME(14) = RIFERIMENTO DEBITORE (FACOLTATIVO) +TYPE(14) = STRINGA +FIELD(14) = 20->NUMCC +POSITION(14) = 79 +LENGTH(14) = 12 + +NAME(15) = CODICE AZIENDA +POSITION(15) = 91 +LENGTH(15) = 5 +MESSAGE(15) = _CODSIA + +NAME(16) = TIPO CODICE INDIVIDUALE (FACOLTATIVO) +TYPE(16) = FISSO +POSITION(16) = 96 +LENGTH(16) = 1 +MESSAGE(16) = _FISSO,!4 + +NAME(17) = CODICE CLIENTE DEBITORE (FACOLTATIVO) +TYPE(17) = FISSO +POSITION(17) = 97 +LENGTH(17) = 16 + +NAME(18) = FILLER +TYPE(18) = FISSO +POSITION(18) = 113 +LENGTH(18) = 6 +// MESSAGE(18) = _FISSO,!1 + +NAME(19) = CODICE MONETA +TYPE(19) = STRINGA +POSITION(19) = 119 +LENGTH(19) = 1 +MESSAGE(19) = _CODMON + +[RECORD 16] +NAME(0) = CAMPO BLANK +TYPE(0) = FISSO +POSITION(0) = 0 +LENGTH(0) = 1 + +NAME(1) = TIPO RECORD +POSITION(1) = 1 +LENGTH(1) = 2 +MESSAGE(1) = _FISSO,!16 + +NAME(2) = NUMERO PROGRESSIVO RIBA +TYPE(2) = NUMERO +POSITION(2) = 3 +LENGTH(2) = 7 +MESSAGE(2) = _NRIBA,!NUM + +NAME(3) = Codice IBAN +TYPE(3) = STRINGA +POSITION(3) = 10 +LENGTH(3) = 34 +FIELD(3) = 403@->S3 + +[RECORD 17] +NAME(0) = CAMPO BLANK +TYPE(0) = FISSO +POSITION(0) = 0 +LENGTH(0) = 1 + +NAME(1) = TIPO RECORD +POSITION(1) = 1 +LENGTH(1) = 2 +MESSAGE(1) = _FISSO,!17 + +NAME(2) = NUMERO PROGRESSIVO RIBA +TYPE(2) = NUMERO +POSITION(2) = 3 +LENGTH(2) = 7 +MESSAGE(2) = _NRIBA,!NUM + +NAME(3) = Codice IBAN +TYPE(3) = STRINGA +POSITION(3) = 10 +LENGTH(3) = 34 +FIELD(3) = 31->IBAN + +[RECORD 20] +NAME(0)=CAMPO BLANK +TYPE(0)=FISSO +POSITION(0)=0 +LENGTH(0)=1 + +NAME(1)=TIPO RECORD +POSITION(1)=1 +LENGTH(1)=2 +MESSAGE(1)=_FISSO,!20 + +NAME(2)=NUMERO PROGRESSIVO RIBA +TYPE(2)=NUMERO +POSITION(2)=3 +LENGTH(2)=7 +MESSAGE(2) = _NRIBA,!NUM + +NAME(3)=DESCRIZIONE MITTENTE (CREDITORE) SEGMENTO 1 +TYPE(3)=STRINGA +POSITION(3)=10 +LENGTH(3)=24 +MESSAGE(3)=_DITTA,!RAGSOC,1 + +NAME(4)=DESCRIZIONE MITTENTE SEGMENTO 2 +TYPE(4)=STRINGA +POSITION(4)=34 +LENGTH(4)=24 +MESSAGE(4)=_DITTA,!RAGSOC,2 + +NAME(5)=DESCRIZIONE MITTENTE SEGMENTO 3 +TYPE(5)=STRINGA +POSITION(5)=59 +LENGTH(5)=24 +MESSAGE(5)=_DITTA,!RAGSOC,3 + +NAME(6)=DESCRIZIONE MITTENTE SEGMENTO 4 +TYPE(6)=STRINGA +POSITION(6)=83 +LENGTH(6)=24 +MESSAGE(6)=_DITTA,!RAGSOC,4 + +NAME(7)=CAMPO BLANK +TYPE(7)=FISSO +POSITION(7)=106 +LENGTH(7)=14 + +[RECORD 30] +NAME(0)=CAMPO BLANK +TYPE(0)=FISSO +POSITION(0)=0 +LENGTH(0)=1 + +NAME(1)=TIPO RECORD +POSITION(1)=1 +LENGTH(1)=2 +MESSAGE(1)=_FISSO,!30 + +NAME(2)=NUMERO PROGRESSIVO RIBA +TYPE(2)=NUMERO +POSITION(2)=3 +LENGTH(2)=7 +MESSAGE(2) = _NRIBA,!NUM + +NAME(3)=DESCRIZIONE DEBITORE SEGMENTO 1 +TYPE(3)=STRINGA +POSITION(3)=10 +LENGTH(3)=30 +MESSAGE(3) = _DEBITORE,!RAGSOC,1 + +NAME(4)=DESCRIZIONE DEBITORE SEGMENTO 2 +TYPE(4)=STRINGA +POSITION(4)=40 +LENGTH(4)=30 +MESSAGE(4) = _DEBITORE,!RAGSOC,2 + +NAME(5)=CODICE FISCALE DEBITORE SEGMENTO 3 +TYPE(5)=STRINGA +POSITION(5)=100 +LENGTH(5)=16 +MESSAGE(5)= _DEBITORE,!CFPI + +NAME(6)=CAMPO BLANK +TYPE(6)=FISSO +POSITION(6)=116 +LENGTH(6)=4 + +[RECORD 40] +NAME(0)=CAMPO BLANK +TYPE(0)=FISSO +POSITION(0)=0 +LENGTH(0)=1 + +NAME(1)=TIPO RECORD +POSITION(1)=1 +LENGTH(1)=2 +MESSAGE(1)=_FISSO,!40 + +NAME(2)=NUMERO PROGRESSIVO RIBA +TYPE(2)=NUMERO +POSITION(2)=3 +LENGTH(2)=7 +MESSAGE(2) = _NRIBA,!NUM + +NAME(3)=INDIRIZZO DEBITORE: VIA,NUMERO CIVICO, NOME FRAZIONE +TYPE(3)=STRINGA +POSITION(3)=10 +LENGTH(3)=30 +MESSAGE(3) = _DEBITORE,!INDIRIZZO + +NAME(4)=INDIRIZZO DEBITORE: CAP +TYPE(4)=NUMERO +FIELD(4)=20->CAPCF +POSITION(4)=40 +LENGTH(4)=5 + +NAME(5)=INDIRIZZO DEBITORE: COMUNE +TYPE(5)=STRINGA +POSITION(5)=45 +LENGTH(5)=23 +MESSAGE(5) = _DEBITORE,!COMUNE + +NAME(6)=INDIRIZZO DEBITORE: SIGLA PROVINCIA +TYPE(6)=STRINGA +POSITION(6)=68 +LENGTH(6)=2 +MESSAGE(6) = _DEBITORE,!PROV + +NAME(7)=BANCA DOMICILIATARIA IN CHIARO (DENOMINAZIONE BANCA E SPORTELLO) +TYPE(7)=STRINGA +POSITION(7)=70 +LENGTH(7)=50 +MESSAGE(7) = _BANCA + +[RECORD 50] +NAME(0)=CAMPO BLANK +TYPE(0)=FISSO +POSITION(0)=0 +LENGTH(0)=1 + +NAME(1)=TIPO RECORD +POSITION(1)=1 +LENGTH(1)=2 +MESSAGE(1)=_FISSO,!50 + +NAME(2)=NUMERO PROGRESSIVO RIBA +TYPE(2)=NUMERO +POSITION(2)=3 +LENGTH(2)=7 +MESSAGE(2) = _NRIBA,!NUM + +NAME(3)=RIFERIMENTI AL DEBITO SEGMENTO 1 +TYPE(3)=STRINGA +POSITION(3)=10 +LENGTH(3)=40 +MESSAGE(3) = _FATT,!1 + +NAME(4)=RIFERIMENTI AL DEBITO SEGMENTO 2 +TYPE(4)=STRINGA +POSITION(4)=50 +LENGTH(4)=50 +MESSAGE(4) = _FATT,!2 + +NAME(5)=CAMPO BLANK +TYPE(5)=FISSO +POSITION(5)=100 +LENGTH(5)=20 + +[RECORD 70] +NAME(0)=CAMPO BLANK +TYPE(0)=FISSO +POSITION(0)=0 +LENGTH(0)=1 + +NAME(1)=TIPO RECORD +POSITION(1)=1 +LENGTH(1)=2 +MESSAGE(1)=_FISSO,!70 + +NAME(2)=NUMERO PROGRESSIVO RIBA +TYPE(2)=NUMERO +POSITION(2)=3 +LENGTH(2)=7 +MESSAGE(2) = _NRIBA,!NUM + +NAME(3)=CAMPO ALTERABILE +TYPE(3)=FISSO +POSITION(3)=10 +LENGTH(3)=110 + +[FOOTER EF] +NAME(0)=CAMPO BLANK +TYPE(0)=FISSO +POSITION(0)=0 +LENGTH(0)=1 + +NAME(1)=TIPO RECORD +POSITION(1)=1 +LENGTH(1)=2 +MESSAGE(1)=_FISSO,!EF + +NAME(2)=CODICE MITTENTE +POSITION(2)=3 +LENGTH(2)=5 +MESSAGE(2)=_CODSIA + +NAME(3)=CODICE DESTINATARIO +FIELD(3)=31->CODABIP +POSITION(3)=8 +LENGTH(3)=5 + +NAME(4)=DATA EMISSIONE +TYPE(4)=DATA +FIELD(4)=31->DATAEMISS +POSITION(4)=13 +LENGTH(4)=6 +MESSAGE(4)=_DATA + +NAME(5)=RAGIONE SOCIALE MITTENTE +TYPE(5)=STRINGA +POSITION(5)=19 +LENGTH(5)=26 +MESSAGE(5) = _DITTA,!RAGSOC,1 + +NAME(6)=NUMERO RICEVUTE NEL FLUSSO +TYPE(6)=NUMERO +POSITION(6)=45 +LENGTH(6)=7 +MESSAGE(6) = _NRIBA,!TOT + +NAME(7)=ZERO FILLED +TYPE(7)=NUMERO +POSITION(7)=52 +LENGTH(7)=15 + +NAME(8)=IMPORTO TOTALE DEL FLUSSO +TYPE(8)= NUMERO +POSITION(8)=67 +LENGTH(8)=15 +PICTURE(8)= @@@@@@@@@@@@@@@ +MESSAGE(8)=_IMPORTO,!TOT + +NAME(9)=NUMERO RECORD +TYPE(9)= NUMERO +POSITION(9)=82 +LENGTH(9)=7 +MESSAGE(9) = _NRIBA,!NREC + +NAME(10)=CAMPO ALTERABILE +TYPE(10)=FISSO +POSITION(10)=89 +LENGTH(10)=24 + +NAME(11)=CODICE MONETA +TYPE(11)=STRINGA +POSITION(11)=113 +LENGTH(11)=1 +MESSAGE(11) = _CODMON + +NAME(12)=FILLER +TYPE(12)=FISSO +POSITION(12)=114 +LENGTH(12)=6 diff --git a/ef/riba.ini b/ef/riba.ini index 8821a1569..b1d53b35c 100755 --- a/ef/riba.ini +++ b/ef/riba.ini @@ -541,14 +541,13 @@ NAME(7)=ZERO FILLED TYPE(7)=NUMERO POSITION(7)=52 LENGTH(7)=15 -PICTURE(7)= @@@@@@@@@@@@@@@ -MESSAGE(7)=_IMPORTO,!TOT NAME(8)=IMPORTO TOTALE DEL FLUSSO TYPE(8)= NUMERO POSITION(8)=67 LENGTH(8)=15 - +PICTURE(8)= @@@@@@@@@@@@@@@ +MESSAGE(8)=_IMPORTO,!TOT NAME(9)=NUMERO RECORD TYPE(9)= NUMERO diff --git a/m770/777100.cpp b/m770/777100.cpp index be12b305e..d6ddcafed 100755 --- a/m770/777100.cpp +++ b/m770/777100.cpp @@ -696,7 +696,7 @@ TTracciato770::TTracciato770(char tipo) : _tipo(tipo) add_field("Stato", 'N', 673, 1); add_field("Situazione", 'N', 674, 1); - add_field("Firma del dichiarante", 'N', 761, 1, 54); // 54 + add_field("Firma del dichiarante", 'B', 761, 1, 54); // 54 add_field("Redazione della dichiarazione", 'N', 796, 1, 74); // 74 add_field("Numero comunicaz. lavoro dipendente", 'N', 797, 8); @@ -705,7 +705,7 @@ TTracciato770::TTracciato770(char tipo) : _tipo(tipo) add_field("Casella prospetto ST", 'N', 814, 1); add_field("Casella prospetto SX", 'N', 815, 1); - add_field("Codice fiscale", 'C',1030,16, 90); // 90 + add_field("Codice fiscale", 'C',1020,16, 90); // 90 add_field("Denominazione (Alternativo a 91 e 92)",'A',1036,60); add_field("Cognome", 'A',1096,24); add_field("Nome", 'A',1120,20); @@ -774,7 +774,7 @@ TTracciato770::TTracciato770(char tipo) : _tipo(tipo) add_field("Numero record di tipo 'G'", 'N', 43, 9); // 6 add_field("Numero record di tipo 'H'", 'N', 52, 9); add_field("Numero record di tipo 'J'", 'N', 61, 9); - add_filler(61, 1837); + add_filler(70, 1828); } } diff --git a/or/or1400.cpp b/or/or1400.cpp index 83b65c4ce..ec98b9afc 100755 --- a/or/or1400.cpp +++ b/or/or1400.cpp @@ -16,6 +16,7 @@ #include #include +static TString8 __codmag; static int __codes; class TArticoli_recordset : public TISAM_recordset @@ -27,7 +28,7 @@ protected: public: virtual TCursor* cursor() const; - TArticoli_recordset(const char* use, bool sottoscorta, int codes) : TISAM_recordset(use), _sottoscorta(sottoscorta) { __codes = codes; } + TArticoli_recordset(const char* use, bool sottoscorta, int codes, const char * codmag) : TISAM_recordset(use), _sottoscorta(sottoscorta) { __codes = codes; __codmag = codmag;} virtual ~TArticoli_recordset() {} }; @@ -37,9 +38,9 @@ bool TArticoli_recordset::filtra_sottoscorta(const TRelation* rel) const TString codart = rel->curr(LF_ANAMAG).get(ANAMAG_CODART); TArticolo_giacenza artgiac(codart); - const real giac = artgiac.giacenza_anno(NULL, NULL, __codes); + const real giac = artgiac.giacenza_anno(__codmag, NULL, __codes); - const bool ok = giac < artgiac.scorta_minima(NULL, NULL, __codes); + const bool ok = giac < artgiac.scorta_minima(__codmag, NULL, __codes); ((TRelation *)rel)->restore_status(); return ok; } @@ -168,13 +169,14 @@ void TGenera_ordini_mask::update_sheet() } - TArticoli_recordset recset(query, get_bool(F_SOTTOSCORTA), esc.date2esc(TDate(TODAY))); + TArticoli_recordset recset(query, get_bool(F_SOTTOSCORTA), esc.date2esc(TDate(TODAY)), get(F_MAG)); TVariant var ; var = grmerc; recset.set_var("#GRMERC", var); var = user(); recset.set_var("#USER", var); + TString8 codes; codes.format("%04d", esc.date2esc(TDate(TODAY))); int i = 0; @@ -211,6 +213,8 @@ void TGenera_ordini_mask::update_sheet() row.add(recset.get(ANAMAG_USER8).as_string(), sf.cid2index(F_USER8)); row.add(recset.get(ANAMAG_USER9).as_string(), sf.cid2index(F_USER9)); row.add(recset.get(ANAMAG_USER10).as_string(), sf.cid2index(F_USER10)); + const real disp = art.disponibilita(codes, get(F_MAG), NULL); + row.add(disp.string(), sf.cid2index(F_DISPON)); sf.check_row(i++); } } diff --git a/or/or1400a.h b/or/or1400a.h index 5821ede72..59c2523db 100755 --- a/or/or1400a.h +++ b/or/or1400a.h @@ -16,7 +16,7 @@ #define F_DESDEP 164 #define F_PREZZO 165 #define F_CDCT 166 -#define F_FSCT 167 +#define F_FSCT 167 #define F_NOTE 168 #define F_SCODART 169 #define F_SDESART 170 @@ -41,13 +41,14 @@ #define F_DESCRAGG 114 #define F_GIACENZA 115 #define F_PPCONF 116 -#define F_USER1 117 -#define F_USER2 118 -#define F_USER3 119 -#define F_USER4 120 -#define F_USER5 121 -#define F_USER6 122 -#define F_USER7 123 -#define F_USER8 124 -#define F_USER9 125 -#define F_USER10 126 +#define F_DISPON 117 +#define F_USER1 118 +#define F_USER2 119 +#define F_USER3 120 +#define F_USER4 121 +#define F_USER5 122 +#define F_USER6 123 +#define F_USER7 124 +#define F_USER8 125 +#define F_USER9 126 +#define F_USER10 127 diff --git a/or/or1400a.uml b/or/or1400a.uml index cefb2be24..e69326ec1 100755 --- a/or/or1400a.uml +++ b/or/or1400a.uml @@ -35,6 +35,7 @@ BEGIN ITEM "Descrizione aggiuntiva@50" ITEM "Giacenza@15" ITEM "Pezzi per conf.@15" + ITEM "Disponibilità@15" ITEM "Campo Aggiuntivo 1@15" ITEM "Campo Aggiuntivo 2@15" ITEM "Campo Aggiuntivo 3@15" @@ -415,13 +416,19 @@ END NUMBER F_GIACENZA 15 5 BEGIN - PROMPT 2 18 "Giacenza" + PROMPT 2 16 "Giacenza" FLAGS "D" END NUMBER F_PPCONF 15 BEGIN - PROMPT 2 19 "Pezzi per conf. " + PROMPT 42 16 "Pezzi per conf. " + FLAGS "D" +END + +NUMBER F_DISPON 15 5 +BEGIN + PROMPT 2 17 "Disponibilità" FLAGS "D" END diff --git a/ps/pg0214.cpp b/ps/pg0214.cpp new file mode 100755 index 000000000..9b6d02213 --- /dev/null +++ b/ps/pg0214.cpp @@ -0,0 +1,16 @@ +#include + +#include "pg0214.h" + +int main(int argc, char** argv) +{ + int n = argc > 1 ? atoi(argv[1]+1) : 0; + switch(n) + { + case 0: + default: + pg0214100(argc, argv); break; //stampa certificazioni per lib. Bonomo + } + exit(0); + return 0; +} \ No newline at end of file diff --git a/ps/pg0214.h b/ps/pg0214.h new file mode 100755 index 000000000..34be0a057 --- /dev/null +++ b/ps/pg0214.h @@ -0,0 +1 @@ +int pg0214100(int argc, char* argv[]); diff --git a/ps/pg0214100.cpp b/ps/pg0214100.cpp new file mode 100755 index 000000000..557585bf2 --- /dev/null +++ b/ps/pg0214100.cpp @@ -0,0 +1,233 @@ +#include "pg0214100a.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../cg/cg2103.h" +#include "../cg/cglib02.h" +#include "../cg/cgsaldac.h" +#include "../ve/velib.h" + +#include "clifo.h" +#include "comuni.h" + +#include +#include +#include +#include +#include + + +#include "../ve/velib.h" + +/////////////////////////////////////////////////////////// +// MASCHERA +/////////////////////////////////////////////////////////// +class TCertificazioni_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TCertificazioni_mask(); + virtual ~TCertificazioni_mask() {} +}; + +TCertificazioni_mask::TCertificazioni_mask() : TAutomask("pg0214100a") +{ +} + +bool TCertificazioni_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + return true; +} + +///////////////////////////////////////////////////////////// +// REPORT +///////////////////////////////////////////////////////////// +class TCertificazioni_report : public TReport +{ +protected: +virtual bool use_mask() { return false; } +public: + TCertificazioni_report() {} +}; + +///////////////////////////////////////////////////////////// +// CSV RECORDSET +///////////////////////////////////////////////////////////// + +class TCertificazioni_csv_recordset : public TCSV_recordset +{ +protected: +public: + TCertificazioni_csv_recordset(); +}; + +TCertificazioni_csv_recordset::TCertificazioni_csv_recordset() +: TCSV_recordset("CSV(,)\n") +{ +} + + +/////////////////////////////////////////////////////////// +// APPLICAZIONE +/////////////////////////////////////////////////////////// + +class TCertificazioni : public TSkeleton_application +{ + + virtual bool check_autorization() const {return false;} + virtual const char * extra_modules() const {return "cg";} + +protected: + void elabora(const TMask& mask) const; + void scrivi_csv(const TRectype& prima_riga, TCertificazioni_csv_recordset& csv) const; + void genera_righe_tributi(const TMovimentoPN& movpn) const; + +public: + virtual bool create(); + virtual void main_loop(); + +}; + + +//crea il documento che contiene la riga che gli viene passata,cerca la riga generata ed in base al risultato della ricerca chiama.. +//..il metodo adatto +void TCertificazioni::scrivi_csv(const TRectype& prima_riga, TCertificazioni_csv_recordset& csv) const +{ + long numreg = prima_riga.get_long(RMV_NUMREG); + + TMovimentoPN movpn; + movpn.lfile().setkey(1); + TRectype& mov = movpn.curr(); + mov.put(MOV_NUMREG, numreg); + if (movpn.read() == NOERR) + { + genera_righe_tributi(movpn); + } +} + +void TCertificazioni::genera_righe_tributi(const TMovimentoPN& movpn) const +{ +} + + +//metodo di base per la ricerca delle righe movimento che soddisfano le condizioni +void TCertificazioni::elabora(const TMask& mask) const +{ + //Tanto per cominciare stabilisce il range di date... + const TDate dataini = mask.get_date(F_DADATA); + const TDate datafin = mask.get_date(F_ADATA); + + //Adesso tocca al codice articolo in base alla specie CONAI + TConfig ditta_ini(CONFIG_DITTA, "ve"); + + //Adesso prende i conti da verificare + TSheet_field& sf = mask.sfield(F_CONTI); + + //la query e' sulle righe movimento + //cerca le righe con numerazione e tipo indicate nello sheet;prende sia le righe che generano CONAI (per avere il codice conai,.. + //..le quantita' etc) e le righe generate da CONAI (per avere i prezzi) + TString query; + query << "USE RMOV KEY 1\n"; + query << "SELECT (NUM(ANSI(23.DATAMOV))>=NUM(ANSI(#DADATA)))&&(NUM(ANSI(23.DATAMOV))<=NUM(ANSI(#ADATA)))\n"; + query << "JOIN MOV INTO NUMREG==NUMREG\n"; + query << "FROM GRUPPO=#GRUPPO CONTO=#CONTO SOTTOCONTO=#SOTTOCONTO\n"; + query << "TO GRUPPO=#GRUPPO CONTO=#CONTO SOTTOCONTO=#SOTTOCONTO\n"; + + TISAM_recordset rmov(query); + + rmov.set_var("#DADATA", dataini); + rmov.set_var("#ADATA", datafin); + + //creazione del csv recordset che verra' riempito dai record del recordset rdoc + TCertificazioni_csv_recordset* csv = new TCertificazioni_csv_recordset; + + //quante righe dello sheet processa? + const long tot_items = sf.items(); + + //Visto che e' possibile avere una secchiata di conti, gli tocca fare un giro per ogni conto + FOR_EACH_SHEET_ROW(sf, r, row) + { + //estrazione definitiva dei record che soddisfano il casino di parametri richiesti + rmov.set_var("#GRUPPO", TVariant(row->get(0))); + rmov.set_var("#CONTO", TVariant(row->get(1))); + rmov.set_var("#SOTTOCONTO", TVariant(row->get(2))); + + //quanti record validi ha trovato? + const long items = rmov.items(); + + //E crea pure la progind.. + TProgind pi(tot_items, TR("Generazione righe..."), true, true); + + long last_nmov = 0; + + //Scansione del recordset trovato + for (bool ok = rmov.move_first(); ok; ok = rmov.move_next()) + { + if (!pi.addstatus(1)) + break; + + const long nmov = rmov.get(RMV_NUMREG).as_int(); + if (nmov != last_nmov) + { + scrivi_csv(rmov.cursor()->curr(), *csv); + last_nmov = nmov; + } + + } //for(bool ok = rmov.move_first(.. + + } //FOR_EACH... + + + //creazione del report di stampa + TCertificazioni_report rep; + bool ok = rep.load("pg0214100a"); + //setta il recordset... + //deve settare almeno un campo manualmente perche' funzioni la mask2report + csv->set_var("#EMAIL", TVariant("Manca la email"), true); + rep.set_recordset(csv); + //..e poi carica i valori sulla maschera nel report!!!! + rep.mask2report(mask); + + if (ok) + { + TReport_book book; + ok = book.add(rep); + if (ok) + book.print_or_preview(); + } +} + +void TCertificazioni::main_loop() +{ + TCertificazioni_mask mask; + mask.field(F_CODDITTA).check(RUNNING_CHECK); + while (mask.run() == K_ENTER) + { + elabora(mask); + } +} + +bool TCertificazioni::create() +{ + if (!has_module(DCAUT)) + return error_box(TR("Modulo non autorizzato")); + + return TSkeleton_application::create(); +} + +int pg0214100(int argc, char* argv[]) +{ + TCertificazioni dc; + dc.run(argc, argv, TR("Stampa certificazioni")); + return 0; +} \ No newline at end of file diff --git a/ps/pg0214100a.h b/ps/pg0214100a.h new file mode 100755 index 000000000..e92f2d9bc --- /dev/null +++ b/ps/pg0214100a.h @@ -0,0 +1,14 @@ +// campi della maschera + +#define F_CODDITTA 101 +#define F_RAGSOC 102 +#define F_DADATA 103 +#define F_ADATA 104 +#define F_CONTI 105 + +// campi dello sheet +#define F_GRUPPO 101 +#define F_CONTO 102 +#define F_SOTTOCONTO 103 +#define F_CAUSALE 104 +#define F_TRIBUTO 105 diff --git a/ps/pg0214100a.rep b/ps/pg0214100a.rep new file mode 100755 index 000000000..c52ad78d3 --- /dev/null +++ b/ps/pg0214100a.rep @@ -0,0 +1,48 @@ + + + Stampa certificazioni + +
+ + + + + + #SYSTEM.RAGSOC + + + + + + + +
+
+
+
+ + A + + + B + + + C + + + D + + + E + + + F + + + H + +
+
+
+ \ No newline at end of file diff --git a/ps/pg0214100a.uml b/ps/pg0214100a.uml new file mode 100755 index 000000000..b6012c90b --- /dev/null +++ b/ps/pg0214100a.uml @@ -0,0 +1,151 @@ +#include "pg0214100a.h" + +TOOLBAR "" 0 -5 0 4 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -11 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -11 "" +END + +ENDPAGE + +PAGE "Stampa certificazioni" -1 -1 78 10 + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 0 "@bDitta" +END + +NUMBER F_CODDITTA 5 +BEGIN + PROMPT 2 1 "Codice " + FLAGS "GDF" + USE LF_NDITTE + INPUT CODDITTA F_CODDITTA + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE REQUIRED +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 17 1 "Rag.Soc. " + FLAGS "D" +END + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 3 "@bMovimenti" +END + +DATE F_DADATA +BEGIN + PROMPT 2 4 "Data iniziale " + FIELD #DADATA + CHECKTYPE REQUIRED +END + +DATE F_ADATA +BEGIN + PROMPT 2 5 "Data finale " + FIELD #ADATA + CHECKTYPE REQUIRED +END + +SPREADSHEET F_CONTI +BEGIN + PROMPT 2 7 "Conti/causali/tributi" + ITEM "Gruppo" + ITEM "Conto" + ITEM "Sottoconto" + ITEM "Causale" + ITEM "tributo" +END + +ENDPAGE + +ENDMASK + +PAGE "CONTI" 4 10 70 10 + +NUMBER F_GRUPPO 3 +BEGIN + PROMPT 2 2 "Gruppo " + USE LF_PCON SELECT (CONTO="") + INPUT GRUPPO F_GRUPPO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_GRUPPO GRUPPO + CHECKTYPE REQUIRED + WARNING "Gruppo assente" +END + +NUMBER F_CONTO 3 +BEGIN + PROMPT 2 3 "Conto " + USE LF_PCON SELECT (CONTO!="")&&(SOTTOCONTO="") + INPUT GRUPPO F_GRUPPO + INPUT CONTO F_CONTO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_GRUPPO GRUPPO + OUTPUT F_CONTO CONTO + CHECKTYPE REQUIRED + WARNING "Conto assente" +END + +NUMBER F_SOTTOCONTO 6 +BEGIN + PROMPT 2 4 "Sottoconto " + USE LF_PCON SELECT (SOTTOCONTO!="") + COPY INPUT F_CONTO + INPUT SOTTOCONTO F_SOTTOCONTO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_SOTTOCONTO SOTTOCONTO + OUTPUT F_GRUPPO GRUPPO + OUTPUT F_CONTO CONTO + CHECKTYPE REQUIRED + WARNING "Sottoconto assente" +END + +STRING F_CAUSALE 20 +BEGIN + PROMPT 2 5 "Causale " +END + +STRING F_TRIBUTO 4 +BEGIN + PROMPT 2 6 "" + USE %TRB //SELECT S6=="E" + INPUT CODTAB F_TRIBUTO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@70" S0 + OUTPUT F_TRIBUTO CODTAB +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/ps/pg9000.uml b/ps/pg9000.uml new file mode 100755 index 000000000..29fb176f0 --- /dev/null +++ b/ps/pg9000.uml @@ -0,0 +1,108 @@ +#include "pg9000a.h" + +PAGE "Stampa Conferimenti" -1 -1 78 10 + + +DATE F_DADATA +BEGIN + PROMPT 2 1 "Movimenti Da data " + FIELD #DADATA + CHECKTYPE REQUIRED +END + +DATE F_ADATA +BEGIN + PROMPT 30 1 "A data " + FIELD #ADATA + CHECKTYPE REQUIRED +END + + +SPREADSHEET F_CONTI +BEGIN + PROMPT 4 5 "Tabella Codici IVA" + ITEM "Gruppo" + ITEM "Conto" + ITEM "Sottoconto" + ITEM "Causale" + ITEM "Codice tributo" +END + +ENDPAGE + +ENDMASK + +PAGE "CONTI" 4 10 70 10 + +NUMBER F_GRUPPO 3 +BEGIN + PROMPT 2 6 "Gruppo " + USE LF_PCON SELECT (CONTO="") + INPUT GRUPPO F_GRUPPO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_GRUPPO GRUPPO + OUTPUT F_DESGRUPPO DESCR + CHECKTYPE REQUIRED + WARNING "Gruppo assente" +END + +NUMBER F_CONTO 3 +BEGIN + PROMPT 2 7 "Conto " + USE LF_PCON SELECT (CONTO!="")&&(SOTTOCONTO="") + INPUT GRUPPO F_GRUPPO + INPUT CONTO F_CONTO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Tipo" TMCF + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CONTO CONTO + OUTPUT F_TIPO TMCF + OUTPUT F_GRUPPO GRUPPO + OUTPUT F_DESCONTO DESCR + CHECKTYPE REQUIRED + WARNING "Conto assente" +END + +NUMBER F_SOTTOCONTO 6 +BEGIN + PROMPT 2 8 "Sottoconto " + USE LF_PCON SELECT (SOTTOCONTO!="") + COPY INPUT F_CONTO + INPUT SOTTOCONTO F_SOTTOCONTO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_SOTTOCONTO SOTTOCONTO + OUTPUT F_GRUPPO GRUPPO + OUTPUT F_CONTO CONTO + OUTPUT F_DESSOTTOC DESCR + CHECKTYPE REQUIRED + WARNING "Sottoconto assente" + GROUP 1 4 +END + +STRING F_CAUS 20 +BEGIN + PROMPT 23 16 "" + CHECKTYPE SEARCH + GROUP 5 +END + +STRING 101 4 +BEGIN + PROMPT 1 2 "" + USE %TRB SELECT S6=="E" + INPUT CODTAB 101 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@70" S0 + OUTPUT 101 CODTAB + CHECKTYPE REQUIRED + FIELD TRIBUTO +END + +ENDPAGE + +ENDMASK diff --git a/ps/ps0214100.cpp b/ps/ps0214100.cpp new file mode 100755 index 000000000..7a6ddc793 --- /dev/null +++ b/ps/ps0214100.cpp @@ -0,0 +1,643 @@ +#include "tp0900a.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "../ve/velib.h" + +/////////////////////////////////////////////////////////// +// MASCHERA +/////////////////////////////////////////////////////////// +class TDichiarazione_CONAI_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TDichiarazione_CONAI_mask(); + virtual ~TDichiarazione_CONAI_mask() {} +}; + +TDichiarazione_CONAI_mask::TDichiarazione_CONAI_mask() : TAutomask("tp0900a") +{ +} + +bool TDichiarazione_CONAI_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_PERIODO: + break; + default: + break; + } + + return true; +} + +///////////////////////////////////////////////////////////// +// REPORT +///////////////////////////////////////////////////////////// +class TDichiarazione_CONAI_report : public TReport +{ +protected: +virtual bool use_mask() { return false; } +public: + TDichiarazione_CONAI_report() {} +}; + +///////////////////////////////////////////////////////////// +// CSV RECORDSET +///////////////////////////////////////////////////////////// + +class TDichiarazione_CONAI_csv_recordset : public TCSV_recordset +{ +protected: + //virtual const TVariant& get(const char* field_name) const; +public: + TDichiarazione_CONAI_csv_recordset(); +}; + + +/*const TDichiarazione_CONAI_csv_recordset::get(const char* field_name) const +{ + if (*field_name == '#') + { + if (strcmp(field_name, "#RAGSOC") == 0) + { + TVariant& var = get_tmp_var(); + var = mask.; + } + return var; + } + return NULL_VARIANT; +}*/ + + +TDichiarazione_CONAI_csv_recordset::TDichiarazione_CONAI_csv_recordset() +: TCSV_recordset("CSV(,)\n") +{ +} + + +/////////////////////////////////////////////////////////// +// APPLICAZIONE +/////////////////////////////////////////////////////////// + +class TDichiarazione_CONAI : public TSkeleton_application +{ + +protected: + void elabora(const TMask& mask) const; + void scrivi_csv(const TRectype& prima_riga, TDichiarazione_CONAI_csv_recordset& csv, + const int conai_specie, const TString& conai_codart) const; + void scrivi_csv_doc_con_riga_generata(TDocumento& doc, const int n_riga_generata, + TDichiarazione_CONAI_csv_recordset& csv, const int conai_specie) const; + void scrivi_csv_doc_speciale(TDocumento& doc, TDichiarazione_CONAI_csv_recordset& csv, + const int conai_specie, const TString& conai_codart) const; + +public: + virtual bool create(); + virtual void main_loop(); + +}; + + +//riempie recordset con le righe CONAI del documento che contiene una riga generata CONAI +void TDichiarazione_CONAI::scrivi_csv_doc_con_riga_generata(TDocumento& doc, const int n_riga_generata, TDichiarazione_CONAI_csv_recordset& csv, + const int conai_specie) const +{ + //prende dalla riga i dati che gli servono per fare vari calcoli + const TRiga_documento& riga_generata = doc[n_riga_generata]; + const TString80 conai_codart = riga_generata.get(RDOC_CODART); //questo ci serve per trovare le righe conai + const real totale_qta_assogg = riga_generata.get_real(RDOC_QTA); //questo ci serve per le quantita' assoggetate o no + + TGeneric_distrib agip(totale_qta_assogg, 5); //distrib per ridistribuire le % dei quantitativi assoggetati + TArray qta_AB_conai; //array con le quantita' conai totali (A+B) + + //scopre se il doc e' una NAC + const bool is_nac = doc.is_nota_credito(); + + //prende la data del documento + const TDate& datadoc = doc.data(); + + //prende il cliente ed i suoi dati + TCli_for clifo = doc.clifor(); + const long clifo_cod = clifo.codice(); + TString16 clifo_cofi = clifo.get(CLI_COFI); + if (clifo_cofi.empty()) + clifo_cofi = clifo.get(CLI_PAIV); + + const int nrighe = doc.rows(); + + //ciclo di creazione del distrib con le quote conai + for (int j = 1; j <= nrighe; j++) + { + const TRiga_documento& rdoc = doc[j]; + + //servono SOLO le righe CONAI!!!!! + const TString& codagg1 = rdoc.get(RDOC_CODAGG1); + + if (codagg1 == conai_codart) + { + //quantita' totale conai (A + B) sul report + const real n = rdoc.calc_conai_qta(conai_specie); + qta_AB_conai.add(n, j); //va calcolato con il metodo apposito + + //quantita' assoggettata (B) sul report + agip.add(n); + } + } + + //ciclo di riempimento delle righe csv;scandisce solo l'array con i valori compilati + FOR_EACH_ARRAY_ROW(qta_AB_conai, i, obj) + { + const TRiga_documento& rdoc = doc[i]; + + //servono SOLO le righe CONAI!!!!! + const TString& codagg1 = rdoc.get(RDOC_CODAGG1); + + if (codagg1 == conai_codart) + { + //se non e' stata definita la sottocategoria conai (maiali!!) va messa uguale a quella generica + TString4 codagg2 = rdoc.get(RDOC_CODAGG2); + if (codagg2.empty()) + codagg2 = codagg1; + //puo' capitare che la sottocategoria sia stata troncata alla categoria + if (codagg2 == codagg1) + codagg2 << "99"; + + //creazione di un nuovo record da esportare + csv.new_rec(""); + + //riempie i campi del record del csv + //codnum-anno-ndoc-datadoc-codcli-cofi-nriga-codagg1-codagg2-prezzo-um-conai(AB)-conai(B)-conai(A) + //parte chiave della riga + csv.set(0, TVariant(rdoc.get(RDOC_CODNUM))); + csv.set(1, TVariant(rdoc.get(RDOC_ANNO))); + csv.set(2, TVariant(rdoc.get(RDOC_NDOC))); + csv.set(3, TVariant(datadoc)); + csv.set(4, TVariant(clifo_cod)); + csv.set(5, TVariant(clifo_cofi)); + csv.set(6, TVariant(rdoc.get(RDOC_CODART))); + csv.set(7, TVariant(rdoc.get(RDOC_NRIGA))); + + //codici conai + csv.set(8, TVariant(codagg1)); //codice materiale conai (es. carta, legno...) + csv.set(9, TVariant(codagg2)); //sottocodice materiale (es. carta imballo, busta...) + + //prezzo + const real prezzo = riga_generata.get_real(RDOC_PREZZO); //va preso dalla riga generata + csv.set(10, TVariant(prezzo)); + + //um conai + const TString4 umqta = cache().get("SPP", conai_codart, "S7"); //unita' di misura dalla tabella SPP + csv.set(11, TVariant(umqta)); + + //quantita' totale conai (A + B) sul report (le NAC hanno segno rovesciato) + real qta_tot_conai = (real&)qta_AB_conai[i]; + if (is_nac) + qta_tot_conai = -qta_tot_conai; + csv.set(15, TVariant(qta_tot_conai)); + + //percentuale di esenzione conai al 100%? + const real perc = rdoc.get_real(RDOC_QTAGG2); + + //quantita' assoggettata (B) sul report (le NAC hanno segno rovesciato) + real qta_assoggettata_conai = agip.get(); + + if (perc == CENTO) + qta_assoggettata_conai = ZERO; + + if (is_nac) + qta_assoggettata_conai = -qta_assoggettata_conai; + csv.set(13, TVariant(qta_assoggettata_conai)); + + //quantita' esente conai (A) sul report + const real qta_esente_conai = qta_tot_conai - qta_assoggettata_conai; + csv.set(12, TVariant(qta_esente_conai)); + + //valore totale contributo (BxC) sul report + const TCurrency totale_contrib_conai = qta_assoggettata_conai * prezzo; + csv.set(14, TVariant(totale_contrib_conai.get_num())); + } + } +} + +//riempie recordset con le righe CONAI del documento che NON ha una riga generata CONAI;trattasi di documenti.. +//..farlocchi costruiti ad arte per correggere le vaccate dei rompiscatolifici +void TDichiarazione_CONAI::scrivi_csv_doc_speciale(TDocumento& doc, TDichiarazione_CONAI_csv_recordset& csv, + const int conai_specie, const TString& conai_codart) const +{ + //scopre se il doc e' una NAC + const bool is_nac = doc.is_nota_credito(); + + //prende la data del documento + const TDate& datadoc = doc.data(); + + //prende il cliente ed i suoi dati + TCli_for clifo = doc.clifor(); + const long clifo_cod = clifo.codice(); + TString16 clifo_cofi = clifo.get(CLI_COFI); + if (clifo_cofi.empty()) + clifo_cofi = clifo.get(CLI_PAIV); + + const int nrighe = doc.rows(); + + //ciclo di riempimento delle righe csv;scandisce solo l'array con i valori compilati + for (int i = 1; i <= nrighe; i++) + { + const TRiga_documento& rdoc = doc[i]; + + //servono SOLO le righe CONAI!!!!! + const TString& codagg1 = rdoc.get(RDOC_CODAGG1); + + if (codagg1 == conai_codart) + { + //se non e' stata definita la sottocategoria conai (maiali!!) va messa uguale a quella generica + TString4 codagg2 = rdoc.get(RDOC_CODAGG2); + if (codagg2.empty()) + codagg2 = codagg1; + //puo' capitare che la sottocategoria sia stata troncata alla categoria + if (codagg2 == codagg1) + codagg2 << "99"; + + //creazione di un nuovo record da esportare + csv.new_rec(""); + + //riempie i campi del record del csv + //codnum-anno-ndoc-datadoc-codcli-cofi-nriga-codagg1-codagg2-prezzo-um-conai(AB)-conai(B)-conai(A) + //parte chiave della riga + csv.set(0, TVariant(rdoc.get(RDOC_CODNUM))); + csv.set(1, TVariant(rdoc.get(RDOC_ANNO))); + csv.set(2, TVariant(rdoc.get(RDOC_NDOC))); + csv.set(3, TVariant(datadoc)); + csv.set(4, TVariant(clifo_cod)); + csv.set(5, TVariant(clifo_cofi)); + csv.set(6, TVariant(rdoc.get(RDOC_CODART))); + csv.set(7, TVariant(rdoc.get(RDOC_NRIGA))); + + //codici conai + csv.set(8, TVariant(codagg1)); //codice materiale conai (es. carta, legno...) + csv.set(9, TVariant(codagg2)); //sottocodice materiale (es. carta imballo, busta...) + + //prezzo + const real prezzo = rdoc.get_real(RDOC_PREZZO); //va preso dalla riga stessa + csv.set(10, TVariant(prezzo)); + + //um conai + const TString4 umqta = cache().get("SPP", conai_codart, "S7"); //unita' di misura dalla tabella SPP + csv.set(11, TVariant(umqta)); + + //quantita' totale conai (A + B) sul report (le NAC hanno segno rovesciato) + real qta_tot_conai = rdoc.get_real(RDOC_QTA); + if (is_nac) + qta_tot_conai = -qta_tot_conai; + csv.set(15, TVariant(qta_tot_conai)); + + //percentuale di esenzione conai al 100%? + const real perc = rdoc.get_real(RDOC_QTAGG2); + + //quantita' assoggettata (B) sul report (le NAC hanno segno rovesciato) + real qta_assoggettata_conai = qta_tot_conai; + + if (perc == CENTO) + qta_assoggettata_conai = ZERO; + + if (is_nac) + qta_assoggettata_conai = -qta_assoggettata_conai; + csv.set(13, TVariant(qta_assoggettata_conai)); + + //quantita' esente conai (A) sul report + const real qta_esente_conai = qta_tot_conai - qta_assoggettata_conai; //deve essere sempre ZERO! + csv.set(12, TVariant(qta_esente_conai)); + + //valore totale contributo (BxC) sul report + const TCurrency totale_contrib_conai = qta_assoggettata_conai * prezzo; + csv.set(14, TVariant(totale_contrib_conai.get_num())); + } + } +} + + +//crea il documento che contiene la riga che gli viene passata,cerca la riga generata ed in base al risultato della ricerca chiama.. +//..il metodo adatto +void TDichiarazione_CONAI::scrivi_csv(const TRectype& prima_riga, TDichiarazione_CONAI_csv_recordset& csv, + const int conai_specie, const TString& conai_codart) const +{ + //crea la testata delle righedoc per poter fare vari calcoli (e intanto il tempo se ne va...) + const int anno = prima_riga.get_int(RDOC_ANNO); + const TString4 codnum = prima_riga.get(RDOC_CODNUM); + const long numdoc = prima_riga.get_long(RDOC_NDOC); + + //documento della prima riga e quindi anche di tutte le altre righe conai + TDocumento doc('D', anno, codnum, numdoc); + + //cerca la riga generata (in tal caso e' un documento con righe CONAI giuste) + const int nrighe = doc.rows(); + + int n_riga_generata = 0; + for (int j = 1; j <= nrighe; j++) + { + const TRiga_documento& rdoc = doc[j]; + //c'è la riga generata con codart di tipo conai (sia automatica che manuale)? + if (rdoc.get(RDOC_CODART) == conai_codart && (rdoc.is_spese() || rdoc.is_generata())) + { + n_riga_generata = j; + break; + } + } + + if (n_riga_generata > 0) + scrivi_csv_doc_con_riga_generata(doc, n_riga_generata, csv, conai_specie); + else + scrivi_csv_doc_speciale(doc, csv, conai_specie, conai_codart); + +} + + +static int compare_csv_rows_specie(const TObject** o1, const TObject** o2) +{ + TToken_string& s1 = *(TToken_string*)*o1; + TToken_string& s2 = *(TToken_string*)*o2; + + //deve ordinare sul campo 8 (codagg2 = codice specie conai) + const TString& c1 = s1.get(8); + const TString& c2 = s2.get(8); + + int cmp = c1.compare(c2); + + // sotto ordinamento per codice cliente (campo 4) + if (cmp == 0) + { + const TString& c1 = s1.get(4); + const TString& c2 = s2.get(4); + cmp = c1.compare(c2); + + // sotto-sotto ordinamento per ndoc (campo 2) + if (cmp == 0) + { + const TString& c1 = s1.get(2); + const TString& c2 = s2.get(2); + cmp = c1.compare(c2); + } + } + + return cmp; +} + +static int compare_csv_rows_cofi(const TObject** o1, const TObject** o2) +{ + TToken_string& s1 = *(TToken_string*)*o1; + TToken_string& s2 = *(TToken_string*)*o2; + + //deve ordinare sul campo cofi/piva + const TString& c1 = s1.get(5); + const TString& c2 = s2.get(5); + int cmp = c1.compare(c2); + + return cmp; +} + +//metodo di base per la ricerca delle righe documento che soddisfano i parametri dell'utonto +void TDichiarazione_CONAI::elabora(const TMask& mask) const +{ + //Tanto per cominciare stabilisce il range di date... + const int anno = mask.get_int(F_ANNO); + + TDate dataini(1, 1, anno); + TDate datafin(31, 12, anno); + + const int tipo_periodo = mask.get_int(F_PERIODO); + //se il periodo scelto non e' un anno intero... + switch (tipo_periodo) + { + case 2: + { + const int mese = mask.get_int(F_TRIMESTRE); + dataini.set_month(mese); + datafin = dataini; + datafin.addmonth(2); + datafin.set_end_month(); + } + break; + case 3: + { + const int mese = mask.get_int(F_MESE); + dataini.set_month(mese); + datafin = dataini; + datafin.set_end_month(); + } + break; + default: + break; + } + + //Adesso tocca al codice articolo in base alla specie CONAI + const int specie_conai = mask.get_int(F_SPECIECONAI); + TConfig ditta_ini(CONFIG_DITTA, "ve"); + + TVariant codart; + TString nome_report; //report di tipo 6.1 scelto in base alla specie conai + + switch (specie_conai) + { + case 0: + codart = ditta_ini.get("CODACC"); //acciaio + nome_report = "tp0900ac.rep"; + break; + case 1: + codart = ditta_ini.get("CODALL"); //alluminio + nome_report = "tp0900al.rep"; + break; + case 2: + codart = ditta_ini.get("CODCAR"); //carta + nome_report = "tp0900ca.rep"; + break; + case 3: + codart = ditta_ini.get("CODPLA"); //plastica + nome_report = "tp0900pl.rep"; + break; + case 4: + codart = ditta_ini.get("CODLEG"); //legno + nome_report = "tp0900le.rep"; + break; + case 5: + codart = ditta_ini.get("CODVET"); //vetro + nome_report = "tp0900ve.rep"; + break; + default: + break; + } + + //In caso il tipo stampa NON sia con il modello 6.1 basato sulla specie conai ma di tipo 6.3 basato sui.. + //fornitori e le loro esenzioni, il report va rinominato perche' e' unico + if (mask.get_int(F_TIPOSTAMPA) == 2) + nome_report = "tp0900es.rep"; + + //Adesso prende le numerazioni e i tipi documento + TSheet_field& sf = mask.sfield(F_TIPI); + + //la query e' sulle righe documento + //cerca le righe con numerazione e tipo indicate nello sheet;prende sia le righe che generano CONAI (per avere il codice conai,.. + //..le quantita' etc) e le righe generate da CONAI (per avere i prezzi) + TString query; +/* query << "USE RDOC KEY 5\n"; + query << "SELECT (NUM(ANSI(33.DATADOC))>=NUM(ANSI(#DADATA)))&&(NUM(ANSI(33.DATADOC))<=NUM(ANSI(#ADATA)))&&(33.TIPODOC=#TIPODOC)&&(GENERATA=\"X\")\n"; + query << "JOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC\n"; + query << "FROM CODART=#CODART ANNO=#ANNO CODNUM=#CODNUM PROVV=\"D\"\n"; + query << "TO CODART=#CODART ANNO=#ANNO CODNUM=#CODNUM PROVV=\"D\"\n";*/ + + query << "USE RDOC KEY 1\n"; + query << "SELECT (NUM(ANSI(33.DATADOC))>=NUM(ANSI(#DADATA)))&&(NUM(ANSI(33.DATADOC))<=NUM(ANSI(#ADATA)))&&(33.TIPODOC=#TIPODOC)&&(CODAGG1=#CODART)\n"; + query << "JOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC\n"; + query << "FROM CODNUM=#CODNUM ANNO=#ANNO PROVV=\"D\"\n"; + query << "TO CODNUM=#CODNUM ANNO=#ANNO PROVV=\"D\"\n"; + + //crea il recordset principale relativo alle righe originali CONAI ed assegna subito i valori delle variabili che restano costanti al cambio.. + //..numerazione/tipo: sono le date ed il codice articolo + TISAM_recordset rdoc(query); + + rdoc.set_var("#ANNO", TVariant((long)anno)); + rdoc.set_var("#DADATA", dataini); + rdoc.set_var("#ADATA", datafin); + rdoc.set_var("#CODART", codart); + + //creazione del csv recordset che verra' riempito dai record del recordset rdoc + TDichiarazione_CONAI_csv_recordset* csv = new TDichiarazione_CONAI_csv_recordset; + + //quante righe dello sheet processa? + const long tot_items = sf.items(); + + //Visto che e' possibile avere una secchiata di numerazioni, gli tocca fare un giro per ogni numerazione + FOR_EACH_SHEET_ROW(sf, r, row) + { + //estrazione definitiva dei record che soddisfano il casino di parametri richiesti + rdoc.set_var("#CODNUM", TVariant(row->get(0))); + rdoc.set_var("#TIPODOC", TVariant(row->get(2))); + + //quanti record validi ha trovato? + const long items = rdoc.items(); +/*#ifdef DBG + warning_box("Hai trovato %ld righe di %s! Ti sembrano abbastanza?", items, row->get(0)); +#endif*/ + + //E crea pure la progind.. + TProgind pi(tot_items, TR("Generazione righe..."), true, true); + + long last_ndoc = 0; + + //Scansione del recordset trovato + for (bool ok = rdoc.move_first(); ok; ok = rdoc.move_next()) + { + if (!pi.addstatus(1)) + break; + + const long ndoc = rdoc.get(RDOC_NDOC).as_int(); + if (ndoc != last_ndoc) + { + scrivi_csv(rdoc.cursor()->curr(), *csv, specie_conai, codart.as_string()); + last_ndoc = ndoc; + } + + } //for(bool ok = rdoc.move_first(.. + + } //FOR_EACH... + + //riordinamento del file secondo: + //In caso il tipo stampa sia con il modello 6.3 basato sui.. + //fornitori e le loro esenzioni... + if (mask.get_int(F_TIPOSTAMPA) == 2) + csv->sort(compare_csv_rows_cofi); + else + //specie conai, codice cliente, numero documento + csv->sort(compare_csv_rows_specie); + + //se richiesto il file in formato excel... + if (mask.get_bool(F_EXCEL)) + { + //crea la riga con le intestazioni dei campi e la mette all'inizio + csv->insert_rec(0); + //riempie i campi del primo record del csv in modo da avere l'intestazione + csv->set(0, "CODNUM"); + csv->set(1, "ANNO"); + csv->set(2, "NDOC"); + csv->set(3, "DATADOC"); + csv->set(4, "CODCLI"); + csv->set(5, "COFICLI"); + csv->set(6, "CODART"); + csv->set(7, "NRIGA"); + csv->set(8, "CLASSE"); + csv->set(9, "SOTTOCL"); + csv->set(10, "PREZZO"); + csv->set(11, "UM"); + csv->set(12, "CONAI A"); + csv->set(13, "CONAI B"); + csv->set(14, "CONAI BxC"); + csv->set(15, "CONAI A+B"); + + const TString path = mask.get(F_PATH); + csv->save_as(path, fmt_text); + + //accoppa la riga con le intestazioni dei campi + csv->destroy(0); + +/*#ifdef DBG + xvt_sys_goto_url(path, "open"); +#endif*/ + } + + //creazione del report di stampa + TDichiarazione_CONAI_report rep; + bool ok = rep.load(nome_report); + //setta il recordset... + //deve settare almeno un campo manualmente perche' funzioni la mask2report + csv->set_var("#EMAIL", TVariant("Manca la email"), true); + rep.set_recordset(csv); + //..e poi carica i valori sulla maschera nel report!!!! + rep.mask2report(mask); + + if (ok) + { + TReport_book book; + ok = book.add(rep); + if (ok) + book.print_or_preview(); + } +} + +void TDichiarazione_CONAI::main_loop() +{ + TDichiarazione_CONAI_mask mask; + mask.field(F_FIRM).check(RUNNING_CHECK); + while (mask.run() == K_ENTER) + { + elabora(mask); + } +} + +bool TDichiarazione_CONAI::create() +{ + if (!has_module(DCAUT)) + return error_box(TR("Modulo non autorizzato")); + + return TSkeleton_application::create(); +} + +int tp0900(int argc, char* argv[]) +{ + TDichiarazione_CONAI dc; + dc.run(argc, argv, TR("Dichiarazione CONAI")); + return 0; +} \ No newline at end of file diff --git a/ps/ps0544.cpp b/ps/ps0544.cpp index f1e1b710e..ed06e71ab 100755 --- a/ps/ps0544.cpp +++ b/ps/ps0544.cpp @@ -8,9 +8,11 @@ int main(int argc, char** argv) switch(n) { case 0: - ps0544100(argc, argv); break; - case 1: - ps0544200(argc, argv); break; + ps0544100(argc, argv); break; + case 1: + ps0544200(argc, argv); break; + case 2: + ps0544300(argc, argv); break; default: ps0544100(argc, argv); break; } diff --git a/ps/ps0544.h b/ps/ps0544.h index 33e0971ca..d87dd3463 100755 --- a/ps/ps0544.h +++ b/ps/ps0544.h @@ -1,2 +1,3 @@ int ps0544100(int argc, char* argv[]); int ps0544200(int argc, char* argv[]); +int ps0544300(int argc, char* argv[]); diff --git a/ps/ps0544300.cpp b/ps/ps0544300.cpp new file mode 100755 index 000000000..c3a41956c --- /dev/null +++ b/ps/ps0544300.cpp @@ -0,0 +1,270 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "..\ve\velib.h" + +#include "ps0544.h" +#include "ps0544300a.h" + +class TSpics_file: public TFile_text +{ +protected: + virtual void validate(TCursor& cur,TRecord_text& rec, TToken_string& val, TString& str); + +public: + TSpics_file(const TString& file_name, const TString& config_name); + virtual ~TSpics_file() { } +}; + +TSpics_file::TSpics_file(const TString& file_name, const TString& config_name) + : TFile_text(file_name, config_name) +{ +} + +class TSpics_mask : public TAutomask +{ +protected: + bool on_field_event(TOperable_field& o, TField_event e, long jolly); +public: + + TSpics_mask(); + + virtual ~TSpics_mask(){}; +}; + +TSpics_mask::TSpics_mask() :TAutomask ("ps0544300a") +{ +} + +bool TSpics_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + return true; +} + +class TSpics : public TSkeleton_application +{ + TCursor* _cur; + TSpics_mask* _msk; + TDate _dataini, _datafin; + TSpics_file* _trasfile; + TConfig* _configfile; + long _nrecords; + TRiga_documento* _riga_doc_curr; + +virtual const char * extra_modules() const {return "ve";} + +protected: + virtual bool create(void); + virtual bool destroy(void); + virtual void main_loop() ; + void elabora_documenti(); + +public: + const long nrecords() { return _nrecords;}; + const TRiga_documento& riga_doc_curr() { return *_riga_doc_curr;}; + TConfig configfile() {return *_configfile;}; + TSpics() {} ; + virtual ~TSpics() {} ; +}; + +// restituisce un riferimento all' applicazione +inline TSpics& app() { return (TSpics&) main_app();} + +// gestione dei messaggi estesi nei campi +void TSpics_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str) +{ + const TString code(s.get(0)); + TString valore; + if (code == "_FISSO") + { + // gestione dei campi fissi per i record delle riba + // sintassi: _FISSO,! + // dove: è la stringa fissa da emettere + TString in(s.get()); + CHECK(in[0]=='!',"Macro _FISSO senza carattere '!'"); + in.ltrim(1); + in.trim(); + valore = in; + } + + else if (code == "_DARIGA") + { + valore = ""; + TString in(s.get()); + if (in == "QTA") + { + real qta = app().riga_doc_curr().quantita(); + valore = qta.string(7,2,'0'); + valore.strip("."); + } + else if (in=="CODART") + { + TString80 codart = app().riga_doc_curr().get(RDOC_CODART); + if (codart[0]!='A' || codart.len()<=10) + valore=codart; + else + valore=(codart.len()==12?valore << codart.left(10) << " " << codart.mid(11,2):valore << codart.left(10) << " " << codart.mid(11,4)); + } + } + else if (code == "_PARAMETRI") + { + TString in(s.get()); + valore = app().configfile().get(in); + } + else if (code == "_OGGI") + { + TDate data(TODAY); + valore = data.string(brief, '-', full, full, amg_date); + valore.strip("-"); + } + else if (code == "_ADESSO") + { + char time[128]; + _strtime(time); + valore.format("%s", time); + valore.strip(":"); + } + else if (code == "_NRECORDS") + { + valore.format("%ld", app().nrecords()); + } + else if (code == "_UPPERCASE") + { + valore = str; + valore.upper(); + } + else NFCHECK("Macro non definita: %s", (const char *)code); + + str = valore; +} + +bool TSpics::create() +{ + open_files(LF_DOC, LF_CLIFO, 0); + _msk = new TSpics_mask(); + _trasfile = NULL; + _configfile = new TConfig("ps0544300a.ini", "TRASFERIMENTO"); + return TSkeleton_application::create(); +} + +bool TSpics::destroy() +{ + if (_trasfile) + delete _trasfile; + if (_configfile) + delete _configfile; + delete _msk; + + return TSkeleton_application::destroy(); +} + +void TSpics::main_loop() +{ + TFilename filename = _configfile->get("NOMEFILE"); + if (filename.exist()) + remove(filename); + while (_msk->run()!=K_QUIT) + { + _trasfile = new TSpics_file(filename, "ps0544300.ini"); + _trasfile->open(filename,'w'); + _trasfile->force_record_separator(TRUE); + + _dataini = _msk->get_date(F_DATAINI); + _datafin = _msk->get_date(F_DATAFIN); + elabora_documenti(); + _trasfile->close(); + delete _trasfile; + _trasfile = NULL; + } +} + + +void TSpics::elabora_documenti() +{ + TSheet_field& sheet = _msk->sfield(F_SHEETDOC); + + TRelation doc_rel(LF_DOC); + doc_rel.add(LF_RIGHEDOC, "CODNUM==CODNUM|ANNO==ANNO|PROVV==PROVV|NDOC==NDOC"); + doc_rel.add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF"); + TRectype da(LF_DOC); + TRectype a(LF_DOC); + const long items = sheet.items(); + TString filt_expr; + + _nrecords = 0; + if (items > 0) + { + bool ok = TRUE; + TString16 codnum; + + da.put("DATADOC", _dataini); + a.put("DATADOC", _datafin); + + filt_expr << "("; + FOR_EACH_SHEET_ROW(sheet, r, row) + { + codnum = row->get(0); + if (codnum.not_empty()) + { + filt_expr << "(CODNUM==\""; + filt_expr << codnum << "\")||"; + } + } + filt_expr.rtrim(2); + filt_expr << ")"; + + doc_rel.lfile().set_curr(new TDocumento); + _cur = new TCursor(&doc_rel,filt_expr,3,&da,&a); + const long cur_items = _cur ->items(); // Scorre tutti i documenti che rientrano nell'intervallo selezionato + if (cur_items != 0) + { + TRecord_text rech; + rech.set_type("OP"); + _trasfile->autoload(rech, *_cur); + _trasfile->write(rech); + for (*_cur = 0; _cur->pos() < cur_items; ++(*_cur)) + { + + TRecord_text rec; + rec.set_type("01"); + _trasfile->autoload(rec, *_cur); + _trasfile->write(rec); + _nrecords++; + TDocumento documento = doc_rel.curr(); + for (int i=1;i<=documento.rows();i++) + { + const TRiga_documento& rec_rdoc = documento[i]; + _riga_doc_curr = new TRiga_documento(rec_rdoc); + doc_rel.curr(LF_RIGHEDOC) = rec_rdoc; + rec.set_type("02"); + _trasfile->autoload(rec, *_cur); + _trasfile->write(rec); + _nrecords++; + delete _riga_doc_curr; + } + } + TRecord_text recf; + recf.set_type("CL"); + _trasfile->autoload(recf, *_cur); + _trasfile->write(recf); + } + delete _cur; + } +} + + +int ps0544300(int argc, char **argv) +{ + TSpics a; + a.run(argc, argv, "Trasferimento a SPICS"); + return 0; +} + diff --git a/ps/ps0544300.ini b/ps/ps0544300.ini new file mode 100755 index 000000000..eafb902bd --- /dev/null +++ b/ps/ps0544300.ini @@ -0,0 +1,199 @@ + +[MAIN] +DECSEP = , +FIELDSEP = +RECORDSEP = +RECORDSIZE = 128 +SKIPLINES = 0 +TYPEFIELD = -1 +TYPELEN = -1 +TYPEPOS = -1 + +[TYPE FISSO] +ALIGN = +DATA = +DECIMAL = 0 +FILLER = ' ' +LENGTH = 0 +PICTURE = + +[TYPE DATA] +ALIGN = +DATA = D +DECIMAL = 0 +FILLER = +LENGTH = 6 +PICTURE = 1442 + +[TYPE NUMERO] +ALIGN = R +DATA = N +DECIMAL = 0 +FILLER = '0' +LENGTH = 0 +PICTURE = + +[TYPE STRINGA] +ALIGN = L +DATA = S +DECIMAL = 0 +FILLER = ' ' +LENGTH = 0 +PICTURE = + +[TYPE IMPORTO] +ALIGN = R +DATA = S +DECIMAL = 0 +FILLER = '0' +LENGTH = + +[HEADER OP] +NAME(0)=IDENTIFICATIVO TESTA +TYPE(0)=STRINGA +LENGTH(0)=4 +POSITION(0)=0 +MESSAGE(0)=_FISSO,!OP01 + +NAME(1) = CODICE MITTENTE +TYPE(1) = STRINGA +LENGTH(1) = 6 +POSITION(1) = 4 +MESSAGE(1) = _PARAMETRI,CODCONCESSIONARIO + +NAME(2) = CODICE DESTINATARIO +TYPE(2) = STRINGA +LENGTH(2) = 6 +POSITION(2) = 10 +MESSAGE(2) = _PARAMETRI,CODPRODUZIONE + +NAME(3) = NOME PROCEDURA +TYPE(3) = STRINGA +LENGTH(3) = 6 +POSITION(3) = 16 +MESSAGE(3) = _PARAMETRI,PROCEDURA + +NAME(4) = DATA SERVIZIO +TYPE(4) = STRINGA +LENGTH(4) = 6 +POSITION(4) = 22 +MESSAGE(4) = _OGGI + +NAME(5) = ORA SERVIZIO +TYPE(5) = STRINGA +LENGTH(5) = 6 +POSITION(5) = 28 +MESSAGE(5) = _ADESSO + +[RECORD 01] +NAME(0)=TIPO RECORD +TYPE(0)=STRINGA +LENGTH(0)=2 +POSITION(0)=0 +MESSAGE(0)=_FISSO,!01 + +NAME(1) = NUMERO MAGAZZINO +TYPE(1) = NUMERO +LENGTH(1) = 2 +POSITION(1) = 2 +MESSAGE(1) = _FISSO,!30 + +NAME(2) = CODICE DEALER +TYPE(2) = NUMERO +LENGTH(2) = 6 +POSITION(2) = 4 +MESSAGE(2) = _PARAMETRI,CODDEALER + +NAME(3) = NUMERO MAGAZZINO DEL DEALER +TYPE(3) = NUMERO +LENGTH(3) = 2 +POSITION(3) = 10 +MESSAGE(3) = _FISSO,!01 + +NAME(4) = NUMERO ORDINE +TYPE(4) = STRINGA +LENGTH(4) = 10 +POSITION(4) = 12 +FIELD(4) = 33->NDOC + +NAME(5) = REFRENZA PER IL DEALER +TYPE(5) = STRINGA +LENGTH(5) = 25 +POSITION(5) = 22 +FIELD(5) = 20->RAGSOC[1,25] + +NAME(6) = FILLER +TYPE(6) = STRINGA +LENGTH(5) = 1 +POSITION(5) = 47 + +[RECORD 02] +NAME(0) = CODICE SEZIONE +TYPE(0) = STRINGA +LENGTH(0) = 1 +POSITION(0) = 0 +FIELD(0) = 34->CODART[1,1] + +NAME(1) = CODICE RICAMBIO +TYPE(1) = STRINGA +LENGTH(1) = 23 +POSITION(1) = 1 +MESSAGE(1) = _DARIGA,CODART + +NAME(2) = QUANTITà ORDINATA +TYPE(2) = NUMERO +LENGTH(2) = 7 +POSITION(2) = 24 +MESSAGE(2) = _DARIGA,QTA + +NAME(3) = REFERENZA DEL CLIENTE +TYPE(3) = STRINGA +LENGTH(3) = 43 +POSITION(3) = 31 + +NAME(4) = OPZIONE 1 +TYPE(4) = STRINGA +LENGTH(4) = 1 +POSITION(4) = 43 + +NAME(26) = OPZIONE 2 +TYPE(26) = STRINGA +LENGTH(26) = 1 +POSITION(26) = 44 + +NAME(5) = OPZIONE 3 +TYPE(5) = NUMERO +LENGTH(5) = 1 +POSITION(5) = 45 + +[FOOTER CL] +NAME(0)=IENTIFICATIVO CODA +TYPE(0)=STRINGA +LENGTH(0)=4 +POSITION(0)=0 +MESSAGE(0)=_FISSO,!CL99 + +NAME(1) = CODICE MITTENTE +TYPE(1) = STRINGA +LENGTH(1) = 6 +POSITION(1) = 4 +MESSAGE(1) = _PARAMETRI,CODCONCESSIONARIO + +NAME(2) = CODICE DESTINATARIO +TYPE(2) = STRINGA +LENGTH(2) = 6 +POSITION(2) = 10 +MESSAGE(2) = _PARAMETRI,CODPRODUZIONE + +NAME(3) = NOME PROCEDURA +TYPE(3) = STRINGA +LENGTH(3) = 6 +POSITION(3) = 16 +MESSAGE(3) = _PARAMETRI,PROCEDURA + +NAME(4) = NUMERO RECORDS PASSATI +TYPE(4) = NUMERO +LENGTH(4) = 6 +POSITION(4) = 38 +MESSAGE(4) = _NRECORDS + diff --git a/ps/ps0544300a.h b/ps/ps0544300a.h new file mode 100755 index 000000000..9df291f5a --- /dev/null +++ b/ps/ps0544300a.h @@ -0,0 +1,8 @@ +#define F_CODDITTA 101 +#define F_RAGSOC 102 +#define F_DATAINI 103 +#define F_DATAFIN 104 +#define F_SHEETDOC 105 +// campi dello sheet +#define F_S_CODNUM 101 +#define F_S_DESNUM 102 \ No newline at end of file diff --git a/ps/ps0544300a.uml b/ps/ps0544300a.uml new file mode 100755 index 000000000..f8a638487 --- /dev/null +++ b/ps/ps0544300a.uml @@ -0,0 +1,122 @@ +#include "ps0544300a.h" + +TOOLBAR "" 0 -5 0 4 + +STRING 30 70 50 + BEGIN + FLAGS "G" + PROMPT 10 -5 "Profilo " + PSELECT +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -11 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -11 "" +END + +ENDPAGE + +PAGE "Trasferimento a SERVUS" -1 -1 78 18 + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 0 "@bDitta" +END + +NUMBER F_CODDITTA 5 +BEGIN + PROMPT 2 1 "Codice " + FLAGS "GDF" + USE LF_NDITTE + INPUT CODDITTA F_CODDITTA + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE REQUIRED +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 17 1 "Rag.Soc. " + FLAGS "D" +END + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 3 "@bParametri" +END + +DATE F_DATAINI +BEGIN + PROMPT 2 4 "Fatture dal " + HELP "Data di inizio per trasferimento documenti" + CHECKTYPE REQUIRED + WARNING "Data dal non valida" + FLAGS "A" +END + +DATE F_DATAFIN +BEGIN + PROMPT 30 4 "al " + HELP "Data di fine per trasferimento documenti" + CHECKTYPE REQUIRED + VALIDATE DATE_CMP_FUNC >= F_DATAINI + WARNING "Data di fine scadenza non valida" +END + +SPREADSHEET F_SHEETDOC 78 10 +BEGIN + PROMPT 1 6 "Scelta documenti" + ITEM "Cod. num." + ITEM "Descrizione num.@50" +END + +ENDPAGE +ENDMASK + +PAGE "Scelta documenti" -1 -1 75 10 + +STRING F_S_CODNUM 4 +BEGIN + PROMPT 2 1 "Cod. num. " + FLAGS "U" + USE %NUM + INPUT CODTAB F_S_CODNUM + DISPLAY "Cod. Num." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_S_CODNUM CODTAB + OUTPUT F_S_DESNUM S0 + CHECKTYPE REQUIRED +END + +STRING F_S_DESNUM 50 +BEGIN + PROMPT 20 1 "" + HELP "Descrizione numerazione" + USE %NUM KEY 2 + INPUT S0 F_S_DESNUM + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_S_CODNUM +END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 9 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 9 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/ps/ps0713.cpp b/ps/ps0713.cpp index a2041f2b8..de1cf1689 100755 --- a/ps/ps0713.cpp +++ b/ps/ps0713.cpp @@ -7,7 +7,8 @@ int main(int argc, char** argv) int n = argc > 1 ? atoi(argv[1]+1) : 0; switch(n) { - case 0: + case 0: ps0713100(argc, argv); break; //Trasferimento dati contabili per ATS + case 1: ps0713200(argc, argv); break; //Trasferimento commesse default: ps0713100(argc, argv); break; //Trasferimento dati contabili per ATS } diff --git a/ps/ps0713.h b/ps/ps0713.h index 3b84ac94f..a141c037f 100755 --- a/ps/ps0713.h +++ b/ps/ps0713.h @@ -1 +1,2 @@ int ps0713100(int argc, char* argv[]); +int ps0713200(int argc, char* argv[]); diff --git a/ps/ps0713200.cpp b/ps/ps0713200.cpp new file mode 100755 index 000000000..b8723dd40 --- /dev/null +++ b/ps/ps0713200.cpp @@ -0,0 +1,245 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "tabutil.h" + +#include "ps0713.h" +#include "ps0713200a.h" + + + +/////////////////////////////////////////////////////////// +// TAutomask +/////////////////////////////////////////////////////////// + +class TImportaComm_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TImportaComm_mask(); +}; + +TImportaComm_mask::TImportaComm_mask() :TAutomask ("ps0713200a") +{ +} + +bool TImportaComm_mask::on_field_event(TOperable_field& f, TField_event e, long jolly) +{ + switch (f.dlg()) + { + //giochetto per avere la lista dei files validi nella directory di trasferimento! + case F_NAME: + if (e == fe_button) + { + TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"), + "File@32"); + TFilename path = get(F_PATH); + path.add("*.csv"); //files delle testate + list_files(path, as.rows_array()); + TFilename name; + FOR_EACH_ARRAY_ROW(as.rows_array(), i, row) + { + name = *row; + *row = name.name(); + } + if (as.run() == K_ENTER) + { + f.set(as.row(as.selected())); + } + } + break; + default: + break; + } + return true; +} + +/////////////////////////////////////// +// TSkeleton_application +/////////////////////////////////////// +class TCommCSV : public TSkeleton_application +{ + virtual bool check_autorization() const {return false;} + virtual const char * extra_modules() const {return "cg";} + + TImportaComm_mask* _msk; + TConfig* _configfile; + +public: + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); + virtual void ini2mask(); + virtual void mask2ini(); + bool transfer(const TFilename& file); + + TCommCSV() {}; +}; + +TCommCSV& app() { return (TCommCSV&) main_app(); } + +///////////////////////////////// +// inserimento commesse +///////////////////////////////// + +bool TCommCSV::transfer(const TFilename& file) +{ + TLog_report log("Inserimento Commesse"); + + TToken_string rec(50,','); + + TScanner s(file); + rec = s.line(); + + + TTable comm("CMS"); + + TProgind pi(fsize(file),"Inserimento Commesse in corso...",true,true); + + while (s.ok()) + { + if (!pi.addstatus(s.tellg())) + break; + + TString str = "La commessa "; + TString codtab = rec.get(0); + codtab.strip("\""); + + //salto le righe vuote del file + if (codtab.empty()) + continue; + + comm.zero(); + comm.put("CODTAB", codtab); //setto il campo CODTAB + + TString tmp = "IDLAVORO "; + tmp << codtab; + + comm.put("S0", tmp); //setto il campo descrizione (S0) + + TString gr = rec.get(1); + gr.strip("\""); + TString co = rec.get(2); + co.strip("\""); + TString sc = rec.get(3); + sc.strip("\""); + + //inserisco il gruppo, il conto e il sottoconto + //solo se esistono e/o hanno valori sensati + if (gr == "" || gr == "?") + gr = "0"; + + comm.put("I1", gr); + + if (co == "" || co == "?") + co = "0"; + + comm.put("I2", co); + + if (sc == "" || sc == "?") + sc = "0"; + + comm.put("I3", sc); + + int err = comm.write(); + + if (err == NOERR) + { + str << codtab << " è stata inserita"; + log.log(0, str); + } + else + { + if (err == 224) + str << codtab << " NON è stata inserita perchè esiste già"; + else + str << codtab << " NON è stata inserita. Errore = " << err; + + log.log(2, str); + } + + rec = s.line(); + + } + + TReport_book buc; + buc.add(log); + buc.preview(); + + return true; +} + +void TCommCSV::mask2ini() +{ + //carica i parametri del file di configurazione + _configfile->set_paragraph("MAIN"); + for (int i = 0; i < _msk->fields() ; i++) + { + TMask_field& f = _msk->fld(i); + const TFieldref* fr = f.field(); + if (fr != NULL) + _configfile->set(fr->name(), f.get()); + } +} + +void TCommCSV::ini2mask() +{ + //carica i parametri del file di configurazione + _configfile->set_paragraph("MAIN"); + for (int i = 0; i < _msk->fields() ; i++) + { + TMask_field& f = _msk->fld(i); + const TFieldref* fr = f.field(); + if (fr != NULL) + f.set(_configfile->get(fr->name())); + } +} + +bool TCommCSV::create() +{ + _configfile = new TConfig("ps0713conf.ini"); + _msk = new TImportaComm_mask(); + + + return TSkeleton_application::create(); +} + +bool TCommCSV::destroy() +{ + delete _msk; + delete _configfile; + return TApplication::destroy(); +} + +void TCommCSV::main_loop() +{ + KEY tasto; + ini2mask(); + tasto = _msk->run(); + if (tasto == K_ENTER) + { + mask2ini(); + + //genero il nome del file da caricare + TFilename name = _msk->get(F_PATH); + name.add(_msk->get(F_NAME)); + if (transfer(name)) + { + message_box(TR("Importazione documenti completata")); + } + } +} + +int ps0713200 (int argc, char* argv[]) +{ + TCommCSV main_app; + main_app.run(argc, argv, TR("Importazione Commesse")); + return true; +} \ No newline at end of file diff --git a/ps/ps0713200a.h b/ps/ps0713200a.h new file mode 100755 index 000000000..c27a7df49 --- /dev/null +++ b/ps/ps0713200a.h @@ -0,0 +1,6 @@ +//campi maschera ps0713200a + +#define F_CODITTA 101 +#define F_RAGSOC 102 +#define F_PATH 103 +#define F_NAME 104 diff --git a/ps/ps0713200a.uml b/ps/ps0713200a.uml new file mode 100755 index 000000000..ff652487a --- /dev/null +++ b/ps/ps0713200a.uml @@ -0,0 +1,59 @@ +#include "ps0713200a.h" + +PAGE "Importazione dati commesse da file" -1 -1 78 12 + +GROUPBOX DLG_NULL 76 3 +BEGIN + PROMPT 2 1 "@bDitta corrente" +END + +NUMBER F_CODITTA 5 +BEGIN + PROMPT 3 2 "Codice " + FLAGS "FD" + USE LF_NDITTE + INPUT CODDITTA F_CODITTA + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE REQUIRED +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 23 2 "" + FLAGS "D" +END + +GROUPBOX DLG_NULL 76 4 +BEGIN + PROMPT 2 4 "@bSorgente" +END + +STRING F_PATH 256 39 +BEGIN + PROMPT 3 5 "Cartella " + DSELECT + CHECKTYPE REQUIRED + FIELD ComInPath +END + +STRING F_NAME 18 +BEGIN + PROMPT 3 6 "File " + FIELD ComInFile +END + +BUTTON DLG_ELABORA 10 2 +BEGIN + PROMPT -12 -1 "" + PICTURE BMP_ELABORA + MESSAGE EXIT,K_ENTER +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK \ No newline at end of file diff --git a/ps/ps0713conf.ini b/ps/ps0713conf.ini index c744e157b..37327e9a7 100755 --- a/ps/ps0713conf.ini +++ b/ps/ps0713conf.ini @@ -1,4 +1,5 @@ [MAIN] -PATH = -NAME = -ADATA = +CODDITTA = +RAGSOC = +PATH = +NAME = \ No newline at end of file diff --git a/ps/pt0002100.cpp b/ps/pt0002100.cpp index d2cc993df..f7a911ba9 100755 --- a/ps/pt0002100.cpp +++ b/ps/pt0002100.cpp @@ -340,7 +340,8 @@ bool TClifoCSV::transfer(const TFilename& file) if (s.get(6).as_string().empty()) //italiano { TString cap = s.get(9).as_string(); - pulisci_cap(cap); + + pulisci_cap(cap); TString80 comune = s.get(11).as_string(); //comune o localita' comune.trim();