diff --git a/lv/lv2500.cpp b/lv/lv2500.cpp index f69603f05..9eb9d87ec 100755 --- a/lv/lv2500.cpp +++ b/lv/lv2500.cpp @@ -1033,7 +1033,7 @@ void TFatturazione_lavanderie::campi_raggruppamento_righe(TToken_string& campi_r //se lo standard lascia campi_riga vuota, allora la pongo uguale a "CODART|UMQTA" //che sono sicuramente sempre uguali if (campi_riga.empty()) - campi_riga = "CODART|UMQTA"; // Uguali sempre + campi_riga = RDOC_CODART"|"RDOC_UMQTA; // Uguali sempre } //FIND_OR_CREATE_ROW: questo metodo cerca tra tutte le righe documento della fattura prodotta diff --git a/lv/lv2700.cpp b/lv/lv2700.cpp index a1cae68c0..b7ad6f2a8 100755 --- a/lv/lv2700.cpp +++ b/lv/lv2700.cpp @@ -23,7 +23,8 @@ struct TStruttura: public TObject long _qta; TStruttura():_cliente(0),_numeroDoc(0),_qta(0) {} TStruttura(long cliente, const TString& articolo, const TString& descr, - TDate dataDoc, int numeroDoc, long qta):_cliente(cliente),_articolo(articolo),_descr(descr),_dataDoc(dataDoc),_numeroDoc(numeroDoc),_qta(qta) {} + TDate dataDoc, int numeroDoc, long qta):_cliente(cliente),_articolo(articolo), + _descr(descr),_dataDoc(dataDoc),_numeroDoc(numeroDoc),_qta(qta) {} }; struct TStrutturaData: public TObject diff --git a/lv/lv4200.cpp b/lv/lv4200.cpp index e7c8612cd..03ad003ee 100755 --- a/lv/lv4200.cpp +++ b/lv/lv4200.cpp @@ -23,7 +23,7 @@ enum CGC_SALDAC { CGC_NULL, CGC_TIPOCF, CGC_ANNO, CGC_NUMPART, CGC_CODCF, CGC_NUMEROREC, CGC_CAMBIO, CGC_VALUTA, CGC_TIPODOC, CGC_DATADOC, - CGC_SCADENZA, CGC_IMPORTO, CGC_IMPORTO_VAL }; + CGC_SCADENZA, CGC_IMPORTO, CGC_IMPORTO_VAL,CGC_NUMDOC }; class TCausali_cache : public TCache { @@ -33,7 +33,7 @@ protected: virtual TObject* key2obj(const char* key); public: - const TCausale& causale(char tipocf, tipo_movimento tm, const TDate& datadoc); + const TCausale& causale(char tipocf, tipo_movimento tm); void init(const char* cln, const char* frn) { _cln = cln; _frn = frn; } }; @@ -41,9 +41,6 @@ TObject* TCausali_cache::key2obj(const char* key) { const char tipocf = key[0]; const tipo_movimento tm = tipo_movimento(key[1]-'0'); - int anno = atoi(key + 2); - if (anno <= 0) - anno = TDate(TODAY).year(); TString4 codcaus; if (tm == tm_fattura) @@ -57,16 +54,15 @@ TObject* TCausali_cache::key2obj(const char* key) if (caus.move_first()) codcaus = caus.get(CAU_CODCAUS).as_string(); } - TCausale* pcaus = new TCausale(codcaus, anno); + TCausale* pcaus = new TCausale(codcaus); return pcaus; } -const TCausale& TCausali_cache::causale(const char tipocf, tipo_movimento tm, const TDate& datadoc) +const TCausale& TCausali_cache::causale(const char tipocf, tipo_movimento tm) { // Metodo bastardo per evitare TToken_string temporanee "a randa" - // creo chiave a lunghezza fissa TIPOCF+TIPOMOV = C1 - TString8 key; - key.format("%c%1d%4d" , tipocf, tm, datadoc.year()); + // creo chiave a lunghezza fissa TIPOCF+TIPOMOV+ANNO = C12010 + const char key[4] = { tipocf, '0'+tm, '\0' }; return *(const TCausale*)objptr(key); } @@ -91,28 +87,26 @@ bool TImporta_sc_mask::on_field_event(TOperable_field& f, TField_event e, long j { switch (f.dlg()) { - //giochetto per avere la lista dei files validi nella directory di trasferimento! - case F_NAME: - if (e == fe_button) + //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("*.txt"); //file da importare + list_files(path, as.rows_array()); + TFilename name; + FOR_EACH_ARRAY_ROW(as.rows_array(), i, row) { - TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"), "File@32"); - TFilename path = get(F_PATH); - path.add("*.txt"); //file da importare - 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())); - } + name = *row; + *row = name.name(); } - break; - default: - break; + if (as.run() == K_ENTER) + f.set(as.row(as.selected())); + } + break; + default: + break; } return true; } @@ -128,17 +122,18 @@ class TImporta_sc : public TSkeleton_application TBill _clienti, _fornitori; private: - void nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, TPartita& game, tipo_movimento tm); + void nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, TPartita& game, tipo_movimento tm, bool is_riba); bool paga_rata(TPartita& game, int nrata, int nrigp, real& importo) const; + void set_descr(TRectype& rec) const; protected: bool log_error(TLog_report& log, const char* msg, const TRecordset& recset); - const TCausale& causale(char tipocf, tipo_movimento tm, const TDate& datadoc); + const TCausale& causale(char tipocf, tipo_movimento tm); char get_tmcf(int gruppo, int conto) const; bool find_clifo_bill(char tipocf, int& gruppo, int& conto, long sottoconto); TRiga_partite& nuova_fattura(const TImporta_cogeco_recset& recset, TPartita& game); - void nuova_scadenza(const TImporta_cogeco_recset& recset, TPartita& game); + void nuova_scadenza(const TImporta_cogeco_recset& recset, TPartita& game, bool is_riba); void nuova_riba(const TImporta_cogeco_recset& recset, TPartita& game); void nuovo_pagamento(const TImporta_cogeco_recset& recset, TPartita& game); void nuova_nota_credito(const TImporta_cogeco_recset& recset, TPartita& game); @@ -153,8 +148,8 @@ public: }; // Cerca una causale appropriata in base a TIPOCF (C o F) e TIPOMOV (1, 2, 3, ...) -const TCausale& TImporta_sc::causale(char tipocf, tipo_movimento tm, const TDate& datadoc) -{ return _cache_causali.causale(tipocf, tm, datadoc); } +const TCausale& TImporta_sc::causale(char tipocf, tipo_movimento tm) +{ return _cache_causali.causale(tipocf, tm); } // Ricava il campo TMCF (Cliente o Fornitore) di un dato conto char TImporta_sc::get_tmcf(int gruppo, int conto) const @@ -189,8 +184,7 @@ bool TImporta_sc::find_clifo_bill(char tipocf, int& gruppo, int& conto, long sot if (!found) { // Cerca sulla prima riga dellla causale - const TDate datadoc(TODAY); - const TCausale& caus = causale(tipocf, tm_fattura, datadoc); + const TCausale& caus = causale(tipocf, tm_fattura); TBill bill; caus.bill(1, bill); gruppo = bill.gruppo(); conto = bill.conto(); @@ -216,6 +210,33 @@ bool TImporta_sc::find_clifo_bill(char tipocf, int& gruppo, int& conto, long sot return found; } +void TImporta_sc::set_descr(TRectype& rec) const +{ + TString descr; + descr << "*** "; + switch (rec.num()) + { + case LF_SCADENZE: + descr << TR("Rata") << ' ' << rec.get(SCAD_NRATA); + rec.put(SCAD_DESCR, descr); + break; + case LF_PARTITE: + switch (tipo_movimento(rec.get_int(PART_TIPOMOV))) + { + case tm_fattura : descr << TR("Fattura") << ' ' + << rec.get(PART_ANNO) << '/' << rec.get(PART_NUMDOC); break; + case tm_nota_credito: descr << TR("Nota di credito") + << rec.get(PART_ANNO) << '/' << rec.get(PART_NUMDOC); break; + case tm_insoluto : descr << TR("Insoluto"); break; + default : descr << TR("Pagamento"); break; + } + rec.put(PART_DESCR, descr); + break; + default: + break; + } +} + // Aggiunge una nuova riga fattura a 'game' in base ai dati in 'recset' TRiga_partite& TImporta_sc::nuova_fattura(const TImporta_cogeco_recset& recset, TPartita& game) { @@ -227,10 +248,12 @@ TRiga_partite& TImporta_sc::nuova_fattura(const TImporta_cogeco_recset& recset, const TDate datadoc = recset.get_date(CGC_DATADOC); fattura.put(PART_DATAREG, datadoc); fattura.put(PART_DATADOC, datadoc); - fattura.put(PART_DESCR, TR("*** Fattura gnerata da COGECO ***")); + const long numdoc = recset.get(CGC_NUMDOC).as_int(); + if (numdoc > 0) + fattura.put(PART_NUMDOC, numdoc); const char tipocf = game.conto().tipo(); - const TCausale& caus = causale(tipocf, tm_fattura, datadoc); + const TCausale& caus = causale(tipocf, tm_fattura); if (caus.ok()) { fattura.put(PART_CODCAUS, caus.codice()); @@ -243,6 +266,8 @@ TRiga_partite& TImporta_sc::nuova_fattura(const TImporta_cogeco_recset& recset, fattura.put(PART_TIPOMOV, tm_fattura); fattura.put(PART_SEZ, tipocf == 'C' ? 'D' : 'A'); } + set_descr(fattura); + nriga = fattura.get_int(PART_NRIGA); } @@ -257,7 +282,7 @@ TRiga_partite& TImporta_sc::nuova_fattura(const TImporta_cogeco_recset& recset, // Aggiunge una nuova rata alla UNICA fattura di 'game'. // Attenzione: in assenza di fattura ne viene creata una "al volo" di pari importo. -void TImporta_sc::nuova_scadenza(const TImporta_cogeco_recset& recset, TPartita& game) +void TImporta_sc::nuova_scadenza(const TImporta_cogeco_recset& recset, TPartita& game, bool is_riba) { int nriga = game.prima_fattura(); // PART_NRIGA della fattura (solitamente = 1) if (nriga <= 0) // Se non ci sono fattura in questa partita ... @@ -266,12 +291,28 @@ void TImporta_sc::nuova_scadenza(const TImporta_cogeco_recset& recset, TPartita& nriga = game.prima_fattura(); // Aggiorno PART_NRIGA che valeva -1 } TRiga_partite& fattura = game.riga(nriga); // Accedo alla riga di fattura, che ora DEVE esistere! - TRiga_scadenze& scadenza = fattura.new_row(); // Creo nuova rata, alla faccia di SCAD_CODPAG + // Se la scadenza coincide o precede l'ultima, non creo una rata nuova + const TDate datascad = recset.get_date(CGC_SCADENZA); + int nrata = fattura.rate(); + if (nrata > 0) + { + const TRiga_scadenze& rata = fattura.rata(nrata); + if (datascad > rata.get_date(SCAD_DATASCAD)) + nrata = 0; // Devo creare una rata nuova + } + if (nrata <= 0) + { + TRiga_scadenze& scadenza = fattura.new_row(); // Creo nuova rata, alla faccia di SCAD_CODPAG + nrata = scadenza.get_int(SCAD_NRATA); // valeva 0 + scadenza.put(SCAD_DATASCAD, recset.get_date(CGC_SCADENZA)); + scadenza.put(SCAD_TIPOPAG, is_riba ? 3 : 1); + set_descr(scadenza); + } + + TRiga_scadenze& scadenza = fattura.rata(nrata); const real importo = recset.get_real(CGC_IMPORTO); - scadenza.put(SCAD_DATASCAD, recset.get_date(CGC_SCADENZA)); - scadenza.put(SCAD_IMPORTO, importo); - scadenza.put(SCAD_DESCR, TR("*** Rata generata da COGECO ***")); + scadenza.add(SCAD_IMPORTO, importo); } bool TImporta_sc::paga_rata(TPartita& game, int nrata, int nrigp, real& importo) const @@ -293,6 +334,7 @@ bool TImporta_sc::paga_rata(TPartita& game, int nrata, int nrigp, real& importo) rpag.put(field[k], scadenza.get(field[k])); rpag.put(PAGSCA_NRIGP, nrigp); // Completa la chiave di PAGSCA col numero riga di partita rpag.put(PAGSCA_IMPORTO, pagare); + rpag.put(PAGSCA_ACCSAL, pagare >= residuo ? 'S' : 'A'); const TValuta euro; game.modifica_pagamento(rpag, euro, true); // Speriamo che faccia tutto lei :-) importo -= pagare; @@ -303,7 +345,7 @@ bool TImporta_sc::paga_rata(TPartita& game, int nrata, int nrigp, real& importo) } // Aggiunge una nuova riga tipo 2 (n.c.) o 3 (pag.) alla partita -void TImporta_sc::nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, TPartita& game, tipo_movimento tm) +void TImporta_sc::nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, TPartita& game, tipo_movimento tm, bool is_riba) { // Crea una nuova riga di partita TRiga_partite& pagamento = game.new_row(); @@ -313,13 +355,17 @@ void TImporta_sc::nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, T pagamento.put(PART_DATAREG, datadoc); pagamento.put(PART_DATADOC, datadoc); if (tm == tm_nota_credito) - pagamento.put(PART_DESCR, TR("*** Nota di credito generata da COGECO ***")); + { + const long numdoc = recset.get(CGC_NUMDOC).as_int(); + if (numdoc > 0) + pagamento.put(PART_NUMDOC, numdoc); + } else - pagamento.put(PART_DESCR, TR("*** Pagamento generato da COGECO ***")); + pagamento.put(PART_DATAPAG, datadoc); // Cerca di inizlizzare la riga con una causale appropriata const char tipocf = game.conto().tipo(); - const TCausale& caus = causale(tipocf, tm, datadoc); + const TCausale& caus = causale(tipocf, tm); if (caus.ok()) { pagamento.put(PART_CODCAUS, caus.codice()); @@ -332,6 +378,7 @@ void TImporta_sc::nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, T pagamento.put(PART_TIPOMOV, tm); pagamento.put(PART_SEZ, tipocf == 'F' ? 'D' : 'A'); } + set_descr(pagamento); // Ora sono certo del TIPOMOV e posso generare la descrizione // Somma da distribuire sulle rate aperte real importo = recset.get_real(CGC_IMPORTO); @@ -373,7 +420,15 @@ void TImporta_sc::nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, T } } if (best_rata > 0) + { + if (is_riba) + { + const TRiga_scadenze& rata = fattura.rata(best_rata); + if (rata.get_int(SCAD_TIPOPAG) == 3) // Per le RIBA precisa la data pagamento + pagamento.put(PART_DATAPAG, rata.get(SCAD_DATASCAD)); + } paga_rata(game, best_rata, nrigp, importo); + } else break; } @@ -390,6 +445,7 @@ void TImporta_sc::nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, T rpag.put(PAGSCA_NRATA, 9999); // Questo 9999 significa "rata ignota" rpag.put(PAGSCA_NRIGP, nrigp); // Completa la chiave di PAGSCA col numero riga di partita rpag.put(PAGSCA_IMPORTO, importo); + rpag.put(PAGSCA_ACCSAL, 'A'); // Gli ancticipi sono sempre in acconto :-) const TValuta euro; game.modifica_pagamento(rpag, euro, true); } @@ -399,17 +455,17 @@ void TImporta_sc::nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, T // per cui in CAMPO viene aperta una scadenza ed immediatamente chiusa col relativo pagamento void TImporta_sc::nuova_riba(const TImporta_cogeco_recset& recset, TPartita& game) { - nuova_scadenza(recset, game); - nuovo_pagamento(recset, game); + nuova_scadenza(recset, game, true); + nuovo_pagamento_o_nota(recset, game, tm_pagamento, true); } // Creo una nuova riga partita corrispondente ad una riga pagamento in PAGSCA void TImporta_sc::nuovo_pagamento(const TImporta_cogeco_recset& recset, TPartita& game) -{ nuovo_pagamento_o_nota(recset, game, tm_pagamento); } +{ nuovo_pagamento_o_nota(recset, game, tm_pagamento, false); } // Creo una nuova riga partita corrispondente ad una riga nota di credito in PAGSCA void TImporta_sc::nuova_nota_credito(const TImporta_cogeco_recset& recset, TPartita& game) -{ nuovo_pagamento_o_nota(recset, game, tm_nota_credito); } +{ nuovo_pagamento_o_nota(recset, game, tm_nota_credito, false); } // Creo una nuova riga partita corrispondente ad una riga di insoluto PAGSCA bool TImporta_sc::nuovo_insoluto(const TImporta_cogeco_recset& recset, TPartita& game, TLog_report& log) @@ -457,11 +513,10 @@ bool TImporta_sc::nuovo_insoluto(const TImporta_cogeco_recset& recset, TPartita& insoluto.put(PART_DATAREG, datadoc); insoluto.put(PART_DATADOC, datadoc); - insoluto.put(PART_DESCR, TR("*** Insoluto trasferito da COGECO ***")); insoluto.put(PART_IMPTOTDOC, importo); const char tipocf = game.conto().tipo(); - const TCausale& caus = causale(tipocf, tm_insoluto, datadoc); + const TCausale& caus = causale(tipocf, tm_insoluto); if (caus.ok()) { insoluto.put(PART_CODCAUS, caus.codice()); @@ -474,6 +529,7 @@ bool TImporta_sc::nuovo_insoluto(const TImporta_cogeco_recset& recset, TPartita& insoluto.put(PART_TIPOMOV, tm_insoluto); insoluto.put(PART_SEZ, fattura.sezione()); } + set_descr(insoluto); paga_rata(game, best_rata, nrigp, importo); } else @@ -576,7 +632,7 @@ void TImporta_sc::transfer(const TFilename& file) TImporta_cogeco_recset recset(file); recset.sort(game_sorter); - TString caption; _msk->get_caption(caption); + const TString& caption = main_app().title(); TProgind pi(recset.items(), caption, true, true); TConfig* conf = NULL; @@ -664,7 +720,7 @@ void TImporta_sc::transfer(const TFilename& file) case 11: nuovo_pagamento(recset, *game); break; // Pagamento case 13: nuova_nota_credito(recset, *game); break; // Nota di credito su RB clienti case 14: nuova_nota_credito(recset, *game); break; // Abbuono - case 15: nuova_scadenza(recset, *game); break; + case 15: nuova_scadenza(recset, *game, false); break; case 18: nuova_riba(recset, *game); break; // Paghero' case 19: nuova_riba(recset, *game); break; // Avviso di scadenza case 20: nuova_riba(recset, *game); break; // R.I.D.