Aggiunto trasferimendo a PayLine per Straccia Packaging

git-svn-id: svn://10.65.10.50/branches/R_10_00@22779 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2013-01-04 08:28:08 +00:00
parent 0bfd0af032
commit f0ab065f43
4 changed files with 352 additions and 106 deletions

@ -200,7 +200,7 @@ void TDocTS::upload_causali(const TFilename& file, TLog_report& log) const
while (s.ok())
{
if (!pi.addstatus(s.tellg()))
if (!pi.addstatus((long)s.tellg()))
break;
causa.zero();
curr = s.line();
@ -252,7 +252,7 @@ void TDocTS::upload_codiva(const TFilename& file, TLog_report& log) const
while(s.ok())
{
if (!pi.addstatus(s.tellg()))
if (!pi.addstatus((long)s.tellg()))
break;
//salto le righe di testata del file
iva.zero();

@ -1,11 +1,14 @@
#include <applicat.h>
#include <automask.h>
#include <dongle.h>
#include <netsock.h>
#include <progind.h>
#include <recarray.h>
#include <relation.h>
#include <reputils.h>
#include <textset.h>
#include <validate.h>
#include <utility.h>
#include "tc8.h"
@ -40,11 +43,6 @@ public:
bool TPayLine_mask::on_field_event(TOperable_field& f, TField_event e, long jolly)
{
switch (f.dlg())
{
default:
break;
}
return true;
}
@ -55,12 +53,18 @@ bool TPayLine_mask::on_field_event(TOperable_field& f, TField_event e, long joll
class TPayLine_app : public TSkeleton_application
{
protected:
bool find_clifo(long codcf, TPayLine_recset& clienti) const;
long export_clifo(long codcf, TPayLine_recset& clienti, TLog_report& log) const;
bool esporta(const TString& dir, const TDate& dt, TLog_report& log) const;
virtual bool create();
virtual const char* extra_modules() { return "cg"; }
virtual void main_loop();
public:
virtual void main_loop();
bool find_clifo(long codcf, TPayLine_recset& clienti) const;
long export_clifo(long codcf, TPayLine_recset& clienti, TLog_report& log) const;
bool esporta_pagsca(const TRectype& pag, const TRectype& scad, bool unico,
TPayLine_recset& clienti, TPayLine_recset& movimenti,
TLog_report& log) const;
bool esporta(const TString& dir, const TString& ftp, const TDate& dt, TLog_report& log) const;
bool ftp_send(const TFilename& filename, const TString& ftp) const;
};
bool TPayLine_app::find_clifo(long codcf, TPayLine_recset& clienti) const
@ -127,10 +131,11 @@ long TPayLine_app::export_clifo(long codcf, TPayLine_recset& clienti, TLog_repor
TToken_string row(256, ';');
row << codcf;
row.format("%6ld", codcf);
str = rec.get(CLI_RAGSOC);
str.strip_double_spaces(); str.strip(";");
str.left_just(50);
row.add(str);
str = rec.get(CLI_INDCF);
@ -171,7 +176,203 @@ long TPayLine_app::export_clifo(long codcf, TPayLine_recset& clienti, TLog_repor
return codcf;
}
bool TPayLine_app::esporta(const TString& dir, const TDate& al, TLog_report& log) const
bool TPayLine_app::esporta_pagsca(const TRectype& pag, const TRectype& scad, bool unico,
TPayLine_recset& clienti, TPayLine_recset& movimenti,
TLog_report& log) const
{
const long codcf = pag.get_long(PAGSCA_SOTTOCONTO);
const long lastcf = export_clifo(codcf, clienti, log);
if (lastcf <= 0)
return false;
TToken_string key;
key.format("C|0|0|%ld|%d|%s|%d",
codcf, pag.get_int(PART_ANNO), (const char*)pag.get(PART_NUMPART),
pag.get_int(PAGSCA_NRIGP));
const TRectype part = cache().get(LF_PARTITE, key);
if (part.empty())
return false; // Can't be empty: orphan record!
if (!scad.empty())
key.format("C|0|0|%ld|%d|%s|%d",
codcf, pag.get_int(PART_ANNO), (const char*)pag.get(PART_NUMPART),
pag.get_int(PAGSCA_NRIGA));
else
key.cut(0);
const TRectype fatt = cache().get(LF_PARTITE, key); // Can be empty: unassigned
TToken_string row(128, ';');
TString str;
row.format("%6ld", lastcf);
TDate data = part.get(PART_DATADOC); // Data Documento
if (!data.ok())
data = part.get_date(PART_DATAREG);
str = data.stringa(); str.left_just(10);
row.add(str, 1);
str = part.get(PART_NUMDOC); str.left_just(8);
row.add(str, 2); // Numero Documento
if (fatt.empty())
{
row.add(row.get(1), 3); // Data riferimento
str = part.get(PART_NUMPART); str.left_just(8);
row.add(str, 4); // Numero Riferimento
}
else
{
data = fatt.get(PART_DATADOC); // Data riferimento
if (!data.ok())
data = fatt.get_date(PART_DATAREG);
str = data.stringa(); str.left_just(10);
row.add(str, 3);
str = fatt.get(PART_NUMPART); str.left_just(8);
row.add(str, 4); // Numero Riferimento
}
str = part.get(PART_DATAREG);
str.left_just(10);
row.add(str, 5); // Data registrazione
str = part.get(PART_NREG); str.right_just(7);
row.add(str, 6); // Numero registrazione
str = scad.get(SCAD_DATASCAD); str.left_just(10);
row.add(str, 7); // Data scadenza
const int tm = part.get_int(PART_TIPOMOV);
real imp;
if (tm == 3 && unico && scad.get_bool(SCAD_PAGATA))
{
// Caso semplice: una rata pagata completamene con un solo pagamento
imp = scad.get_real(SCAD_IMPORTO); // Importo pagato = importo da pagare
}
else
{
imp = pag.get_real(PAGSCA_IMPORTO);
if (tm == 3)
{
if (pag.get_char(PAGSCA_PASSATT) == 'P')
imp += pag.get_real(PAGSCA_ABBUONI);
imp += pag.get_real(PAGSCA_RITENUTE);
imp += pag.get_real(PAGSCA_RITSOC);
}
}
str = part.get(PART_SEZ);
if (imp < ZERO)
{
imp = -imp;
str = str == "D" ? "A" : "D";
}
row.add(imp.stringa(10,2), 8); // Importo
row.add(str, 9); // Dare/Avere
switch (tm)
{
case 2: row.add("EF7#", 10); break; // Nota di credito
case 5: row.add("EF5#", 10); break; // Insoluto
default:
switch (part.get_int(PART_TIPOPAG))
{
case 3: row.add("EF3#", 10); break;// Causale pagamento con RIBA
default: row.add("EF6#", 10); break;// Causale pagamento normale
}
}
row.add(" ", 11); // Condizioni di pagamento
row.add(part.get(PART_DATAPAG), 12); // Data pagamento
movimenti.new_rec(row);
return true;
}
static int sort_mov(const TObject** o1, const TObject** o2)
{
const TToken_string& r1 = *(const TToken_string*)*o1;
const TToken_string& r2 = *(const TToken_string*)*o2;
long c1 = 0, c2 = 0;
r1.get(0, c1);
r2.get(0, c2);
int ret = c1 - c2;
for (int i = 3; i > 0 && ret == 0; i -= 2)
{
TDate d1, d2;
r1.get(i, d1);
r2.get(i, d2);
ret = d1 - d2;
if (ret == 0)
{
TString16 p1, p2;
r1.get(i+1, p1); p1.trim();
r2.get(i+1, p2); p2.trim();
ret = p1.compare(p2);
}
}
return ret;
}
bool TPayLine_app::ftp_send(const TFilename& filename, const TString& ftp) const
{
bool done = false;
TString srv, pat, usr, pwd;
const int at = ftp.find('@');
if (at > 0)
{
srv = ftp.mid(at+1);
usr = ftp.left(at);
if (usr.starts_with("ftp://"))
usr.ltrim(6);
const int colon = usr.find(':');
if (colon > 0)
{
pwd = usr.mid(colon+1);
usr.cut(colon);
}
}
else
{
srv = ftp;
if (srv.starts_with("ftp://"))
srv.ltrim(6);
}
const int slash = srv.find('/');
if (slash > 0)
{
pat = srv.mid(slash);
srv.cut(slash);
if (pat.full() && !pat.ends_with("/"))
pat << '/';
}
TSocketClient ftpserver;
CONNID id = ftpserver.QueryConnection("21", srv);
if (id > 0)
{
TString remote = pat;
remote << filename.name();
done = ftpserver.FtpSendFile(id, remote, filename, usr, pwd);
if (!done)
done = error_box(FR("Impossibile inviare il file %s"), (const char*)filename);
ftpserver.RemoveConnection(id);
}
else
{
done = error_box(FR("Impossibile connettersi al server %s"), (const char*)srv);
}
return done;
}
bool TPayLine_app::esporta(const TString& dir, const TString& ftp,
const TDate& al, TLog_report& log) const
{
TDate dal(al);
dal.set_day(1); // A scanso equivoci bisestili
@ -184,117 +385,117 @@ bool TPayLine_app::esporta(const TString& dir, const TDate& al, TLog_report& log
query << "USE SCAD "
<< "\nJOIN PART INTO TIPOC==TIPOC SOTTOCONTO==SOTTOCONTO ANNO==ANNO NUMPART==NUMPART NRIGA==NRIGA"
<< "\nFROM TIPOC=C\nTO TIPOC=C";
TISAM_recordset mov(query);
const TRectype& scad = mov.cursor()->curr();
const TRectype& part = mov.cursor()->curr(LF_PARTITE);
long lastcf = 0;
TProgind pi(mov.items(), log.title());
TToken_string row(256, ';');
TString str;
for (bool ok = mov.move_first(); ok; ok = mov.move_next())
if (mov.items() > 0)
{
if (!pi.addstatus(1))
break;
const TRectype& scad = mov.cursor()->curr();
const TRectype& part = mov.cursor()->curr(LF_PARTITE);
long lastcf = 0;
TToken_string row(256, ';');
TString str;
const TDate datascad = scad.get(SCAD_DATASCAD);
if (scad.get_bool(SCAD_PAGATA) || part.get_bool(PART_CHIUSA))
{
if (datascad < dal)
continue; // Ignora vecchia partita chiusa
}
str = log.title();
str << '\n' << TR("Scadenze e pagamenti associati");
const long codcf = scad.get_long(SCAD_SOTTOCONTO);
if (codcf != lastcf)
TProgind pi(mov.items(), str);
for (bool ok = mov.move_first(); ok; ok = mov.move_next())
{
lastcf = export_clifo(codcf, clienti, log);
if (lastcf <= 0)
if (!pi.addstatus(1))
break;
const TDate datascad = scad.get(SCAD_DATASCAD);
if (datascad > al)
continue;
}
if (scad.get_bool(SCAD_PAGATA) || part.get_bool(PART_CHIUSA))
{
if (datascad < dal)
continue; // Ignora vecchia partita chiusa
}
str.cut(0) << lastcf; str.right_just(6);
row.add(str, 0); // Codice cliente
const long codcf = scad.get_long(SCAD_SOTTOCONTO);
if (codcf != lastcf)
{
lastcf = export_clifo(codcf, clienti, log);
if (lastcf <= 0)
continue;
}
str = part.get(PART_DATADOC); // Data Documento
if (str.blank())
str = part.get(PART_DATAREG);
row.add(str, 1);
str = part.get(PART_NUMDOC); str.left_just(8);
row.add(str, 2); // Numero Documento
row.add(row.get(1), 3); // Data riferimento
row.add(row.get(2), 4); // Numero riferimento
row.add(part.get(PART_DATAREG), 5); // Data registrazione
str = part.get(PART_NREG); str.right_just(7);
row.add(str, 6); // Numero registrazione
row.add(datascad, 7); // Data scadenza
row.add(scad.get_real(SCAD_IMPORTO).stringa(10,2), 8); // Importo
row.add(part.get(PART_SEZ), 9); // Dare/Avere
row.add("EF1#", 10); // Causale Fattura
movimenti.new_rec(row);
TToken_string key;
key.format("C|0|0|%ld|%d|%s|%d|%d",
lastcf, part.get_int(PART_ANNO), (const char*)part.get(PART_NUMPART),
scad.get_int(SCAD_NRIGA), scad.get_int(SCAD_NRATA));
TRecord_array pagsca(key, LF_PAGSCA);
for (int r = pagsca.first_row(); r > 0 && r <= pagsca.last_row(); r = pagsca.succ_row(r))
{
const TRectype& pag = pagsca.row(r);
key.add(r, 6);
const TRectype& part = cache().get(LF_PARTITE, key);
row.format("%6d", lastcf); // Codice cliente
str = part.get(PART_DATADOC); // Data Documento
if (str.blank())
str = part.get(PART_DATAREG);
row.add(str, 1);
row.add(str, 1);
str = part.get(PART_NUMDOC); str.left_just(8);
row.add(str, 2); // Numero Documento
row.add(str, 2); // Numero Documento
row.add(row.get(1), 3); // Data riferimento
str = part.get(PART_NUMPART); str.left_just(8);
row.add(str, 4); // Numero riferimento
row.add(part.get(PART_DATAREG), 5); // Data registrazione
str = part.get(PART_NREG); str.right_just(7);
row.add(str, 6); // Numero registrazione
row.add(str, 6); // Numero registrazione
const int tm = part.get_int(PART_TIPOMOV);
row.add(datascad, 7); // Data scadenza
real imp;
if (tm == 3 && pagsca.rows() == 1 && scad.get_bool(SCAD_PAGATA))
real importo = scad.get_real(SCAD_IMPORTO);
str = part.get(PART_SEZ);
if (importo < ZERO)
{
// Caso semplice: una rata pagata completamene con un solo pagamento
imp = scad.get_real(SCAD_IMPORTO); // Importo pagato = importo da pagare
importo = -importo;
str = str == "D" ? "A" : "D";
}
else
{
imp = pag.get_real(PAGSCA_IMPORTO);
if (tm == 3)
{
if (pag.get_char(PAGSCA_PASSATT) == 'P')
imp += pag.get_real(PAGSCA_ABBUONI);
imp += pag.get_real(PAGSCA_RITENUTE);
imp += pag.get_real(PAGSCA_RITSOC);
}
}
row.add(imp.stringa(10,2), 8); // Importo
row.add(part.get(PART_SEZ), 9); // Dare/Avere
switch (tm)
{
case 2: row.add("EF7#", 10); // Nota di credito
case 5: row.add("EF5#", 10); // Insoluto
default: row.add("EF6#", 10); // Causale pagamento
}
row.add(part.get(PART_DATAPAG), 12); // Data pagamento
row.add(importo.stringa(10,2), 8); // Importo
row.add(str, 9); // Dare/Avere
row.add(str[0] == 'A' ? "EF7#" : "EF1#", 10); // Causale Fattura o Nota credito
movimenti.new_rec(row);
TToken_string key;
key.format("C|0|0|%ld|%d|%s|%d|%d",
lastcf, part.get_int(PART_ANNO), (const char*)part.get(PART_NUMPART),
scad.get_int(SCAD_NRIGA), scad.get_int(SCAD_NRATA));
TRecord_array pagsca(key, LF_PAGSCA);
const bool unico = pagsca.rows() == 1;
for (int r = pagsca.first_row(); r > 0 && r <= pagsca.last_row(); r = pagsca.succ_row(r))
esporta_pagsca(pagsca.row(r), scad, unico, clienti, movimenti, log);
}
}
query.cut(0);
query << "USE PAGSCA SELECT NRIGA=9999"
<< "\nJOIN PART INTO TIPOC==TIPOC SOTTOCONTO==SOTTOCONTO ANNO==ANNO NUMPART==NUMPART"
<< "\nFROM TIPOC=C\nTO TIPOC=C";
TISAM_recordset nonass(query);
if (nonass.items())
{
TString str;
str = log.title();
str << '\n' << TR("Pagamenti non associati a scadenze");
TProgind pi(nonass.items(), str);
const TRectype& pagsca = nonass.cursor()->curr();
const TRectype& part = nonass.cursor()->curr(LF_PARTITE);
const TRectype scad(LF_SCADENZE); // Scadenza nulla
for (bool ok = nonass.move_first(); ok; ok = nonass.move_next())
{
if (!pi.addstatus(1))
break;
TDate data = part.get(PART_DATADOC);
if (!data.ok())
data = part.get_date(PART_DATAREG);
if (data > al || (data < dal && part.get_bool(PART_CHIUSA))) // Ignora vecchia partita chiusa
continue;
esporta_pagsca(pagsca, scad, false, clienti, movimenti, log);
}
}
TString msg;
log.log(0, msg);
@ -304,11 +505,46 @@ bool TPayLine_app::esporta(const TString& dir, const TDate& al, TLog_report& log
<< TR(" al ") << al;
log.log(0, msg);
TFilename fname = dir; fname.add("PLclienti.txt");
clienti.save_as(fname);
TFilename fname_cli = dir; fname_cli.add("PLclienti.txt");
clienti.sort();
clienti.save_as(fname_cli);
fname = dir; fname.add("PLmovimenti.txt");
return movimenti.save_as(fname);
TFilename fname_mov = dir; fname_mov.add("PLmovimenti.txt");
movimenti.sort(sort_mov);
bool done = movimenti.save_as(fname_mov);
if (done && ftp.full())
{
msg.cut(0);
log.log(0, msg);
msg << TR("Invio a ") << ftp;
log.log(0, msg);
TProgind pi(2, msg);
for (int i = 0; done && i < 2; i++)
{
if (!pi.addstatus(1))
break;
const TFilename& fname = i == 0 ? fname_cli : fname_mov;
done = ftp_send(fname, ftp);
if (!done)
{
msg.cut(0) << TR("Impossibile inviare il file ") << fname;
log.log_error(msg);
}
}
}
return done;
}
bool TPayLine_app::create()
{
Tdninst dn;
if (!dn.can_I_run(true))
return error_box(FR("Postazione non abilitata per %s"), (const char*)title());
return TSkeleton_application::create();
}
void TPayLine_app::main_loop()
@ -317,14 +553,15 @@ void TPayLine_app::main_loop()
while (m.run() == K_ENTER)
{
const TString& dir = m.get(101);
const TDate limit = m.get(102);
const TDate limit = m.get(102);
const TString& ftp = m.get(103);
TString tit;
tit << title() << " al " << limit;
TLog_report log(tit);
log.kill_duplicates();
esporta(dir, limit, log);
esporta(dir, ftp, limit, log);
log.preview();
}
}

@ -1,4 +1,4 @@
PAGE "Esportazione PayLine" -1 -1 60 4
PAGE "Esportazione PayLine" -1 -1 60 8
GROUPBOX DLG_NULL 58 4
BEGIN
@ -19,6 +19,15 @@ BEGIN
FLAGS "A"
END
GROUPBOX DLG_NULL 58 3
BEGIN
PROMPT 1 4 "@bSito FTP di destinazione"
END
STRING 103 256 53
BEGIN
PROMPT 2 5 ""
END
STRING DLG_PROFILE 50
BEGIN

@ -155,4 +155,4 @@ Picture = <cg01>
Module = 27
Item_01 = "Proforma", "tc9 -0", ""
Item_02 = "Semetra", "tc8 -0", ""
Item_03 = "PayLine", "tc8 -1", "F"