#include "dbcv.h" #include "dbcv09.h" #include "dbcv00a.h" #include #include #include #include "..\mg\anamag.h" #include "..\mg\mag.h" #include "..\include\doc.h" #include "..\include\rdoc.h" typedef void (*SET_DOC_FUN)(TImport_file & import,TConfig &trans); typedef bool (*FILTER_FUN)(TImport_file & import); class TImporta_mask : public TAutomask { protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: TImporta_mask() :TAutomask("dbcv00a.msk"){} }; bool TImporta_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { return TRUE; } class TImporta_BPCS : public TSkeleton_application { TLocalisamfile * _dist, *_rdist, * _anamag, *_umart, *_codcorr,*_mag; private: void delete_ghosts(); void delete_arts(); bool delete_boms(); int read_last_rdist(const char *item_code); bool read_is_dist(const char *item_code); bool is_ghost(const char *item_code); const char * read_first_um(const char *item_code); bool creadocs(const char * msg, long firm, TImport_file & imp_file, const char *FieldNumDoc, const char *FieldClifor, const char *FieldDataDoc,const char *FieldGroup1, const char *FieldGroup2, const char *FieldGroup3, SET_DOC_FUN set_header, SET_DOC_FUN set_body, FILTER_FUN filter ); void clear_docs(long firm, const char * num, TDate *fromdate=NULL, TDate *todate=NULL); void newums(); protected: virtual bool create(); virtual bool destroy(); bool importa_boms(TMask &m); bool cambia_gmc(TMask & m); bool importa_arts(TMask &m, const bool erase, const bool sologhost=FALSE); bool importa_ums_BP(TMask &m); bool importa_ordacq(TMask & m); bool importa_ordcli(TMask & m); bool importa_ordprod(TMask & m); bool importa_movmag(TMask & m, bool segrate=FALSE, bool trieste=FALSE); protected: virtual void main_loop() ; }; bool TImporta_BPCS::create() { _dist = new TLocalisamfile(LF_DIST); _rdist = new TLocalisamfile(LF_RDIST); _anamag = new TLocalisamfile(LF_ANAMAG); _umart = new TLocalisamfile(LF_UMART); _codcorr = new TLocalisamfile(LF_CODCORR); _mag = new TLocalisamfile(LF_MAG); return TSkeleton_application::create(); } bool TImporta_BPCS::destroy() { delete _dist; delete _rdist; delete _anamag; delete _umart; delete _codcorr; delete _mag; return TSkeleton_application::destroy(); } int TImporta_BPCS::read_last_rdist(const char *item_code) { static TString prevcode=""; static int nrig=0; if (prevcode!=item_code) { prevcode=item_code; nrig=0; _rdist->put("CODDIST",item_code); int err=_rdist->read(_isgteq); while (err==NOERR && _rdist->get("CODDIST")==item_code) { nrig++; err=_rdist->next(); } } return ++nrig; } bool TImporta_BPCS::read_is_dist(const char *item_code) { const TRectype & rec=cache().get(LF_DIST,item_code); if (!rec.empty()) return TRUE; return FALSE; } bool TImporta_BPCS::is_ghost(const char *item_code) { const TRectype & rec=cache().get(LF_DIST,item_code); if (!rec.empty()) return rec.get_bool("VIRTUALE") && !rec.get_bool("ARTPROD")&& !rec.get_bool("ARTACQ") ; return FALSE; } const char * TImporta_BPCS::read_first_um(const char *item_code) { TToken_string key(item_code); key.add(1); const TRectype & rec=cache().get(LF_UMART,key); if (rec.empty()) error_box("Impossibile trovare l'item %s",item_code); return rec.get("UM"); } // cancella gli articoli void TImporta_BPCS ::delete_arts() { TIndwin info(60,"Cancellazione articoli...",FALSE,FALSE); int err; _anamag->first(); for (long i=_anamag->items(); i>0; i--) { _anamag->readat(i); err=_anamag->remove(); if ((i%TICK)==0) do_events(); } } // cancella le distinte che non sono lavorazioni bool TImporta_BPCS ::delete_boms() { bool retv=FALSE; TWait_cursor hourglass; TIndwin info(60,"Cancellazione distinte...",FALSE,FALSE); // distinte for (long i=_dist->items(); i>0; i--) { _dist->readat(i); if (cache().get("LAV",_dist->get("CODDIST")).empty()) { // non e' una lavorazione _dist->remove(); } if ((i%TICK)==0) do_events(); } // righe distinte for (i=_rdist->items(); i>0; i--) { _rdist->readat(i); if (_rdist->get("TIPO")!="L" || _rdist->get("CODCOMP").left(5)=="ACQUA") { // non e' una lavorazione interessante _rdist->remove(); } else { _rdist->put("NRIG",_rdist->get("NRIG")+200); _rdist->rewrite(); retv=TRUE; } if ((i%TICK)==0) do_events(); } return retv; } // elimina i ghost "di servizio" void TImporta_BPCS ::delete_ghosts() { TWait_cursor hourglass; TIndwin info(60,"Cancellazione distinte fantasma inutili...",FALSE,FALSE); TLocalisamfile dist(LF_DIST); _dist->first(); while (!_dist->eof()) { do_events(); if (_dist->get_bool("VIRTUALE") && !_dist->get_bool("ARTPROD")&& !_dist->get_bool("ARTACQ") )// fantasma { TString codice=_dist->get("CODDIST"); if (codice.find("__") < 0) // non appartiene ad uno stabilimento particolare _dist->remove(); } _dist->next(); } } bool TImporta_BPCS ::importa_boms(TMask &m) { TWait_cursor hourglass; cache().flush(LF_DIST); cache().flush(LF_ANAMAG); cache().flush(LF_UMART); TSupport_file morti(LF_DIST,ANAGRAFICA_MORTI); TImport_file boms(m.get(F_PATH), BPCS_DISTINTE); TProgind info(boms.items(),"Importazione distinte...",TRUE,TRUE); TToken_string imported_lcode,dead_lcode,skipped_lcode,current_lcode; TString old_code,item_code,last_code; TString8 impianto,main_imp; int bseq=0; boms.first(); while (!boms.eof()) { info.addstatus(1); if (info.iscancelled()) return FALSE; // converte ogni distinta ancora valida old_code=(boms.get_codice("BPROD")); impianto=(boms.get("BMWHS")); int metodo(int(boms.get_long("BMBOMM"))); current_lcode.add(old_code,0); current_lcode.add(impianto,1); current_lcode.add(metodo,2); const long ddis=boms.get_long("BDDIS"); bool skip=!((ddis==99999999)||(ddis==9999999)||(ddis==999999)||(ddis==99999)); if (skipped_lcode==current_lcode || dead_lcode==current_lcode) skip = TRUE; if (!skip && m.get_bool(F_CHECKDEADARTS)) { morti.put("CODDIST",old_code); if (morti.read()==NOERR) { skip=TRUE; skipped_lcode=current_lcode; } } if (!skip && atol(boms.get("BDEFF"))zero(); _dist->put("CODDIST", old_code); _dist->put("DESCR", descr); _dist->put("VIRTUALE", " "); _dist->put("MASTER", "X"); _dist->put("ARTPROD", "X"); _dist->put("UM", um_f); TString varvar("VARIANTE="); varvar << "_DISTINTA+\"__\"+IF(_IMPIANTO!=\"XT\",_IMPIANTO,_LINEA)" ; _dist->put("PARAMETRI",varvar); int err=_dist->write(); if (err!=_isreinsert) { _rdist->zero(); _rdist->put("CODDIST", old_code); _rdist->put("NRIG", 1 ); _rdist->put("TIPO", "V" ); _rdist->put("CODCOMP", "VARIANTE" ); _rdist->put("UM", ""); _rdist->put("EXPR", 1 ); _rdist->write(); } } } // figlio TString son_code=boms.get_codice("BCHLD"); TString um_s=read_first_um(son_code) ; const bool son_ghost=is_ghost(son_code); if (son_ghost) son_code << "__" << impianto ; // scrivi la bom if (last_code!=item_code) { if (cache().get(LF_DIST,item_code).empty()) { cache().discard(LF_DIST,item_code); descr << " (impianto " << main_imp << ")"; _dist->zero(' '); _dist->put("CODDIST", item_code); _dist->put("DESCR", descr); _dist->put("VIRTUALE", "X" ); _dist->put("ARTPROD", ""); _dist->put("UM", "BP"); if (impianto.left(2)!= "XT") { // l'albero della distinte di un impianto e' su qyell'impianto // i terzisti seguono l'impianto di pianificazione TString varimp("_IMPIANTO="); varimp << '"'<< main_imp <<'"'; _dist->put("PARAMETRI",varimp); } _dist->write(); // fallisce se esiste gia' _umart->zero(' '); _umart->put("CODART",item_code); _umart->put("NRIGA",1); _umart->put("UM",um_f); _umart->put("FC","1"); force_write(*_umart); } last_code=item_code; if (bseq>0 || (impianto != "PD" && impianto != "PR")) bseq=0; } if (impianto == "PD") bseq--; else if (impianto != "PR") bseq++; if (bseq==0) error_box("Numero riga 0 per %s / %s",(const char *)item_code,(const char *)son_code); _rdist->zero(' '); _rdist->put("CODDIST", item_code); _rdist->put("NRIG", bseq >0 ? bseq : -bseq); if (son_ghost) _rdist->put("TIPO", "D"); else if (son_code=="ACQUA" || son_code=="ACQUADEION") _rdist->put("TIPO", "L"); else _rdist->put("TIPO", "A"); _rdist->put("CODCOMP", son_code ); _rdist->put("UM", um_s); _rdist->put("EXPR", boms.get_real("BQREQ") ); _rdist->write(); imported_lcode=current_lcode; } while (impianto == "PD"); } boms.next(); } delete_ghosts(); return TRUE; } void TImporta_BPCS ::newums() { _dist->first(); TString item_code,ghostcode; while (!_dist->eof()) { if (_dist->get_bool("VIRTUALE") && !_dist->get_bool("ARTPROD")&& !_dist->get_bool("ARTACQ") )// fantasma { item_code=_dist->get("CODDIST"); int pos=item_code.find("__"); if (pos>=0) { ghostcode=item_code; ghostcode.cut(pos); _umart->zero(); _umart->put("CODART",ghostcode); _umart->put("NRIGA",1); if (_umart->read()==NOERR) { _umart->put("CODART",item_code); force_write(*_umart); } } } _dist->next(); } } // importa le ums dal file di anagrafica bool TImporta_BPCS ::importa_arts(TMask & m, const bool erase, const bool sologhost) { TWait_cursor hourglass; cache().flush(LF_ANAMAG); cache().flush(LF_DIST); cache().flush(LF_UMART); if (erase) delete_arts(); TSupport_file morti(LF_DIST,ANAGRAFICA_MORTI); TImport_file items_ext(m.get(F_PATH),BPCS_IMPORTEX); TImport_file items(m.get(F_PATH),BPCS_ANAGRAFICA); TString item_code,item_type,tmp; bool skip; TProgind info(items.items(),sologhost ? "Importazione distinte fantasma...":"Importazione articoli e distinte fantasma...",TRUE,TRUE); items_ext.first(); items.first(); while (!items.eof()) { info.addstatus(1); if (info.iscancelled()) return FALSE; item_type=items.get("IITYP"); if (items.get("IID")=="IM" && atoi(item_type)!=6) { item_code=items.get_codice("IPROD"); skip=FALSE; // sincronizza il file dell'anagrafica Importex while (!sologhost && items_ext.get_codice("MSITE")zero(); _dist->put("CODDIST",item_code); _dist->put("DESCR",items.get("IDESC")); _dist->put("VIRTUALE", "X" ); _dist->put("ARTPROD", " "); force_write(*_dist); } else { _anamag->zero(); _anamag->put( ANAMAG_CODART,item_code); _anamag->put( ANAMAG_DESCR,items.get("IDESC")); _anamag->put( ANAMAG_DESCRAGG,items.get("IDSCE")); _anamag->put( ANAMAG_CODFORN, items.get("IVEND")); _anamag->put( ANAMAG_UMP, "KG"); _anamag->put( ANAMAG_PESO, items.get("IWGHT")); // riordino _anamag->put( ANAMAG_RIORDINO , "F"); //_anamag->put( ANAMAG_RIORDINO , items.get("IMRP")=="M" ? "F" : "P" ); _anamag->put( ANAMAG_GIORNIRIOR, items.get("ILEAD")); _anamag->put( ANAMAG_LOTTORIOR, items.get("ILOTS")); _anamag->put( ANAMAG_LOTTOIRIOR, items.get("IIOQ")); // _anamag->put( ANAMAG_PPCONF , items.get("IFII")); _anamag->put( ANAMAG_PPCOLLO , items.get("IFII")); TString16 gmc=items.get("IITYP"); switch (gmc[0]) { case 'F': case 'E': case 'Z': case 'G': gmc[0]= 'F'; break; case 'M': gmc[0]= 'S'; break; case 'P': gmc[0]= 'C'; break; } TString16 iclas(items.get("ICLAS")); if (!iclas.blank()) { switch (m.get(F_ICLAS)[0]) { case 'S': complete_gmc(gmc, iclas); break; case 'C': gmc << iclas; break; case ' ': break; } } _anamag->put( ANAMAG_GRMERC,gmc); _anamag->put( ANAMAG_COSTSTD, items.get("ISCST")); _anamag->put( ANAMAG_ULTCOS1, items.get("IACST")); tmp=items.get("TAXC1"); if (tmp.left(3)=="IVA") tmp=tmp.sub(3); _anamag->put( ANAMAG_CODIVA , tmp); if (items_ext.get_codice("MSITE")==items.get_codice("IPROD")) { _anamag->put( ANAMAG_CLASSDOG , check_clasdog(items_ext.get_long("MSTDO"))); _anamag->put( ANAMAG_USER1 , items_ext.get("MSIDR"));// idrati _anamag->put( ANAMAG_USER2 , items_ext.get("MSANI"));//anidri _anamag->put( ANAMAG_USER3 , items_ext.get("MSTAL"));//alcool // dimensioni _anamag->put( ANAMAG_USER4, items_ext.get("MSPLU")); _anamag->put( ANAMAG_USER5, items_ext.get("MSPAL")); _anamag->put( ANAMAG_USER6, items_ext.get("MSPPR")); // composizione pallets _anamag->put( ANAMAG_USER7, items_ext.get("MSCST")); // casse per strato _anamag->put( ANAMAG_USER8, items_ext.get("MSSTP")); // strati per pallet } force_write(*_anamag); real smin(items.get("IMIN")); if (smin!=ZERO) { _mag->zero(); _mag->put(MAG_SCORTAMIN,smin); _mag->put(MAG_ANNOES,"1999"); _mag->put(MAG_CODART,item_code); _mag->put(MAG_NRIGA,1); _mag->put(MAG_CODMAG,"SE1"); force_write(*_mag); _mag->put(MAG_NRIGA,2); _mag->put(MAG_CODMAG,"TS1"); force_write(*_mag); } } TString16 um,ums(items.get("IUMS")); real fc; int nriga=1; for (int u=0; u<3; u++) { switch (u) { case 1: um=items.get("IUMP"); fc=items.get_real("IUMCN"); break; case 2: um=items.get("IUMR"); fc=items.get_real("IUMRC"); break; default: um=ums; fc=1.0; } if (!um.blank() && (u==0 || um!=ums)) { _umart->zero(); _umart->put("CODART",item_code); _umart->put("NRIGA",nriga); _umart->put("UM",um); if (nriga==1) _umart->put("PREZZO",items.get("ILIST")); _umart->put("FC",fc); force_write(*_umart); nriga++; } } // fine ciclo unita' di misura long ean=items.get_long("IDRAW"); if (!m.get(F_EAN).blank()) { TString16 eancode=items.get("IDRAW"); if (ean!=0L || (eancode[0]>='A' && eancode[0]<='Z' && atol(eancode.sub(1))!=0L)) { _codcorr->zero(); _codcorr->put("CODARTALT",eancode); _codcorr->put("NRIGA",1); _codcorr->put("TIPO",m.get(F_EAN)); _codcorr->put("CODART",item_code); force_write(*_codcorr); } } } } items.next(); } return TRUE; } bool TImporta_BPCS ::cambia_gmc(TMask & m) { TWait_cursor hourglass; cache().flush(LF_ANAMAG); cache().flush(LF_DIST); cache().flush(LF_UMART); TImport_file items_ext(m.get(F_PATH),BPCS_IMPORTEX); TImport_file items(m.get(F_PATH),BPCS_ANAGRAFICA); TString item_code,item_type,tmp; TProgind info(items.items(),"Importazione gruppi merceologici e classi doganali",TRUE,TRUE); items_ext.first(); items.first(); while (!items.eof()) { info.addstatus(1); if (info.iscancelled()) return FALSE; item_type=items.get("IITYP"); if (items.get("IID")=="IM" && atoi(item_type)!=6) { item_code=items.get_codice("IPROD"); if (item_type!="0") // fantasma { _anamag->zero(); _anamag->put( ANAMAG_CODART,item_code); if (_anamag->read()==NOERR) { // sincronizza il file dell'anagrafica Importex while (items_ext.get_codice("MSITE")put( ANAMAG_CLASSDOG , cld); } TString16 gmc=items.get("IITYP"); switch (gmc[0]) { case 'F': case 'E': case 'Z': case 'G': gmc[0]= 'F'; break; // finiti case 'M': gmc[0]= 'S'; break; // semilavorati () case 'P': gmc[0]= 'C'; break; // componenti (parts) } TString16 iclas(items.get("ICLAS")); if (!iclas.blank()) { switch (m.get(F_ICLAS)[0]) { case 'S': complete_gmc(gmc, iclas); break; case 'C': gmc << iclas; break; case ' ': break; } } _anamag->put( ANAMAG_GRMERC,gmc); _anamag->rewrite(); } } } items.next(); } return TRUE; } // importa le ums dal file dei divisori bool TImporta_BPCS ::importa_ums_BP(TMask & m) { TWait_cursor hourglass; cache().flush(LF_UMART); TImport_file divisori(m.get(F_PATH),BPCS_DIVISORI); TProgind info(divisori.items(),"Importazione divisori (batch di produzione)...",TRUE,TRUE); divisori.first(); TString item_code,impianto; while (!divisori.eof()) { info.addstatus(1); if (info.iscancelled()) return FALSE; impianto=divisori.get("ICFAC"); if (impianto=="SE" || impianto == "TS") { for (int falsi_terzisti=0;falsi_terzisti<3; falsi_terzisti++) { item_code=(divisori.get_codice("ICPROD")); item_code << "__"; switch (falsi_terzisti) { case 1: item_code << "PD"; break; case 2: item_code << "PR"; break; default: item_code << impianto; break; } if (read_is_dist(item_code)) { _umart->zero(); _umart->put("CODART",item_code); _umart->put("NRIGA",2); _umart->put("UM","BP"); _umart->put("FC",divisori.get("ICBTCH")); force_write(*_umart); } } } divisori.next(); } return TRUE; } void TImporta_BPCS ::clear_docs(long firm, const char * num, TDate *fromdate, TDate *todate) { TConfig *trans=NULL; long ntransac=0; // rimuove le transazioni delete_files("ND_*.ini"); TString codnum(num); TLocalisamfile doc(LF_DOC); TLocalisamfile rdoc(LF_RIGHEDOC); for (int anno=1998; anno<=1999; anno++) { TDate docdate(doc.get_date("DATADOC")); doc.put(DOC_PROVV,"D"); doc.put(DOC_ANNO,anno); doc.put(DOC_CODNUM,codnum); doc.read(_isgteq); while (!doc.eof() && doc.get("CODNUM")==codnum) { if (!fromdate || fromdate->empty() || doc.get_date("DATADOC")>=*fromdate) if (!todate || todate->empty() || doc.get_date("DATADOC")<=*todate) { ntransac++; if (trans) delete trans; trans = new TConfig(format("ND_%05d.ini",ntransac)); trans->set_paragraph("Transaction"); trans->set("Action","DELETE"); trans->set("Mode","AUTO"); trans->set("Firm",firm); trans->set_paragraph(format("%d",LF_DOC)); trans->set(DOC_PROVV,doc.get(DOC_PROVV)); trans->set(DOC_ANNO,doc.get(DOC_ANNO)); trans->set(DOC_CODNUM,doc.get(DOC_CODNUM)); trans->set(DOC_NDOC,doc.get(DOC_NDOC)); } doc.read(_isnext); } } if (trans) { delete trans; // genera i documenti TExternal_app gestdoc("ve0.exe -1 -iND_*.INI"); gestdoc.run(); } } bool TImporta_BPCS ::creadocs(const char * msg, long firm, // ditta TImport_file & imp_file, const char *FieldNumDoc, const char *FieldClifor, const char *FieldDataDoc, const char *FieldGroup1, const char *FieldGroup2, const char *FieldGroup3, SET_DOC_FUN set_header, SET_DOC_FUN set_body, FILTER_FUN filter ) { TProgind info(imp_file.items(),msg,TRUE,TRUE); TConfig *trans=NULL; int nblock=1; long ntransac=0; int nrigadoc=0; // rimuove le transazioni delete_files("ND_*.ini"); imp_file.first(); while (!imp_file.eof() ) { long last_ndoc=-1L; TDate last_date(""); long last_clifor=-1L; TString last_group1=""; TString last_group2=""; TString last_group3=""; while (!imp_file.eof()) { info.addstatus(1); if (info.iscancelled()) return FALSE; if (filter(imp_file)) { long new_ndoc =FieldNumDoc ? imp_file.get_long(FieldNumDoc) : last_ndoc; long new_clifor=FieldClifor ? imp_file.get_long(FieldClifor) : last_clifor; if (new_clifor==0L && FieldClifor) new_clifor=9999; // cliente generico TDate new_date(FieldDataDoc ? imp_file.get_long(FieldDataDoc) : 0L); TString new_group1=FieldGroup1 ? imp_file.get(FieldGroup1) : last_group1; TString new_group2=FieldGroup2 ? imp_file.get(FieldGroup2) : last_group2; TString new_group3=FieldGroup3 ? imp_file.get(FieldGroup3) : last_group3; if (nrigadoc>99 || (last_ndoc != new_ndoc) || (last_date != new_date ) || (last_clifor != new_clifor )|| (last_group1 != new_group1 )|| (last_group2 != new_group2 )|| (last_group3 != new_group3 )) { if (ntransac==nblock*100) { break; } // emetti il doc // reset if (new_ndoc>0L) last_ndoc=new_ndoc; if (new_clifor>0L) last_clifor=new_clifor; if (!new_group1.blank()) last_group1=new_group1; if (!new_group2.blank()) last_group2=new_group2; if (!new_group3.blank()) last_group3=new_group3; if (!new_date.empty()) last_date=new_date; if (trans) delete trans; trans = new TConfig(format("ND_%05d.INI",ntransac)); trans->set_paragraph("Transaction"); trans->set("Action","INSERT"); trans->set("Mode","AUTO"); trans->set("Firm",firm); trans->set_paragraph(format("%d",LF_DOC)); if (new_ndoc>0) trans->set(DOC_NDOC,new_ndoc); if (new_date.empty()) new_date=TODAY; trans->set(DOC_DATADOC, new_date); trans->set(DOC_TIPOCF,"F"); if (new_clifor>0L) trans->set(DOC_CODCF,new_clifor); trans->set(DOC_PROVV,"D"); set_header(imp_file, *trans); nrigadoc=0; ntransac++; } // righe nrigadoc++; trans->set_paragraph(format("%d,%d",LF_RIGHEDOC, nrigadoc)); set_body(imp_file, *trans); } imp_file.next(); } if (trans) { delete trans; trans=NULL; // genera i documenti TString cmd("ve0.exe -1 -i"); cmd << format("ND_%03d*.INI",nblock-1) ; TExternal_app gestdoc((const char *)cmd); gestdoc.run(); nblock++; } } return TRUE; } void set_head_F_ordcli(TImport_file & import, TConfig &trans) { trans.set(DOC_ANNO,import.get_date("FRDTE").year()); trans.set(DOC_CODNUM,(import.get("FPFAC")=="SE") ? "SEOC": "TSOC"); trans.set(DOC_TIPODOC,"ORC"); TDate dc(import.get_date("FRDTE")); round_date(dc,28,TRUE); trans.set(DOC_DATACONS, dc);// stessa data del doc } void set_body_F_ordcli(TImport_file &import, TConfig &trans) { TToken_string tmp; trans.set(RDOC_TIPORIGA,"01"); tmp =import.get_codice("FPROD"); trans.set(RDOC_CODART,tmp); trans.set(RDOC_DESCR,cache().get(LF_ANAMAG,tmp).get("DESCR")); tmp.add("1"); trans.set(RDOC_PREZZO,cache().get(LF_UMART,tmp).get("PREZZO")); trans.set(RDOC_UMQTA,cache().get(LF_UMART,tmp).get("UM")); trans.set(RDOC_QTA,import.get_real("FQTY")); // gia' suddivisa su doc : trans.set(RDOC_DATACONS, import.get_date("FDATE")); tmp=import.get("FPFAC"); tmp << 1; trans.set(RDOC_CODMAG,tmp); } bool filter_F_ordcli(TImport_file & import) { bool ok= import.get("FID")=="FP" && import.get("FTYPE")=="F"; if (ok) { char type = cache().get(LF_ANAMAG,import.get_codice("FPROD")).get(ANAMAG_GRMERC)[0]; ok = (type== 'F'); } return ok; } void set_head_R_ordcli(TImport_file & import, TConfig &trans) { trans.set(DOC_ANNO,import.get_date("SRDTE").year()); trans.set(DOC_CODNUM,(import.get("SOFAC")=="SE") ? "SEOC": "TSOC"); trans.set(DOC_TIPODOC,"ORC"); TDate dc(import.get_date("SRDTE")); round_date(dc,28,TRUE); trans.set(DOC_DATACONS, dc);// stessa data del doc } void set_body_R_ordcli(TImport_file &import, TConfig &trans) { TToken_string tmp; trans.set(RDOC_TIPORIGA,"01"); tmp =import.get_codice("SPROD"); trans.set(RDOC_CODART,tmp); trans.set(RDOC_DESCR,cache().get(LF_ANAMAG,tmp).get("DESCR")); tmp.add("1"); trans.set(RDOC_PREZZO,cache().get(LF_UMART,tmp).get("PREZZO")); trans.set(RDOC_UMQTA,cache().get(LF_UMART,tmp).get("UM")); trans.set(RDOC_QTA,import.get_real("SQREQ")); trans.set(RDOC_QTAEVASA,import.get_real("SQFIN")); tmp=import.get("SOFAC"); tmp << 1; trans.set(RDOC_CODMAG,tmp); } bool filter_R_ordcli(TImport_file & import) { bool ok=import.get("SID")=="SO"; if (ok) { char type = cache().get(LF_ANAMAG,import.get_codice("SPROD")).get(ANAMAG_GRMERC)[0]; ok = (type== 'F'); } return ok; } // ordini di produzione void set_head_F_ordprod(TImport_file & import, TConfig &trans) { trans.set(DOC_ANNO,import.get_date("FRDTE").year()); trans.set(DOC_CODNUM,(import.get("FPFAC")=="SE") ? "MSP": "TSMP"); trans.set("TIPODOC","ORP"); TDate today(TODAY),dc(import.get_date("FRDTE")); TDate rdt(import.get_date("FRSDT")); if (rdt.ok() && rdt != 99999999L && rdt > dc) dc = rdt; if (dc < today) if (1 || yesno_box("Data ordine di produzione per l'articolo %s inferiore a quella attuale: posticipo ?",(const char *) import.get("FPROD"))) dc = today; round_date(dc,28,TRUE); TDate dd(trans.get(DOC_DATADOC)); if (dc < dd ) trans.set(DOC_DATADOC, dc); trans.set(DOC_DATACONS, dc); } void set_body_F_ordprod(TImport_file &import, TConfig &trans) { TToken_string tmp,tmp2; trans.set(RDOC_TIPORIGA,"01"); tmp =import.get_codice("FPROD"); trans.set(RDOC_CODART,tmp); trans.set(RDOC_DESCR,cache().get(LF_ANAMAG,tmp).get("DESCR")); tmp.add("1"); trans.set(RDOC_PREZZO,cache().get(LF_UMART,tmp).get("PREZZO")); trans.set(RDOC_UMQTA,cache().get(LF_UMART,tmp).get("UM")); tmp=import.get("FPFAC"); codimp2codmagdep(tmp, atoi(import.get("FPBOMM")), tmp2); trans.set(RDOC_IMPIANTO,tmp); trans.set(RDOC_CODMAG,tmp2); trans.set(RDOC_QTA,import.get_real("FQTY")); trans.set(RDOC_QTAEVASA,"0"); } bool filterFordprodSE(TImport_file & import) { bool ok= import.get("FID")=="FP" && import.get("FPFAC")=="SE" && import.get("FTYPE")=="F"; if (ok) { const TRectype &art= cache().get(LF_ANAMAG,import.get_codice("FPROD")); char type = art.get(ANAMAG_GRMERC)[0]; if (art.empty()) { if (yesno_box("Articolo non trovato:%s. Lo considero ugualmente come prodotto finito?",(const char *)import.get_codice("FPROD"))) type = 'F'; } ok = (type== 'F' || type== 'S' ); } return ok; } void set_head_R_ordprod(TImport_file & import, TConfig &trans) { trans.set(DOC_ANNO,import.get_date("SRDTE").year()); trans.set("CODNUM",(import.get("SOFAC")=="SE") ? "MSP": "TSMP"); trans.set("TIPODOC","ORP"); TDate today(TODAY),dc(import.get_date("SDDTE")); TDate rdt(import.get_date("SRSDT")); if (rdt.ok() && rdt != 99999999L && rdt > dc) dc = rdt; if (dc < today) if (1 || yesno_box("Data ordine di produzione %ld per l'articolo %s inferiore a quella attuale: posticipo ?",import.get_long("SORD"),(const char *) import.get("SPROD"))) dc = today; round_date(dc,28,TRUE); TDate dd(trans.get(DOC_DATADOC)); if (dc < dd ) trans.set(DOC_DATADOC, dc); trans.set(DOC_DATACONS, dc); } void set_body_R_ordprod(TImport_file &import, TConfig &trans) { TToken_string tmp,tmp2; trans.set(RDOC_TIPORIGA,"01"); tmp =import.get_codice("SPROD"); trans.set(RDOC_CODART,tmp); trans.set(RDOC_DESCR,cache().get(LF_ANAMAG,tmp).get("DESCR")); tmp.add("1"); trans.set(RDOC_PREZZO,cache().get(LF_UMART,tmp).get("PREZZO")); trans.set(RDOC_UMQTA,cache().get(LF_UMART,tmp).get("UM")); tmp=import.get("SOFAC"); codimp2codmagdep(tmp, atoi(import.get("SOBOMM")), tmp2); trans.set(RDOC_IMPIANTO,tmp); trans.set(RDOC_CODMAG,tmp2); tmp=import.get("SOFAC"); set_workcenter_code(tmp2, tmp, import.get_long("SWRKC"), int(import.get_long("SOBOMM"))) ; trans.set(RDOC_LINEA,tmp2); if (tmp2.left(3)=="X07") // ex terzista cover { if (tmp2.right(2)=="SE") tmp="PR"; else tmp="PD"; trans.set(RDOC_IMPIANTO,tmp); tmp << "01M"; trans.set(RDOC_LINEA,tmp); } real totale = import.get_real("SQREQ"); real evasa = import.get_real("SQFIN"); trans.set(RDOC_QTA,totale); trans.set(RDOC_QTAEVASA,evasa); add_stdlabors(import.get_codice("SPROD"), import.get_long("SWRKC"), int(import.get_long("SOBOMM"))); } bool filterRordprodSE(TImport_file & import) { bool ok=(import.get("SID")=="SO" && import.get("SOFAC")=="SE"); if (ok) { real totale = import.get_real("SQREQ"); totale-= import.get_real("SQFIN"); ok = (totale > ZERO); if (ok) { char type = cache().get(LF_ANAMAG,import.get_codice("SPROD")).get(ANAMAG_GRMERC)[0]; ok = (type== 'F'||type== 'S'); } } return ok; } void set_head_ordacq(TImport_file & import, TConfig &trans) { TString codimp; int nummag=(atoi(import.get_date("PWHSE"))) ; num_mag2main_imp(nummag, codimp); TDate dc(import.get_date("PDDTE")); TDate dd(import.get_date("PEDTE"));//data doc if (dc < dd ) dd=dc; trans.set(DOC_DATADOC, dd); trans.set(DOC_DATACONS, dc); trans.set(DOC_ANNO,dd.year()); trans.set("CODNUM",(codimp=="SE") ? "SEOF": "TSOF"); trans.set("TIPODOC","ORF"); } void set_body_ordacq(TImport_file &import, TConfig &trans) { TToken_string tmp,tmp2; trans.set(RDOC_TIPORIGA,"01"); tmp=import.get_codice("PPROD"); trans.set(RDOC_CODART,tmp); trans.set(RDOC_DESCR,cache().get(LF_ANAMAG,tmp).get("DESCR")); //trans.set(RDOC_PREZZO,import.get("POLIST")); trans.set(RDOC_UMQTA,import.get("PUM")); int nummag=(atoi(import.get_date("PWHSE"))) ; num_mag2main_imp(nummag, tmp); tmp << "1"; trans.set(RDOC_CODMAG,tmp); trans.set(RDOC_QTA,import.get("PQORD")); trans.set(RDOC_QTAEVASA,import.get("PQREC")); } bool filter_ordacq(TImport_file & import) { TString codimp; int nummag=(atoi(import.get_date("PWHSE"))) ; num_mag2main_imp(nummag, codimp); bool ok =(codimp == "SE" ||codimp == "TS" ); if (!ok) error_box("Ordine di acquisto sull'impianto %s",(const char *)codimp); return ok; } void set_head_movmag(TImport_file & import, TConfig &trans) { long codcli=atol(import.get("TVEND")); int magno=atoi(import.get("TWHS")); char cod0=*((const char * )import.get("TTYPE")); char cod1=*((const char * )import.get("TTYPE")+1); if (magno == 25 || magno == 27) { cod1=cod0; cod0='V'; // codice fittizio per simulare la vendita import.put("TTYPE", "V"); if (magno == 25) magno = 26; else magno = 28; } TString codimp; num_mag2main_imp(magno, codimp); TString codnum,tipodoc, causmag, descrmov; codnum=codimp; long numdoc=0L;// riassegno qui il numdoc , per usare il nummag al suo posto come ragguppatore nel ciclo di crea_docs switch (cod0) { case 'O': // completed; descrmov="Movimento di apertura di inizio esercizio"; codnum << "DI"; causmag="RIMI"; tipodoc = "__O"; codcli=0L; break; case 'A': // completed descrmov="Differenza inventariale"; codnum << "DI"; tipodoc = "__A"; codcli=0L; break; case '0': // completed; descrmov="Carico prodotti finiti da terzi"; codnum << "BE"; causmag="CFAL"; break; case 'C': // completed; CHECKS(cod1=='3',"Causale sconosciuta :%s",cod0); descrmov="Scarico componenti terzisti"; codnum << "MM"; tipodoc = "__C3"; trans.set(DOC_TIPOCF,"F"); break; case 'M': if (cod1=='\0') // completed; { descrmov="Consuntivazione produzione"; codnum << "BP"; tipodoc = "BPR"; } else { descrmov="Produzione semilavorati per sconfezionamento "; codnum << "BP"; tipodoc = "BPR1"; } codcli=0L; break; case 'U': if (cod1=='\0') // completed; { descrmov="Acquisto merce"; causmag="ACQO"; // acquisto ordine codnum << "BA"; } else { descrmov="Reso su acquisto"; causmag="REAO"; // reso su acquisto ordine codnum << "RF"; } break; case 'I': // confirmed descrmov="Scarico componenti "; codnum << "MM"; tipodoc = "__I"; break; case 'T': // to be confirmed codnum << "MM"; descrmov="Trasferimento merce"; codcli=0L; tipodoc = "__T"; break; case 'X': // completed; codnum << "MM"; if (cod1=='7') { descrmov="Scarico manuale"; } else if (cod1=='8') { descrmov="Carico manuale"; } else { descrmov="Scarico per campionatura"; } codcli=0L; break; case 'V': // completed; descrmov="Vendita da BPCS (simulata con scarico magazzini 25-27)"; codnum << "MM"; if (cod1=='T') causmag="VNUSC"; // vendo stornando una uscita else causmag="VNENT"; // vendo contemporaneamente ad una entrata break; case 'R': // completed; if (cod1=='D') { codnum << "MM"; descrmov="Cambio codice"; codcli=0L; tipodoc = "__RD"; } break; } descrmov << '(' <= ZERO) causmag="CAR"; else { qta = -qta; causmag="SCAR"; } break; case 'O': case 'U': case 'V': break; } trans.set(RDOC_CAUSMAG,causmag); trans.set(RDOC_QTA, qta.string()); } bool filter_movmag(TImport_file & import) { const long codmag=import.get_long("TWHS"); if (!import.get("TWHS").blank() ) { if (import.get_real("TQTY")!=ZERO) { const char cod0=*(const char * )import.get("TTYPE"); if ((codmag == 25 || codmag == 27) && cod0 == 'X') return FALSE; // importa solo i magazzini non fittizi switch (cod0) { case 'O': case 'A': case '0': case 'C': case 'M': case 'U': case 'I': case 'T': case 'X': case 'R': return TRUE; break; default: fatal_box("Causale sconosciuta :%s",(const char * )import.get("TTYPE")); } } } return FALSE; } bool filter_movmagSE(TImport_file & import) { TString codimp; int magno=atoi(import.get("TWHS")); num_mag2main_imp(magno, codimp); return codimp=="SE" && filter_movmag(import); } bool filter_movmagTS(TImport_file & import) { TString codimp; int magno=atoi(import.get("TWHS")); num_mag2main_imp(magno, codimp); return codimp=="TS"; } bool TImporta_BPCS ::importa_ordacq(TMask & m) { long firm =get_firm(); clear_docs(firm,"SEOF"); clear_docs(firm,"TSOF"); TImport_file ordacq(m.get(F_PATH),BPCS_ORDACQ); return creadocs("Importazione ordini di acquisto..",firm,ordacq, "PORD","PVEND",NULL,NULL,NULL,NULL, set_head_ordacq,set_body_ordacq,filter_ordacq); } bool TImporta_BPCS ::importa_ordcli(TMask & m) { long firm =get_firm(); clear_docs(firm,"SEOC"); clear_docs(firm,"TSOC"); TImport_file released_orders(m.get(F_PATH),BPCS_SHOPORDS); bool ok = creadocs("Importazione ordini cliente (1)..",firm,released_orders, NULL,"SCUST","SRDTE","SOFAC",NULL,NULL, set_head_R_ordcli,set_body_R_ordcli,filter_R_ordcli); TImport_file firm_orders(m.get(F_PATH),BPCS_FIRMORD); ok = ok && creadocs("Importazione ordini cliente (2)..",firm,firm_orders, NULL,"FPPVND","FRDTE","FPFAC",NULL,NULL, set_head_F_ordcli,set_body_F_ordcli,filter_F_ordcli); return ok; } bool TImporta_BPCS ::importa_ordprod(TMask & m) { long firm =get_firm(); if (yesno_box("Cancello gli ordini MSP?")) clear_docs(firm,"MSP"); clear_docs(firm,"SEFA"); TImport_file released_orders(m.get(F_PATH),BPCS_SHOPORDS); bool ok = creadocs("Importazione ordini di produzione Segrate (Released)..",firm,released_orders, "SORD",NULL,"SRDTE","SOFAC",NULL,NULL, set_head_R_ordprod,set_body_R_ordprod,filterRordprodSE); TImport_file firm_orders(m.get(F_PATH),BPCS_FIRMORD); ok = ok && creadocs("Importazione ordini di produzione Segrate (Firm Planned)..",firm,firm_orders, NULL,NULL,"FRDTE","FPFAC",NULL,NULL, set_head_F_ordprod,set_body_F_ordprod,filterFordprodSE); return ok; } bool TImporta_BPCS ::importa_movmag(TMask & m, bool segrate, bool trieste) { long firm =get_firm(); TFilename source(m.get(F_MOVMAG_FILE)); if (source.blank()) source=BPCS_MOVMAG; TDate fromdate(m.get(F_MOVMAG_FROMD)); TDate todate(m.get(F_MOVMAG_TOD)); TImport_file movmag(m.get(F_PATH),source); if (yesno_box("Controllo la presenza di locazioni sconosciute?")) { if (!check_mag_locations(m.get(F_PATH),source)) return FALSE; } bool ok = TRUE; if (segrate) { clear_docs(firm, "SEBA",&fromdate,&todate); clear_docs(firm, "SEBE",&fromdate,&todate); clear_docs(firm, "SEBT",&fromdate,&todate); clear_docs(firm, "SEBU",&fromdate,&todate); clear_docs(firm, "SEBV",&fromdate,&todate); clear_docs(firm, "SEDI",&fromdate,&todate); clear_docs(firm, "SEMM",&fromdate,&todate); clear_docs(firm, "SERF",&fromdate,&todate); ok &= creadocs("Importazione movimenti magazzino di Segrate..",firm, movmag, NULL,"TVEND","TTDTE","TTYPE","TREF",NULL, set_head_movmag,set_body_movmag,filter_movmagSE); } if (trieste) { clear_docs(firm, "TSBA",&fromdate,&todate); clear_docs(firm, "TSBE",&fromdate,&todate); clear_docs(firm, "TSBT",&fromdate,&todate); clear_docs(firm, "TSBU",&fromdate,&todate); clear_docs(firm, "TSBV",&fromdate,&todate); clear_docs(firm, "TSDI",&fromdate,&todate); clear_docs(firm, "TSMM",&fromdate,&todate); clear_docs(firm, "TSRF",&fromdate,&todate); ok &= creadocs("Importazione movimenti magazzino di Trieste..",firm, movmag, NULL,"TVEND","TTDTE","TTYPE","TREF",NULL, set_head_movmag,set_body_movmag,filter_movmagTS); } return ok; /*bool creadocs( ........ char *FieldNumDoc,char *FieldClifor,char *FieldDataDoc, char *Group ...........)*/ } void TImporta_BPCS ::main_loop() { TImporta_mask m; m.field(F_PATH).set("E:\\bpcs\\"); while (m.run()!=K_QUIT) { bool ok=TRUE; bool lavs_rinumerate=FALSE; if (m.get_bool(F_ARTS)) { if (m.get_bool(F_CHANGEGMC)) ok|=cambia_gmc(m); else { if (m.get_bool(F_BOMS)) lavs_rinumerate = delete_boms(); ok|=importa_arts(m, m.get_bool(F_ERASE_ARTS), FALSE); // articoli e distinte virtuali fantasma } } if (m.get_bool(F_BOMS)) { if (!m.get_bool(F_ARTS)) { if (yesno_box("Azzero le distinte e importo i ghost dall'anagrafica?")) { lavs_rinumerate = delete_boms(); ok|=importa_arts(m, m.get_bool(F_ERASE_ARTS), TRUE); // importa distinte virtuali fantasma } } ok|=importa_boms(m); if (lavs_rinumerate || yesno_box("Rinumero le distinte ?" )) rinumera_dist(); if (yesno_box("Setto gli articolo MASTER per il MSP a 2 livelli ?")) build2levmsp(); } if (m.get_bool(F_DIVS)) ok|=importa_ums_BP(m); if (m.get_bool(F_ORDACQ)) ok|=importa_ordacq(m); if (m.get_bool(F_ORDPROD)) ok|=importa_ordprod(m); if (m.get_bool(F_ORDCLI)) if (noyes_box("Gli ordini cliente dovrebbero essere inseriti a mano; confermi l'importazione?")) ok|=importa_ordcli(m); if (m.get_bool(F_MOVMAG)) ok|=importa_movmag(m,m.get_bool(F_MOVMAG_SE),m.get_bool(F_MOVMAG_TS)); if (ok) message_box("Operazione conclusa"); else message_box("Operazione interrotta"); } } int dbcv00(int argc, char* argv[]) { TString name; TImporta_BPCS dt; dt.run(argc, argv, "Importazione archivi da BPCS"); return 0; }