Source of file api.banksta2.php
Size: 167,155 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.banksta2.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120 | <?php /** * Bank statements processing class */ class Banksta2 { /** * UbillingConfig object placeholder * * @var null */ protected $ubConfig = null; /** * Billing API object placeholder * * @var null */ protected $billing = null; /** * System message helper object placeholder * * @var null */ protected $messages = null; /** * UbillingCache instance placeholder * * @var null */ protected $ubCache = null; /** * Placeholder for BANKSTA2_CACHE_LIFETIME from alter.ini * * @var int */ protected $cacheLifeTime = 900; /** * List of allowed extensions * * @var array */ protected $allowedExtensions = array("txt", "csv", "dbf", "xls", "xlsx"); /** * Field mapping presets represented as [preset_id] => array[] of options * * @var array */ protected $fieldsMappingPresets = array(); /** * Default payment ID to push Internet banksta payments * * @var int */ protected $inetPaymentId = 1; /** * Default payment ID to push UKV banksta payments * * @var int */ protected $ukvPaymentId = 2; /** * Service types placeholder * * @var array */ protected $bankstaServiceType = array(); /** * Already preprocessed banksta records from BANKSTA2_TABLE * * @var array */ protected $bankstaRecordsAll = array(); /** * Already preprocessed banksta records IDs from BANKSTA2_TABLE * * @var array */ protected $bankstaRecordsAllIDs = array(); /** * Contains available Inet users data as login => userdata * * @var array */ protected $allUsersDataInet = array(); /** * Contains available UKV users data as login => userdata * * @var array */ protected $allUsersDataUKV = array(); /** * Contains available Inet users contracts mappings as contract => login * * @var array */ protected $allContractsInet = array(); /** * Contains available UKV users contracts mappings as contract => login * * @var array */ protected $allContractsUKV = array(); /** * Contains available UKV tariffs mappings as id => data * * @var array */ protected $ukvTariffs = array(); /** * Contains detected Internet/UKV users as contract => login / contract => id * for displaying during statement processing * * @var array */ protected $bankstaFoundUsers = array(); /** * Placeholder for BANKSTA2_REGEX_KEYWORDS_DELIM option * * @var string */ protected $regexKeywordsDelimiter = ','; /** * Placeholder for BANKSTA2_LSTCHK_FNAMES_TRANSLATE option * * @var bool */ protected $translateLstChkFieldNames = false; /** * Placeholder for BANKSTA2_OPAYZID_AS_CONTRACT option * * @var bool */ protected $opayzIDAsContract = false; /** * Placeholder for BANKSTA2_INETSRV_ALLOTED_IDS option * * @var array */ protected $inetSrvAllotedIDs = array(); /** * Placeholder for BANKSTA2_CTVSRV_ALLOTED_IDS option * * @var array */ protected $ctvSrvAllotedIDs = array(); /** * Placeholder for file data preprocessed during filePreprocessing() * * @var array */ public $preprocessedFileData = array(); /** * Placeholder mapper for BANKSTA2_PRESETS_TABLE and web_PreprocessingForm * * @var array */ public $dbPresetsFlds2PreprocForm = array( 'col_realname' => 'bsrealname_col', 'col_address' => 'bsaddress_col', 'col_paysum' => 'bspaysum_col', 'col_paypurpose' => 'bspaypurpose_col', 'col_paydate' => 'bspaydate_col', 'col_paytime' => 'bspaytime_col', 'col_contract' => 'bscontract_col', 'col_srvidents' => 'bssrvidents_col', 'sum_in_coins' => 'bspaymincoins', 'guess_contract' => 'bstryguesscontract', 'srvidents_preffered' => 'bssrvidentspreff', 'contract_delim_start' => 'bscontractdelimstart', 'contract_delim_end' => 'bscontractdelimend', 'contract_min_len' => 'bscontractminlen', 'contract_max_len' => 'bscontractmaxlen', 'service_type' => 'bssrvtype', 'inet_srv_start_delim' => 'bsinetdelimstart', 'inet_srv_end_delim' => 'bsinetdelimend', 'inet_srv_keywords' => 'bsinetkeywords', 'noesc_inet_srv_keywords' => 'bsinetkeywordsnoesc', 'ukv_srv_start_delim' => 'bsukvdelimstart', 'ukv_srv_end_delim' => 'bsukvdelimend', 'ukv_srv_keywords' => 'bsukvkeywords', 'noesc_ukv_srv_keywords' => 'bsukvkeywordsnoesc', 'skip_row' => 'bsskiprow', 'col_skiprow' => 'bsskiprow_col', 'skip_row_keywords' => 'bsskiprowkeywords', 'noesc_skip_row_keywords' => 'bsskiprowkeywordsnoesc', 'replace_strs' => 'bsreplacestrs', 'col_replace_strs' => 'bscolsreplacestrs', 'strs_to_replace' => 'bsstrstoreplace', 'strs_to_replace_with' => 'bsstrstoreplacewith', 'replacements_cnt' => 'bsreplacementscnt', 'noesc_replace_keywords' => 'bsreplacekeywordsnoesc', 'remove_strs' => 'bsremovestrs', 'col_remove_strs' => 'bscolremovestrs', 'strs_to_remove' => 'bsstrstoremove', 'noesc_remove_keywords' => 'bsremovekeywordsnoesc', 'payment_type_id' => 'bspaymtypeid' ); /** * Default storage table name */ const BANKSTA2_TABLE = 'banksta2'; const BANKSTA2_PRESETS_TABLE = 'banksta2_presets'; const BANKSTA2_USER_CACHE_KEY = "BANKSTA2_USERS_DATA"; const BANKSTA2_PROCBS_CACHE_KEY = "BANKSTA2_PROCBS_DATA"; const BANKSTA2_MAPPRESETS_CACHE_KEY = "BANKSTA2_MAPPRESETS_DATA"; /** * Routing URLs */ const URL_ME = '?module=banksta2'; const URL_BANKSTA2_UPLOADFORM = '?module=banksta2&uploadform=true'; const URL_BANKSTA2_PROCESSING = '?module=banksta2&showhash='; const URL_BANKSTA2_DETAILED = '?module=banksta2&showdetailed='; const URL_BANKSTA2_FIELD_MAPPING = '?module=banksta2&fieldmapping=true'; const URL_BANKSTA2_PRESETS = '?module=banksta2&presets=true'; const URL_BANKSTA2_PROCEED_STMT_IMP = '?module=banksta2&proceedstatementimport=true'; const URL_BANKSTA2_BANKSTALIST = '?module=banksta2&bankstalist=true'; const URL_USERS_PROFILE_INET = '?module=userprofile&username='; const URL_USERS_PROFILE_UKV = '?module=ukv&users=true&showuser='; /** * Some banksta options */ const BANKSTA2_PATH = 'content/documents/banksta2/'; public function __construct() { global $ubillingConfig, $billing; $this->ubConfig = $ubillingConfig; $this->billing = $billing; $this->ubCache = new UbillingCache(); $this->initMessages(); $this->loadOptions(); $this->loadProcessedBankstaRecsIDs(); $this->bankstaServiceType = array('Internet' => __('Internet'), 'UKV' => __('UKV'), 'Telepathy' => __('Telepathy') ); } /** * Inits message helper object for further usage * * @return void */ protected function initMessages() { $this->messages = new UbillingMessageHelper(); } /** * Returns reference to UbillingMessageHelper object * * @return object */ public function getUbMsgHelperInstance() { return $this->messages; } /** * Getting an alter.ini options * * @return void */ protected function loadOptions() { $this->inetPaymentId = $this->ubConfig->getAlterParam('BANKSTA2_PAYMENTID_INET'); $this->ukvPaymentId = $this->ubConfig->getAlterParam('BANKSTA2_PAYMENTID_UKV'); $this->regexKeywordsDelimiter = (wf_getBoolFromVar($this->ubConfig->getAlterParam('BANKSTA2_REGEX_KEYWORDS_DELIM'))) ? $this->ubConfig->getAlterParam('BANKSTA2_REGEX_KEYWORDS_DELIM') : ','; $this->translateLstChkFieldNames = $this->ubConfig->getAlterParam('BANKSTA2_LSTCHK_FNAMES_TRANSLATE'); $this->opayzIDAsContract = $this->ubConfig->getAlterParam('BANKSTA2_OPAYZID_AS_CONTRACT'); $this->inetSrvAllotedIDs = explode(',', trim($this->ubConfig->getAlterParam('BANKSTA2_INETSRV_ALLOTED_IDS'), "\t\n\r\0\x0B,")); $this->ctvSrvAllotedIDs = explode(',', trim($this->ubConfig->getAlterParam('BANKSTA2_CTVSRV_ALLOTED_IDS'), "\t\n\r\0\x0B,")); $this->cacheLifeTime = ($this->ubConfig->getAlterParam('BANKSTA2_CACHE_LIFETIME')) ? $this->ubConfig->getAlterParam('BANKSTA2_CACHE_LIFETIME') : 900; } /** * Returns essential user data suitable for caching * * @return array */ public function getUsersDataForCache() { $cacheArray = array(); $userDataInet = $this->loadUserDataInet(); $userDataUKV = $this->loadUserDataUKV(); $ukvTariffs = $this->loadUKVTariffs(); $cacheArray['usersinet'] = (empty($userDataInet['usersdata']) ? array() : $userDataInet['usersdata']); $cacheArray['usersinetcontracts'] = (empty($userDataInet['userscontracts']) ? array() : $userDataInet['userscontracts']); $cacheArray['usersukv'] = (empty($userDataUKV['usersdata']) ? array() : $userDataUKV['usersdata']); $cacheArray['usersukvcontracts'] = (empty($userDataUKV['userscontracts']) ? array() : $userDataUKV['userscontracts']); $cacheArray['tariffsukv'] = (empty($ukvTariffs) ? array() : $ukvTariffs); return ($cacheArray); } /** * Returns user data from cache * * @return array */ public function getUsersDataCached($force = false) { $userDataCached = array(); if ($force) { $this->ubCache->set(self::BANKSTA2_USER_CACHE_KEY, $this->getUsersDataForCache(), $this->cacheLifeTime); $userDataCached = $this->ubCache->get(self::BANKSTA2_USER_CACHE_KEY, $this->cacheLifeTime); } else { $thisInstance = $this; $userDataCached = $this->ubCache->getCallback(self::BANKSTA2_USER_CACHE_KEY, function () use ($thisInstance) { return ($thisInstance->getUsersDataForCache()); }, $this->cacheLifeTime); } $this->allUsersDataInet = $userDataCached['usersinet']; $this->allContractsInet = $userDataCached['usersinetcontracts']; $this->allUsersDataUKV = $userDataCached['usersukv']; $this->allContractsUKV = $userDataCached['usersukvcontracts']; $this->ukvTariffs = $userDataCached['tariffsukv']; return ($userDataCached); } /** * Returns processed bank statements data from cache * * @return array */ public function getProcessedBSRecsCached($force = false) { $processedBSRecsCached = array(); if ($force) { $this->ubCache->set(self::BANKSTA2_PROCBS_CACHE_KEY, $this->loadProcessedBankstaRecs(), $this->cacheLifeTime); $processedBSRecsCached = $this->ubCache->get(self::BANKSTA2_PROCBS_CACHE_KEY, $this->cacheLifeTime); } else { $thisInstance = $this; $processedBSRecsCached = $this->ubCache->getCallback(self::BANKSTA2_PROCBS_CACHE_KEY, function () use ($thisInstance) { return ($thisInstance->loadProcessedBankstaRecs()); }, $this->cacheLifeTime); } $this->bankstaRecordsAll = $processedBSRecsCached; return ($processedBSRecsCached); } /** * Returns processed bank statements data from cache * * @return array */ public function getMappingPresetsCached($force = false) { $mappingPresetsCached = array(); if ($force) { $this->ubCache->set(self::BANKSTA2_MAPPRESETS_CACHE_KEY, $this->loadMappingPresets(), $this->cacheLifeTime); $mappingPresetsCached = $this->ubCache->get(self::BANKSTA2_MAPPRESETS_CACHE_KEY, $this->cacheLifeTime); } else { $thisInstance = $this; $mappingPresetsCached = $this->ubCache->getCallback(self::BANKSTA2_MAPPRESETS_CACHE_KEY, function () use ($thisInstance) { return ($thisInstance->loadMappingPresets()); }, $this->cacheLifeTime); } $this->fieldsMappingPresets = $mappingPresetsCached; return ($mappingPresetsCached); } /** * Loads all available Internet users data from database * * @return array */ protected function loadUserDataInet() { $result = array(); $allOpenPayzUsers = array(); $allUsersDataInet = array(); $allContractsInet = array(); $allUsersData = zb_UserGetAllData(); if (!empty($allUsersData)) { foreach ($allUsersData as $eachLogin => $eachUserData) { $allUsersDataInet[$eachUserData['login']] = array('login' => $eachUserData['login'], 'contract' => $eachUserData['contract'], 'fulladress' => $eachUserData['fulladress'], 'realname' => $eachUserData['realname'], 'Tariff' => $eachUserData['Tariff'] ); } if (!empty($allUsersDataInet)) { // getting openpayz customers, if any if ($this->opayzIDAsContract) { $tQuery = "SELECT * FROM `op_customers`"; $tQueryResult = simple_queryall($tQuery); if (!empty($tQueryResult)) { foreach ($tQueryResult as $eachRec => $eachOpayzUser) { if (!empty($eachOpayzUser['virtualid'])) { $allOpenPayzUsers[$eachOpayzUser['realid']] = $eachOpayzUser['virtualid']; } } } } foreach ($allUsersDataInet as $io => $eachUser) { $login = $eachUser['login']; if (!empty($eachUser['contract'])) { $allContractsInet[$eachUser['contract']] = $login; } elseif ($this->opayzIDAsContract and !empty($allOpenPayzUsers[$login])) { $allContractsInet[$allOpenPayzUsers[$login]] = $login; } } } } $result['usersdata'] = $allUsersDataInet; $result['userscontracts'] = $allContractsInet; return ($result); } /** * Loads all available UKV users data from database * * @return array */ protected function loadUserDataUKV() { $tQuery = "SELECT * from `ukv_users`"; $allUsers = simple_queryall($tQuery); $allUsersDataUKV = array(); $allContractsUKV = array(); $result = array(); if (!empty($allUsers)) { foreach ($allUsers as $io => $eachUser) { $allUsersDataUKV[$eachUser['id']] = array('id' => $eachUser['id'], 'contract' => $eachUser['contract'], 'realname' => $eachUser['realname'], 'tariffid' => $eachUser['tariffid'], 'street' => $eachUser['street'], 'build' => $eachUser['build'], 'apt' => $eachUser['apt'] ); $allContractsUKV[$eachUser['contract']] = $eachUser['id']; } } $result['usersdata'] = $allUsersDataUKV; $result['userscontracts'] = $allContractsUKV; return ($result); } /** * Loads UKV tariffs into private tariffs prop * * @return array */ protected function loadUKVTariffs() { $tQuery = "SELECT * from `ukv_tariffs` ORDER by `tariffname` ASC;"; $allTariffs = simple_queryall($tQuery); $ukvTariffs = array(); if (!empty($allTariffs)) { foreach ($allTariffs as $io => $each) { $ukvTariffs[$each['id']] = $each; } } return ($ukvTariffs); } /** * Loads all of banksta rows to private property for further use * * @return array */ public function loadProcessedBankstaRecs() { $tQuery = "SELECT * FROM `" . self::BANKSTA2_TABLE . "`"; $tQueryResult = simple_queryall($tQuery); $bankstaRecordsAll = array(); if (!empty($tQueryResult)) { foreach ($tQueryResult as $io => $eachRec) { $data4cache = array(); $data4cache['id'] = $eachRec['id']; $data4cache['hash'] = $eachRec['hash']; $data4cache['contract'] = $eachRec['contract']; $data4cache['processed'] = $eachRec['processed']; $data4cache['canceled'] = $eachRec['canceled']; $data4cache['service_type'] = $eachRec['service_type']; $bankstaRecordsAll[$eachRec['id']] = $data4cache; } } return ($bankstaRecordsAll); } /** * Loads all of banksta rows IDs to private property for further use * * @return array */ public function loadProcessedBankstaRecsIDs() { $tQuery = "SELECT `id` FROM `" . self::BANKSTA2_TABLE . "`"; $tQueryResult = simple_queryall($tQuery); $bankstaRecordsAllIDs = array(); if (!empty($tQueryResult)) { foreach ($tQueryResult as $io => $eachRec) { $bankstaRecordsAllIDs[$eachRec['id']] = $eachRec['id']; } } $this->bankstaRecordsAllIDs = $bankstaRecordsAllIDs; return ($bankstaRecordsAllIDs); } /** * Load fields mapping presets (FMPs) * * @return array */ public function loadMappingPresets() { $tQuery = "SELECT * FROM `" . self::BANKSTA2_PRESETS_TABLE . "`"; $tQueryResult = simple_queryall($tQuery); $fieldsMappingPresets = array(); if (!empty($tQueryResult)) { foreach ($tQueryResult as $eachRec) { $fieldsMappingPresets[$eachRec['id']] = $eachRec; } } return ($fieldsMappingPresets); } /** * Fields mapping presets placeholder getter * * @return array */ public function getMappingPresets() { $this->getMappingPresetsCached(); return ($this->fieldsMappingPresets); } /** * Returns file info for a certain filehash * * @param $hash * @return array */ public function getFileInfoByHash($hash) { $data = array(); $tQuery = "SELECT `filename`, `hash`, `date`, `admin`, COUNT(`id`) AS `rowcount`, COUNT(if(`processed` > 0, 1, null)) AS processed_cnt, COUNT(if(`canceled` > 0, 1, null)) AS canceled_cnt FROM `" . self::BANKSTA2_TABLE . "` WHERE `hash`='" . $hash . "' LIMIT 1"; $tQueryResult = simple_queryall($tQuery); if (!empty($tQueryResult)) { foreach ($tQueryResult as $io => $eachRec) { $data['date'] = $eachRec['date']; $data['filename'] = $eachRec['filename']; $data['rowcount'] = $eachRec['rowcount']; $data['processed_cnt'] = $eachRec['processed_cnt']; $data['canceled_cnt'] = $eachRec['canceled_cnt']; $data['admin'] = $eachRec['admin']; } } return ($data); } /** * Returns fields mapping presets in JSON representation * * @param $fmpID * @param array $arrayToRemap * * @return array|false|string */ public function getFMPDataJSON($fmpID, $arrayToRemap = array()) { $result = array(); $this->getMappingPresetsCached(); if (isset($this->fieldsMappingPresets[$fmpID]) and !empty($this->fieldsMappingPresets[$fmpID])) { $fmpData = $this->fieldsMappingPresets[$fmpID]; if (empty($arrayToRemap)) { $result = json_encode($fmpData); } else { foreach ($fmpData as $eachField => $eachValue) { $remappedFieldName = (isset($arrayToRemap[$eachField]) and !empty($arrayToRemap[$eachField])) ? $arrayToRemap[$eachField] : $eachField; $result[$remappedFieldName] = $eachValue; } $result = json_encode($result); } } return ($result); } /** * Returns an HTML-code string containing selector control * * @param string $selectorID * @param string $selectorClass * @param bool $inContainer * @param string $title * @param bool $insBR * @param bool $insRefreshButton * * @return string */ public function getMappingPresetsSelector($selectorID = '', $selectorClass = '', $inContainer = false, $title = '', $insBR = false, $insRefreshButton = false) { $this->getMappingPresetsCached(); $labelTitle = (empty($title)) ? __('Choose fields mapping preset') : $title; $ctrlID = (empty($selectorID)) ? 'BankstaPresetsSelector' : $selectorID; $ctrlClass = (empty($selectorClass)) ? '__BankstaPresetsSelector' : $selectorClass; $selectorContent = array('' => '-'); $result = ''; $refresh_button = ''; if ($insRefreshButton) { $refresh_button.= wf_tag('span', false, 'ubButton', 'id="refresh_' . $ctrlID . '" title="' . __('Refresh selector data') . '" style="cursor: pointer; vertical-align: sub; padding: 2px 8px !important"'); $refresh_button.= wf_img('skins/refresh.gif'); $refresh_button.= wf_tag('span', true); $refresh_button.= wf_nbsp(1); } foreach ($this->fieldsMappingPresets as $eachPreset) { $selectorContent[$eachPreset['id']] = $eachPreset['presetname']; } $result.= wf_Selector('bspresets', $selectorContent, $labelTitle, '', $insBR, true, $ctrlID, $ctrlClass); if ($inContainer) { $result = wf_tag('span', false, '', 'id="container_' . $ctrlID . '"') . $result; $result.= wf_tag('span', true); } $result = $refresh_button . $result; return ($result); } /** * Returns array with certain banksta record content * * @param $recID * * @return array|mixed */ public function getBankstaRecDetails($recID) { $this->getProcessedBSRecsCached(); $result = array(); if (isset($this->bankstaRecordsAll[$recID])) { //$result = $this->bankstaRecordsAll[$recID]; $query = "SELECT * FROM `" . self::BANKSTA2_TABLE . "` WHERE `id` = '" . $recID . "'"; $result = simple_query($query); } return ($result); } /** * Marks banksta record as processed * * @param $bankstaRecID * * @return void */ public function setBankstaRecProcessed($bankstaRecID) { if (isset($this->bankstaRecordsAllIDs[$bankstaRecID])) { simple_update_field(self::BANKSTA2_TABLE, 'processed', 1, "WHERE `id`='" . $bankstaRecID . "';"); //log_register('BANKSTA2 [' . $bankstaRecID . '] SET AS PROCESSED'); } else { log_register('BANKSTA2 NONEXISTENT [' . $bankstaRecID . '] RECORD SETTING PROCESSED TRY'); } } /** * Marks banksta record as canceled * * @param $bankstaRecID * * @return void */ public function setBankstaRecCanceled($bankstaRecID) { if (isset($this->bankstaRecordsAllIDs[$bankstaRecID])) { simple_update_field(self::BANKSTA2_TABLE, 'processed', 1, "WHERE `id`='" . $bankstaRecID . "';"); simple_update_field(self::BANKSTA2_TABLE, 'canceled', 1, "WHERE `id`='" . $bankstaRecID . "';"); log_register('BANKSTA2 [' . $bankstaRecID . '] SET AS CANCELED'); } else { log_register('BANKSTA2 NONEXISTENT [' . $bankstaRecID . '] RECORD SETTING CANCELED TRY'); } } /** * Marks banksta record as uncanceled * * @param $bankstaRecID * * @return void */ public function setBankstaRecUnCanceled($bankstaRecID) { if (isset($this->bankstaRecordsAllIDs[$bankstaRecID])) { simple_update_field(self::BANKSTA2_TABLE, 'processed', 0, "WHERE `id`='" . $bankstaRecID . "';"); simple_update_field(self::BANKSTA2_TABLE, 'canceled', 0, "WHERE `id`='" . $bankstaRecID . "';"); log_register('BANKSTA2 [' . $bankstaRecID . '] SET AS UNCANCELED'); } else { log_register('BANKSTA2 NONEXISTENT [' . $bankstaRecID . '] RECORD SETTING UNCANCELED TRY'); } } /** * Changes contract for some banksta record * * @param $bankstaRecID * @param $contract * * @return void */ public function setBankstaRecContract($bankstaRecID, $contract) { $this->getProcessedBSRecsCached(); $contract = mysql_real_escape_string($contract); $contract = trim($contract); if (isset($this->bankstaRecordsAll[$bankstaRecID])) { $oldContract = $this->bankstaRecordsAll[$bankstaRecID]['contract']; simple_update_field(self::BANKSTA2_TABLE, 'contract', $contract, "WHERE `id`='" . $bankstaRecID . "';"); log_register('BANKSTA2 [' . $bankstaRecID . '] CONTRACT `' . $oldContract . '` CHANGED TO `' . $contract . '`'); } else { log_register('BANKSTA2 NONEXISTENT [' . $bankstaRecID . '] CONTRACT CHANGE TRY'); } } /** * Changes service type for some banksta record * * @param $bankstaRecID * @param $srvType * * @return void */ public function setBankstaRecSrvType($bankstaRecID, $srvType) { $this->getProcessedBSRecsCached(); $srvType = mysql_real_escape_string($srvType); $srvType = trim($srvType); if (isset($this->bankstaRecordsAll[$bankstaRecID])) { $oldSrvType = $this->bankstaRecordsAll[$bankstaRecID]['service_type']; simple_update_field(self::BANKSTA2_TABLE, 'service_type', $srvType, "WHERE `id`='" . $bankstaRecID . "';"); log_register('BANKSTA2 [' . $bankstaRecID . '] RECORD SERVICE TYPE `' . $oldSrvType . '` CHANGED TO `' . $srvType . '`'); } else { log_register('BANKSTA2 NONEXISTENT [' . $bankstaRecID . '] RECORD SERVICE TYPE CHANGE TRY'); } } /** * Upload statement file * * @return array|bool */ public function uploadFile() { $result = false; $extCheck = true; if ($_FILES['uploadbnksta2']['error'] == 4) { log_register('BANKSTA2 NO FILE WAS SELECTED'); show_error(__('No file was selected')); return ($result); } //check file extension against $allowedExtensions foreach ($_FILES as $file) { if ($file['tmp_name'] > '') { if (@!in_array(end(explode(".", strtolower($file['name']))), $this->allowedExtensions)) { $extCheck = false; } } } if ($extCheck) { $fileName = vf($_FILES['uploadbnksta2']['name']); $uploadFile = self::BANKSTA2_PATH . $fileName; if (move_uploaded_file($_FILES['uploadbnksta2']['tmp_name'], $uploadFile)) { $fileContent = file_get_contents(self::BANKSTA2_PATH . $fileName); $fileHash = md5($fileContent); $fileContent = ''; //free some memory if (!$this->checkHashExists($fileHash)) { $result = array( 'filename' => $_FILES['uploadbnksta2']['name'], 'savedname' => $fileName, 'hash' => $fileHash ); } else { log_register('BANKSTA2 DUPLICATE TRY ' . $fileHash); show_error(__('Same bank statement already exists')); } } else { show_error(__('Cant upload file to') . ' ' . self::BANKSTA2_PATH); } } else { show_error(__('Wrong file type')); log_register('BANKSTA2 WRONG FILETYPE'); } return ($result); } /** * checks if banksta hash exists? * * @param string $hash bank statement raw content hash * * @return bool */ protected function checkHashExists($hash) { $query = "SELECT `id` FROM `" . self::BANKSTA2_TABLE . "` WHERE `hash`='" . $hash . "'"; $data = simple_query($query); if (empty($data)) { return (false); } else { return (true); } } /** * Returns true if field mapping preset with such name already exists * * @param $fmpName * @param int $excludeEditedFMPId * * @return string */ public function checkFMPNameExists($fmpName, $excludeEditedFMPId = 0) { $fmpName = trim($fmpName); if (empty($excludeEditedFMPId)) { $tQuery = "SELECT `id` FROM `" . self::BANKSTA2_PRESETS_TABLE . "` WHERE `presetname` = '" . $fmpName . "'"; } else { $tQuery = "SELECT `id` FROM `" . self::BANKSTA2_PRESETS_TABLE . "` WHERE `presetname` = '" . $fmpName . "' AND `id` != " . $excludeEditedFMPId; } $tQueryResult = simple_queryall($tQuery); return ( empty($tQueryResult) ) ? '' : $tQueryResult[0]['id']; } /** * Adds new fields mapping preset to DB * * @param $fmpName * @param $fmpColRealName * @param $fmpColAddr * @param $fmpColPaySum * @param $fmpColPayPurpose * @param $fmpColPayDate * @param $fmpColPayTime * @param $fmpColContract * @param $fmpPaySumInCoins * @param $fmpGuessContract * @param $fmpContractDelimStart * @param $fmpContractDelimEnd * @param $fmpContractMinLen * @param $fmpContractMaxLen * @param $fmpSrvType * @param $fmpInetStartDelim * @param $fmpInetEndDelim * @param $fmpInetKeywords * @param $fmpNoEscInetKeywords * @param $fmpUKVDelimStart * @param $fmpUKVDelimEnd * @param $fmpUKVKeywords * @param $fmpNoEscUKVKeywords * @param $fmpSkipRow * @param $fmpColSkipRow * @param $fmpSkipRowKeywords * @param $fmpNoEscSkipRowKeywords * @param $fmpReplaceStrs * @param $fmpColReplaceStrs * @param $fmpStrsToReplace * @param $fmpStrsToReplaceWith * @param $fmpReplacementsCount * @param $fmpNoEscReplaceKeywords * @param $fmpRemoveStrs * @param $fmpColRemoveStrs * @param $fmpStrsToRemove * @param $fmpNoEscRemoveKeywords * @param $fmpPaymentTypeID * @param $fmpColSrvIdents * @param $fmpSrvIdentsPreffered * * @return void */ public function addFieldsMappingPreset($fmpName, $fmpColRealName = 'NONE', $fmpColAddr = 'NONE', $fmpColPaySum = 'NONE', $fmpColPayPurpose = 'NONE', $fmpColPayDate = 'NONE', $fmpColPayTime = 'NONE', $fmpColContract = 'NONE', $fmpPaySumInCoins = 0, $fmpGuessContract = 0, $fmpContractDelimStart = '', $fmpContractDelimEnd = '', $fmpContractMinLen = 0, $fmpContractMaxLen = 0, $fmpSrvType = '', $fmpInetStartDelim = '', $fmpInetEndDelim = '', $fmpInetKeywords = '', $fmpNoEscInetKeywords = 0, $fmpUKVDelimStart = '', $fmpUKVDelimEnd = '', $fmpUKVKeywords = '', $fmpNoEscUKVKeywords = 0, $fmpSkipRow = 0, $fmpColSkipRow = '', $fmpSkipRowKeywords = '', $fmpNoEscSkipRowKeywords = 0, $fmpReplaceStrs = 0, $fmpColReplaceStrs = '', $fmpStrsToReplace = '', $fmpStrsToReplaceWith = '', $fmpReplacementsCount = '', $fmpNoEscReplaceKeywords = 0, $fmpRemoveStrs = 0, $fmpColRemoveStrs = '', $fmpStrsToRemove = '', $fmpNoEscRemoveKeywords = 0, $fmpPaymentTypeID = 0, $fmpColSrvIdents = 0, $fmpSrvIdentsPreffered = 0 ) { $fmpColRealName = (wf_emptyNonZero($fmpColRealName) ? 'NONE' : $fmpColRealName); $fmpColAddr = (wf_emptyNonZero($fmpColAddr) ? 'NONE' : $fmpColAddr); $fmpColPaySum = (wf_emptyNonZero($fmpColPaySum) ? 'NONE' : $fmpColPaySum); $fmpColPayPurpose = (wf_emptyNonZero($fmpColPayPurpose) ? 'NONE' : $fmpColPayPurpose); $fmpColPayDate = (wf_emptyNonZero($fmpColPayDate) ? 'NONE' : $fmpColPayDate); $fmpColPayTime = (wf_emptyNonZero($fmpColPayTime) ? 'NONE' : $fmpColPayTime); $fmpColContract = (wf_emptyNonZero($fmpColContract) ? 'NONE' : $fmpColContract); $fmpColSrvIdents = (wf_emptyNonZero($fmpColSrvIdents) ? 'NONE' : $fmpColSrvIdents); $tQuery = "INSERT INTO `" . self::BANKSTA2_PRESETS_TABLE . "` (`presetname`, `col_realname`, `col_address`, `col_paysum`, `sum_in_coins`, `col_paypurpose`, `col_paydate`, `col_paytime`, `col_contract`, `col_srvidents`, `guess_contract`, `srvidents_preffered`, `contract_delim_start`, `contract_delim_end`, `contract_min_len`, `contract_max_len`, `service_type`, `inet_srv_start_delim`, `inet_srv_end_delim`, `inet_srv_keywords`, `noesc_inet_srv_keywords`, `ukv_srv_start_delim`, `ukv_srv_end_delim`, `ukv_srv_keywords`, `noesc_ukv_srv_keywords`, `skip_row`, `col_skiprow`, `skip_row_keywords`, `noesc_skip_row_keywords`, `replace_strs`, `col_replace_strs`, `strs_to_replace`, `strs_to_replace_with`, `replacements_cnt`, `noesc_replace_keywords`, `remove_strs`, `col_remove_strs`, `strs_to_remove`, `noesc_remove_keywords`, `payment_type_id`) VALUES ('" . $fmpName . "', '" . $fmpColRealName . "', '" . $fmpColAddr . "', '" . $fmpColPaySum . "', '" . $fmpPaySumInCoins . "', '" . $fmpColPayPurpose . "', '" . $fmpColPayDate . "', '" . $fmpColPayTime . "', '" . $fmpColContract . "', '" . $fmpColSrvIdents . "', " . $fmpGuessContract . ", " . $fmpSrvIdentsPreffered . ", '" . $fmpContractDelimStart . "', '" . $fmpContractDelimEnd . "', " . $fmpContractMinLen . ", " . $fmpContractMaxLen . ", '" . $fmpSrvType . "', '" . $fmpInetStartDelim . "', '" . $fmpInetEndDelim . "', '" . $fmpInetKeywords . "', " . $fmpNoEscInetKeywords . ", '" . $fmpUKVDelimStart . "', '" . $fmpUKVDelimEnd . "', '" . $fmpUKVKeywords . "', " . $fmpNoEscUKVKeywords . ", '" . $fmpSkipRow . "', '" . $fmpColSkipRow . "', '" . $fmpSkipRowKeywords . "', " . $fmpNoEscSkipRowKeywords . ", '" . $fmpReplaceStrs . "', '" . $fmpColReplaceStrs . "', '" . $fmpStrsToReplace . "', '" . $fmpStrsToReplaceWith . "', '" . $fmpReplacementsCount . "', '" . $fmpNoEscReplaceKeywords . "', '" . $fmpRemoveStrs . "', '" . $fmpColRemoveStrs . "', '" . $fmpStrsToRemove . "', " . $fmpNoEscRemoveKeywords . ", " . $fmpPaymentTypeID . ")"; nr_query($tQuery); log_register('CREATE banksta2 fields mapping preset [' . $fmpName . ']'); $this->getMappingPresetsCached(true); } /** * Edits existing fields mapping preset * * @param $fmpID * @param $fmpName * @param $fmpColRealName * @param $fmpColAddr * @param $fmpColPaySum * @param $fmpColPayPurpose * @param $fmpColPayDate * @param $fmpColPayTime * @param $fmpColContract * @param $fmpPaySumInCoins * @param $fmpGuessContract * @param $fmpContractDelimStart * @param $fmpContractDelimEnd * @param $fmpContractMinLen * @param $fmpContractMaxLen * @param $fmpSrvType * @param $fmpInetStartDelim * @param $fmpInetEndDelim * @param $fmpInetKeywords * @param $fmpNoEscInetKeywords * @param $fmpUKVDelimStart * @param $fmpUKVDelimEnd * @param $fmpUKVKeywords * @param $fmpNoEscUKVKeywords * @param $fmpSkipRow * @param $fmpColSkipRow * @param $fmpSkipRowKeywords * @param $fmpNoEscSkipRowKeywords * @param $fmpReplaceStrs * @param $fmpColReplaceStrs * @param $fmpStrsToReplace * @param $fmpStrsToReplaceWith * @param $fmpReplacementsCount * @param $fmpNoEscReplaceKeywords * @param $fmpRemoveStrs * @param $fmpColRemoveStrs * @param $fmpStrsToRemove * @param $fmpNoEscRemoveKeywords * @param $fmpPaymentTypeID * @param $fmpColSrvIdents * @param $fmpSrvIdentsPreffered * * @return void */ public function editFieldsMappingPreset($fmpID, $fmpName, $fmpColRealName = 'NONE', $fmpColAddr = 'NONE', $fmpColPaySum = 'NONE', $fmpColPayPurpose = 'NONE', $fmpColPayDate = 'NONE', $fmpColPayTime = 'NONE', $fmpColContract = 'NONE', $fmpPaySumInCoins = 0, $fmpGuessContract = 0, $fmpContractDelimStart = '', $fmpContractDelimEnd = '', $fmpContractMinLen = 0, $fmpContractMaxLen = 0, $fmpSrvType = '', $fmpInetStartDelim = '', $fmpInetEndDelim = '', $fmpInetKeywords = '', $fmpNoEscInetKeywords = 0, $fmpUKVDelimStart = '', $fmpUKVDelimEnd = '', $fmpUKVKeywords = '', $fmpNoEscUKVKeywords = 0, $fmpSkipRow = 0, $fmpColSkipRow = '', $fmpSkipRowKeywords = '', $fmpNoEscSkipRowKeywords = 0, $fmpReplaceStrs = 0, $fmpColReplaceStrs = '', $fmpStrsToReplace = '', $fmpStrsToReplaceWith = '', $fmpReplacementsCount = '', $fmpNoEscReplaceKeywords = 0, $fmpRemoveStrs = 0, $fmpColRemoveStrs = '', $fmpStrsToRemove = '', $fmpNoEscRemoveKeywords = 0, $fmpPaymentTypeID = 0, $fmpColSrvIdents = 0, $fmpSrvIdentsPreffered = 0 ) { $fmpColRealName = (wf_emptyNonZero($fmpColRealName) ? 'NONE' : $fmpColRealName); $fmpColAddr = (wf_emptyNonZero($fmpColAddr) ? 'NONE' : $fmpColAddr); $fmpColPaySum = (wf_emptyNonZero($fmpColPaySum) ? 'NONE' : $fmpColPaySum); $fmpColPayPurpose = (wf_emptyNonZero($fmpColPayPurpose) ? 'NONE' : $fmpColPayPurpose); $fmpColPayDate = (wf_emptyNonZero($fmpColPayDate) ? 'NONE' : $fmpColPayDate); $fmpColPayTime = (wf_emptyNonZero($fmpColPayTime) ? 'NONE' : $fmpColPayTime); $fmpColContract = (wf_emptyNonZero($fmpColContract) ? 'NONE' : $fmpColContract); $fmpColSrvIdents = (wf_emptyNonZero($fmpColSrvIdents) ? 'NONE' : $fmpColSrvIdents); $tQuery = "UPDATE `" . self::BANKSTA2_PRESETS_TABLE . "` SET `presetname` = '" . $fmpName . "', `col_realname` = '" . $fmpColRealName . "', `col_address` = '" . $fmpColAddr . "', `col_paysum` = '" . $fmpColPaySum . "', `col_paypurpose` = '" . $fmpColPayPurpose . "', `col_paydate` = '" . $fmpColPayDate . "', `col_paytime` = '" . $fmpColPayTime . "', `col_contract` = '" . $fmpColContract . "', `col_srvidents` = '" . $fmpColSrvIdents . "', `sum_in_coins` = '" . $fmpPaySumInCoins . "', `guess_contract` = " . $fmpGuessContract . ", `srvidents_preffered` = " . $fmpSrvIdentsPreffered . ", `contract_delim_start` = '" . $fmpContractDelimStart . "', `contract_delim_end` = '" . $fmpContractDelimEnd . "', `contract_min_len` = " . $fmpContractMinLen . ", `contract_max_len` = " . $fmpContractMaxLen . ", `service_type` = '" . $fmpSrvType . "', `inet_srv_start_delim` = '" . $fmpInetStartDelim . "', `inet_srv_end_delim` = '" . $fmpInetEndDelim . "', `inet_srv_keywords` = '" . $fmpInetKeywords . "', `noesc_inet_srv_keywords` = '" . $fmpNoEscInetKeywords . "', `ukv_srv_start_delim` = '" . $fmpUKVDelimStart . "', `ukv_srv_end_delim` = '" . $fmpUKVDelimEnd . "', `ukv_srv_keywords` = '" . $fmpUKVKeywords . "', `noesc_ukv_srv_keywords` = '" . $fmpNoEscUKVKeywords . "', `skip_row` = '" . $fmpSkipRow . "', `col_skiprow` = '" . $fmpColSkipRow . "', `skip_row_keywords` = '" . $fmpSkipRowKeywords . "', `noesc_skip_row_keywords` = '" . $fmpNoEscSkipRowKeywords . "', `replace_strs` = '" . $fmpReplaceStrs . "', `col_replace_strs` = '" . $fmpColReplaceStrs . "', `strs_to_replace` = '" . $fmpStrsToReplace . "', `strs_to_replace_with` = '" . $fmpStrsToReplaceWith . "', `replacements_cnt` = '" . $fmpReplacementsCount . "', `noesc_replace_keywords` = '" . $fmpNoEscReplaceKeywords . "', `remove_strs` = '" . $fmpRemoveStrs . "', `col_remove_strs` = '" . $fmpColRemoveStrs . "', `strs_to_remove` = '" . $fmpStrsToRemove . "', `noesc_remove_keywords` = '" . $fmpNoEscRemoveKeywords . "', `payment_type_id` = " . $fmpPaymentTypeID . " WHERE `id` = " . $fmpID; nr_query($tQuery); log_register('CHANGE banksta2 fields mapping preset [' . $fmpName . ']'); $this->getMappingPresetsCached(true); } /** * Deletes fields mapping preset * * @param $fmpId * @param string $fmpName * * @return void */ public function deleteFieldsMappingPreset($fmpId, $fmpName = '') { $tQuery = "DELETE FROM `" . self::BANKSTA2_PRESETS_TABLE . "` WHERE `id` = '" . $fmpId . "'"; nr_query($tQuery); log_register('DELETE banksta2 fields mapping preset [' . $fmpId . '] ` ' . $fmpName); $this->getMappingPresetsCached(true); } /** * Deletes uploaded bank statement * * @param $statementHash * @param string $fileName * * @return void */ public function deleteBankStatement($statementHash, $fileName = '') { $tQuery = "DELETE FROM `" . self::BANKSTA2_TABLE . "` WHERE `hash` = '" . $statementHash . "'"; nr_query($tQuery); log_register('DELETE banksta2 statement [' . $statementHash . '] ` ' . $fileName); $this->getProcessedBSRecsCached(true); } /** * Uploaded file preprocessing * * @param $filename * @param $delimiter * @param $encoding * @param bool $useDBFColNames * * @return string */ public function preprocessImportFile($filename, $delimiter, $encoding, $useDBFColNames = false, $skipRowsCount = 0) { $dataParsed = array(); $colNamesArr = array(); $colNamesTypesArr = array(); $codePage = $encoding; $filePath = self::BANKSTA2_PATH . $filename; $fileExt = @end(explode(".", strtolower($filename))); $errorMessage = ''; $rowsSkipped = 0; set_error_handler(function ($severity, $message, $file, $line) { throw new \ErrorException($message, $severity, $severity, $file, $line); }); try { // dbf/csv/xlsx differentiation goes here switch ($fileExt) { case ('dbf'): $dbfTab = new dbf_class($filePath); $dbfTabRecCount = $dbfTab->dbf_num_rec; if ($useDBFColNames) { foreach ($dbfTab->dbf_names as $item => $eachCol) { $colNamesArr[] = $eachCol['name']; $colNamesTypesArr[$eachCol['name']] = $eachCol['type']; } if (!empty($colNamesArr)) { $dataParsed[] = $colNamesArr; } } for ($i = 0; $i < $dbfTabRecCount; $i++) { $eachRow = $dbfTab->getRow($i); if (!empty($eachRow)) { $dataParsed[] = @array_map(function ($row) use ($codePage) { return (iconv($codePage, 'utf-8', $row)); }, $eachRow); } } break; case ('csv'): case ('txt'): $dataRaw = file_get_contents($filePath); if ($encoding != 'utf-8') { $dataRaw = iconv($encoding, 'utf-8', $dataRaw); } $dataRaw = explodeRows($dataRaw); if (!empty($dataRaw)) { foreach ($dataRaw as $eachrow) { if ($rowsSkipped != $skipRowsCount) { $rowsSkipped++; continue; } if (!empty($eachrow)) { $tmpArray = explode($delimiter, $eachrow); // shitty hacky tricky check... if (!empty($tmpArray) and count($tmpArray) > 1) { $dataParsed[] = $tmpArray; } } } } break; case ('xls'): case ('xlsx'): require_once('api/vendor/excel/excel_reader2.php'); require_once('api/vendor/excel/SpreadsheetReader.php'); $excelReader = new SpreadsheetReader($filePath); foreach ($excelReader as $eachRow) { if ($rowsSkipped != $skipRowsCount) { $rowsSkipped++; continue; } if (!empty($eachRow) and count($eachRow) > 1) { $dataParsed[] = $eachRow; } } break; } } catch(Exception $e) { $errorMessage = __('File parsing error') . '. ' . __('If you tried to import .DBF file - make sure it\'s version is dBaseIII/IV and you\'ve selected a proper codepage.') . ' ' . wf_delimiter(0) . __('Error message') . ': ' . $e->getMessage() . ' in ' . $e->getFile() . ':' . $e->getLine(); } restore_error_handler(); $this->preprocessedFileData = $dataParsed; return($errorMessage); } /** * Creates essential regex body-strings for preprocessBStatement() processing * * @param $keyWordStr * @param string $delimiter * @return string */ public function prepareRegexStrings($keyWordStr, $delimiter = ',', $noEscaping = false) { $keywordsStr = ''; $keywordsArray = explode($delimiter, $keyWordStr); foreach ($keywordsArray as $keyWord) { if ($noEscaping) { $keywordsStr.= trim($keyWord) . '|'; } else { $keywordsStr.= trim(preg_quote($keyWord, '/')) . '|'; } } $keywordsStr = rtrim($keywordsStr, '|'); return ($keywordsStr); } /** * Bank statement preprocessing and last checks form building * * @param $statementRawData * @param $importOpts * @param bool $skipLastChecksForm * * @return string */ public function preprocessBStatement($statementRawData, $importOpts, $skipLastChecksForm = false) { $statementRawData = unserialize(base64_decode($statementRawData)); $noescInetKeywords = wf_getBoolFromVar($importOpts['noesc_inet_srv_keywords']); $noescUKVKeywords = wf_getBoolFromVar($importOpts['noesc_ukv_srv_keywords']); $noescSkipKeywords = wf_getBoolFromVar($importOpts['noesc_skip_row_keywords']); $noescRplcKeywords = wf_getBoolFromVar($importOpts['noesc_replace_keywords']); $noescRmvKeywords = wf_getBoolFromVar($importOpts['noesc_remove_keywords']); $contractGuess = $importOpts['guess_contract']; $contractDelimS = (empty($importOpts['contract_delim_start'])) ? '' : preg_quote($importOpts['contract_delim_start'], '/'); $contractDelimE = (empty($importOpts['contract_delim_end'])) ? '' : preg_quote($importOpts['contract_delim_end'], '/'); $contractMinLen = $importOpts['contract_min_len']; $contractMaxLen = $importOpts['contract_max_len']; $serviceType = $importOpts['service_type']; $paymentTypeID = $importOpts['payment_type_id']; $inetSrvDelimS = (empty($importOpts['inet_srv_start_delim'])) ? '' : preg_quote($importOpts['inet_srv_start_delim'], '/'); $inetSrvDelimE = (empty($importOpts['inet_srv_end_delim'])) ? '' : preg_quote($importOpts['inet_srv_end_delim'], '/'); $inetSrvKeywords = (empty($importOpts['inet_srv_keywords'])) ? '' : ($noescInetKeywords ? $importOpts['inet_srv_keywords'] : preg_quote($importOpts['inet_srv_keywords'], '/')); $ukvSrvDelimS = (empty($importOpts['ukv_srv_start_delim'])) ? '' : preg_quote($importOpts['ukv_srv_start_delim'], '/'); $ukvSrvDelimE = (empty($importOpts['ukv_srv_end_delim'])) ? '' : preg_quote($importOpts['ukv_srv_end_delim'], '/'); $ukvSrvKeywords = (empty($importOpts['ukv_srv_keywords'])) ? '' : ($noescUKVKeywords ? $importOpts['ukv_srv_keywords'] : preg_quote($importOpts['ukv_srv_keywords'], '/')); $skipRow = $importOpts['skip_row']; $skipRowCols = ($importOpts['col_skiprow'] !== 'NONE') ? explode(',', str_replace(' ', '', $importOpts['col_skiprow'])) : array(); $skipRowKeywords = (empty($importOpts['skip_row_keywords'])) ? '' : ($noescSkipKeywords ? $importOpts['skip_row_keywords'] : preg_quote($importOpts['skip_row_keywords'], '/')); $strsReplace = $importOpts['replace_strs']; $strsReplaceCols = ($importOpts['col_replace_strs'] !== 'NONE') ? explode(',', str_replace(' ', '', $importOpts['col_replace_strs'])) : array(); $strsReplaceChars = (empty($importOpts['strs_to_replace'])) ? '' : ($noescRplcKeywords ? $importOpts['strs_to_replace'] : preg_quote($importOpts['strs_to_replace'])); $strsReplaceCharsWith = (empty($importOpts['strs_to_replace_with'])) ? '' : $importOpts['strs_to_replace_with']; $strsReplacementsCnt = (empty($importOpts['replacements_cnt'])) ? -1 : $importOpts['replacements_cnt']; $strsRemove = $importOpts['remove_strs']; $strsRemoveCols = ($importOpts['col_remove_strs'] !== 'NONE') ? explode(',', str_replace(' ', '', $importOpts['col_remove_strs'])) : array(); $strsRemoveChars = (empty($importOpts['strs_to_remove'])) ? '' : ($noescRmvKeywords ? $importOpts['strs_to_remove'] : preg_quote($importOpts['strs_to_remove'])); $srvsIDsIdentsPreff = $importOpts['srvidents_preffered']; // creating essential regex bodies $keywordsStrInet = ''; $keywordsStrUKV = ''; $keywordsStrSkipRow = ''; $keywordsStrReplaceChars = ''; $keywordsStrRemoveChars = ''; // trying to get Inet service keywords if (!empty($inetSrvKeywords)) { $keywordsStrInet = $this->prepareRegexStrings($inetSrvKeywords, $this->regexKeywordsDelimiter, $noescInetKeywords); } // trying to get UKV service keywords if (!empty($ukvSrvKeywords)) { $keywordsStrUKV = $this->prepareRegexStrings($ukvSrvKeywords, $this->regexKeywordsDelimiter, $noescUKVKeywords); } // trying to get skipping row keywords if ($skipRow and !empty($skipRowCols)) { $keywordsStrSkipRow = $this->prepareRegexStrings($skipRowKeywords, $this->regexKeywordsDelimiter, $noescSkipKeywords); } // trying to get replacement keywords if ($strsReplace and !empty($strsReplaceCols)) { $keywordsStrReplaceChars = $this->prepareRegexStrings($strsReplaceChars, $this->regexKeywordsDelimiter, $noescRplcKeywords); } // trying to get removing keywords if ($strsRemove and !empty($strsRemoveCols)) { $keywordsStrRemoveChars = $this->prepareRegexStrings($strsRemoveChars, $this->regexKeywordsDelimiter, $noescRmvKeywords); } $i = 0; $rows = ''; $statementData = array(); foreach ($statementRawData as $eachRow) { if (empty($eachRow)) { continue; } $i++; $cells = wf_TableCell($i); $cancelRow = 0; // replacing characters/strings in specified fields if ($strsReplace and !empty($strsReplaceCols) and !empty($strsReplaceChars)) { foreach ($strsReplaceCols as $strsReplaceCol) { if (isset($eachRow[$strsReplaceCol])) { $eachRow[$strsReplaceCol] = preg_replace('/(' . $keywordsStrReplaceChars . ')/msiu', $strsReplaceCharsWith, $eachRow[$strsReplaceCol], $strsReplacementsCnt); } } } // removing characters/strings from specified fields if ($strsRemove and !empty($strsRemoveCols) and !empty($keywordsStrRemoveChars)) { foreach ($strsRemoveCols as $strsRemoveCol) { if (isset($eachRow[$strsRemoveCol])) { $eachRow[$strsRemoveCol] = preg_replace('/(' . $keywordsStrRemoveChars . ')/msiu', '', $eachRow[$strsRemoveCol]); } } } $realname = ($importOpts['col_realname'] !== 'NONE' and isset($eachRow[$importOpts['col_realname']])) ? $eachRow[$importOpts['col_realname']] : ''; $address = ($importOpts['col_address'] !== 'NONE' and isset($eachRow[$importOpts['col_address']])) ? $eachRow[$importOpts['col_address']] : ''; $notes = ($importOpts['col_paypurpose'] !== 'NONE' and isset($eachRow[$importOpts['col_paypurpose']])) ? $eachRow[$importOpts['col_paypurpose']] : ''; $ptime = ($importOpts['col_paytime'] !== 'NONE' and isset($eachRow[$importOpts['col_paytime']])) ? $eachRow[$importOpts['col_paytime']] : ''; $summ = (isset($eachRow[$importOpts['col_paysum']])) ? preg_replace('/[^-0-9\.,]/', '', $eachRow[$importOpts['col_paysum']]) : ''; $summ = ((!empty($summ) and $importOpts['sum_in_coins']) ? ($summ / 100) : $summ); $pdate = (isset($eachRow[$importOpts['col_paydate']])) ? $eachRow[$importOpts['col_paydate']] : ''; $contract = ($importOpts['col_contract'] !== 'NONE' and isset($eachRow[$importOpts['col_contract']])) ? $eachRow[$importOpts['col_contract']] : ''; $service_type = $serviceType; $payment_type_id = $paymentTypeID; $srvTypeMatched = false; // checking and preparing services idents if an appropriate dedicated field specified $serviceIdent = ($importOpts['col_srvidents'] !== 'NONE' and isset($eachRow[$importOpts['col_srvidents']])) ? $eachRow[$importOpts['col_srvidents']] : ''; if (!empty($serviceIdent) and (!empty($this->inetSrvAllotedIDs[0]) or !empty($this->ctvSrvAllotedIDs[0]))) { if (in_array($serviceIdent, $this->inetSrvAllotedIDs)) { $service_type = 'Internet'; $srvTypeMatched = true; } elseif (in_array($serviceIdent, $this->ctvSrvAllotedIDs)) { $service_type = 'UKV'; $srvTypeMatched = true; } } if (!empty($notes)) { if (empty($contract)) { // if contract guessing enabled and at least one of the delimiters is not empty if ($contractGuess) { if (empty($contractMinLen) or empty($contractMaxLen)) { if ($contractDelimS != '' or $contractDelimE != '') { //$contractDelimS = '(' . $contractDelimS . ')'; //$contractDelimE = '(' . $contractDelimE . ')'; //preg_match('/' . $contractDelimS . '(\D)*?\d{' . $contractMinLen . ',' . $contractMaxLen . '}(\D)*?' . $contractDelimE . '/msu', $notes, $matchResult); //} else { preg_match('/' . $contractDelimS . '(.*?)' . $contractDelimE . '/msu', $notes, $matchResult); } if (isset($matchResult[1])) { $contract = trim($matchResult[1]); } else { $contract = 'unknown_' . $i; } } else { preg_match('/(\D)?(\d{' . $contractMinLen . ',' . $contractMaxLen . '})(\D)?/msu', $notes, $matchResult); if (isset($matchResult[2])) { $contract = trim($matchResult[2]); } else { $contract = 'unknown_' . $i; } } } else { $contract = 'unknown_' . $i; } } if (strtolower($serviceType) == 'telepathy' and !($srvsIDsIdentsPreff and $srvTypeMatched)) { // trying to check for Inet service keywords if (!empty($keywordsStrInet)) { if ($inetSrvDelimS == '' and $inetSrvDelimE == '') { $betweenDelimStr = $notes; } else { preg_match('/' . $inetSrvDelimS . '(.*?)' . $inetSrvDelimE . '/msiu', strtolower($notes), $matchResult); if (isset($matchResult[1])) { $betweenDelimStr = trim($matchResult[1]); } else { $betweenDelimStr = $notes; } } preg_match('/(' . $keywordsStrInet . ')/msiu', $betweenDelimStr, $matchResult); if (isset($matchResult[1])) { $service_type = 'Internet'; $srvTypeMatched = true; } } // trying to check for UKV service keywords if (!$srvTypeMatched and !empty($keywordsStrUKV)) { if ($ukvSrvDelimS == '' and $ukvSrvDelimE == '') { $betweenDelimStr = $notes; } else { preg_match('/' . $ukvSrvDelimS . '(.*?)' . $ukvSrvDelimE . '/msiu', $notes, $matchResult); if (isset($matchResult[1])) { $betweenDelimStr = trim($matchResult[1]); } else { $betweenDelimStr = $notes; } } preg_match('/(' . $keywordsStrUKV . ')/msiu', $betweenDelimStr, $matchResult); if (isset($matchResult[1])) { $service_type = 'UKV'; } } } } else { if (empty($contract)) { $contract = 'unknown_' . $i; } } // skipping rows if ($skipRow and !empty($skipRowCols) and !empty($keywordsStrSkipRow)) { foreach ($skipRowCols as $skipRowCol) { if (!empty($eachRow[$skipRowCol])) { $skipRowContent = $eachRow[$skipRowCol]; preg_match('/(' . $keywordsStrSkipRow . ')/msiu', $skipRowContent, $matchResult); if (isset($matchResult[1])) { $cancelRow = 1; break; } } } } // filling statement array for further processing $tArrayIndex = wf_InputId() . wf_InputId(); $statementData[$tArrayIndex]['contract'] = $contract; $statementData[$tArrayIndex]['summ'] = $summ; $statementData[$tArrayIndex]['address'] = $address; $statementData[$tArrayIndex]['realname'] = $realname; $statementData[$tArrayIndex]['notes'] = $notes; $statementData[$tArrayIndex]['pdate'] = $pdate; $statementData[$tArrayIndex]['ptime'] = $ptime; $statementData[$tArrayIndex]['service_type'] = $service_type; $statementData[$tArrayIndex]['row_canceled'] = $cancelRow; $statementData[$tArrayIndex]['paymtype_id'] = $payment_type_id; if (!$skipLastChecksForm) { $cancelTitle = ($cancelRow) ? 'Yes' : 'No'; $cancelTitle = ($this->translateLstChkFieldNames) ? __($cancelTitle) : $cancelTitle; $cells.= wf_TableCell($contract); $cells.= wf_TableCell($summ); $cells.= wf_TableCell($address); $cells.= wf_TableCell($realname); $cells.= wf_TableCell($notes); $cells.= wf_TableCell($pdate); $cells.= wf_TableCell($ptime); $cells.= wf_TableCell($service_type); $cells.= wf_TableCell($cancelTitle); $rows.= wf_TableRow($cells, (($cancelRow) ? 'row6' : 'row3')); } } zb_StorageSet('BANKSTA2_STATEMENT_DATA', base64_encode(serialize($statementData))); return ($rows); } /** * Bank statement rows processing and adding to DB * * @param $statementData * @param $statementFileData * * @return void */ public function processBankStatement($statementData, $statementFileData) { if (!empty($statementData)) { $importCounter = 0; $newAdmin = whoami(); $newHash = $statementFileData['hash']; $newFilename = $statementFileData['filename']; foreach ($statementData as $eachContract => $eachRow) { if (!empty($eachRow)) { $newDate = date("Y-m-d H:i:s"); //@$newContract = trim($eachContract); @$newContract = trim($eachRow['contract']); $newContract = mysql_real_escape_string($newContract); @$newSumm = trim($eachRow['summ']); $newSumm = mysql_real_escape_string($newSumm); $newSumm = str_replace(array(' ', ','), array('', '.'), $newSumm); @$newAddress = mysql_real_escape_string($eachRow['address']); @$newRealname = mysql_real_escape_string($eachRow['realname']); $newNotes = mysql_real_escape_string($eachRow['notes']); $newPdate = mysql_real_escape_string($eachRow['pdate']); $newPtime = mysql_real_escape_string($eachRow['ptime']); $newSrvType = mysql_real_escape_string($eachRow['service_type']); $newCancelRow = $eachRow['row_canceled']; $paymentTypeID = $eachRow['paymtype_id']; //pushing row into database if ((!empty($newPdate)) AND (!empty($newSumm))) { $this->createPaymentRec($newDate, $newHash, $newFilename, $newAdmin, $newContract, $newSumm, $newAddress, $newRealname, $newNotes, $newPdate, $newPtime, $newSrvType, $newCancelRow, $paymentTypeID); $importCounter++; } } } zb_StorageDelete('BANKSTA2_STATEMENT_DATA'); zb_StorageDelete('BANKSTA2_RAWDATA'); log_register('BANKSTA2 IMPORTED ' . $importCounter . ' ROWS FROM ' . $statementFileData['savedname']); } else { show_error(__('Can not process empty bank statement')); } } /** * Push bank statement payments for users that have been found * * @param $paymentsToPush * @param bool $refiscalize * * @return void */ public function pushStatementPayments($paymentsToPush, $refiscalize = false) { $paymentsToPush = unserialize(base64_decode($paymentsToPush)); $checkForCorpUsers = $this->ubConfig->getAlterParam('USER_LINKING_ENABLED'); $dreamkasEnabled = $this->ubConfig->getAlterParam('DREAMKAS_ENABLED'); $needToFiscalize = false; $fiscalDataArray = array(); $insatiability = false; if ($dreamkasEnabled and wf_CheckPost(array('bankstapaymentsfiscalize'))) { $DreamKas = null; $greed = new Avarice(); $insatiability = $greed->runtime('DREAMKAS'); $needToFiscalize = true; $fiscalDataArray = json_decode(base64_decode($_POST['bankstapaymentsfiscalize']), true); if ($refiscalize) { $paymentsToPush = array(); $bs2RecIDs = implode(',', array_keys($fiscalDataArray)); $tQuery = "(SELECT `contracts`.`login` AS `userlogin`, `" . self::BANKSTA2_TABLE . "`.`id`, `summ`, `pdate`, `ptime`, `payid`, `service_type` AS `service` FROM `" . self::BANKSTA2_TABLE . "` RIGHT JOIN `contracts` ON `" . self::BANKSTA2_TABLE . "`.`contract` = `contracts`.`contract` AND `" . self::BANKSTA2_TABLE . "`.`service_type` = 'Internet' WHERE `" . self::BANKSTA2_TABLE . "`.`id` IN (" . $bs2RecIDs . ")) UNION (SELECT `ukv_users`.`id` AS `userlogin`, `" . self::BANKSTA2_TABLE . "`.`id`, `summ`, `pdate`, `ptime`, `payid`, `service_type` AS `service` FROM `" . self::BANKSTA2_TABLE . "` RIGHT JOIN `ukv_users` ON `" . self::BANKSTA2_TABLE . "`.`contract` = `ukv_users`.`contract` AND `" . self::BANKSTA2_TABLE . "`.`service_type` = 'UKV' WHERE `" . self::BANKSTA2_TABLE . "`.`id` IN (" . $bs2RecIDs . ")) "; if ($this->opayzIDAsContract) { $tQuery.= " UNION (SELECT `op_customers`.`realid` AS `userlogin`, `" . self::BANKSTA2_TABLE . "`.`id`, `summ`, `pdate`, `ptime`, `payid`, `service_type` AS `service` FROM `" . self::BANKSTA2_TABLE . "` RIGHT JOIN `op_customers` ON `" . self::BANKSTA2_TABLE . "`.`contract` = `op_customers`.`virtualid` AND `" . self::BANKSTA2_TABLE . "`.`service_type` = 'Internet' WHERE `" . self::BANKSTA2_TABLE . "`.`id` IN (" . $bs2RecIDs . ")) "; } $tQueryResult = simple_queryall($tQuery); if (!empty($tQueryResult)) { foreach ($tQueryResult as $eachRec) { $paymentsToPush[$eachRec['id']] = $eachRec; } } } } if (!empty($paymentsToPush)) { $this->getUsersDataCached(); $this->getProcessedBSRecsCached(true); $needProcessUKV = $this->checkNeedProcessUKV($paymentsToPush); $ukv = $needProcessUKV ? new UkvSystem() : null; $allParentUsers = ($checkForCorpUsers and !$refiscalize) ? cu_GetAllParentUsers() : array(); foreach ($paymentsToPush as $eachRecID => $eachRec) { $paymentSuccessful = false; $userLogin = $eachRec['userlogin']; $paySumm = $eachRec['summ']; if (!$refiscalize) { if ($this->checkBankstaRowIsUnprocessed($eachRecID)) { $cashType = $eachRec['payid']; $operation = 'add'; $paymentDayTimeNote = (empty($eachRec['pdate'])) ? '' : ' ON ' . $eachRec['pdate'] . ' ' . $eachRec['ptime']; $paymentNote = 'BANKSTA2: [' . $eachRecID . '] ASCONTRACT ' . $eachRec['usercontract'] . $paymentDayTimeNote; if (zb_checkMoney($paySumm)) { if (strtolower($eachRec['service']) == 'internet') { // inet service payment processing if (!empty($userLogin)) { if (isset($this->allUsersDataInet[$userLogin])) { // check for corporate user possibility if ($checkForCorpUsers and !empty($allParentUsers[$eachRec['userlogin']])) { //corporate user $userLink = $allParentUsers[$eachRec['userlogin']]; $allChildUsers = cu_GetAllChildUsers($userLink); // adding natural payment to parent user zb_CashAdd($userLogin, $paySumm, $operation, $cashType, $paymentNote); if (!empty($allChildUsers)) { foreach ($allChildUsers as $eachChild) { //adding quiet payments for child users $this->billing->addcash($eachChild, $paySumm); log_register("BANKSTA2 GROUPBALANCE " . $eachChild . " " . $operation . " ON " . $paySumm); } } } else { // ordinary user processing zb_CashAdd($userLogin, $paySumm, $operation, $cashType, $paymentNote); } $this->setBankstaRecProcessed($eachRecID); $paymentSuccessful = true; } else { log_register('BANKSTA2 [' . $eachRecID . '] FAIL LOGIN (' . $userLogin . ')'); } } else { log_register('BANKSTA2 [' . $eachRecID . '] FAIL EMPTY LOGIN'); } } else { // UKV service payment processing $ukv->userAddCash($userLogin, $paySumm, 1, $cashType, $paymentNote); $this->setBankstaRecProcessed($eachRecID); $paymentSuccessful = true; } } else { log_register('BANKSTA2 FAILED: payment record ID: [' . $eachRecID . '] for service: [' . $eachRec['service'] . '] for login: [' . $userLogin . ']. ' . __('Wrong format of a sum of money to pay')); } } else { $this->setBankstaRecProcessed($eachRecID); log_register('BANKSTA2 DUPLICATE PAYMENT PUSH TRY FOR REC ID: [' . $eachRecID . ']'); } } // dreamkas fiscalization routine if ($needToFiscalize and !empty($insatiability) and isset($fiscalDataArray[$eachRecID]) and ($paymentSuccessful or $refiscalize) ) { $DreamKas = new DreamKas(); $rapacity_a = $insatiability['M']['KICKUP']; $rapacity_b = $insatiability['M']['PICKUP']; $rapacity_c = $insatiability['M']['PUSHCASHLO']; $rapacity_d = $insatiability['M']['KANBARU']; $rapacity_e = $insatiability['M']['SURUGA']; $rapacity_z = $insatiability['M']['ONONOKI']; $curRecFiscalData = $fiscalDataArray[$eachRecID]; $voracity_a = $curRecFiscalData[$insatiability['B2']['OIKURA']]; $voracity_b = $curRecFiscalData[$insatiability['B2']['SODACHI']]; $voracity_c = $curRecFiscalData[$insatiability['B2']['IZUKO']]; if (strtolower($eachRec[$insatiability['LT']['YOTSUGI']]) == $insatiability['LT']['MEME']) { $voracity_d = $DreamKas->$rapacity_d($userLogin); $voracity_e = $DreamKas->$rapacity_e($userLogin); } else { $voracity_d = $DreamKas->$rapacity_z($userLogin, $ukv); $voracity_d = (empty($voracity_d)) ? '' : $voracity_d[$insatiability['AK']['ARARAGI']]; $voracity_e = ''; } $voracity_f = array($curRecFiscalData[$insatiability['B2']['GAEN']] => array($insatiability['AK']['TSUKIHI'] => ($paySumm * 100))); $voracity_g = array($insatiability['AK']['MAYOI'] => $voracity_e, $insatiability['AK']['OUGI'] => $voracity_d); $voracity_h = $DreamKas->$rapacity_a($voracity_a, $voracity_b, $voracity_c, $voracity_f, $voracity_g); $DreamKas->$rapacity_c($voracity_h, $eachRecID); $voracity_i = $DreamKas->$rapacity_b(); if (!empty($voracity_i)) { log_register('BANKSTA2 FAILED: payment record ID: [' . $eachRecID . '] fiscalization for service: [' . $eachRec['service'] . '] for login: [' . $userLogin . ']. Error message: ' . $voracity_i); } } } } } /** * Creates a row in BANKSTA2_TABLE with essential payment data * * @param $newDate * @param $newHash * @param $newFilename * @param $newAdmin * @param $newContract * @param $newSumm * @param $newAddress * @param $newRealname * @param $newNotes * @param $newPdate * @param $newPtime * @param $newSrvType * * @return void */ protected function createPaymentRec($newDate, $newHash, $newFilename, $newAdmin, $newContract, $newSumm, $newAddress, $newRealname, $newNotes, $newPdate, $newPtime, $newSrvType, $newCancelRow, $paymentTypeID = 0) { if (empty($paymentTypeID)) { $newPaymentID = (strtolower($newSrvType) == 'internet') ? $this->inetPaymentId : $this->ukvPaymentId; } else { $newPaymentID = $paymentTypeID; } $tQuery = "INSERT INTO `" . self::BANKSTA2_TABLE . "` (`date`, `hash`, `filename`, `admin`, `contract`, `summ`, `address`, `realname`, `notes`, `pdate`, `ptime`, `processed`, `canceled`, `service_type`, `payid`) VALUES ( '" . $newDate . "', '" . $newHash . "', '" . $newFilename . "', '" . $newAdmin . "', '" . $newContract . "', '" . $newSumm . "', '" . $newAddress . "', '" . $newRealname . "', '" . $newNotes . "', '" . $newPdate . "', '" . $newPtime . "', '" . $newCancelRow . "', '" . $newCancelRow . "', '" . $newSrvType . "', '" . $newPaymentID . "' )"; nr_query($tQuery); } /** * Checks banksta row by it's ID if it is unprocessed * * @param int $bankstaid existing banksta row ID * * @return bool */ protected function checkBankstaRowIsUnprocessed($bankstaid) { $result = false; $this->getProcessedBSRecsCached(); if (isset($this->bankstaRecordsAll[$bankstaid])) { if ($this->bankstaRecordsAll[$bankstaid]['processed'] == 0) { $result = true; } else { $result = false; } } return ($result); } public function checkStatementIsUnprocessed($bankstaHash) { $tQuery = "SELECT `id` FROM `" . self::BANKSTA2_TABLE . "` WHERE `hash` = '" . $bankstaHash . "' AND `processed` < 1 and `canceled` < 1"; $tQueryResult = simple_queryall($tQuery); } /** * Checks $paymentsToPush array for UKV records presence * * @param $paymentsToPush * * @return bool */ public function checkNeedProcessUKV($paymentsToPush) { $result = false; if (!empty($paymentsToPush)) { foreach ($paymentsToPush as $eachRecID => $eachRec) { if (strtolower($eachRec['service']) == 'ukv') { $result = true; break; } } } return ($result); } /** * Returns main buttons controls for banksta2 * * @return string */ public static function web_MainButtonsControls() { $controls = wf_Link(self::URL_BANKSTA2_BANKSTALIST, wf_img('skins/menuicons/receipt_small_compl.png') . wf_nbsp() . __('Uploaded bank statements'), false, 'ubButton') . wf_nbsp(2); $controls.= wf_Link(self::URL_BANKSTA2_UPLOADFORM, wf_img('skins/menuicons/receipt_small.png') . wf_nbsp() . __('Upload bank statement'), false, 'ubButton') . wf_nbsp(2); $controls.= wf_Link(self::URL_BANKSTA2_PRESETS, wf_img('skins/icon_note.gif') . wf_nbsp() . __('Fields mapping presets'), false, 'ubButton'); return ($controls); } /** * Returns file selection and upload form * * @return string */ public function web_FileUploadForm() { $delimiters = array(';'=>';', '|'=>'|', ','=>',' ); $encodings = array('utf-8'=>'utf-8', 'windows-1251'=>'windows-1251', 'koi8-u'=>'koi8-u', 'cp866'=>'cp866' ); $uploadinputs = wf_HiddenInput('bankstatementuploaded','true'); $uploadinputs.= __('Upload bank statement') . wf_nbsp(2) . ' <input id="fileselector" type="file" name="uploadbnksta2" size="10" /><br>'; $uploadinputs.= wf_delimiter(0); $uploadinputs.= wf_tag('div', false, '', 'style="border: 1px solid #ddd; border-radius: 4px; padding: 4px"'); $uploadinputs.= wf_Selector('delimiter', $delimiters, __('Delimiter') . ' (' . __('this setting does not have any effect on') . ' .DBF/.XLS/.XLSX)', '', true); $uploadinputs.= wf_delimiter(0); $uploadinputs.= wf_Selector('encoding', $encodings, __('Encoding') . ' (' . __('this setting does not have any effect on') . ' .XLS/.XLSX)', '', true); $uploadinputs.= wf_delimiter(0); $uploadinputs.= wf_TextInput('skiprowscount', __('Skip specified numbers of rows from the beginning of .CSV/.TXT/.XLS/.XLSX file (if those rows are empty, or contain fields captions, or whatever)'), 0, true, '4', 'digits'); $uploadinputs.= wf_delimiter(0); $uploadinputs.= wf_CheckInput('usedbfcolnames', __('Use .DBF column names instead of record values in mapping visualizer'), true, false); $uploadinputs.= wf_tag('div', true); $uploadinputs.= wf_delimiter(0); $uploadinputs.= wf_Submit('Upload'); $uploadform = bs_UploadFormBody(self::URL_BANKSTA2_FIELD_MAPPING, 'POST', $uploadinputs, 'glamour'); return ($uploadform); } /** * Renders statement preprocessing form with fields mapping * * @param $dataParsed */ public function web_FieldsMappingForm($dataParsed) { $dataParsed = unserialize(base64_decode($dataParsed)); // actual fileds mapping form assembling if (sizeof($dataParsed) > 1) { $colCount = sizeof($dataParsed[0]); $cells= wf_TableCell(__('Column number')); $cells.= wf_TableCell(__('Column content')); $rows = wf_TableRow($cells, 'row1'); foreach ($dataParsed[0] as $colNum => $colData) { $cells = wf_TableCell($colNum); $cells.= wf_TableCell($colData); $rows.= wf_TableRow($cells, 'row3'); } $firstRow = wf_TableBody($rows, '100%', '0', ''); show_window(__('Found count of data columns'),$colCount); show_window(__('First of imported data rows'), $firstRow); //construct of data processing form $rowNumArr = array(); for ($i = 0; $i < $colCount; $i++) { $rowNumArr[$i] = $i; } $bsrealname_arr = $rowNumArr + array('NONE' => __('Set to none')); $bsaddress_arr = $rowNumArr + array('NONE' => __('Set to none')); $bspaysum_arr = $rowNumArr; $bspaypurpose_arr = $rowNumArr + array('NONE' => __('Set to none')); $bspaydate_arr = $rowNumArr; $bspaytime_arr = $rowNumArr + array('NONE' => __('Set to none')); $bscontract_arr = $rowNumArr + array('NONE' => __('Set to none')); $bssrvidents_arr = $rowNumArr + array('NONE' => __('Set to none')); //save preset form $errorModalWindowId = wf_InputId(); $presetsSelectorId = wf_InputId(); $presetsSelectorClass = '__' . wf_InputId(); $savePresetInputs = wf_TextInput('fmpname', __('Preset name'), '', true, '', '', '__FMPEmptyCheck'); $savePresetInputs.= wf_HiddenInput('fmpcreate', 'true'); $savePresetInputs.= wf_Submit(__('Create')); $savePresetForm = wf_Form(self::URL_ME . '&fmpquickadd=true', 'POST', $savePresetInputs, 'glamour __FMPQuickSave'); $savePresetForm = wf_modalAuto(wf_img_sized('skins/save-as.png', '', '16') . wf_nbsp(1) . __('Save current mapping as preset'), __('Save current mapping as preset'), $savePresetForm, 'ubButton'); $savePresetForm.= wf_delimiter(1); $savePresetForm.= $this->getMappingPresetsSelector($presetsSelectorId, $presetsSelectorClass, true, '', true, true); $savePresetForm.= wf_delimiter(0); //data column setting form $inputs = wf_TextInput('bspaymtypeid', __('Custom payment type ID for this bank statement'), 0, true, '4', 'digits', '', 'BankstaPaymentTypeID'); $inputs.= wf_delimiter(0); $inputs.= wf_Selector('bsrealname_col', $bsrealname_arr, __('User realname'), '0', true); $inputs.= wf_delimiter(0); $inputs.= wf_Selector('bsaddress_col', $bsaddress_arr, __('User address'), '1', true); $inputs.= wf_delimiter(0); $inputs.= wf_Selector('bspaysum_col', $bspaysum_arr, __('Payment sum'), '2', true); $inputs.= wf_CheckInput('bspaymincoins', __('Bank statement "SUM" field presented in coins(need to be divided by 100)'), true, false, 'BankstaPaymInCoins'); $inputs.= wf_delimiter(0); $inputs.= wf_Selector('bspaypurpose_col', $bspaypurpose_arr, __('Payment purpose'), '3', true); $inputs.= wf_delimiter(0); $inputs.= wf_Selector('bspaydate_col', $bspaydate_arr, __('Payment date'), '4', true); $inputs.= wf_delimiter(0); $inputs.= wf_Selector('bspaytime_col', $bspaytime_arr, __('Payment time'), '5', true); //contract defining controls $inputs.= wf_delimiter(0); $inputs.= wf_Selector('bscontract_col', $bscontract_arr, __('User contract') . ' (' . __('Payment ID') . ')', '6', true); $inputs.= wf_CheckInput('bstryguesscontract', __('Try to get contract from payment purpose field'), true, false, 'BankstaTryGuessContract'); $inputs.= wf_tag('h4', false, '', 'style="font-weight: 400; width: 700px; padding: 2px 0 8px 28px; color: #666; margin-block-end: 0; margin-block-start: 0;"'); $inputs.= __('ONLY, if mapped contract field for some row will be empty or if contract field will be not specified'); $inputs.= wf_tag('h4', true); $inputs.= wf_tag('div', false, '', 'id="BankstaContractGuessingBlock" style="border: 1px solid #ddd; border-radius: 4px; padding: 4px"'); $inputs.= __('If it is possible that there are users contracts between start/end delimiters in payment purpose field of the bank statement - they will be extracted'); $inputs.= wf_delimiter(0); $inputs.= wf_TextInput('bscontractdelimstart', __('Contract') . ' (' . __('Payment ID') . '): ' . __('start delimiter string'), '', true, '', '', '', 'BankstaContractDelimStart'); $inputs.= wf_TextInput('bscontractdelimend', __('Contract') . ' (' . __('Payment ID') . '): ' . __('end delimiter string'), '', true, '', '', '', 'BankstaContractDelimEnd'); $inputs.= wf_tag('h4', false, '', 'style="font-weight: 400; width: 700px; padding: 11px 0 7px 0; color: #666; margin-block-end: 0; margin-block-start: 0;"'); $inputs.= __('If your contracts(payment IDs) are 100% DIGITAL - you may specify their minimum and maximum length to extract them properly(delimiters will not be taken into account)'); $inputs.= wf_tag('h4', true); $inputs.= wf_TextInput('bscontractminlen', __('Contract') . ' (' . __('Payment ID') . '): ' . __('min length'), '0', true, '', '', '', 'BankstaContractMinLen'); $inputs.= wf_TextInput('bscontractmaxlen', __('Contract') . ' (' . __('Payment ID') . '): ' . __('max length'), '0', true, '', '', '', 'BankstaContractMaxLen'); $inputs.= wf_tag('div', true); //service types defining controls $inputs.= wf_delimiter(0); $inputs.= wf_Selector('bssrvtype', $this->bankstaServiceType, __('Service type'), '21', true, false, 'BankstaSrvType'); $inputs.= wf_tag('div', false, '', 'id="BankstaServiceGuessingBlock" style="border: 1px solid #ddd; border-radius: 4px; padding: 4px"'); $inputs.= wf_TextInput('bsinetdelimstart', __('Internet service before keywords delimiter string'), '', true, '', '', '', 'BankstaInetDelimStart'); $inputs.= wf_TextInput('bsinetkeywords', __('Internet service determination keywords') . ', ' . __('separated with') . ' BANKSTA2_REGEX_KEYWORDS_DELIM', '', true, '40', '', '', 'BankstaInetKeyWords'); $inputs.= wf_TextInput('bsinetdelimend', __('Internet service after keywords delimiter string'), '', true, '', '', '', 'BankstaInetDelimEnd'); $inputs.= wf_CheckInput('bsinetkeywordsnoesc', __('Don\'t escape or process in any other way the keywords - just left them "as is"'), true, false, 'BankstaInetKeyWordsNoEsc'); $inputs.= wf_delimiter(0); $inputs.= wf_TextInput('bsukvdelimstart', __('UKV service before keywords delimiter string'), '', true, '', '', '', 'BankstaUKVDelimStart'); $inputs.= wf_TextInput('bsukvkeywords', __('UKV service determination keywords') . ', ' . __('separated with') . ' BANKSTA2_REGEX_KEYWORDS_DELIM', '', true, '40', '', '', 'BankstaUKVKeyWords'); $inputs.= wf_TextInput('bsukvdelimend', __('UKV service after keywords delimiter string'), '', true, '', '', '', 'BankstaUKVDelimEnd'); $inputs.= wf_CheckInput('bsukvkeywordsnoesc', __('Don\'t escape or process in any other way the keywords - just left them "as is"'), true, false, 'BankstaUKVKeyWordsNoEsc'); $inputs.= wf_tag('div', true); $inputs.= wf_delimiter(0); //allotted service IDs controls $inputs.= wf_Selector('bssrvidents_col', $bssrvidents_arr, __('Number of the dedicated field which contains services IDs identifiers mapped via BANKSTA2_INETSRV_ALLOTED_IDS and BANKSTA2_CTVSRV_ALLOTED_IDS'), '6', true); $inputs.= wf_CheckInput('bssrvidentspreff', __('Services IDs identifiers from the dedicated field take precedence over service type telepathy'), true, false, 'BankstaSrvIdentsPreff'); $inputs.= wf_tag('h4', false, '', 'style="font-weight: 400; width: 980px; padding: 2px 0 8px 28px; color: #666; margin-block-end: 0; margin-block-start: 0;"'); $inputs.= __('NOTE: dedicated field\'s services IDs are always take precedence over manually chosen \'Internet\' or \'UKV\' services'); $inputs.= wf_tag('h4', true); $inputs.= wf_delimiter(0); //row skipping controls $inputs.= wf_CheckInput('bsskiprow', __('Skip row processing if specified fields contain keywords below'), true, false, 'BankstaSkipRow'); $inputs.= wf_tag('div', false, '', 'id="BankstaSkipRowBlock" style="border: 1px solid #ddd; border-radius: 4px; padding: 4px"'); //$inputs.= wf_Selector('bsskiprow_col', $bsrealname_arr, __('Fields to check row skipping(multiple fields must be separated with comas)'), 'NONE', true); $inputs.= wf_TextInput('bsskiprow_col', __('Fields to check row skipping') . '(' . __('multiple fields must be separated with comas') . ')', '', true, '', '', '', 'BankstaSkipRowKeyWordsCols'); $inputs.= wf_TextInput('bsskiprowkeywords', __('Row skipping determination keywords') . ', ' . __('separated with') . ' BANKSTA2_REGEX_KEYWORDS_DELIM', '', true, '40', '', '', 'BankstaSkipRowKeyWords'); $inputs.= wf_CheckInput('bsskiprowkeywordsnoesc', __('Don\'t escape or process in any other way the keywords - just left them "as is"'), true, false, 'BankstaSkipRowKeyWordsNoEsc'); $inputs.= wf_tag('div', true); $inputs.= wf_delimiter(0); //words/strings replacing controls $inputs.= wf_CheckInput('bsreplacestrs', __('Replace characters specified below in specified fields'), true, false, 'BankstaReplaceStrs'); $inputs.= wf_tag('div', false, '', 'id="BankstaReplaceStrsBlock" style="border: 1px solid #ddd; border-radius: 4px; padding: 4px"'); //$inputs.= wf_Selector('bscolsreplacestrs', $bsrealname_arr, __('Fields to perform replacing(multiple fields must be separated with comas)'), 'NONE', true); $inputs.= wf_TextInput('bscolsreplacestrs', __('Fields to perform replacing') . '(' . __('multiple fields must be separated with comas') . ')', '', true, '', '', '', 'BankstaReplaceStrsCols'); $inputs.= wf_TextInput('bsstrstoreplace', __('Replaced characters or strings') . ', ' . __('separated with') . ' BANKSTA2_REGEX_KEYWORDS_DELIM', '', true, '40', '', '', 'BankstaReplaceStrsChars'); $inputs.= wf_TextInput('bsstrstoreplacewith', __('Replacing characters or string'), '', true, '40', '', '', 'BankstaReplaceStrsWith'); $inputs.= wf_TextInput('bsreplacementscnt', __('Replacements count'), '', true, '40', '', '', 'BankstaReplaceStrsCnt'); $inputs.= wf_CheckInput('bsreplacekeywordsnoesc', __('Don\'t escape or process in any other way the keywords - just left them "as is"'), true, false, 'BankstaReplaceKeyWordsNoEsc'); $inputs.= wf_tag('div', true); $inputs.= wf_delimiter(0); //words/strings removing controls $inputs.= wf_CheckInput('bsremovestrs', __('Remove characters specified below in specified fields'), true, false, 'BankstaRemoveStrs'); $inputs.= wf_tag('div', false, '', 'id="BankstaRemoveStrsBlock" style="border: 1px solid #ddd; border-radius: 4px; padding: 4px"'); //$inputs.= wf_Selector('bscolremovestrs', $bsrealname_arr, __('Fields to perform replacing(multiple fields must be separated with comas)'), 'NONE', true); $inputs.= wf_TextInput('bscolremovestrs', __('Fields to perform removing') . '(' . __('multiple fields must be separated with comas') . ')', '', true, '', '', '', 'BankstaRemoveStrsCols'); $inputs.= wf_TextInput('bsstrstoremove', __('Removed characters or strings') . ', ' . __('separated with') . ' BANKSTA2_REGEX_KEYWORDS_DELIM', '', true, '40', '', '', 'BankstaRemoveStrsChars'); $inputs.= wf_CheckInput('bsremovekeywordsnoesc', __('Don\'t escape or process in any other way the keywords - just left them "as is"'), true, false, 'BankstaRemoveKeyWordsNoEsc'); $inputs.= wf_tag('div', true); $inputs.= wf_delimiter(0); $inputs.= wf_CheckInput('bsskiplastcheck', __('Skip last check visualization form and import data immediately'), true); $inputs.= wf_tag('script', false, '', 'type="text/javascript"'); $inputs.= wf_JSEmptyFunc(); $inputs.= wf_JSElemInsertedCatcherFunc(); $inputs.= ' function chekEmptyVal(ctrlClassName) { $(document).on("focus keydown", ctrlClassName, function(evt) { if ( $(ctrlClassName).css("border-color") == "rgb(255, 0, 0)" ) { $(ctrlClassName).val(""); $(ctrlClassName).css("border-color", ""); $(ctrlClassName).css("color", ""); } }); } function dynamicDistributePresetValue(ctrlClassName) { $(document).on("change", ctrlClassName, function(evt) { distributePresetValue($(ctrlClassName).val()); }); } function distributePresetValue(presetId) { $.ajax({ type: "POST", url: "' . self::URL_ME . '", data: { getfmpdata: true, fmpid: presetId }, success: function(result) { var tFMPData = JSON.parse(result); var tFields = Object.entries(tFMPData); tFields.forEach(function(field) { var fieldNam = field[0]; var fieldVal = field[1]; if ( $(\'[name=\'+fieldNam+\']\').length ) { var ctrl = $(\'[name=\'+fieldNam+\']\'); console.log(fieldNam); console.log(fieldVal); console.log(ctrl); switch(ctrl.prop("type")) { case "radio": case "checkbox": ctrl.each(function() { if (fieldVal == true || fieldVal > 0) { //$(this).attr("checked", true); $(this).prop("checked", true).change(); } else { //$(this).attr("checked", false); $(this).prop("checked", false).change(); } }); break; default: ctrl.val(fieldVal); } ctrl.change(); } }); } }); } function refreshFMPSelector() { $.ajax({ type: "GET", url: "' . self::URL_ME . '", data: { refreshfmpselector: true, fmpselectorid: "' . $presetsSelectorId . '", fmpselectorclass: "' . $presetsSelectorClass . '" }, success: function(result) { if ( !empty(result) ) { $("label[for=\'' . $presetsSelectorId . '\']").remove(); $(\'#' . $presetsSelectorId . '\').replaceWith(result); } } }); } $(document).on("submit", ".__FMPQuickSave", function(evt) { var FrmAction = $(".__FMPQuickSave").attr("action"); var FrmData = $(".__FMPQuickSave").serialize() + \'&\' + $(".__Banksta2PreprocessingForm").serialize() + \'&errfrmid=' . $errorModalWindowId . '\'; evt.preventDefault(); var emptyCheckClass = \'.__FMPEmptyCheck\'; if ( empty( $(emptyCheckClass).val() ) || $(emptyCheckClass).css("border-color") == "rgb(255, 0, 0)" ) { $(emptyCheckClass).css("border-color", "red"); $(emptyCheckClass).css("color", "grey"); $(emptyCheckClass).val("' . __('Mandatory field') . '"); } else { $.ajax({ type: "POST", url: FrmAction, data: FrmData, success: function(result) { if ( !empty(result) ) { $(document.body).append(result); $( \'#' . $errorModalWindowId . '\' ).dialog("open"); } else { alert(\'' . __('Preset added successfully') . '\'); $(".__FMPQuickSave").parent(\'.ui-dialog-content\').dialog("close"); refreshFMPSelector(); } } }); } }); onElementInserted(\'body\', \'.' . $presetsSelectorClass . '\', function(element) { dynamicDistributePresetValue(\'.'. $presetsSelectorClass . '\'); }); onElementInserted(\'body\', \'.__FMPEmptyCheck\', function(element) { chekEmptyVal(\'.__FMPEmptyCheck\'); }); $(\'#refresh_' . $presetsSelectorId . '\').click(function(evt) { refreshFMPSelector(); }); $(\'#' . $presetsSelectorId . '\').change(function(evt) { distributePresetValue($(this).val()); }); $(\'#BankstaTryGuessContract\').change(function () { if ( $(\'#BankstaTryGuessContract\').is(\':checked\') ) { $(\'#BankstaContractGuessingBlock\').show(); } else { $(\'#BankstaContractGuessingBlock\').hide(); } }); $(\'#BankstaSrvType\').change(function () { if ( $(\'#BankstaSrvType\').val() == \'Telepathy\' ) { $(\'#BankstaServiceGuessingBlock\').show(); } else { $(\'#BankstaServiceGuessingBlock\').hide(); } }); $(\'#BankstaSkipRow\').change(function () { if ( $(\'#BankstaSkipRow\').is(\':checked\') ) { $(\'#BankstaSkipRowBlock\').show(); } else { $(\'#BankstaSkipRowBlock\').hide(); } }); $(\'#BankstaReplaceStrs\').change(function () { if ( $(\'#BankstaReplaceStrs\').is(\':checked\') ) { $(\'#BankstaReplaceStrsBlock\').show(); } else { $(\'#BankstaReplaceStrsBlock\').hide(); } }); $(\'#BankstaRemoveStrs\').change(function () { if ( $(\'#BankstaRemoveStrs\').is(\':checked\') ) { $(\'#BankstaRemoveStrsBlock\').show(); } else { $(\'#BankstaRemoveStrsBlock\').hide(); } }); $(document).ready(function() { $(\'#BankstaContractGuessingBlock\').hide(); $(\'#BankstaServiceGuessingBlock\').hide(); $(\'#BankstaSkipRowBlock\').hide(); $(\'#BankstaReplaceStrsBlock\').hide(); $(\'#BankstaRemoveStrsBlock\').hide(); }); '; $inputs.= wf_tag('script', true); $inputs.= wf_HiddenInput('import_rawdata', base64_encode(serialize($dataParsed))); $inputs.= wf_delimiter(0); $inputs.= wf_Submit('Save this column mappings and continue payments import'); $colForm = wf_Form("?module=banksta2", 'POST', $inputs, 'glamour __Banksta2PreprocessingForm'); show_window(__('Select data columns numbers and their values mapping'), $savePresetForm . $colForm); } else { show_error(__('File parsing error: data array is empty')); } } /** * Renders a "last checks form" with all the actual payments data that will be imported * * @param $dataRows */ public function web_LastChecksForm($dataRows) { if ($this->translateLstChkFieldNames) { $captContract = __('Contract'); $captSumm = __('Sum'); $captAddr = __('Address'); $captRealName = __('Real name'); $captNotes = __('Payment notes'); $captPDate = __('Payment date'); $captPTime = __('Payment time'); $captSrvType = __('Service type'); $captCanceled = __('Processing canceled'); } else { $captContract = '[contract]'; $captSumm = '[summ]'; $captAddr = '[address]'; $captRealName = '[realname]'; $captNotes = '[notes]'; $captPDate = '[pdate]'; $captPTime = '[ptime]'; $captSrvType = '[service_type]'; $captCanceled = '[row_canceled]'; } $cells = wf_TableCell('#'); $cells.= wf_TableCell($captContract); $cells.= wf_TableCell($captSumm); $cells.= wf_TableCell($captAddr); $cells.= wf_TableCell($captRealName); $cells.= wf_TableCell($captNotes); $cells.= wf_TableCell($captPDate); $cells.= wf_TableCell($captPTime); $cells.= wf_TableCell($captSrvType); $cells.= wf_TableCell($captCanceled); $rows = wf_TableRow($cells, 'row1'); $table = wf_TableBody($rows . $dataRows, '100%', '0', ''); $inputs = wf_Link(self::URL_BANKSTA2_FIELD_MAPPING, 'No I want to try another import settings', false, 'ubButton'); $inputs.= wf_nbsp(2); $inputs.= wf_Link(self::URL_BANKSTA2_PROCEED_STMT_IMP, 'Yes, proceed payments import', false, 'ubButton'); show_window(__('All is correct') . '?', $table . wf_delimiter(1) . $inputs); } /** * Shows the fields mapping presets form * * @return void */ public static function web_FMPForm() { $lnkId = wf_InputId(); $addServiceJS = wf_tag('script', false, '', 'type="text/javascript"'); $addServiceJS.= wf_JSAjaxModalOpener(self::URL_ME, array('fmpcreate' => 'true'), $lnkId, false, 'POST'); $addServiceJS.= wf_tag('script', true); show_window(__('Fields mapping presets'), wf_Link('#', web_add_icon() . ' ' . __('Add fields mapping preset'), false, 'ubButton', 'id="' . $lnkId . '"') . wf_delimiter() . $addServiceJS . self::renderFMPJQDT() ); } /** * Renders a processing form for certain statement determined by hash * * @param $hash * * @return string */ public function web_BSProcessingForm($hash) { $hash = mysql_real_escape_string($hash); if ($this->checkHashExists($hash)) { $tQuery = "SELECT * FROM `" . self::BANKSTA2_TABLE . "` WHERE `hash`='" . $hash . "' ORDER BY `id` ASC;"; $tQueryResult = simple_queryall($tQuery); $cashPairs = array(); $tServices = array('' => __('-'), 'Internet' => __('Internet'), 'UKV' => __('UKV') ); $dreamkasEnabled = $this->ubConfig->getAlterParam('DREAMKAS_ENABLED'); $fiscalRecsIDsList = array(); $addFiscalizePaymentCtrlsJS = false; $refiscalize = false; if ($dreamkasEnabled) { $DreamKas = new DreamKas(); } $cells = wf_TableCell(__('ID')); $cells .= wf_TableCell(__('Statement Address')); $cells .= wf_TableCell(__('Statement Real Name')); $cells .= wf_TableCell(__('Statement Contract')); $cells .= wf_TableCell(__('Service type')); $cells .= wf_TableCell(__('Edit record')); $cells .= wf_TableCell(__('Payment type ID')); $cells .= wf_TableCell(__('Cash')); $cells .= wf_TableCell(__('Processed')); $cells .= wf_TableCell(__('Canceled')); $cells .= wf_TableCell(__('Contract')); $cells .= wf_TableCell(__('Real Name')); $cells .= wf_TableCell(__('Address')); $cells .= wf_TableCell(__('Tariff')); $rows = wf_TableRow($cells, 'row1'); if (!empty($tQueryResult)) { $this->getUsersDataCached(); foreach ($tQueryResult as $io => $eachRec) { $recProcessed = ($eachRec['processed']) ? true : false; $recCanceled = ($eachRec['canceled']) ? true : false; $serviceType = trim($eachRec['service_type']); $addrIsEmpty = empty($eachRec['address']); $nameIsEmpty = empty($eachRec['realname']); $contractUnknown = (empty($eachRec['contract']) or ispos($eachRec['contract'], 'unknown_')); $detailsWinID = wf_InputId(); $lnkID = wf_InputId(); $addInfoControl = wf_Link('#', $eachRec['id'], false, '', ' id="' . $lnkID . '" '); $addInfoControl .= wf_tag('script', false, '', 'type="text/javascript"'); $addInfoControl .= '$(\'#' . $lnkID . '\').click(function(evt) { $.ajax({ type: "GET", url: "' . self::URL_ME . '", data: { showdetailed: "' . $eachRec['id'] . '", detailsWinID: "' . $detailsWinID . '" }, success: function(result) { $(document.body).append(result); $( \'#' . $detailsWinID . '\' ).dialog("open"); } }); evt.preventDefault(); return false; }); '; $addInfoControl .= wf_tag('script', true); $cells = wf_TableCell($addInfoControl, '', '', '', '', (($dreamkasEnabled) ? '2' : '')); if (($addrIsEmpty or $nameIsEmpty or $contractUnknown) and !empty($eachRec['notes'])) { if ($addrIsEmpty or $contractUnknown) { $cells .= wf_TableCell($eachRec['notes']); $cells .= wf_TableCell(''); } else { $cells .= wf_TableCell(''); $cells .= wf_TableCell($eachRec['notes']); } } else { $cells .= wf_TableCell($eachRec['address']); $cells .= wf_TableCell($eachRec['realname']); } if ($recProcessed) { if ($recCanceled) { $editInputs = wf_CheckInput('recallrowprocessing', __('Recall record processing'), false, false); $editInputs .= wf_HiddenInput('bankstaeditrowid', $eachRec['id']); $editInputs .= wf_delimiter(0); $editInputs .= wf_Submit(__('Save')); $editForm = wf_Form('', 'POST', $editInputs); } else { $editForm = __('Record processed'); } $cells .= wf_TableCell($eachRec['contract']); $cells .= wf_TableCell($serviceType); $cells .= wf_TableCell($editForm); } else { $formID = wf_InputId(); $cells .= wf_TableCell(wf_TextInput('newbankstacontract', '', $eachRec['contract'], false, '6', '', '', '', 'form="' . $formID . '"')); $cells .= wf_TableCell(wf_Selector('newbankstarvtype', $tServices, '', $serviceType, '', '', '', '', 'form="' . $formID . '"')); $editInputs = wf_CheckInput('cancelrowprocessing', __('Cancel record processing'), false, false); $editInputs .= wf_HiddenInput('bankstaeditrowid', $eachRec['id']); $editInputs .= wf_delimiter(0); $editInputs .= wf_Submit(__('Save')); $editForm = wf_Form('', 'POST', $editInputs, '', '', $formID); $cells .= wf_TableCell($editForm); } $cells .= wf_TableCell($eachRec['payid']); $cells .= wf_TableCell($eachRec['summ']); $cells .= wf_TableCell(web_bool_led($recProcessed)); $cells .= wf_TableCell(web_bool_led($recCanceled)); //user detection $detectedContract = ''; $detectedAddress = ''; $detectedRealName = ''; $detectedTariff = ''; $rowClass = ($recProcessed) ? 'row2' : 'undone'; switch (strtolower($serviceType)) { case ('internet'): if (isset($this->allContractsInet[$eachRec['contract']])) { $detectedUser = $this->allUsersDataInet[$this->allContractsInet[$eachRec['contract']]]; $detectedContract = wf_Link(self::URL_USERS_PROFILE_INET . $detectedUser['login'], web_profile_icon() . ' ' . $detectedUser['contract'], false, ''); $detectedAddress = $detectedUser['fulladress']; $detectedRealName = $detectedUser['realname']; $detectedTariff = $detectedUser['Tariff']; if (!$recProcessed) { $cashPairs[$eachRec['id']]['bankstaid'] = $eachRec['id']; $cashPairs[$eachRec['id']]['userlogin'] = $detectedUser['login']; $cashPairs[$eachRec['id']]['usercontract'] = $detectedUser['contract']; $cashPairs[$eachRec['id']]['summ'] = $eachRec['summ']; $cashPairs[$eachRec['id']]['pdate'] = $eachRec['pdate']; $cashPairs[$eachRec['id']]['ptime'] = $eachRec['ptime']; $cashPairs[$eachRec['id']]['payid'] = (empty($eachRec['payid'])) ? $this->inetPaymentId : $eachRec['payid']; $cashPairs[$eachRec['id']]['service'] = $serviceType; $fiscalRecsIDsList[] = $eachRec['id']; } $rowClass = 'row3'; //try to highlight multiple payments if (!isset($this->bankstaFoundUsers[$eachRec['contract']])) { $this->bankstaFoundUsers[$eachRec['contract']] = $detectedUser['login']; } else { $rowClass = 'ukvbankstadup'; } } break; case ('ukv'): if (isset($this->allContractsUKV[$eachRec['contract']])) { $detectedUser = $this->allUsersDataUKV[$this->allContractsUKV[$eachRec['contract']]]; $detectedContract = wf_Link(self::URL_USERS_PROFILE_UKV . $detectedUser['id'], web_profile_icon() . ' ' . $detectedUser['contract'], false, ''); $detectedAddress = $detectedUser['street'] . ' ' . $detectedUser['build'] . '/' . $detectedUser['apt']; $detectedRealName = $detectedUser['realname']; $detectedTariff = $detectedUser['tariffid']; $detectedTariff = $this->ukvTariffs[$detectedTariff]['tariffname']; if (!$recProcessed) { $cashPairs[$eachRec['id']]['bankstaid'] = $eachRec['id']; $cashPairs[$eachRec['id']]['userlogin'] = $detectedUser['id']; $cashPairs[$eachRec['id']]['usercontract'] = $detectedUser['contract']; $cashPairs[$eachRec['id']]['summ'] = $eachRec['summ']; $cashPairs[$eachRec['id']]['pdate'] = $eachRec['pdate']; $cashPairs[$eachRec['id']]['ptime'] = $eachRec['ptime']; $cashPairs[$eachRec['id']]['payid'] = (empty($eachRec['payid'])) ? $this->ukvPaymentId : $eachRec['payid']; $cashPairs[$eachRec['id']]['service'] = $serviceType; $fiscalRecsIDsList[] = $eachRec['id']; } $rowClass = 'row3'; //try to highlight multiple payments if (!isset($this->bankstaFoundUsers[$eachRec['contract']])) { $this->bankstaFoundUsers[$eachRec['contract']] = $detectedUser['id']; } else { $rowClass = 'ukvbankstadup'; } } break; default: // maybe sometime in future here would be some defaults } $cells.= wf_TableCell($detectedContract); $cells.= wf_TableCell($detectedRealName); $cells.= wf_TableCell($detectedAddress); $cells.= wf_TableCell($detectedTariff); $rows.= wf_TableRow($cells, $rowClass); // dreamkas fiscalizing controls if ($dreamkasEnabled) { $dreamkasCtrls = ''; if ($recProcessed) { if ($recCanceled) { $dreamkasCtrls = wf_TableRow(''); } else { // geting fiscalized data $dreamkasCtrls = $DreamKas->web_ReceiptDetailsTableRow($eachRec['id']); if (empty($dreamkasCtrls)) { $refiscalize = true; } } } if (empty($dreamkasCtrls)) { $addFiscalizePaymentCtrlsJS = true; $dreamkasCtrls = $DreamKas->web_FiscalizePaymentCtrls($serviceType, true, $eachRec['id'], $recProcessed); $dreamkasCtrls.= $DreamKas->web_FiscalOperationDetailsTableRow($eachRec['id']); } $rows.= $dreamkasCtrls; } } } $result = wf_TableBody($rows, '100%', '0', ''); $result.= ($addFiscalizePaymentCtrlsJS) ? $DreamKas->get_BS2FiscalizePaymentCtrlsJS() : ''; if (!empty($cashPairs) or $refiscalize) { $cashInputs = ''; $formID = wf_InputId(); $submitID = wf_InputId(); $submitID2 = wf_InputId(); $fiscalizeallChkID = wf_InputId(); $submitCaption = __('Process current bank statement'); $submitCaption2 = __('Re-fiscalize payments'); $fiscalizeallChkCapt = __('Check to fiscalize all'); $unfiscalizeallChkCapt = __('Clear check to fiscalize all'); if ($dreamkasEnabled and (!empty($cashPairs) or $refiscalize)) { //$cashInputs.= wf_delimiter(0); $cashInputs.= wf_CheckInput('fiscalizeall', $fiscalizeallChkCapt, false, false, $fiscalizeallChkID); $cashInputs.= wf_delimiter(); } if (!empty($cashPairs)) { $cashPairs = serialize($cashPairs); $cashPairs = base64_encode($cashPairs); $cashInputs.= wf_HiddenInput('bankstaneedpaymentspush', $cashPairs); $cashInputs.= ($dreamkasEnabled) ? wf_HiddenInput('bankstafiscalrecsidslist', base64_encode(json_encode($fiscalRecsIDsList))) : ''; $cashInputs.= wf_Submit($submitCaption, $submitID); $cashInputs.= wf_nbsp(4); } else { $cashInputs.= wf_HiddenInput('bankstaneedpaymentspush', base64_encode(serialize('dummy_dump'))); } if ($refiscalize) { $cashInputs.= wf_Submit($submitCaption2, $submitID2); $cashInputs.= wf_nbsp(2); } $cashInputs.= wf_HiddenInput('bankstaneedrefiscalize', 'false'); $cashInputs.= ($dreamkasEnabled) ? wf_HiddenInput('bankstapaymentsfiscalize', '') : ''; $result.= wf_Form('', 'POST', $cashInputs, 'glamour', '', $formID); if ($dreamkasEnabled) { $result.= wf_tag('script', false, '', 'type="text/javascript"'); $result.= wf_JSEmptyFunc(); $result.= ' $(\'#' . $fiscalizeallChkID . '\').change(function() { var checkVal = $(this).is(\':checked\'); $(\'[name^="fiscalizepayment_"]\').prop("checked", checkVal); if (checkVal) { $(\'label[for="' . $fiscalizeallChkID . '"]\').html(\'' . $unfiscalizeallChkCapt . '\'); } else { $(\'label[for="' . $fiscalizeallChkID . '"]\').html(\'' . $fiscalizeallChkCapt . '\'); } }); $(\'#' . $submitID2 . '\').on("click mouseup keyup", function(evt) { $(\'[name="bankstaneedrefiscalize"]\').val("true"); }); $(\'#' . $formID . '\').submit(function(evt) { $(\'#' . $submitID . '\').attr("disabled", "disabled"); $(\'#' . $submitID . '\').val("' . __('Form processing in progress') . '...' . '"); $(\'#' . $submitID2 . '\').attr("disabled", "disabled"); $(\'#' . $submitID2 . '\').val("' . __('Form processing in progress') . '...' . '"); var fiscalizationArr = {}; var refiscalize = ( $(\'[name="bankstaneedrefiscalize"]\').val() === "true" ); '; $result.= ' if (!refiscalize) { fiscalRecsIDsList = JSON.parse(atob($(\'[name="bankstafiscalrecsidslist"]\').val())); } '; $result.= ' $(\'[name^="fiscalizepayment_"]\').each(function(chkindex, chkelement) { if ($(chkelement).is(\':checked\')) { checkCtrlID = $(chkelement).attr("id").substring($(chkelement).attr("id").indexOf(\'_\') + 1); '; $result.= ' if ( (refiscalize && $(chkelement).hasClass(\'__BankstaRecProcessed\')) || (!refiscalize && $.inArray(checkCtrlID, fiscalRecsIDsList) != -1) ) { fiscalizationArr[checkCtrlID] = {}; fiscalizationArr[checkCtrlID][\'drscashmachineid\'] = $(\'[name=drscashmachines_\'+checkCtrlID+\']\').val(); fiscalizationArr[checkCtrlID][\'drstaxtype\'] = $(\'[name=drstaxtypes_\'+checkCtrlID+\']\').val(); fiscalizationArr[checkCtrlID][\'drspaymtype\'] = $(\'[name=drspaymtypes_\'+checkCtrlID+\']\').val(); fiscalizationArr[checkCtrlID][\'drssellingpos\'] = $(\'[name=drssellpos_\'+checkCtrlID+\']\').val(); } '; $result.= ' } }); if (refiscalize && empty(fiscalizationArr)) { evt.preventDefault(); $(\'#' . $submitID . '\').removeAttr("disabled"); $(\'#' . $submitID . '\').val("' . $submitCaption . '"); $(\'#' . $submitID2 . '\').removeAttr("disabled"); $(\'#' . $submitID2 . '\').val("' . $submitCaption2 . '"); alert(\'' . __('No records to re-fiscalize chosen') . '\'); return false; } $(\'[name="bankstapaymentsfiscalize"]\').val(btoa(JSON.stringify(fiscalizationArr))); }); '; $result.= wf_tag('script', true); } else { $result.= wf_tag('script', false, '', 'type="text/javascript"'); $result.= ' $(\'#' . $formID . '\').submit(function(evt) { $(\'#' . $submitID . '\').attr("disabled", "disabled"); $(\'#' . $submitID . '\').val("' . __('Form processing in progress') . '...' . '"); }); '; $result.= wf_tag('script', true); } } } else { $result = $this->getUbMsgHelperInstance()->getStyledMessage(__('Specified bank statement hash does not exists'), 'warning'); } return ($result); } /** * Renders uploaded statements ajax list JSON for JQDT */ public static function renderBStatementsListJSON() { $tQuery = "SELECT `filename`, `hash`, `date`, `admin`, COUNT(`id`) AS `rowcount`, COUNT(if(`processed` > 0 and `canceled` <= 0, 1, null)) AS processed_cnt, COUNT(if(`canceled` > 0, 1, null)) AS canceled_cnt FROM `" . self::BANKSTA2_TABLE . "` GROUP BY `hash` ORDER BY `date` DESC;"; $tQueryResult = simple_queryall($tQuery); $json = new wf_JqDtHelper(); if (!empty($tQueryResult)) { $data = array(); foreach ($tQueryResult as $eachRec) { $data[] = $eachRec['date']; $data[] = $eachRec['filename']; $data[] = $eachRec['rowcount']; $data[] = $eachRec['processed_cnt']; $data[] = $eachRec['canceled_cnt']; $data[] = $eachRec['admin']; $actions = wf_Link(self::URL_BANKSTA2_PROCESSING . $eachRec['hash'], wf_img('skins/icon_search_small.gif', __('Show')), false, ''); if ($eachRec['processed_cnt'] == 0) { $actions.= wf_JSAlert( '#', web_delete_icon(), 'Removing this may lead to irreparable results', 'deleteStatement(\'' . $eachRec['hash'] . '\', \'' . self::URL_ME . '\', \'delStatement\', \'' . wf_InputId() . '\')') . wf_nbsp(); } $data[] = $actions; $json->addRow($data); unset($data); } } $json->getJson(); } /** * Returns uploaded statements JQDT control * * @return string */ public static function renderBStatementsJQDT() { $ajaxUrlStr = '' . self::URL_ME . '&bslistajax=true'; $jqdtId = 'jqdt_' . md5($ajaxUrlStr); $columns = array(__('Date'), __('Filename'), __('Total rows'), __('Processed rows'), __('Canceled rows'), __('Admin'), __('Actions')); $opts = '"order": [[ 0, "desc" ]]'; $result = ''; $result.= wf_JqDtLoader($columns, $ajaxUrlStr, false, __('Bank statement'), 50, $opts); $result.= wf_tag('script', false, '', 'type="text/javascript"'); $result.= wf_JSEmptyFunc(); $result.= wf_JSElemInsertedCatcherFunc(); $result.= ' function deleteStatement(bankstaHash, ajaxURL, actionName, errFrmId) { var ajaxData = \'&\'+ actionName +\'=true&hash=\' + bankstaHash + \'&errfrmid=\' + errFrmId $.ajax({ type: "POST", url: ajaxURL, data: ajaxData, success: function(result) { if ( !empty(result) ) { $(document.body).append(result); $(\'#\'+errFrmId).dialog("open"); } $(\'#' . $jqdtId . '\').DataTable().ajax.reload(); } }); } '; $result.= wf_tag('script', true); return ($result); } /** * Renders fields mapping presets ajax list JSON for JQDT */ public static function renderFMPListJSON() { $tQuery = "SELECT `id`, `presetname`, `payment_type_id`, `col_realname`, `col_address`, `col_paysum`, `col_paypurpose`, `col_paydate`, `col_paytime`, `col_contract`, `guess_contract`, `skip_row`, `replace_strs`, `remove_strs`, `service_type` FROM `" . self::BANKSTA2_PRESETS_TABLE . "`"; $tQueryResult = simple_queryall($tQuery); $json = new wf_JqDtHelper(); if (!empty($tQueryResult)) { $data = array(); $fmpID = 0; foreach ($tQueryResult as $eachRec) { foreach ($eachRec as $fieldName => $fieldVal) { switch ($fieldName) { case 'id': $fmpID = $fieldVal; $data[] = $fieldVal; break; case 'guess_contract': case 'skip_row': case 'replace_strs': case 'remove_strs': $data[] = ($fieldVal == 1) ? web_green_led() : web_red_led(); break; default: $data[] = $fieldVal; } } $linkId1 = wf_InputId(); $linkId2 = wf_InputId(); $actions = wf_JSAlert( '#', web_delete_icon(), 'Removing this may lead to irreparable results', 'deleteFMP(' . $eachRec['id'] . ', \'' . self::URL_ME . '\', \'delFMP\', \'' . wf_InputId() . '\')') . wf_nbsp(); $actions.= wf_Link('#', web_edit_icon(), false, '', 'id="' . $linkId1 . '"') . wf_nbsp(); $actions.= wf_Link('#', web_clone_icon(), false, '', 'id="' . $linkId2 . '"') . wf_nbsp(); $actions.= wf_JSAjaxModalOpener(self::URL_ME, array('fmpedit' => 'true', 'fmpid' => $fmpID), $linkId1, true, 'POST'); $actions.= wf_JSAjaxModalOpener(self::URL_ME, array('fmpclone' => 'true', 'fmpid' => $fmpID), $linkId2, true, 'POST'); $data[] = $actions; $json->addRow($data); unset($data); } } $json->getJson(); } /** * Returns fields mapping presets JQDT control and some JS bindings for dynamic forms * * @return string */ protected static function renderFMPJQDT() { $ajaxUrlStr = '' . self::URL_ME . '&fmpajax=true'; $jqdtId = 'jqdt_' . md5($ajaxUrlStr); $errorModalWindowId = wf_InputId(); $columns = array(); $opts = '"order": [[ 0, "asc" ]], "columnDefs": [ {"targets": "_all", "className": "dt-center"} ]'; $columns[] = __('ID'); $columns[] = __('Preset name'); $columns[] = __('Payment type ID'); $columns[] = __('Realname column'); $columns[] = __('Address column'); $columns[] = __('Paysum column'); $columns[] = __('Paypurpose column'); $columns[] = __('Paydate column'); $columns[] = __('Paytime column'); $columns[] = __('Contract column'); $columns[] = __('Contract guessing'); $columns[] = __('Row skipping'); $columns[] = __('Char replacing'); $columns[] = __('Char removing'); $columns[] = __('Service type'); $columns[] = __('Actions'); $result = wf_JqDtLoader($columns, $ajaxUrlStr, false, __('results'), 100, $opts); $result.= wf_tag('script', false, '', 'type="text/javascript"'); $result.= wf_JSEmptyFunc(); $result.= wf_JSElemInsertedCatcherFunc(); $result.= ' function chekEmptyVal(ctrlClassName) { $(document).on("focus keydown", ctrlClassName, function(evt) { if ( $(ctrlClassName).css("border-color") == "rgb(255, 0, 0)" ) { $(ctrlClassName).val(""); $(ctrlClassName).css("border-color", ""); $(ctrlClassName).css("color", ""); } }); } onElementInserted(\'body\', \'.__FMPEmptyCheck\', function(element) { chekEmptyVal(\'.__FMPEmptyCheck\'); }); $(document).on("submit", ".__FMPForm", function(evt) { var FrmAction = $(".__FMPForm").attr("action"); var FrmData = $(".__FMPForm").serialize() + \'&errfrmid=' . $errorModalWindowId . '\'; //var modalWindowId = $(".__FMPForm").closest(\'div\').attr(\'id\'); evt.preventDefault(); var emptyCheckClass = \'.__FMPEmptyCheck\'; if ( empty( $(emptyCheckClass).val() ) || $(emptyCheckClass).css("border-color") == "rgb(255, 0, 0)" ) { $(emptyCheckClass).css("border-color", "red"); $(emptyCheckClass).css("color", "grey"); $(emptyCheckClass).val("' . __('Mandatory field') . '"); } else { $.ajax({ type: "POST", url: FrmAction, data: FrmData, success: function(result) { if ( !empty(result) ) { $(document.body).append(result); $( \'#' . $errorModalWindowId . '\' ).dialog("open"); } else { $(\'#' . $jqdtId . '\').DataTable().ajax.reload(); //$("[name=swgroupname]").val(""); if ( $(".__CloseFrmOnSubmitChk").is(\':checked\') ) { $( \'#\'+$(".__FMPFormModalWindowId").val() ).dialog("close"); } } } }); } }); function deleteFMP(FMPId, ajaxURL, actionName, errFrmId) { var ajaxData = \'&\'+ actionName +\'=true&fmpid=\' + FMPId + \'&errfrmid=\' + errFrmId $.ajax({ type: "POST", url: ajaxURL, data: ajaxData, success: function(result) { if ( !empty(result) ) { $(document.body).append(result); $(\'#\'+errFrmId).dialog("open"); } $(\'#' . $jqdtId . '\').DataTable().ajax.reload(); } }); } '; $result.= wf_tag('script', true); return ($result); } /** * Returns field mapping preset addition form * * @return string */ public function renderFMPAddForm($modalWindowId) { $formId = 'Form_' . wf_InputId(); $closeFormChkId = 'CloseFrmChkID_' . wf_InputId(); $inputs = wf_TextInput('fmpname', __('Preset name'), '', false, '', '', '__FMPEmptyCheck'); $inputs.= wf_nbsp(8); $inputs.= wf_TextInput('fmppaymtypeid', __('Custom payment type ID for this bank statement'), 0, true, '4', 'digits', '', 'BankstaPaymentTypeID'); $inputscells = wf_TableCell(wf_TextInput('fmpcolrealname', __('Real name column number'), 'NONE', false, '4')); $inputscells.= wf_TableCell(wf_TextInput('fmpcoladdr', __('Address column number'), 'NONE', false, '4')); $inputscells.= wf_TableCell(wf_TextInput('fmpcolpaysum', __('Payment sum column number'), 'NONE', false, '4')); $inputsrows = wf_TableRow($inputscells); $inputscells = wf_TableCell(wf_TextInput('fmpcolpaypurpose', __('Payment purpose column number'), 'NONE', false, '4')); $inputscells.= wf_TableCell(wf_TextInput('fmpcolpaydate', __('Payment date column number'), 'NONE', false, '4')); $inputscells.= wf_TableCell(wf_TextInput('fmpcolpaytime', __('Payment time column number'), 'NONE', true, '4')); $inputsrows.= wf_TableRow($inputscells); $inputscells = wf_TableCell(wf_CheckInput('fmppaymincoins', __('Bank statement "SUM" field presented in coins(need to be divided by 100)'), true, false, 'BankstaPaymInCoins'), '', '', '', '2'); $inputsrows.= wf_TableRow($inputscells); $inputs.= wf_TableBody($inputsrows, '', '0', '', 'cellspacing="4px" style="margin-top: 8px;"'); $inputs.= wf_tag('hr', false, '', 'style="margin-bottom: 11px;"'); $inputs.= wf_TextInput('fmpcolcontract', __('User contract column number') . ' (' . __('Payment ID') . ')', 'NONE', true, '4'); $inputs.= wf_CheckInput('fmptryguesscontract', __('Try to get contract from payment purpose field'), true, false, 'BankstaTryGuessContract'); $inputs.= wf_tag('h4', false, '', 'style="font-weight: 400; width: 800px; padding: 2px 0 8px 28px; color: #666; margin-block-end: 0; margin-block-start: 0;"'); $inputs.= __('ONLY, if mapped contract field for some row will be empty or if contract field will be not specified'); $inputs.= wf_tag('h4', true); $inputs.= wf_TextInput('fmpcontractdelimstart', __('Contract') . ' (' . __('Payment ID') . '): ' . __('start delimiter string'), '', true, '', '', '', 'BankstaContractDelimStart'); $inputs.= wf_TextInput('fmpcontractdelimend', __('Contract') . ' (' . __('Payment ID') . '): ' . __('end delimiter string'), '', true, '', '', '', 'BankstaContractDelimEnd'); $inputs.= wf_tag('h4', false, '', 'style="font-weight: 400; width: 800px; padding: 11px 0 7px 0; color: #666; margin-block-end: 0; margin-block-start: 0;"'); $inputs.= __('If your contracts(payment IDs) are 100% DIGITAL - you may specify their minimum and maximum length to extract them properly(delimiters will not be taken into account)'); $inputs.= wf_tag('h4', true); $inputs.= wf_TextInput('fmpcontractminlen', __('Contract') . ' (' . __('Payment ID') . '): ' . __('min length'), '0', true, '', '', '', 'BankstaContractMinLen'); $inputs.= wf_TextInput('fmpcontractmaxlen', __('Contract') . ' (' . __('Payment ID') . '): ' . __('max length'), '0', true, '', '', '', 'BankstaContractMaxLen'); $inputs.= wf_tag('hr', false, '', 'style="margin-bottom: 11px;"'); $inputs.= wf_Selector('fmpsrvtype', $this->bankstaServiceType, __('Service type') . ' (' . __('select "Telepathy" to try to get service type from payment purpose field') . ')', '', true, false, 'BankstaSrvType'); $inputs.= wf_TextInput('fmpinetdelimstart', __('Internet service before keywords delimiter string'), '', true, '', '', '', 'BankstaInetDelimStart'); $inputs.= wf_TextInput('fmpinetkeywords', __('Internet service determination keywords') . ', ' . __('separated with') . ' BANKSTA2_REGEX_KEYWORDS_DELIM', '', true, '40', '', '', 'BankstaInetKeyWords'); $inputs.= wf_TextInput('fmpinetdelimend', __('Internet service after keywords delimiter string'), '', true, '', '', '', 'BankstaInetDelimEnd'); $inputs.= wf_CheckInput('fmpinetkeywordsnoesc', __('Don\'t escape or process in any other way the keywords - just left them "as is"'), true, false, 'BankstaInetKeyWordsNoEsc'); $inputs.= wf_delimiter(0); $inputs.= wf_TextInput('fmpukvdelimstart', __('UKV service before keywords delimiter string'), '', true, '', '', '', 'BankstaUKVDelimStart'); $inputs.= wf_TextInput('fmpukvkeywords', __('UKV service determination keywords') . ', ' . __('separated with') . ' BANKSTA2_REGEX_KEYWORDS_DELIM', '', true, '40', '', '', 'BankstaUKVKeyWords'); $inputs.= wf_TextInput('fmpukvdelimend', __('UKV service after keywords delimiter string'), '', true, '', '', '', 'BankstaUKVDelimEnd'); $inputs.= wf_CheckInput('fmpukvkeywordsnoesc', __('Don\'t escape or process in any other way the keywords - just left them "as is"'), true, false, 'BankstaUKVKeyWordsNoEsc'); $inputs.= wf_delimiter(0); $inputs.= wf_TextInput('fmpcolsrvidents', __('Number of the dedicated field which contains services IDs identifiers mapped via BANKSTA2_INETSRV_ALLOTED_IDS and BANKSTA2_CTVSRV_ALLOTED_IDS'), 'NONE', true, '4'); $inputs.= wf_CheckInput('fmpsrvidentspreff', __('Services IDs identifiers from the dedicated field take precedence over service type telepathy'), true, false, 'BankstaSrvIdentsPreff'); $inputs.= wf_tag('h4', false, '', 'style="font-weight: 400; width: 980px; padding: 2px 0 8px 28px; color: #666; margin-block-end: 0; margin-block-start: 0;"'); $inputs.= __('NOTE: dedicated field\'s services IDs are always take precedence over manually chosen \'Internet\' or \'UKV\' services'); $inputs.= wf_tag('h4', true); $inputs.= wf_delimiter(0); $inputs.= wf_tag('hr', false, '', 'style="margin-bottom: 11px;"'); $inputs.= wf_CheckInput('fmpskiprow', __('Skip row processing if specified fields contain keywords below'), true, false, 'BankstaSkipRow'); $inputs.= wf_TextInput('fmpcolskiprow', __('Fields to check row skipping') . '(' . __('multiple fields must be separated with comas') . ')', '', true, '', '', '', 'BankstaSkipRowKeyWordsCol'); $inputs.= wf_TextInput('fmpskiprowkeywords', __('Row skipping determination keywords') . ', ' . __('separated with') . ' BANKSTA2_REGEX_KEYWORDS_DELIM', '', true, '40', '', '', 'BankstaSkipRowKeyWords'); $inputs.= wf_CheckInput('fmpskiprokeywordsnoesc', __('Don\'t escape or process in any other way the keywords - just left them "as is"'), true, false, 'BankstaSkipRowKeyWordsNoEsc'); $inputs.= wf_delimiter(0); $inputs.= wf_CheckInput('fmpreplacestrs', __('Replace characters specified below in specified fields'), true, false, 'BankstaReplaceStrs'); $inputs.= wf_TextInput('fmpcolsreplacestrs', __('Fields to perform replacing') . '(' . __('multiple fields must be separated with comas') . ')', '', true, '', '', '', 'BankstaReplaceStrsCols'); $inputs.= wf_TextInput('fmpstrstoreplace', __('Replaced characters or strings') . ', ' . __('separated with') . ' BANKSTA2_REGEX_KEYWORDS_DELIM', '', true, '40', '', '', 'BankstaReplaceStrsChars'); $inputs.= wf_TextInput('fmpstrstoreplacewith', __('Replacing characters or string'), '', true, '40', '', '', 'BankstaReplaceStrsWith'); $inputs.= wf_TextInput('fmpstrsreplacecount', __('Replacements count'), '', true, '40', '', '', 'BankstaReplaceStrsCount'); $inputs.= wf_CheckInput('fmpreplacekeywordsnoesc', __('Don\'t escape or process in any other way the keywords - just left them "as is"'), true, false, 'BankstaReplaceKeyWordsNoEsc'); $inputs.= wf_delimiter(0); $inputs.= wf_CheckInput('fmpremovestrs', __('Remove characters specified below in specified fields'), true, false, 'BankstaRemoveStrs'); $inputs.= wf_TextInput('fmpcolsremovestrs', __('Fields to perform removing') . '(' . __('multiple fields must be separated with comas') . ')', '', true, '', '', '', 'BankstaRemoveStrsCols'); $inputs.= wf_TextInput('fmpstrstoremove', __('Removed characters or strings') . ', ' . __('separated with') . ' BANKSTA2_REGEX_KEYWORDS_DELIM', '', true, '40', '', '', 'BankstaRemoveStrsChars'); $inputs.= wf_CheckInput('fmpremovekeywordsnoesc', __('Don\'t escape or process in any other way the keywords - just left them "as is"'), true, false, 'BankstaRemoveKeyWordsNoEsc'); $inputs.= wf_delimiter(0); $inputs.= wf_CheckInput('formclose', __('Close form after operation'), false, true, $closeFormChkId, '__CloseFrmOnSubmitChk'); $inputs.= wf_HiddenInput('', $modalWindowId, '', '__FMPFormModalWindowId'); $inputs.= wf_HiddenInput('fmpcreate', 'true'); $inputs.= wf_delimiter(); $inputs.= wf_Submit(__('Create')); $form = wf_Form(self::URL_ME, 'POST', $inputs, 'glamour __FMPForm', '', $formId); return ($form); } /** * Returns field mapping preset editing form * * @return string */ public function renderFMPEditForm($fmpID, $modalWindowId, $clone = false) { $this->getMappingPresetsCached(); $formId = 'Form_' . wf_InputId(); $closeFormChkId = 'CloseFrmChkID_' . wf_InputId(); $fmpData = $this->fieldsMappingPresets[$fmpID]; $colRealName = (wf_emptyNonZero($fmpData['col_realname']) ? 'NONE' : $fmpData['col_realname']); $colAddress = (wf_emptyNonZero($fmpData['col_address']) ? 'NONE' : $fmpData['col_address']); $colPaysum = (wf_emptyNonZero($fmpData['col_paysum']) ? 'NONE' : $fmpData['col_paysum']); $colPayPurpose = (wf_emptyNonZero($fmpData['col_paypurpose']) ? 'NONE' : $fmpData['col_paypurpose']); $colPayDate = (wf_emptyNonZero($fmpData['col_paydate']) ? 'NONE' : $fmpData['col_paydate']); $colPayTime = (wf_emptyNonZero($fmpData['col_paytime']) ? 'NONE' : $fmpData['col_paytime']); $colContract = (wf_emptyNonZero($fmpData['col_contract']) ? 'NONE' : $fmpData['col_contract']); $colSrvIdents = (wf_emptyNonZero($fmpData['col_srvidents']) ? 'NONE' : $fmpData['col_srvidents']); $contractGuessing = (empty($fmpData['guess_contract'])) ? false : true; $prefferSrvIdents = (empty($fmpData['srvidents_preffered'])) ? false : true; $rowSkipping = (empty($fmpData['skip_row'])) ? false : true; $strReplacing = (empty($fmpData['replace_strs'])) ? false : true; $strRemoving = (empty($fmpData['remove_strs'])) ? false : true; $sumInCoins = (empty($fmpData['sum_in_coins'])) ? false : true; $noescInetKeyWords = (empty($fmpData['noesc_inet_srv_keywords'])) ? false : true; $noescUKVKeyWords = (empty($fmpData['noesc_ukv_srv_keywords'])) ? false : true; $noescSkipKeyWords = (empty($fmpData['noesc_skip_row_keywords'])) ? false : true; $noescRplcKeyWords = (empty($fmpData['noesc_replace_keywords'])) ? false : true; $noescRmvKeyWords = (empty($fmpData['noesc_remove_keywords'])) ? false : true; $inputs = wf_TextInput('fmpname', __('Preset name'), $fmpData['presetname'], false, '', '', '__FMPEmptyCheck'); $inputs.= wf_nbsp(8); $inputs.= wf_TextInput('fmppaymtypeid', __('Custom payment type ID for this bank statement'), $fmpData['payment_type_id'], true, '4', 'digits', '', 'BankstaPaymentTypeID'); $inputscells = wf_TableCell(wf_TextInput('fmpcolrealname', __('Real name column number'), $colRealName, false, '4')); $inputscells.= wf_TableCell(wf_TextInput('fmpcoladdr', __('Address column number'), $colAddress, false, '4')); $inputscells.= wf_TableCell(wf_TextInput('fmpcolpaysum', __('Payment sum column number'), $colPaysum, false, '4')); $inputsrows = wf_TableRow($inputscells); $inputscells = wf_TableCell(wf_TextInput('fmpcolpaypurpose', __('Payment purpose column number'), $colPayPurpose, false, '4')); $inputscells.= wf_TableCell(wf_TextInput('fmpcolpaydate', __('Payment date column number'), $colPayDate, false, '4')); $inputscells.= wf_TableCell(wf_TextInput('fmpcolpaytime', __('Payment time column number'), $colPayTime, true, '4')); $inputsrows.= wf_TableRow($inputscells); $inputscells = wf_TableCell(wf_CheckInput('fmppaymincoins', __('Bank statement "SUM" field presented in coins(need to be divided by 100)'), true, $sumInCoins, 'BankstaPaymInCoins'), '', '', '', '2'); $inputsrows.= wf_TableRow($inputscells); $inputs.= wf_TableBody($inputsrows, '', '0', '', 'cellspacing="4px" style="margin-top: 8px;"'); $inputs.= wf_tag('hr', false, '', 'style="margin-bottom: 11px;"'); $inputs.= wf_TextInput('fmpcolcontract', __('User contract column number') . ' (' . __('Payment ID') . ')', $colContract, true, '4'); $inputs.= wf_CheckInput('fmptryguesscontract', __('Try to get contract from payment purpose field'), true, $contractGuessing, 'BankstaTryGuessContract'); $inputs.= wf_tag('h4', false, '', 'style="font-weight: 400; width: 800px; padding: 2px 0 8px 28px; color: #666; margin-block-end: 0; margin-block-start: 0;"'); $inputs.= __('ONLY, if mapped contract field for some row will be empty or if contract field will be not specified'); $inputs.= wf_tag('h4', true); $inputs.= wf_TextInput('fmpcontractdelimstart', __('Contract') . ' (' . __('Payment ID') . '): ' . __('start delimiter string'), $fmpData['contract_delim_start'], true, '', '', '', 'BankstaContractDelimStart'); $inputs.= wf_TextInput('fmpcontractdelimend', __('Contract') . ' (' . __('Payment ID') . '): ' . __('end delimiter string'), $fmpData['contract_delim_end'], true, '', '', '', 'BankstaContractDelimEnd'); $inputs.= wf_tag('h4', false, '', 'style="font-weight: 400; width: 800px; padding: 11px 0 7px 0; color: #666; margin-block-end: 0; margin-block-start: 0;"'); $inputs.= __('If your contracts(payment IDs) are 100% DIGITAL - you may specify their minimum and maximum length to extract them properly(delimiters will not be taken into account)'); $inputs.= wf_tag('h4', true); $inputs.= wf_TextInput('fmpcontractminlen', __('Contract') . ' (' . __('Payment ID') . '): ' . __('min length'), $fmpData['contract_min_len'], true, '', '', '', 'BankstaContractMinLen'); $inputs.= wf_TextInput('fmpcontractmaxlen', __('Contract') . ' (' . __('Payment ID') . '): ' . __('max length'), $fmpData['contract_max_len'], true, '', '', '', 'BankstaContractMaxLen'); $inputs.= wf_tag('hr', false, '', 'style="margin-bottom: 11px;"'); $inputs.= wf_Selector('fmpsrvtype', $this->bankstaServiceType, __('Service type') . ' (' . __('select "Telepathy" to try to get service type from payment purpose field') . ')', $fmpData['service_type'], true, false, 'BankstaSrvType'); $inputs.= wf_TextInput('fmpinetdelimstart', __('Internet service before keywords delimiter string'), $fmpData['inet_srv_start_delim'], true, '', '', '', 'BankstaInetDelimStart'); $inputs.= wf_TextInput('fmpinetkeywords', __('Internet service determination keywords') . ', ' . __('separated with') . ' BANKSTA2_REGEX_KEYWORDS_DELIM', $fmpData['inet_srv_keywords'], true, '40', '', '', 'BankstaInetKeyWords'); $inputs.= wf_TextInput('fmpinetdelimend', __('Internet service after keywords delimiter string'), $fmpData['inet_srv_end_delim'], true, '', '', '', 'BankstaInetDelimEnd'); $inputs.= wf_CheckInput('fmpinetkeywordsnoesc', __('Don\'t escape or process in any other way the keywords - just left them "as is"'), true, $noescInetKeyWords, 'BankstaInetKeyWordsNoEsc'); $inputs.= wf_delimiter(0); $inputs.= wf_TextInput('fmpukvdelimstart', __('UKV service before keywords delimiter string'), $fmpData['ukv_srv_start_delim'], true, '', '', '', 'BankstaUKVDelimStart'); $inputs.= wf_TextInput('fmpukvkeywords', __('UKV service determination keywords') . ', ' . __('separated with') . ' BANKSTA2_REGEX_KEYWORDS_DELIM', $fmpData['ukv_srv_keywords'], true, '40', '', '', 'BankstaUKVKeyWords'); $inputs.= wf_TextInput('fmpukvdelimend', __('UKV service after keywords delimiter string'), $fmpData['ukv_srv_end_delim'], true, '', '', '', 'BankstaUKVDelimEnd'); $inputs.= wf_CheckInput('fmpukvkeywordsnoesc', __('Don\'t escape or process in any other way the keywords - just left them "as is"'), true, $noescUKVKeyWords, 'BankstaUKVKeyWordsNoEsc'); $inputs.= wf_delimiter(0); $inputs.= wf_TextInput('fmpcolsrvidents', __('Number of the dedicated field which contains services IDs identifiers mapped via BANKSTA2_INETSRV_ALLOTED_IDS and BANKSTA2_CTVSRV_ALLOTED_IDS'), $colSrvIdents, true, '4'); $inputs.= wf_CheckInput('fmpsrvidentspreff', __('Services IDs identifiers from the dedicated field take precedence over service type telepathy'), true, $prefferSrvIdents, 'BankstaSrvIdentsPreff'); $inputs.= wf_tag('h4', false, '', 'style="font-weight: 400; width: 980px; padding: 2px 0 8px 28px; color: #666; margin-block-end: 0; margin-block-start: 0;"'); $inputs.= __('NOTE: dedicated field\'s services IDs are always take precedence over manually chosen \'Internet\' or \'UKV\' services'); $inputs.= wf_tag('h4', true); $inputs.= wf_delimiter(0); $inputs.= wf_tag('hr', false, '', 'style="margin-bottom: 11px;"'); $inputs.= wf_CheckInput('fmpskiprow', __('Skip row processing if specified fields contain keywords below'), true, $rowSkipping, 'BankstaSkipRow'); $inputs.= wf_TextInput('fmpcolskiprow', __('Fields to check row skipping') . '(' . __('multiple fields must be separated with comas') . ')', $fmpData['col_skiprow'], true, '', '', '', 'BankstaSkipRowKeyWordsCol'); $inputs.= wf_TextInput('fmpskiprowkeywords', __('Row skipping determination keywords') . ', ' . __('separated with') . ' BANKSTA2_REGEX_KEYWORDS_DELIM', $fmpData['skip_row_keywords'], true, '40', '', '', 'BankstaSkipRowKeyWords'); $inputs.= wf_CheckInput('fmpskiprokeywordsnoesc', __('Don\'t escape or process in any other way the keywords - just left them "as is"'), true, $noescSkipKeyWords, 'BankstaSkipRowKeyWordsNoEsc'); $inputs.= wf_delimiter(0); $inputs.= wf_CheckInput('fmpreplacestrs', __('Replace characters specified below in specified fields'), true, $strReplacing, 'BankstaReplaceStrs'); $inputs.= wf_TextInput('fmpcolsreplacestrs', __('Fields to perform replacing') . '(' . __('multiple fields must be separated with comas') . ')', $fmpData['col_replace_strs'], true, '', '', '', 'BankstaReplaceStrsCols'); $inputs.= wf_TextInput('fmpstrstoreplace', __('Replaced characters or strings') . ', ' . __('separated with') . ' BANKSTA2_REGEX_KEYWORDS_DELIM', $fmpData['strs_to_replace'], true, '40', '', '', 'BankstaReplaceStrsChars'); $inputs.= wf_TextInput('fmpstrstoreplacewith', __('Replacing characters or string'), $fmpData['strs_to_replace_with'], true, '40', '', '', 'BankstaReplaceStrsWith'); $inputs.= wf_TextInput('fmpstrsreplacecount', __('Replacements count'), $fmpData['replacements_cnt'], true, '40', '', '', 'BankstaReplaceStrsCount'); $inputs.= wf_CheckInput('fmpreplacekeywordsnoesc', __('Don\'t escape or process in any other way the keywords - just left them "as is"'), true, $noescRplcKeyWords, 'BankstaReplaceKeyWordsNoEsc'); $inputs.= wf_delimiter(0); $inputs.= wf_CheckInput('fmpremovestrs', __('Remove characters specified below in specified fields'), true, $strRemoving, 'BankstaRemoveStrs'); $inputs.= wf_TextInput('fmpcolsremovestrs', __('Fields to perform removing') . '(' . __('multiple fields must be separated with comas') . ')', $fmpData['col_remove_strs'], true, '', '', '', 'BankstaRemoveStrsCols'); $inputs.= wf_TextInput('fmpstrstoremove', __('Removed characters or strings') . ', ' . __('separated with') . ' BANKSTA2_REGEX_KEYWORDS_DELIM', $fmpData['strs_to_remove'], true, '40', '', '', 'BankstaRemoveStrsChars'); $inputs.= wf_CheckInput('fmpremovekeywordsnoesc', __('Don\'t escape or process in any other way the keywords - just left them "as is"'), true, $noescRmvKeyWords, 'BankstaRemoveKeyWordsNoEsc'); $inputs.= wf_delimiter(0); $inputs.= wf_CheckInput('formclose', __('Close form after operation'), false, true, $closeFormChkId, '__CloseFrmOnSubmitChk'); $inputs.= wf_HiddenInput('', $modalWindowId, '', '__FMPFormModalWindowId'); $inputs.= ($clone) ? wf_HiddenInput('fmpclone', 'true') : wf_HiddenInput('fmpedit', 'true'); $inputs.= wf_HiddenInput('fmpid', $fmpID); $inputs.= wf_delimiter(); $inputs.= ($clone) ? wf_Submit(__('Clone')) : wf_Submit(__('Edit')); $form = wf_Form(self::URL_ME, 'POST', $inputs, 'glamour __FMPForm', '', $formId); return ($form); } } |