Source of file api.extcontras.php
Size: 157,708 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.extcontras.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492 | <?php /** * - Вы делоете платежов? * - Нет, просто показываю. * - Кросивое... */ class ExtContras { /** * Database abstraction layer with for `extcontras` table * * @var object */ protected $dbExtContras = null; /** * Database abstraction layer with for `extcontras` table + data JOINed from related tables * * @var object */ protected $dbExtContrasExten = null; /** * Database abstraction layer with for `extcontras_profiles` table * * @var object */ protected $dbECProfiles = null; /** * Database abstraction layer with for `extcontras_contracts` table * * @var object */ protected $dbECContracts = null; /** * Database abstraction layer with for `extcontras_address` table * * @var object */ protected $dbECAddress = null; /** * Database abstraction layer with for `extcontras_periods` table * * @var object */ protected $dbECPeriods = null; /** * Database abstraction layer with for `extcontras_money` table * * @var object */ protected $dbECMoney = null; /** * Database abstraction layer with for `money` table + data JOINed from `extcontras` table * * @var object */ protected $dbECMoneyExten = null; /** * Database abstraction layer with for `extcontras_invoices` table * * @var object */ protected $dbECInvoices = null; /** * Database abstraction layer with for `extcontras_missed_payms` table * * @var object */ protected $dbECMissedPayms = null; /** * Contains all DB entities objects in array($tableName => $dbEntity) * * @var array */ protected $dbEntitiesAll = array(); /** * Contains all data entities objects in array($tableName => $dataEntity) * * @var array */ protected $dataEntitiesAll = array(); /** * Placeholder for $dbExtContras DB table field structure * * @var array */ protected $dbExtContrasStruct = array(); /** * Placeholder for $dbECProfiles DB table field structure * * @var array */ protected $dbECProfilesStruct = array(); /** * Placeholder for $dbECContracts DB table field structure * * @var array */ protected $dbECContractsStruct = array(); /** * Placeholder for $dbECAddress DB table field structure * * @var array */ protected $dbECAddressStruct = array(); /** * Placeholder for $dbECPeriods DB table field structure * * @var array */ protected $dbECPeriodsStruct = array(); /** * Placeholder for $dbECExtMoney DB table field structure * * @var array */ protected $dbECMoneyStruct = array(); /** * Placeholder for $dbECInvoices DB table field structure * * @var array */ protected $dbECInvoicesStruct = array(); /** * Placeholder for $dbECMissedPayms DB table field structure * * @var array */ protected $dbECMissedPaymsStruct = array(); /** * Contains all extcontras records from DB as ecid => ecdata * * @var array */ protected $allExtContras = array(); /** * Contains all extcontras records from DB as ecid => ecdata + data JOINed from related tables * * @var array */ protected $allExtContrasExten = array(); /** * Contains all extcontras profiles records from DB ecprofileid => ecprofiledata * * @var array */ protected $allECProfiles = array(); /** * Contains all extcontras contracts records from DB eccontractid => eccontractdata * * @var array */ protected $allECContracts = array(); /** * Contains all extcontras addresses records from DB ecaddressid => ecaddressdata * * @var array */ protected $allECAddresses = array(); /** * Contains all extcontras periods records from DB ecperiodid => ecperioddata * * @var array */ protected $allECPeriods = array(); /** * Contains all extcontras money records from DB ecmoneyid => ecmoneydata * * @var array */ protected $allECMoney = array(); /** * Contains all extcontras money records from DB as ececmoneyid => ecmoneydata + data JOINed from `extcontras` table * * @var array */ protected $allECMoneyExten = array(); /** * Contains all extcontras invoices records from DB ecinvoiceid => ecinvoicedata * * @var array */ protected $allECInvoices = array(); /** * Contains all extcontras overdue payments records from DB ecmisspaymid => ecmisspaymdata * * @var array */ protected $allECMissedPayms = array(); /** * Contains selector control filtering array for a contracts dropdown selector * * @var array */ protected $selectfiltECContractsAll = array(); /** * Contains selector control filtering array for an address dropdown selector * * @var array */ protected $selectfiltECAddressAll = array(); /** * System config object placeholder * * @var null */ protected $ubConfig = null; /** * UbillingCache instance placeholder * * @var null */ protected $ubCache = null; /** * System message helper object placeholder * * @var object */ protected $messages = null; /** * System files storage placeholder * * @var object */ protected $fileStorage = null; /** * Placeholder for FILESTORAGE_ENABLED alter.ini option * * @var bool */ protected $fileStorageEnabled = false; /** * Placeholder for EXTCONTRAS_EDIT_ALLOWED_DAYS alter.ini option * * @var int */ protected $ecEditablePreiod = 60; /** * Placeholder for EXTCONTRAS_INVOICE_ON alter.ini option * * @var int */ protected $ecInvoicesON = 1; /** * Placeholder for EXTCONTRAS_OVERDUE_CONTRACT_NO_ADDR alter.ini option * * @var int */ protected $ecFullCtrctOverdueNoAddrOnly = 1; /** * Placeholder for EXTCONTRAS_CACHE_LIFETIME from alter.ini * * @var int */ protected $cacheLifeTime = 1800; /** * Placeholder for cfr('EXTCONTRASRO') * * @var bool */ protected $ecReadOnlyAccess = false; /** * Contains HTML attribute to disable from's submit buttons on read only access * * @var string */ protected $submitBtnDisabled = ''; /** * Placeholder for mandatory fields SUP mark * * @var string */ protected $supFrmFldMark = ''; /** * Background color for records which have payments in current month * * @var string */ protected $payedThisMonthBKGND = ''; /** * Foreground color for records which have payments in current month * * @var string */ protected $payedThisMonthFRGND = ''; /** * Background color for records which need to be payed during next 5 days * * @var string */ protected $fiveDaysTillPayBKGND = ''; /** * Foreground color for records which need to be payed during next 5 days * * @var string */ protected $fiveDaysTillPayFRGND = ''; /** * Background color for records which payday has passed already * * @var string */ protected $paymentExpiredBKGND = ''; /** * Foreground color for records which payday has passed already * * @var string */ protected $paymentExpiredFRGND = ''; /** * Placeholder for TEMPLATE_CURRENCY alter.ini option * * @var string */ public $currencyStr = ''; /** * Routes, static defines, etc */ // const SAY_MY_NAME = 'CONTRAS'; const URL_ME = '?module=extcontras'; const URL_EXTCONTRAS = 'extcontraslist'; const URL_EXTCONTRAS_COLORS = 'extcontrascolors'; const URL_DICTPROFILES = 'dictprofiles'; const URL_DICTCONTRACTS = 'dictcontracts'; const URL_DICTADDRESS = 'dictaddress'; const URL_DICTPERIODS = 'dictperiods'; const URL_FINOPERATIONS = 'finoperations'; const URL_INVOICES = 'invoices'; const URL_MISSEDPAYMENTS = 'misspayms'; const TABLE_EXTCONTRAS = 'extcontras'; const TABLE_EXTCONTRASEXTEN = 'extcontrasexten'; const TABLE_ECPROFILES = 'extcontras_profiles'; const TABLE_ECCONTRACTS = 'extcontras_contracts'; const TABLE_ECADDRESS = 'extcontras_address'; const TABLE_ECPERIODS = 'extcontras_periods'; const TABLE_ECMONEY = 'extcontras_money'; const TABLE_ECMONEYEXTEN = 'extcontras_moneyexten'; const TABLE_ECINVOICES = 'extcontras_invoices'; const TABLE_ECMISSPAYMENTS = 'extcontras_missed_payms'; const DBFLD_COMMON_ID = 'id'; const CTRL_PROFILE_NAME = 'profname'; const CTRL_PROFILE_EDRPO = 'profedrpo'; const CTRL_PROFILE_CONTACT = 'profcontact'; const CTRL_PROFILE_MAIL = 'profmail'; const DBFLD_PROFILE_NAME = 'name'; const DBFLD_PROFILE_EDRPO = 'edrpo'; const DBFLD_PROFILE_CONTACT = 'contact'; const DBFLD_PROFILE_MAIL = 'email'; const CTRL_CTRCT_CONTRACT = 'ctrctcontract'; const CTRL_CTRCT_DTSTART = 'ctrctdtstart'; const CTRL_CTRCT_DTEND = 'ctrctdtend'; const CTRL_CTRCT_SUBJECT = 'ctrctsubject'; const CTRL_CTRCT_AUTOPRLNG = 'ctrctautoprolong'; const CTRL_CTRCT_FULLSUM = 'ctrctfullsum'; const CTRL_CTRCT_NOTES = 'ctrctnotes'; const DBFLD_CTRCT_CONTRACT = 'contract'; const DBFLD_CTRCT_DTSTART = 'date_start'; const DBFLD_CTRCT_DTEND = 'date_end'; const DBFLD_CTRCT_SUBJECT = 'subject'; const DBFLD_CTRCT_AUTOPRLNG = 'autoprolong'; const DBFLD_CTRCT_FULLSUM = 'full_sum'; const DBFLD_CTRCT_NOTES = 'notes'; const CTRL_ADDRESS_ADDR = 'addraddress'; const CTRL_ADDRESS_SUM = 'addrsumm'; const CTRL_ADDRESS_CTNOTES = 'addrctrctnotes'; const CTRL_ADDRESS_NOTES = 'addrnotes'; const DBFLD_ADDRESS_ADDR = 'address'; const DBFLD_ADDRESS_SUM = 'summ'; const DBFLD_ADDRESS_CTNOTES = 'contract_notes'; const DBFLD_ADDRESS_NOTES = 'notes'; const CTRL_PERIOD_NAME = 'prdname'; const DBFLD_PERIOD_NAME = 'period_name'; const CTRL_MONEY_PROFILEID = 'moneyprofileid'; const CTRL_MONEY_CNTRCTID = 'moneycontractid'; const CTRL_MONEY_ADDRESSID = 'moneyaddressid'; const CTRL_MONEY_ACCRUALID = 'moneyaccrualid'; const CTRL_MONEY_INVOICEID = 'moneyinvoiceid'; const CTRL_MONEY_PURPOSE = 'moneypurpose'; const CTRL_MONEY_SUMACCRUAL = 'moneysummaccrual'; const CTRL_MONEY_SUMPAYMENT = 'moneysummpayment'; const CTRL_MONEY_INOUT = 'moneyinout'; const CTRL_MONEY_PAYNOTES = 'moneypaynotes'; const DBFLD_MONEY_PROFILEID = 'profile_id'; const DBFLD_MONEY_CNTRCTID = 'contract_id'; const DBFLD_MONEY_ADDRESSID = 'address_id'; const DBFLD_MONEY_ACCRUALID = 'accrual_id'; const DBFLD_MONEY_INVOICEID = 'invoice_id'; const DBFLD_MONEY_PURPOSE = 'purpose'; const DBFLD_MONEY_DATE = 'date'; const DBFLD_MONEY_DATE_EDIT = 'date_edit'; const DBFLD_MONEY_SMACCRUAL = 'summ_accrual'; const DBFLD_MONEY_SMPAYMENT = 'summ_payment'; const DBFLD_MONEY_DATE_PAYMENT = 'date_payment'; const DBFLD_MONEY_INCOMING = 'incoming'; const DBFLD_MONEY_OUTGOING = 'outgoing'; const DBFLD_MONEY_PAYNOTES = 'paynotes'; const CTRL_INVOICES_CONTRASID = 'invocontrasrecid'; const CTRL_INVOICES_INTERNAL_NUM = 'invointernalnum'; const CTRL_INVOICES_INVOICE_NUM = 'invoicenum'; const CTRL_INVOICES_DATE = 'invodate'; const CTRL_INVOICES_SUM = 'invosumm'; const CTRL_INVOICES_SUM_VAT = 'invosummvat'; const CTRL_INVOICES_NOTES = 'invonotes'; const CTRL_INVOICES_IN_OUT = 'invoinout'; const DBFLD_INVOICES_CONTRASID = 'contras_rec_id'; const DBFLD_INVOICES_INTERNAL_NUM = 'internal_number'; const DBFLD_INVOICES_INVOICE_NUM = 'invoice_number'; const DBFLD_INVOICES_DATE = 'date'; const DBFLD_INVOICES_SUM = 'summ'; const DBFLD_INVOICES_SUM_VAT = 'summ_vat'; const DBFLD_INVOICES_NOTES = 'notes'; const DBFLD_INVOICES_INCOMING = 'incoming'; const DBFLD_INVOICES_OUTGOING = 'outgoing'; const CTRL_EXTCONTRAS_PROFILE_ID = 'extcontraprofileid'; const CTRL_EXTCONTRAS_CONTRACT_ID = 'extcontracontractid'; const CTRL_EXTCONTRAS_ADDRESS_ID = 'extcontraaddressid'; const CTRL_EXTCONTRAS_PERIOD_ID = 'extcontraperiodid'; const CTRL_EXTCONTRAS_PAYDAY = 'extcontrapayday'; const DBFLD_EXTCONTRAS_PROFILE_ID = 'contras_id'; const DBFLD_EXTCONTRAS_CONTRACT_ID = 'contract_id'; const DBFLD_EXTCONTRAS_ADDRESS_ID = 'address_id'; const DBFLD_EXTCONTRAS_PERIOD_ID = 'period_id'; const DBFLD_EXTCONTRAS_MISSPAYM_ID = 'missed_paym_id'; const DBFLD_EXTCONTRAS_PAYDAY = 'payday'; const DBFLD_EXTCONTRAS_DATECREATE = 'date_create'; const CTRL_ECCOLOR_PAYEDTHISMONTH_BKGND = 'EC_PAYEDTHISMONTH_BKGND'; const CTRL_ECCOLOR_PAYEDTHISMONTH_FRGND = 'EC_PAYEDTHISMONTH_FRGND'; const CTRL_ECCOLOR_FIVEDAYSTILLPAY_BKGND = 'EC_FIVEDAYSTILLPAY_BKGND'; const CTRL_ECCOLOR_FIVEDAYSTILLPAY_FRGND = 'EC_FIVEDAYSTILLPAY_FRGND'; const CTRL_ECCOLOR_PAYMENTEXPIRED_BKGND = 'EC_PAYMENTEXPIRED_BKGND'; const CTRL_ECCOLOR_PAYMENTEXPIRED_FRGND = 'EC_PAYMENTEXPIRED_FRGND'; const DBFLD_MISSPAYMS_CONTRASID = 'contras_rec_id'; const DBFLD_MISSPAYMS_PROFILEID = 'profile_id'; const DBFLD_MISSPAYMS_CONTRACTID = 'contract_id'; const DBFLD_MISSPAYMS_ADDRESSID = 'address_id'; const DBFLD_MISSPAYMS_PERIOD_ID = 'period_id'; const DBFLD_MISSPAYMS_PAYDAY = 'payday'; const DBFLD_MISSPAYMS_DATE_PAYMENT = 'date_payment'; const DBFLD_MISSPAYMS_DATE_EXPIRED = 'date_expired'; const DBFLD_MISSPAYMS_DATE_PAYED = 'date_payed'; const DBFLD_MISSPAYMS_SUMPAYMENT = 'summ_payment'; const ROUTE_ACTION_CREATE = 'doCreate'; const ROUTE_ACTION_PREFILL = 'doPrefill'; const ROUTE_ACTION_EDIT = 'doEdit'; const ROUTE_ACTION_CLONE = 'doClone'; const ROUTE_ACTION_DELETE = 'doRemove'; const ROUTE_EDIT_REC_ID = 'editRecID'; const ROUTE_DELETE_REC_ID = 'deleteRecID'; const ROUTE_CONTRAS_ACTS = 'contrasacts'; const ROUTE_CONTRAS_JSON = 'contraslistjson'; const ROUTE_PROFILE_ACTS = 'profileacts'; const ROUTE_PROFILE_JSON = 'profilelistjson'; const ROUTE_CONTRACT_ACTS = 'contractacts'; const ROUTE_CONTRACT_JSON = 'contractlistjson'; const ROUTE_ADDRESS_ACTS = 'addressacts'; const ROUTE_ADDRESS_JSON = 'addresslistjson'; const ROUTE_PERIOD_ACTS = 'periodacts'; const ROUTE_PERIOD_JSON = 'periodlistjson'; const ROUTE_FINOPS_ACTS = 'finopsacts'; const ROUTE_FINOPS_JSON = 'finopslistjson'; const ROUTE_FINOPS_DETAILS_CNTRCTS = 'finopsdetailscontracts'; const ROUTE_FINOPS_DETAILS_ADDRESS = 'finopsdetailsaddress'; const ROUTE_INVOICES_ACTS = 'invoicesacts'; const ROUTE_INVOICES_JSON = 'invoiceslistjson'; const ROUTE_MISSPAYMS_ACTS = 'misspaymslistjson'; const ROUTE_MISSPAYMS_JSON = 'misspaymslistjson'; const ROUTE_FORCECACHE_UPD = 'extcontrasforcecacheupdate'; const ROUTE_2LVL_CNTRCTS_DETAIL = 'contras2lvlcntrctsdetails'; const ROUTE_2LVL_CNTRCTS_JSON = 'contras2lvlcntrctsjson'; const ROUTE_3LVL_ADDR_JSON = 'contras3lvladdrsjson'; const MISC_FILESTORAGE_SCOPE = 'EXCONTRAS'; const MISC_CLASS_MWID_CTRL = '__FormModalWindowID'; const MISC_CLASS_SUBMITFORM = '__FormSubmit'; const MISC_CLASS_SUBMITFORM_MODAL = '__FormSubmitModal'; const MISC_CLASS_EMPTYVALCHECK = '__EmptyCheckControl'; const MISC_CLASS_EMPTYVALCHECK_MODAL = '__EmptyCheckControlModal'; const MISC_CLASS_DPICKER_MODAL_INIT = '__DatePickerModalInit'; const MISC_JS_DEL_FUNC_NAME = 'deleteRec'; const MISC_ERRFORM_ID_PARAM = 'errfrmid'; const MISC_MARKROW_URL = 'markrowid'; const MISC_WEBFILTER_DATE_START = 'datefilterstart'; const MISC_WEBFILTER_DATE_END = 'datefilterend'; const MISC_WEBFILTER_PAYDAY = 'paydayfilter'; const MISC_WEBFILTER_MISSPAYMS = 'misspaysfilter'; const MISC_PREFILL_DATA = 'prefilldata'; const MISC_WEBSEL_PROFILES = 'WebSelECProfiles_'; const MISC_WEBSEL_CONTRACTS = 'WebSelECContracts_'; const MISC_WEBSEL_ADDRESS = 'WebSelECAddress_'; const MISC_WEBSEL_FILTDATA_CONTRACTS = 'WebSelContractFilterData_'; const MISC_WEBSEL_FILTDATA_ADDRESS = 'WebSelAddressFilterData_'; const MISC_WEBSEL_DBVAL_PROFILE_ID = 'ModalDBValProfile_'; const MISC_WEBSEL_DBVAL_CONTRACTS_ID = 'ModalDBValContract_'; const MISC_WEBSEL_DBVAL_ADDRESS_ID = 'ModalDBValAddress_'; const MISC_MISSED_PAYMENT_PROCESSING = 'misspaymprocessing'; const MISC_MISSED_PAYMENT_ID = 'missedpaymentid'; const MISC_FORMS_CAPTS_PROFILE_DICT = 'counterparty profile'; const MISC_FORMS_CAPTS_CNTRCTS_DICT = 'counterparty contract'; const MISC_FORMS_CAPTS_ADDRESS_DICT = 'contract address'; const MISC_FORMS_CAPTS_PERIODS_DICT = 'period'; const MISC_FORMS_CAPTS_INVOICES_LIST = 'invoice'; const MISC_FORMS_CAPTS_FINOPS_LIST = 'financial operation'; const MISC_FORMS_CAPTS_EXTCONTRAS = 'counterparty record'; public function __construct() { global $ubillingConfig; $this->ubConfig = $ubillingConfig; $this->ubCache = new UbillingCache(); $this->messages = new UbillingMessageHelper(); $this->loadOptions(); $this->initDBEntities(); $this->loadDBTableStructs(); $this->loadAllData(); $this->getTableGridColorOpts(); if ($this->fileStorageEnabled) { $this->fileStorage = new FileStorage(self::MISC_FILESTORAGE_SCOPE); } $this->supFrmFldMark = wf_tag('sup') . '*' . wf_tag('sup', true); } /** * Loads alter.ini options */ protected function loadOptions() { $this->currencyStr = $this->ubConfig->getAlterParam('TEMPLATE_CURRENCY', 'грн'); $this->fileStorageEnabled = $this->ubConfig->getAlterParam('FILESTORAGE_ENABLED'); $this->cacheLifeTime = $this->ubConfig->getAlterParam('EXTCONTRAS_CACHE_LIFETIME', 1800); $this->ecInvoicesON = $this->ubConfig->getAlterParam('EXTCONTRAS_INVOICE_ON', 1); $this->ecFullCtrctOverdueNoAddrOnly = $this->ubConfig->getAlterParam('EXTCONTRAS_OVERDUE_CONTRACT_NO_ADDR', 1); $this->ecEditablePreiod = $this->ubConfig->getAlterParam('EXTCONTRAS_EDIT_ALLOWED_DAYS'); $this->ecEditablePreiod = empty($this->ecEditablePreiod) ? (60 * 86400) : ($this->ecEditablePreiod * 86400); // Option is in days $this->ecReadOnlyAccess = (!cfr('EXTCONTRASRW')); $this->submitBtnDisabled = ($this->ecReadOnlyAccess ? 'disabled="true"' : ''); } /** * Inits DB NyanORM objects */ protected function initDBEntities() { $this->dbExtContras = new NyanORM(self::TABLE_EXTCONTRAS); $this->dbEntitiesAll[self::TABLE_EXTCONTRAS] = $this->dbExtContras; $this->dataEntitiesAll[self::TABLE_EXTCONTRAS] = 'allExtContras'; $this->dbExtContrasExten = new NyanORM(self::TABLE_EXTCONTRAS); $this->dbEntitiesAll[self::TABLE_EXTCONTRASEXTEN] = $this->dbExtContrasExten; $this->dataEntitiesAll[self::TABLE_EXTCONTRASEXTEN] = 'allExtContrasExten'; $this->dbECProfiles = new NyanORM(self::TABLE_ECPROFILES); $this->dbEntitiesAll[self::TABLE_ECPROFILES] = $this->dbECProfiles; $this->dataEntitiesAll[self::TABLE_ECPROFILES] = 'allECProfiles'; $this->dbECContracts = new NyanORM(self::TABLE_ECCONTRACTS); $this->dbEntitiesAll[self::TABLE_ECCONTRACTS] = $this->dbECContracts; $this->dataEntitiesAll[self::TABLE_ECCONTRACTS] = 'allECContracts'; $this->dbECAddress = new NyanORM(self::TABLE_ECADDRESS); $this->dbEntitiesAll[self::TABLE_ECADDRESS] = $this->dbECAddress; $this->dataEntitiesAll[self::TABLE_ECADDRESS] = 'allECAddresses'; $this->dbECPeriods = new NyanORM(self::TABLE_ECPERIODS); $this->dbEntitiesAll[self::TABLE_ECPERIODS] = $this->dbECPeriods; $this->dataEntitiesAll[self::TABLE_ECPERIODS] = 'allECPeriods'; $this->dbECMoney = new NyanORM(self::TABLE_ECMONEY); $this->dbEntitiesAll[self::TABLE_ECMONEY] = $this->dbECMoney; $this->dataEntitiesAll[self::TABLE_ECMONEY] = 'allECMoney'; $this->dbECMoneyExten = new NyanORM(self::TABLE_ECMONEY); $this->dbEntitiesAll[self::TABLE_ECMONEYEXTEN] = $this->dbECMoneyExten; $this->dataEntitiesAll[self::TABLE_ECMONEYEXTEN] = 'allECMoneyExten'; $this->dbECInvoices = new NyanORM(self::TABLE_ECINVOICES); $this->dbEntitiesAll[self::TABLE_ECINVOICES] = $this->dbECInvoices; $this->dataEntitiesAll[self::TABLE_ECINVOICES] = 'allECInvoices'; $this->dbECMissedPayms = new NyanORM(self::TABLE_ECMISSPAYMENTS); $this->dbEntitiesAll[self::TABLE_ECMISSPAYMENTS] = $this->dbECMissedPayms; $this->dataEntitiesAll[self::TABLE_ECMISSPAYMENTS] = 'allECMissedPayms'; } /** * Returns DB entity object by table name * * @param $dbEntityName * * @return object|null */ public function getDBEntity($dbEntityName) { $result = null; if (!empty($this->dbEntitiesAll[$dbEntityName])) { $result = $this->dbEntitiesAll[$dbEntityName]; } return ($result); } /** * Returns data entity object by table name * * @param $dataEntityName * * @return mixed|null */ public function getDataEntity($dataEntityName) { $result = null; if (!empty($this->dataEntitiesAll[$dataEntityName])) { $result = $this->dataEntitiesAll[$dataEntityName]; } return ($result); } /** * Loads DB tables fields structures to a class properties */ protected function loadDBTableStructs() { $this->dbExtContrasStruct = $this->dbExtContras->getTableStructure(true, false, true, true); $this->dbECProfilesStruct = $this->dbECProfiles->getTableStructure(true, false, true, true); $this->dbECContractsStruct = $this->dbECContracts->getTableStructure(true, false, true, true); $this->dbECAddressStruct = $this->dbECAddress->getTableStructure(true, false, true, true); $this->dbECPeriodsStruct = $this->dbECPeriods->getTableStructure(true, false, true, true); $this->dbECMoneyStruct = $this->dbECMoney->getTableStructure(true, false, true, true); $this->dbECInvoicesStruct = $this->dbECInvoices->getTableStructure(true, false, true, true); $this->dbECMissedPaymsStruct = $this->dbECMissedPayms->getTableStructure(true, false, true, true); } /** * Loads data from a DB table or UB cache * * @param string $tableName * @param string $cacheKey * @param bool $forceDBLoad * @param bool $flushNyanParams * @param string $assocByField * @param string $dataEntity * @param bool $cachingDisabled * @param bool $distinctSelectON * * @return mixed */ public function loadDataFromTableCached($tableName, $cacheKey, $forceDBLoad = false, $flushNyanParams = true, $assocByField = '', $dataEntity = '', $cachingDisabled = false, $distinctSelectON = false) { $cacheKey = strtoupper($cacheKey); $dbInstance = $this->getDBEntity($tableName); $flushParams = $flushNyanParams; $assocByField = (empty($assocByField) ? 'id' : $assocByField); $dataInstance = (empty($dataEntity) ? $this->getDataEntity($tableName) : $dataEntity); $thisInstance = $this; if ($forceDBLoad) { $this->$dataInstance = $dbInstance->getAll($assocByField, $flushParams, $distinctSelectON); if ($cachingDisabled) { $this->ubCache->delete($cacheKey); } else { $this->ubCache->set($cacheKey, $this->$dataInstance, $this->cacheLifeTime); } } else { $this->$dataInstance = $this->ubCache->getCallback($cacheKey, function () use ($thisInstance, $tableName, $cacheKey, $flushParams, $assocByField, $dataInstance, $cachingDisabled, $distinctSelectON) { return ($thisInstance->loadDataFromTableCached($tableName, $cacheKey, true, $flushParams, $assocByField, $dataInstance, $cachingDisabled, $distinctSelectON)); }, $this->cacheLifeTime); } return ($this->$dataInstance); } /** * Loads extended external counterparties data * * @param bool $forceDBLoad * @param string $whereRaw * @param string $orderBy * @param string $orderDir * @param bool $distinctSelectON */ protected function loadExtContrasExtenData($forceDBLoad = false, $whereRaw = '', $orderBy = '', $orderDir = 'ASC', $distinctSelectON = false) { $selectable = array_merge($this->dbExtContrasStruct, $this->dbECProfilesStruct, $this->dbECContractsStruct, $this->dbECAddressStruct, $this->dbECPeriodsStruct); if (!$forceDBLoad) { $forceDBLoad = (empty($whereRaw) and empty($orderBy) and empty($distinctSelectON)); } $this->dbExtContrasExten->selectable($selectable); $this->dbExtContrasExten->joinOn(); $this->dbExtContrasExten->joinOn('LEFT', self::TABLE_ECPROFILES, self::TABLE_EXTCONTRAS . '.' . self::DBFLD_EXTCONTRAS_PROFILE_ID . ' = ' . self::TABLE_ECPROFILES . '.' . self::DBFLD_COMMON_ID); $this->dbExtContrasExten->joinOn('LEFT', self::TABLE_ECCONTRACTS, self::TABLE_EXTCONTRAS . '.' . self::DBFLD_EXTCONTRAS_CONTRACT_ID . ' = ' . self::TABLE_ECCONTRACTS . '.' . self::DBFLD_COMMON_ID); $this->dbExtContrasExten->joinOn('LEFT', self::TABLE_ECADDRESS, self::TABLE_EXTCONTRAS . '.' . self::DBFLD_EXTCONTRAS_ADDRESS_ID . ' = ' . self::TABLE_ECADDRESS . '.' . self::DBFLD_COMMON_ID); $this->dbExtContrasExten->joinOn('LEFT', self::TABLE_ECPERIODS, self::TABLE_EXTCONTRAS . '.' . self::DBFLD_EXTCONTRAS_PERIOD_ID . ' = ' . self::TABLE_ECPERIODS . '.' . self::DBFLD_COMMON_ID); if (!empty($whereRaw)) { $this->dbExtContrasExten->whereRaw($whereRaw); } if (!empty($orderBy)) { $this->dbExtContrasExten->orderBy($orderBy, $orderDir); } //$this->dbExtContrasExten->setDebug(true, true); $this->loadDataFromTableCached(self::TABLE_EXTCONTRASEXTEN, self::TABLE_EXTCONTRASEXTEN, $forceDBLoad, false, self::TABLE_EXTCONTRAS . self::DBFLD_COMMON_ID, '', !empty($whereRaw), $distinctSelectON); } /** * Loads extended external finops data * * @param bool $forceDBLoad * @param string $whereRaw * @param string $orderBy * @param string $orderDir * @param bool $distinctSelectON * */ public function loadFinopsExtenData($forceDBLoad = false, $whereRaw = '', $orderBy = '', $orderDir = 'ASC', $distinctSelectON = false) { $selectable = array_merge($this->dbECMoneyStruct, $this->dbExtContrasStruct); if (!$forceDBLoad) { $forceDBLoad = (empty($whereRaw) and empty($orderBy) and empty($distinctSelectON)); } $this->dbECMoneyExten->selectable($selectable); $this->dbECMoneyExten->joinOn(); $this->dbECMoneyExten->joinOn('INNER', self::TABLE_EXTCONTRAS, self::TABLE_ECMONEY . '.' . self::DBFLD_MONEY_PROFILEID . ' = ' . self::TABLE_EXTCONTRAS . '.' . self::DBFLD_EXTCONTRAS_PROFILE_ID); if (!empty($whereRaw)) { $this->dbECMoneyExten->whereRaw($whereRaw); } if (!empty($orderBy)) { $this->dbExtContrasExten->orderBy($orderBy, $orderDir); } //$this->dbECMoneyExten->setDebug(true, true); $this->loadDataFromTableCached(self::TABLE_ECMONEYEXTEN, self::TABLE_ECMONEYEXTEN, $forceDBLoad, false, self::TABLE_ECMONEY . self::DBFLD_COMMON_ID, '', !empty($whereRaw), $distinctSelectON); } /** * Retrieves data for contracts web selector control filtering */ protected function loadWebSelFilterData() { $this->loadExtContrasExtenData(false, '', self::TABLE_EXTCONTRAS . self::DBFLD_EXTCONTRAS_PROFILE_ID); foreach ($this->allExtContrasExten as $eachID => $eachRec) { $tmpProfileID = $eachRec[self::TABLE_EXTCONTRAS . self::DBFLD_EXTCONTRAS_PROFILE_ID]; $tmpContractID = $eachRec[self::TABLE_EXTCONTRAS . self::DBFLD_EXTCONTRAS_CONTRACT_ID]; $tmpAddressID = $eachRec[self::TABLE_EXTCONTRAS . self::DBFLD_EXTCONTRAS_ADDRESS_ID]; $this->selectfiltECContractsAll[$tmpProfileID][] = array($tmpContractID => $eachRec[self::TABLE_ECCONTRACTS . self::DBFLD_CTRCT_CONTRACT] . ' ' . $eachRec[self::TABLE_ECCONTRACTS . self::DBFLD_CTRCT_SUBJECT] . ' ' . $eachRec[self::TABLE_ECCONTRACTS . self::DBFLD_CTRCT_FULLSUM]); $this->selectfiltECAddressAll[$tmpContractID][] = array($tmpAddressID => $eachRec[self::TABLE_ECADDRESS . self::DBFLD_ADDRESS_ADDR] . ' ' . $eachRec[self::TABLE_ECADDRESS . self::DBFLD_ADDRESS_SUM]); } } /** * Unified data loader */ protected function loadAllData($forceDBLoad = false) { $this->loadDataFromTableCached(self::TABLE_EXTCONTRAS, self::TABLE_EXTCONTRAS, $forceDBLoad); $this->loadDataFromTableCached(self::TABLE_ECPROFILES, self::TABLE_ECPROFILES, $forceDBLoad); $this->loadDataFromTableCached(self::TABLE_ECCONTRACTS, self::TABLE_ECCONTRACTS, $forceDBLoad); $this->loadDataFromTableCached(self::TABLE_ECADDRESS, self::TABLE_ECADDRESS, $forceDBLoad); $this->loadDataFromTableCached(self::TABLE_ECPERIODS, self::TABLE_ECPERIODS, $forceDBLoad); $this->loadDataFromTableCached(self::TABLE_ECMONEY, self::TABLE_ECMONEY, $forceDBLoad); $this->loadDataFromTableCached(self::TABLE_ECINVOICES, self::TABLE_ECINVOICES, $forceDBLoad); $this->loadDataFromTableCached(self::TABLE_ECMISSPAYMENTS, self::TABLE_ECMISSPAYMENTS, $forceDBLoad); $this->loadExtContrasExtenData($forceDBLoad); $this->loadFinopsExtenData($forceDBLoad); } /** * Forcibly updates cached data */ public function refreshCacheForced() { $this->loadAllData(true); } /** * Returns prepared filtering array for NyanORM checkRecExists() method * * @param $dbTabField * @param $operator * @param $dbFieldValue * * @return array */ public function createCheckUniquenessArray($dbTabField, $operator, $dbFieldValue) { $tmpArray = array($dbTabField => array('operator' => $operator, 'fieldval' => $dbFieldValue) ); return ($tmpArray); } /** * Saves counterparties list coloring to ubStorage */ public function setTableGridColorOpts() { zb_StorageSet(self::CTRL_ECCOLOR_PAYEDTHISMONTH_BKGND, ubRouting::post(self::CTRL_ECCOLOR_PAYEDTHISMONTH_BKGND)); zb_StorageSet(self::CTRL_ECCOLOR_PAYEDTHISMONTH_FRGND, ubRouting::post(self::CTRL_ECCOLOR_PAYEDTHISMONTH_FRGND)); zb_StorageSet(self::CTRL_ECCOLOR_FIVEDAYSTILLPAY_BKGND, ubRouting::post(self::CTRL_ECCOLOR_FIVEDAYSTILLPAY_BKGND)); zb_StorageSet(self::CTRL_ECCOLOR_FIVEDAYSTILLPAY_FRGND, ubRouting::post(self::CTRL_ECCOLOR_FIVEDAYSTILLPAY_FRGND)); zb_StorageSet(self::CTRL_ECCOLOR_PAYMENTEXPIRED_BKGND, ubRouting::post(self::CTRL_ECCOLOR_PAYMENTEXPIRED_BKGND)); zb_StorageSet(self::CTRL_ECCOLOR_PAYMENTEXPIRED_FRGND, ubRouting::post(self::CTRL_ECCOLOR_PAYMENTEXPIRED_FRGND)); } /** * Loads counterparties list coloring to class properties */ public function getTableGridColorOpts() { $this->payedThisMonthBKGND = zb_StorageGet(self::CTRL_ECCOLOR_PAYEDTHISMONTH_BKGND); $this->payedThisMonthBKGND = (empty($this->payedThisMonthBKGND) ? '#4f7318' : $this->payedThisMonthBKGND); $this->payedThisMonthFRGND = zb_StorageGet(self::CTRL_ECCOLOR_PAYEDTHISMONTH_FRGND); $this->payedThisMonthFRGND = (empty($this->payedThisMonthFRGND) ? '#ffffff' : $this->payedThisMonthFRGND); $this->fiveDaysTillPayBKGND = zb_StorageGet(self::CTRL_ECCOLOR_FIVEDAYSTILLPAY_BKGND); $this->fiveDaysTillPayBKGND = (empty($this->fiveDaysTillPayBKGND) ? '#ffff00' : $this->fiveDaysTillPayBKGND); $this->fiveDaysTillPayFRGND = zb_StorageGet(self::CTRL_ECCOLOR_FIVEDAYSTILLPAY_FRGND); $this->fiveDaysTillPayFRGND = (empty($this->fiveDaysTillPayFRGND) ? '#4800ff' : $this->fiveDaysTillPayFRGND); $this->paymentExpiredBKGND = zb_StorageGet(self::CTRL_ECCOLOR_PAYMENTEXPIRED_BKGND); $this->paymentExpiredBKGND = (empty($this->paymentExpiredBKGND) ? '#9e1313' : $this->paymentExpiredBKGND); $this->paymentExpiredFRGND = zb_StorageGet(self::CTRL_ECCOLOR_PAYMENTEXPIRED_FRGND); $this->paymentExpiredFRGND = (empty($this->paymentExpiredFRGND) ? '#ffff44' : $this->paymentExpiredFRGND); } /** * Searches for any occurrences of current month payments for a certain counterparty ID * * @param $ecRecID * @param bool $contractCheck * @param bool $addressCheck * @param bool $checkSum * * @return string */ public function checkCurMonthPaymExists($ecRecID, $contractCheck = false, $addressCheck = false, $checkSum = false) { $result = ''; if (!empty($ecRecID) and !empty($this->allExtContras[$ecRecID][self::DBFLD_EXTCONTRAS_PAYDAY])) { $tmpECPayDay = $this->allExtContras[$ecRecID][self::DBFLD_EXTCONTRAS_PAYDAY]; $tmpECProfileID = $this->allExtContras[$ecRecID][self::DBFLD_EXTCONTRAS_PROFILE_ID]; $tmpECContractID = $this->allExtContras[$ecRecID][self::DBFLD_EXTCONTRAS_CONTRACT_ID]; $tmpECAddressID = $this->allExtContras[$ecRecID][self::DBFLD_EXTCONTRAS_ADDRESS_ID]; $curMonthStart = date('Y-m-') . '01'; $curMonthEnd = date('Y-m-') . date('t'); $fullPaymentSum = 0; // getting full payment sum for a current contract if (!empty($this->allECContracts[$tmpECContractID][self::DBFLD_CTRCT_FULLSUM])) { $fullPaymentSum = $this->allECContracts[$tmpECContractID][self::DBFLD_CTRCT_FULLSUM]; } // setting initial mandatory filtering by contragent profile ID $this->dbECMoney->selectable(self::DBFLD_COMMON_ID); $this->dbECMoney->where(self::DBFLD_MONEY_PROFILEID, '=', $tmpECProfileID); // adding filtering by contract ID if it's "contract check" if ($contractCheck) { $this->dbECMoney->where(self::DBFLD_MONEY_CNTRCTID, '=', $tmpECContractID); } // if it's address check, and there is a payment sum for current address, // and we didn't get full payment sum for a current contract on a very first step // then we're trying to get a current address payment sum if ($addressCheck and empty($fullPaymentSum) and !empty($this->allECAddresses[$tmpECAddressID][self::DBFLD_ADDRESS_SUM])) { $fullPaymentSum = $this->allECAddresses[$tmpECAddressID][self::DBFLD_ADDRESS_SUM]; } // adding filtering by payment sum "!= 0" to be sure that the financial operation was ever paid $this->dbECMoney->where(self::DBFLD_MONEY_SMPAYMENT, '!=', 0); if (!empty($fullPaymentSum)) { // if we've got full payment sum for a current contract(or address) ... if ($addressCheck) { // ... and it's "address check" // - then we search either for a financial operation with current address ID // or for a financial operation with current payment sum // - because address check in this case(when we have full payment sum for a current contract) - is just in case $this->dbECMoney->whereRaw(' (`' . self::DBFLD_MONEY_ADDRESSID . '` = ' . $tmpECAddressID . ' OR `' . self::DBFLD_MONEY_SMPAYMENT . '` = ' . $fullPaymentSum . ') '); } else { // ... and it's "contract check" - then we search for a financial operation with current or grater payment sum $this->dbECMoney->where(self::DBFLD_MONEY_SMPAYMENT, '>=', $fullPaymentSum); } } elseif ($addressCheck) { // this means that our contract doesn't have payment sum filled // - and we search for a financial operation with current address ID // // this line will never be executed, if all the fields in contract and address dictionaries are filled correctly $this->dbECMoney->where(self::DBFLD_MONEY_ADDRESSID, '=', $tmpECAddressID); } // finally - adding filter by date to range it in current month $this->dbECMoney->whereRaw(' `' . self::DBFLD_MONEY_DATE . '` BETWEEN "' . $curMonthStart . '" AND "' . $curMonthEnd . '" + INTERVAL 1 DAY '); //$this->dbECMoney->setDebug(true, true); // getting the ID(s) of the supposed existing payment(s) - or nothing $result = $this->dbECMoney->getAll(self::DBFLD_COMMON_ID); } // if "check sum" - trying to sum up all of the existing payments // to get the total paid sum // totally used for "address check" to determine if total sum all payments for a certain addresses of the contract // are "covering" - i.e. are equal or grater than - the full contract sum if ($checkSum and !empty($result)) { $tmpPayedSum = 0; foreach ($result as $paymID => $paymData) { $tmpPayedSum += $paymData[self::DBFLD_MONEY_SMPAYMENT]; } $result = $tmpPayedSum; } return ($result); } /** * Returns array of addresses assigned to a certain combination of $profileID + $contractID * * @param $profileID * @param $contractID * * @return mixed */ public function checkContractHasAddresses($profileID, $contractID) { //$this->dbExtContras->setDebug(true, true); $this->dbExtContras->selectable(array(self::DBFLD_COMMON_ID, self::DBFLD_EXTCONTRAS_ADDRESS_ID)); $this->dbExtContras->where(self::DBFLD_EXTCONTRAS_PROFILE_ID, '=', $profileID); $this->dbExtContras->where(self::DBFLD_EXTCONTRAS_CONTRACT_ID, '=', $contractID); $result = $this->dbExtContras->getAll(self::DBFLD_COMMON_ID); return ($result); } /** * Returns typical JQDT with or without JS code for interacting with modals and dynamic modals * * @param $ajaxURL * @param $columnsArr * @param string $columnsOpts * @param bool $stdJSForCRUDs * @param string $customJSCode * @param string $truncateURL * @param string $truncateParam * @param bool $addTotalsFooter * @param array $totalsColumns * @param string $totalsColsLegendStr * @param bool $addDetailsProcessingJS * @param string $dpAjaxURL * @param string $dpColumnIdx * @param string $dpJSFuncName * @param string $dpAjaxMethod * * @param string|int $markRowForID * * @return string */ protected function getStdJQDTWithJSForCRUDs($ajaxURL, $columnsArr, $columnsOpts = '', $stdJSForCRUDs = true, $customJSCode = '', $markRowForID = '', $truncateURL = '', $truncateParam = '', $addTotalsFooter = false, $totalsColumns = array(), $totalsColsLegendStr = '', $addDetailsProcessingJS = false, $dpAjaxURL = '', $dpColumnIdx = '', $dpJSFuncName = 'showDetailsData', $dpAjaxMethod = 'POST') { $result = ''; $ajaxURLStr = $ajaxURL; $jqdtID = 'jqdt_' . md5($ajaxURLStr); $columns = $columnsArr; $opts = (empty($columnsOpts) ? '"order": [[ 0, "asc" ]]' : $columnsOpts); $footerOpts = 'style="line-height: 2.2em; white-space: nowrap;"'; $footTHOpts = 'style="padding: 0 5px 0 5px; border-top: 2px solid lightgrey;"'; if (!empty($markRowForID)) { $result .= wf_EncloseWithJSTags(wf_JQDTRowShowPluginJS()); } if ($addTotalsFooter and ! empty($totalsColumns)) { $result .= wf_EncloseWithJSTags(wf_JQDTColumnTotalSumJS()); $opts .= ' , "footerCallback": function(tfoot, data, start, end, display) { var api = this.api(); var footerHTML = ""; let curPageSum = 0; let curPageTotal = 0; '; foreach ($totalsColumns as $colNum) { $opts .= ' curPageSum = api.column( ' . $colNum . ', {page:"current"} ).data().sum().toFixed(2); curPageTotal = api.column( ' . $colNum . ' ).data().sum().toFixed(2); footerHTML = " " + curPageSum + " ' . __($totalsColsLegendStr) . wf_delimiter(0) . ' ( " + curPageTotal + " ' . __($totalsColsLegendStr) . ' )"; $( api.column(' . $colNum . ').footer() ).html( footerHTML ); '; } $opts .= ' } '; } $result .= wf_JqDtLoader($columns, $ajaxURLStr, false, __('results'), 100, $opts, $addTotalsFooter, $footerOpts, $footTHOpts); if ($stdJSForCRUDs) { $result .= wf_tag('script', false, '', 'type="text/javascript"'); // putting a "form submitting catcher" JS code to process multiple modal and static forms // with one piece of code and ajax requests $result .= wf_jsAjaxFormSubmit('.' . self::MISC_CLASS_SUBMITFORM . ', .' . self::MISC_CLASS_SUBMITFORM_MODAL, '.' . self::MISC_CLASS_MWID_CTRL, $jqdtID, '.' . self::MISC_CLASS_EMPTYVALCHECK . ', .' . self::MISC_CLASS_EMPTYVALCHECK_MODAL, self::MISC_ERRFORM_ID_PARAM); // putting a piece of JS code to perform records delete action $result .= wf_jsAjaxCustomFunc(self::MISC_JS_DEL_FUNC_NAME, $jqdtID, '', self::MISC_ERRFORM_ID_PARAM); if (!empty($markRowForID)) { $result .= wf_JQDTMarkRowJS(0, $markRowForID, $truncateURL, $truncateParam); } $result .= wf_tag('script', true); } if ($addDetailsProcessingJS and ! empty($dpAjaxURL) and ! wf_emptyNonZero($dpColumnIdx)) { $result .= wf_EncloseWithJSTags(wf_JQDTDetailsClickProcessingJS($dpAjaxURL, $dpColumnIdx, $jqdtID, $dpAjaxMethod, $dpJSFuncName)); } if (!empty($customJSCode)) { $result .= wf_EncloseWithJSTags($customJSCode); } return ($result); } /** * Returns typical JQDT "actions" controls, like "Delete", "Edit", "Clone" * * @param int $recID * @param string $routeActs * @param bool $cloneButtonON * @param string $customControls * @param bool $editButton * @param bool $deleteButton * * @return string */ protected function getStdJQDTActions($recID, $routeActs, $cloneButtonON = false, $customControls = '', $editButton = true, $deleteButton = true) { $curTimeStamp = strtotime(curdate()); $actions = ''; if ($deleteButton and ! $this->ecReadOnlyAccess) { // gathering the delete ajax data query $tmpDeleteQuery = '\'&' . $routeActs . '=true' . '&' . self::ROUTE_ACTION_DELETE . '=true' . '&' . self::ROUTE_DELETE_REC_ID . '=' . $recID . '\''; $deleteDialogWID = 'dialog-modal_' . wf_inputid(); $deleteDialogCloseFunc = ' $(\'#' . $deleteDialogWID . '\').dialog(\'close\') '; $actions = wf_ConfirmDialogJS('#', web_delete_icon(), $this->messages->getDeleteAlert(), '', '#', self::MISC_JS_DEL_FUNC_NAME . '(\'' . self::URL_ME . '\',' . $tmpDeleteQuery . ');' . $deleteDialogCloseFunc, $deleteDialogCloseFunc, $deleteDialogWID); } if ($editButton and ! $this->ecReadOnlyAccess) { $actions .= wf_nbsp(2); $actions .= wf_jsAjaxDynamicWindowButton(self::URL_ME, array($routeActs => 'true', self::ROUTE_ACTION_EDIT => 'true', self::ROUTE_EDIT_REC_ID => $recID ), '', web_edit_icon() ); } if ($cloneButtonON and ! $this->ecReadOnlyAccess) { $actions .= wf_nbsp(2); $actions .= wf_jsAjaxDynamicWindowButton(self::URL_ME, array($routeActs => 'true', self::ROUTE_ACTION_CLONE => 'true', self::ROUTE_EDIT_REC_ID => $recID), '', web_clone_icon() ); } $actions .= $customControls; return ($actions); } /** * Simply returns JS snippet for datepicker init on dynamic modal forms * * @return string */ protected function getDatePickerModalInitJS() { $result = ' onElementInserted("body", ".' . self::MISC_CLASS_DPICKER_MODAL_INIT . '", function(element) { $(".' . self::MISC_CLASS_DPICKER_MODAL_INIT . '").datepicker({ showOn: "both", buttonImage: "skins/icon_calendar.gif", buttonImageOnly: true, dateFormat: "yy-mm-dd", showAnim: "slideDown", changeMonth: true, yearRange: "-100:+100", changeYear: true }); }); '; return($result); } /** * Ash oghum durbatulûk, ash oghum gimbatul, * Ash oghum thrakatulûk, agh burzum-ishi krimpatul. * * @param array $dataArray * @param string $dbTabName * @param string $postFrmCtrlValToChk * @param string $webFormMethod * @param bool $checkUniqueness * @param array $checkUniqArray * @param string $crudEntityName * @param array $prefillFieldsData * @param bool $createFormModality * @param bool $editFormModality * * @return mixed * * @throws Exception */ public function processCRUDs($dataArray, $dbTabName, $postFrmCtrlValToChk = '', $webFormMethod = '', $checkUniqueness = true, $checkUniqArray = array(), $crudEntityName = '', $prefillFieldsData = array(), $createFormModality = false, $editFormModality = true) { $recID = ubRouting::post(self::ROUTE_EDIT_REC_ID); $recEdit = ubRouting::checkPost(self::ROUTE_ACTION_EDIT, false); $recClone = ubRouting::checkPost(self::ROUTE_ACTION_CLONE, false); $recCreate = ubRouting::checkPost(self::ROUTE_ACTION_CREATE); $recDelete = ubRouting::checkPost(self::ROUTE_ACTION_DELETE); $dbEntity = $this->getDBEntity($dbTabName); $foundRecID = ''; $crudEntityName = empty($crudEntityName) ? 'Entity' : $crudEntityName; $entityExistError = ''; $wfmExistError = ''; if (empty($dbEntity)) { $entityExistError .= wf_nbsp(2) . wf_tag('b') . $dbTabName . wf_tag('b', true); } if (!method_exists($this, $webFormMethod)) { $wfmExistError .= $this->renderWebMsg(__('Error'), __('CRUDs processing: try to call to non-existent method') . ': ' . wf_nbsp(2) . wf_tag('b') . $webFormMethod . wf_tag('b', true), 'error'); } // todo: check uniqueness of extrcontras recs by profile_id + contract_id + addr_id // checking record uniqueness upon criteria, if needed if ($checkUniqueness and ! $recDelete) { if (empty($checkUniqArray)) { $entityExistError .= wf_nbsp(2) . wf_tag('b') . '$checkUniqArray' . wf_tag('b', true); } else { if ($recEdit) { if (!empty($recID)) { $foundRecID = $dbEntity->checkRecExists($checkUniqArray, $recID); } else { $entityExistError .= wf_nbsp(2) . wf_tag('b') . '$recID' . wf_tag('b', true); } } else { $foundRecID = $dbEntity->checkRecExists($checkUniqArray); } if (!empty($foundRecID)) { return ($this->renderWebMsg(__('Error'), __($crudEntityName) . ' ' . __('with such fields criteria') . ' ' . print_r($checkUniqArray, true) . ' ' . __('already exists with ID') . ': ' . $foundRecID, 'error')); } } } if (!empty($entityExistError)) { return($this->renderWebMsg(__('Error'), __('CRUDs processing: possible try to call to/use of non-existent method, data- or DB-entity') . ': ' . $entityExistError, 'error')); } if (!empty($recID) and ( $recEdit or $recClone)) { if (ubRouting::checkPost($postFrmCtrlValToChk)) { if ($recEdit) { $this->recordCreateEdit($dbEntity, $dataArray, $recID); } elseif ($recClone) { $this->recordCreateEdit($dbEntity, $dataArray); } } else { if (empty($wfmExistError)) { return (call_user_func_array(array($this, $webFormMethod), array($editFormModality, $recID, $recEdit, $recClone))); } else { return($wfmExistError); } } } elseif ($recCreate) { $this->recordCreateEdit($dbEntity, $dataArray); } elseif ($recDelete) { if (ubRouting::checkPost(self::ROUTE_DELETE_REC_ID)) { $delRecID = ubRouting::post(self::ROUTE_DELETE_REC_ID); $tmpUniqArray = array(); $delRecProtected = false; $protectionChkArr = array(); $protectionChkTab = ''; $protectionChkFld = ''; if (ubRouting::checkPost(self::ROUTE_PROFILE_ACTS)) { $protectionChkFld = self::DBFLD_EXTCONTRAS_PROFILE_ID; $protectionChkTab = self::TABLE_EXTCONTRAS; $protectionChkArr[] = array($protectionChkTab => $protectionChkFld); } if (ubRouting::checkPost(self::ROUTE_CONTRACT_ACTS)) { $protectionChkFld = self::DBFLD_EXTCONTRAS_CONTRACT_ID; $protectionChkTab = self::TABLE_EXTCONTRAS; $protectionChkArr[] = array($protectionChkTab => $protectionChkFld); } if (ubRouting::checkPost(self::ROUTE_ADDRESS_ACTS)) { $protectionChkFld = self::DBFLD_EXTCONTRAS_ADDRESS_ID; $protectionChkTab = self::TABLE_EXTCONTRAS; $protectionChkArr[] = array($protectionChkTab => $protectionChkFld); } if (ubRouting::checkPost(self::ROUTE_PERIOD_ACTS)) { $protectionChkFld = self::DBFLD_EXTCONTRAS_PERIOD_ID; $protectionChkTab = self::TABLE_EXTCONTRAS; $protectionChkArr[] = array($protectionChkTab => $protectionChkFld); } if (ubRouting::checkPost(self::ROUTE_CONTRAS_ACTS)) { $protectionChkFld = self::DBFLD_INVOICES_CONTRASID; $protectionChkTab = self::TABLE_ECINVOICES; $protectionChkArr[] = array($protectionChkTab => $protectionChkFld); $protectionChkFld = self::DBFLD_MONEY_PROFILEID; $protectionChkTab = self::TABLE_ECMONEY; $protectionChkArr[] = array($protectionChkTab => $protectionChkFld); } foreach ($protectionChkArr as $tmpArray) { foreach ($tmpArray as $table => $field) { $tmpUniqArray = $this->createCheckUniquenessArray($field, '=', $delRecID); $protectionChkTab = $this->getDBEntity($table); $delRecProtected = $protectionChkTab->checkRecExists($tmpUniqArray); } } if (empty($delRecProtected)) { $this->recordDelete($dbEntity, $delRecID); } else { return($this->renderWebMsg(__('Warning'), __('CRUDs processing: can\'t delete record because it\'s ID: [' . $delRecID . '] is used in: `' . $protectionChkTab->getTableName() . '` table'), 'warning')); } } } else { if (empty($wfmExistError)) { return(call_user_func_array(array($this, $webFormMethod), array($createFormModality, 0, false, false, $prefillFieldsData))); } else { return($wfmExistError); } } return (''); } /** * Renders main module controls * * @return string */ public function renderMainControls() { $inputs = ''; $inputs .= wf_Link(self::URL_ME . '&' . self::URL_EXTCONTRAS . '=true', wf_img_sized('skins/extcontrasfin.png', '', '16', '16') . ' ' . __('External counterparties list'), false, 'ubButton'); $inputs .= wf_Link(self::URL_ME . '&' . self::URL_FINOPERATIONS . '=true', wf_img_sized('skins/ukv/dollar.png') . ' ' . __('Finance operations'), false, 'ubButton'); $inputs .= wf_Link(self::URL_ME . '&' . self::URL_MISSEDPAYMENTS . '=true', wf_img_sized('skins/dollar_red.png', '', '10', '17') . ' ' . __('Overdue payments'), false, 'ubButton'); $inputs .= ($this->ecInvoicesON ? wf_Link(self::URL_ME . '&' . self::URL_INVOICES . '=true', wf_img_sized('skins/menuicons/receipt_small.png') . ' ' . __('Invoices list'), false, 'ubButton') : ''); // dictionaries forms $dictControls = wf_Link(self::URL_ME . '&' . self::URL_DICTPROFILES . '=true', wf_img_sized('skins/extcontrasprofiles.png') . ' ' . __('Counterparties profiles dictionary'), false, 'ubButton'); $dictControls .= wf_Link(self::URL_ME . '&' . self::URL_DICTCONTRACTS . '=true', wf_img_sized('skins/corporate_small.png') . ' ' . __('Contracts dictionary'), false, 'ubButton'); $dictControls .= wf_Link(self::URL_ME . '&' . self::URL_DICTADDRESS . '=true', wf_img_sized('skins/extcontrasaddr.png') . ' ' . __('Address dictionary'), false, 'ubButton'); $dictControls .= wf_Link(self::URL_ME . '&' . self::URL_DICTPERIODS . '=true', wf_img_sized('skins/clock.png') . ' ' . __('Periods dictionary'), false, 'ubButton'); $inputs .= wf_modalAuto(web_icon_extended() . ' ' . __('Dictionaries'), __('Dictionaries'), $dictControls, 'ubButton'); $inputs .= wf_jsAjaxDynamicWindowButton(self::URL_ME, array(self::ROUTE_FORCECACHE_UPD => 'true'), wf_img('skins/refresh.gif') . ' ' . __('Refresh cache data'), '', 'ubButton'); // JS helper functions for forms, modals, etc $inputs .= wf_EncloseWithJSTags(wf_JSEmptyFunc() . wf_JSElemInsertedCatcherFunc() . $this->getDatePickerModalInitJS()); return ($inputs); } /** * Returns dropdown selector control * * @param $selectorData * @param $dbFiledName * @param $ctrlName * @param $ctrlLabel * @param string $selected * @param bool $blankFirstRow * @param bool $br * @param bool $sort * @param string $ctrlID * @param string $ctrlClass * @param string $options * @param bool $labelLeftSide * @param string $labelOpts * @param array $filterData * @param string $filterDataElemID * @param string $blankFirstRowVal * @param string $blankFirstRowDispVal * * @return string */ public function renderWebSelector($selectorData, $dbFiledName, $ctrlName, $ctrlLabel, $selected = '', $blankFirstRow = false, $br = false, $sort = false, $ctrlID = '', $ctrlClass = '', $options = '', $labelLeftSide = false, $labelOpts = '', $filterData = array(), $filterDataElemID = '', $blankFirstRowVal = '0', $blankFirstRowDispVal = '----') { $result = ''; $ctrlID = (empty($ctrlID) ? wf_InputId() : $ctrlID); $tmpArray = ($blankFirstRow ? array($blankFirstRowVal => $blankFirstRowDispVal) : array()); if (!empty($selectorData)) { foreach ($selectorData as $eachID => $eachRec) { $tmpValue = ''; if (is_array($dbFiledName)) { foreach ($dbFiledName as $eachdbFieldName) { $tmpValue .= $eachRec[$eachdbFieldName] . ' '; } } else { $tmpValue = $eachRec[$dbFiledName]; } $tmpArray[$eachID] = trim($tmpValue); } } $result = wf_Selector($ctrlName, $tmpArray, $ctrlLabel, $selected, $br, $sort, $ctrlID, $ctrlClass, $options, $labelLeftSide, $labelOpts); if (!empty($filterData)) { $filterDataElemID = (empty($filterDataElemID) ? 'selector_filter_' . wf_InputId() : $filterDataElemID); $result .= wf_HiddenInput($filterDataElemID, base64_encode(json_encode($filterData)), $filterDataElemID); } return ($result); } /** * Returns modal window with some message and pre-defined DOM ID * * @param $title * @param $message * @param string $style * * @return string */ public function renderWebMsg($title, $message, $style = 'info') { $errormes = $this->messages->getStyledMessage($message, $style, 'style="margin: auto 0; padding: 10px 3px; width: 100%;"'); return(wf_modalAutoForm($title, $errormes, ubRouting::post(self::MISC_ERRFORM_ID_PARAM), '', true, 'true')); } /** * Cumulative method for creating and editing some DB records * * @param $dbEntity * @param $dataArray * * @param int $recordID */ protected function recordCreateEdit($dbEntity, $dataArray, $recordID = 0) { $dbEntity->dataArr($dataArray); //$dbEntity->setDebug(true, true); if (!empty($recordID)) { $dbEntity->where(self::DBFLD_COMMON_ID, '=', $recordID); $dbEntity->save(true, true); log_register(get_class($this) . ': EDITED record ID: ' . $recordID . ' in table `' . $dbEntity->getTableName() . '`'); } else { $dbEntity->create(); log_register(get_class($this) . ': ADDED new record to `' . $dbEntity->getTableName() . '`'); } $this->loadDataFromTableCached($dbEntity->getTableName(true), $dbEntity->getTableName(true), true); } protected function recordDelete($dbEntity, $recordID) { $dbEntity->where(self::DBFLD_COMMON_ID, '=', $recordID); $dbEntity->delete(); $this->loadDataFromTableCached($dbEntity->getTableName(true), $dbEntity->getTableName(true), true); log_register(get_class($this) . ': REMOVED record ID: ' . $recordID . ' from table `' . $dbEntity->getTableName() . '`'); } /** * Returns a profile-editor web form * * @param bool $modal * @param int $profileID * @param bool $editAction * @param bool $cloneAction * @param array $prefillFieldsData * * @return string */ public function profileWebForm($modal = true, $profileID = 0, $editAction = false, $cloneAction = false, $prefillFieldsData = array()) { $inputs = ''; $prfName = ''; $prfContact = ''; $prfEDRPO = ''; $prfEmail = ''; $modalWinID = ubRouting::post('modalWindowId'); $modalWinBodyID = ubRouting::post('modalWindowBodyId'); if ($modal) { $formClass = self::MISC_CLASS_SUBMITFORM_MODAL; $emptyCheckClass = self::MISC_CLASS_EMPTYVALCHECK_MODAL; } else { $formClass = self::MISC_CLASS_SUBMITFORM; $emptyCheckClass = self::MISC_CLASS_EMPTYVALCHECK; } if (($editAction or $cloneAction) and ! empty($this->allECProfiles[$profileID])) { $profile = $this->allECProfiles[$profileID]; $prfName = $profile[self::DBFLD_PROFILE_NAME]; $prfContact = $profile[self::DBFLD_PROFILE_CONTACT]; $prfEDRPO = $profile[self::DBFLD_PROFILE_EDRPO]; $prfEmail = $profile[self::DBFLD_PROFILE_MAIL]; } $submitCapt = ($editAction) ? __('Edit') : (($cloneAction) ? __('Clone') : __('Create')); $formCapt = $submitCapt . ' ' . __(self::MISC_FORMS_CAPTS_PROFILE_DICT); $inputs .= wf_TextInput(self::CTRL_PROFILE_NAME, __('Name') . $this->supFrmFldMark, $prfName, false, '', '', $emptyCheckClass, '', '', true); $inputs .= wf_TextInput(self::CTRL_PROFILE_CONTACT, __('Contact data'), $prfContact, false, '', '', '', '', '', true); $inputs .= wf_TextInput(self::CTRL_PROFILE_EDRPO, __('EDRPO/INN') . $this->supFrmFldMark, $prfEDRPO, false, '', '', $emptyCheckClass, '', '', true); $inputs .= wf_TextInput(self::CTRL_PROFILE_MAIL, __('E-mail'), $prfEmail, false, '', '', '', '', '', true); $inputs .= wf_SubmitClassed(true, 'ubButton', '', $submitCapt, '', $this->submitBtnDisabled); $inputs .= wf_HiddenInput(self::ROUTE_PROFILE_ACTS, 'true'); if ($editAction) { $inputs .= wf_HiddenInput(self::ROUTE_ACTION_EDIT, 'true'); $inputs .= wf_HiddenInput(self::ROUTE_EDIT_REC_ID, $profileID); } else { $inputs .= wf_HiddenInput(self::ROUTE_ACTION_CREATE, 'true'); } if ($modal and ! empty($modalWinID)) { $inputs .= wf_HiddenInput('', $modalWinID, '', self::MISC_CLASS_MWID_CTRL); } $inputs = wf_Form(self::URL_ME . '&' . self::URL_DICTPROFILES . '=true', 'POST', $inputs, 'glamour form-grid-2cols form-grid-2cols-label-right ' . $formClass); if ($modal and ! empty($modalWinID)) { $inputs = wf_modalAutoForm($formCapt, $inputs, $modalWinID, $modalWinBodyID, true); } return ($inputs); } /** * Renders JQDT for profiles dictionary * * @param string $customJSCode * @param string $markRowForID * @param string $detailsFilter * @param bool $stdJSForCRUDs * * @return string */ public function profileRenderJQDT($customJSCode = '', $markRowForID = '', $detailsFilter = '', $stdJSForCRUDs = true) { $ajaxURL = '' . self::URL_ME . '&' . self::ROUTE_PROFILE_JSON . '=true'; $columns[] = __('ID'); $columns[] = __('Profile name'); $columns[] = __('EDRPO'); $columns[] = __('Contact'); $columns[] = __('E-mail'); $columns[] = __('Actions'); $opts = ' "order": [[ 0, "desc" ]], "columnDefs": [ {"targets": [0, 2, 5], "className": "dt-center dt-head-center"}, {"targets": [5], "orderable": false}, {"targets": [5], "width": "85px"} ] '; $result = $this->getStdJQDTWithJSForCRUDs($ajaxURL, $columns, $opts, $stdJSForCRUDs, $customJSCode, $markRowForID, self::URL_ME . '&' . self::URL_DICTPROFILES . '=true&' . self::MISC_MARKROW_URL . '=' . $markRowForID, self::MISC_MARKROW_URL); return($result); } /** * Renders JSON for profile's dictionary JQDT */ public function profileRenderListJSON() { $this->loadDataFromTableCached(self::TABLE_ECPROFILES, self::TABLE_ECPROFILES); $json = new wf_JqDtHelper(); if (!empty($this->allECProfiles)) { $data = array(); foreach ($this->allECProfiles as $eachRecID) { foreach ($eachRecID as $fieldName => $fieldVal) { $data[] = $fieldVal; } $actions = $this->getStdJQDTActions($eachRecID['id'], self::ROUTE_PROFILE_ACTS, true); $data[] = $actions; $json->addRow($data); unset($data); } } $json->getJson(); } /** * Returns a contract-editor web form * * @param bool $modal * @param int $contractID * @param bool $editAction * @param bool $cloneAction * @param array $prefillFieldsData * * @return string */ public function contractWebForm($modal = true, $contractID = 0, $editAction = false, $cloneAction = false, $prefillFieldsData = array()) { $inputs = ''; $ctrctDTStart = ''; $ctrctDTEnd = ''; $ctrctContract = ''; $ctrctSubject = ''; $ctrctAutoProlong = ''; $ctrctFullSum = ''; $ctrctNotes = ''; $modalWinID = ubRouting::post('modalWindowId'); $modalWinBodyID = ubRouting::post('modalWindowBodyId'); if ($modal) { $formClass = self::MISC_CLASS_SUBMITFORM_MODAL; $emptyCheckClass = self::MISC_CLASS_EMPTYVALCHECK_MODAL; } else { $formClass = self::MISC_CLASS_SUBMITFORM; $emptyCheckClass = self::MISC_CLASS_EMPTYVALCHECK; } if (($editAction or $cloneAction) and ! empty($this->allECContracts[$contractID])) { $contract = $this->allECContracts[$contractID]; $ctrctDTStart = $contract[self::DBFLD_CTRCT_DTSTART]; $ctrctDTEnd = $contract[self::DBFLD_CTRCT_DTEND]; $ctrctContract = $contract[self::DBFLD_CTRCT_CONTRACT]; $ctrctSubject = $contract[self::DBFLD_CTRCT_SUBJECT]; $ctrctAutoProlong = ubRouting::filters($contract[self::DBFLD_CTRCT_AUTOPRLNG], 'fi', FILTER_VALIDATE_BOOLEAN); $ctrctFullSum = $contract[self::DBFLD_CTRCT_FULLSUM]; $ctrctNotes = $contract[self::DBFLD_CTRCT_NOTES]; } $submitCapt = ($editAction) ? __('Edit') : (($cloneAction) ? __('Clone') : __('Create')); $formCapt = $submitCapt . ' ' . __(self::MISC_FORMS_CAPTS_CNTRCTS_DICT); $datepickerID1 = wf_InputId(); $datepickerID2 = wf_InputId(); $ctrlsLblStyle = 'style="line-height: 2.2em"'; $inputs .= wf_tag('label', false, '', 'for="' . $datepickerID1 . '"'); $inputs .= __('Date start') . $this->supFrmFldMark; $inputs .= wf_tag('label', true); $inputs .= wf_tag('span', false); $inputs .= wf_DatePickerPreset(self::CTRL_CTRCT_DTSTART, $ctrctDTStart, true, $datepickerID1, $emptyCheckClass . ' ' . self::MISC_CLASS_DPICKER_MODAL_INIT); $inputs .= wf_tag('span', true); $inputs .= wf_tag('span', false); $inputs .= wf_tag('label', false, '', 'for="' . $datepickerID2 . '"'); $inputs .= __('Date end') . $this->supFrmFldMark; $inputs .= wf_tag('label', true); $inputs .= wf_DatePickerPreset(self::CTRL_CTRCT_DTEND, $ctrctDTEnd, true, $datepickerID2, $emptyCheckClass . ' ' . self::MISC_CLASS_DPICKER_MODAL_INIT); $inputs .= wf_nbsp(14); $inputs .= wf_CheckInput(self::CTRL_CTRCT_AUTOPRLNG, __('Autoprolong'), false, $ctrctAutoProlong, '', ''); $inputs .= wf_tag('span', true); $inputs .= wf_TextInput(self::CTRL_CTRCT_CONTRACT, __('Contract number') . $this->supFrmFldMark, $ctrctContract, false, '', '', $emptyCheckClass, '', '', true); $inputs .= wf_tag('span', false); $inputs .= wf_TextInput(self::CTRL_CTRCT_FULLSUM, __('Contract full sum'), $ctrctFullSum, false, '4', 'finance', '', '', '', true); $inputs .= wf_tag('span', true); $inputs .= wf_TextInput(self::CTRL_CTRCT_SUBJECT, __('Contract subject'), $ctrctSubject, false, '70', '', 'right-two-thirds-occupy', '', '', true); $inputs .= wf_TextInput(self::CTRL_CTRCT_NOTES, __('Contract notes'), $ctrctNotes, false, '70', '', 'right-two-thirds-occupy', '', '', true); $inputs .= wf_SubmitClassed(true, 'ubButton', '', $submitCapt, '', $this->submitBtnDisabled); $inputs .= wf_HiddenInput(self::ROUTE_CONTRACT_ACTS, 'true'); if ($editAction) { $inputs .= wf_HiddenInput(self::ROUTE_ACTION_EDIT, 'true'); $inputs .= wf_HiddenInput(self::ROUTE_EDIT_REC_ID, $contractID); } else { $inputs .= wf_HiddenInput(self::ROUTE_ACTION_CREATE, 'true'); } if ($modal and ! empty($modalWinID)) { $inputs .= wf_HiddenInput('', $modalWinID, '', self::MISC_CLASS_MWID_CTRL); } $inputs = wf_Form(self::URL_ME . '&' . self::URL_DICTCONTRACTS . '=true', 'POST', $inputs, 'glamour form-grid-3cols form-grid-3cols-label-right ' . $formClass); if ($editAction and $this->fileStorageEnabled) { $this->fileStorage->setItemid(self::URL_DICTCONTRACTS . $contractID); $inputs .= wf_tag('span', false, '', $ctrlsLblStyle); $inputs .= wf_tag('h3'); $inputs .= __('Uploaded files'); $inputs .= wf_tag('h3', true); $inputs .= $this->fileStorage->renderFilesPreview(true, '', 'ubButton', '32', '&callback=' . base64_encode(self::URL_ME . '&' . self::URL_DICTCONTRACTS . '=true'), true); $inputs .= wf_tag('span', true); } if ($modal and ! empty($modalWinID)) { $inputs = wf_modalAutoForm($formCapt, $inputs, $modalWinID, $modalWinBodyID, true); } return ($inputs); } /** * Renders JQDT for contracts dictionary * * @param string $customJSCode * @param string $markRowForID * @param string $detailsFilter * @param bool $stdJSForCRUDs * * @return string */ public function contractRenderJQDT($customJSCode = '', $markRowForID = '', $detailsFilter = '', $stdJSForCRUDs = true) { $ajaxURL = '' . self::URL_ME . '&' . self::ROUTE_CONTRACT_JSON . '=true'; $columns[] = __('ID'); $columns[] = __('Contract'); $columns[] = __('Date start'); $columns[] = __('Date end'); $columns[] = __('Contract subject'); $columns[] = __('Full sum'); $columns[] = __('Autoprolong'); $columns[] = __('Notes'); $columns[] = __('Uploaded files'); $columns[] = __('Actions'); $opts = ' "order": [[ 1, "desc" ]], "columnDefs": [ {"targets": [4, 7], "className": "dt-left dt-head-center"}, {"targets": ["_all"], "className": "dt-center dt-head-center"}, {"targets": [8, 9], "orderable": false}, {"targets": [8, 9], "width": "85px"} ] '; $result = $this->getStdJQDTWithJSForCRUDs($ajaxURL, $columns, $opts, $stdJSForCRUDs, $customJSCode, $markRowForID, self::URL_ME . '&' . self::URL_DICTCONTRACTS . '=true&' . self::MISC_MARKROW_URL . '=' . $markRowForID, self::MISC_MARKROW_URL); return($result); } /** * Renders JSON for contract's dictionary JQDT */ public function contractRenderListJSON() { $this->loadDataFromTableCached(self::TABLE_ECCONTRACTS, self::TABLE_ECCONTRACTS); $json = new wf_JqDtHelper(); if (!empty($this->allECContracts)) { $data = array(); foreach ($this->allECContracts as $eachRecID) { foreach ($eachRecID as $fieldName => $fieldVal) { if ($fieldName == self::DBFLD_CTRCT_AUTOPRLNG) { $data[] = (empty($fieldVal) ? web_red_led() : web_green_led()); } else { $data[] = $fieldVal; } } if ($this->fileStorage) { $this->fileStorage->setItemid(self::URL_DICTCONTRACTS . $eachRecID['id']); $data[] = $this->fileStorage->renderFilesPreview(true, '', 'ubButton', '32', '&callback=' . base64_encode(self::URL_ME . '&' . self::URL_DICTCONTRACTS . '=true'), true); } else { $data[] = __('Filestorage') . ' - ' . __('Disabled'); } $actions = $this->getStdJQDTActions($eachRecID['id'], self::ROUTE_CONTRACT_ACTS, true); $data[] = $actions; $json->addRow($data); unset($data); } } $json->getJson(); } /** * Returns a address-editor web form * * @param bool $modal * @param int $addressID * @param bool $editAction * @param bool $cloneAction * @param array $prefillFieldsData * * @return string */ public function addressWebForm($modal = true, $addressID = 0, $editAction = false, $cloneAction = false, $prefillFieldsData = array()) { $inputs = ''; $addrAddress = ''; $addrSum = ''; $addrCtrctNotes = ''; $addrNotes = ''; $modalWinID = ubRouting::post('modalWindowId'); $modalWinBodyID = ubRouting::post('modalWindowBodyId'); if ($modal) { $formClass = self::MISC_CLASS_SUBMITFORM_MODAL; $emptyCheckClass = self::MISC_CLASS_EMPTYVALCHECK_MODAL; } else { $formClass = self::MISC_CLASS_SUBMITFORM; $emptyCheckClass = self::MISC_CLASS_EMPTYVALCHECK; } if (($editAction or $cloneAction) and ! empty($this->allECAddresses[$addressID])) { $address = $this->allECAddresses[$addressID]; $addrAddress = $address[self::DBFLD_ADDRESS_ADDR]; $addrSum = $address[self::DBFLD_ADDRESS_SUM]; $addrCtrctNotes = $address[self::DBFLD_ADDRESS_CTNOTES]; $addrNotes = $address[self::DBFLD_ADDRESS_NOTES]; } $submitCapt = ($editAction) ? __('Edit') : (($cloneAction) ? __('Clone') : __('Create')); $formCapt = $submitCapt . ' ' . __(self::MISC_FORMS_CAPTS_ADDRESS_DICT); $inputs .= wf_TextInput(self::CTRL_ADDRESS_ADDR, __('Address') . $this->supFrmFldMark, $addrAddress, false, '', '', $emptyCheckClass, '', '', true); $inputs .= wf_TextInput(self::CTRL_ADDRESS_SUM, __('Sum'), $addrSum, false, '', '', '', '', '', true); $inputs .= wf_TextInput(self::CTRL_ADDRESS_CTNOTES, __('Contract notes'), $addrCtrctNotes, false, '', '', $emptyCheckClass, '', '', true); $inputs .= wf_TextInput(self::CTRL_ADDRESS_NOTES, __('Notes'), $addrNotes, false, '', '', '', '', '', true); $inputs .= wf_SubmitClassed(true, 'ubButton', '', $submitCapt, '', $this->submitBtnDisabled); $inputs .= wf_HiddenInput(self::ROUTE_ADDRESS_ACTS, 'true'); if ($editAction) { $inputs .= wf_HiddenInput(self::ROUTE_ACTION_EDIT, 'true'); $inputs .= wf_HiddenInput(self::ROUTE_EDIT_REC_ID, $addressID); } else { $inputs .= wf_HiddenInput(self::ROUTE_ACTION_CREATE, 'true'); } if ($modal and ! empty($modalWinID)) { $inputs .= wf_HiddenInput('', $modalWinID, '', self::MISC_CLASS_MWID_CTRL); } $inputs = wf_Form(self::URL_ME . '&' . self::URL_DICTADDRESS . '=true', 'POST', $inputs, 'glamour form-grid-2cols form-grid-2cols-label-right ' . $formClass); if ($modal and ! empty($modalWinID)) { $inputs = wf_modalAutoForm($formCapt, $inputs, $modalWinID, $modalWinBodyID, true); } return ($inputs); } /** * Renders JQDT for address dictionary * * @param string $customJSCode * @param string $markRowForID * @param string $detailsFilter * @param bool $stdJSForCRUDs * * @return string */ public function addressRenderJQDT($customJSCode = '', $markRowForID = '', $detailsFilter = '', $stdJSForCRUDs = true) { $ajaxURL = '' . self::URL_ME . '&' . self::ROUTE_ADDRESS_JSON . '=true'; $columns[] = __('ID'); $columns[] = __('Address'); $columns[] = __('Contract sum'); $columns[] = __('Contract notes'); $columns[] = __('Address notes'); $columns[] = __('Actions'); $opts = ' "order": [[ 0, "desc" ]], "columnDefs": [ {"targets": [0, 2, 5], "className": "dt-center dt-head-center"}, {"targets": [5], "orderable": false}, {"targets": [5], "width": "85px"} ] '; $result = $this->getStdJQDTWithJSForCRUDs($ajaxURL, $columns, $opts, $stdJSForCRUDs, $customJSCode, $markRowForID, self::URL_ME . '&' . self::URL_DICTADDRESS . '=true&' . self::MISC_MARKROW_URL . '=' . $markRowForID, self::MISC_MARKROW_URL); return($result); } /** * Renders JSON for address's dictionary JQDT */ public function addressRenderListJSON() { $this->loadDataFromTableCached(self::TABLE_ECADDRESS, self::TABLE_ECADDRESS); $json = new wf_JqDtHelper(); if (!empty($this->allECAddresses)) { $data = array(); foreach ($this->allECAddresses as $eachRecID) { foreach ($eachRecID as $fieldName => $fieldVal) { $data[] = $fieldVal; } $actions = $this->getStdJQDTActions($eachRecID['id'], self::ROUTE_ADDRESS_ACTS, true); $data[] = $actions; $json->addRow($data); unset($data); } } $json->getJson(); } public function periodWebForm($modal = true, $periodID = 0, $editAction = false) { $inputs = ''; $prdName = ''; $modalWinID = ubRouting::post('modalWindowId'); $modalWinBodyID = ubRouting::post('modalWindowBodyId'); if ($modal) { $formClass = self::MISC_CLASS_SUBMITFORM_MODAL; $emptyCheckClass = self::MISC_CLASS_EMPTYVALCHECK_MODAL; } else { $formClass = self::MISC_CLASS_SUBMITFORM; $emptyCheckClass = self::MISC_CLASS_EMPTYVALCHECK; } if ($editAction and ! empty($this->allECPeriods[$periodID])) { $period = $this->allECPeriods[$periodID]; $prdName = $period[self::DBFLD_PERIOD_NAME]; } $submitCapt = ($editAction) ? __('Edit') : __('Create'); $formCapt = $submitCapt . ' ' . __(self::MISC_FORMS_CAPTS_PERIODS_DICT); $ctrlsLblStyle = 'style="line-height: 3.4em; margin-right: 0.5em;"'; $inputs .= wf_TextInput(self::CTRL_PERIOD_NAME, __('Name') . $this->supFrmFldMark, $prdName, true, '', '', $emptyCheckClass, '', '', true, $ctrlsLblStyle); $inputs .= wf_SubmitClassed(true, 'ubButton', '', $submitCapt, '', 'style="width: 100%"; ' . $this->submitBtnDisabled); $inputs .= wf_HiddenInput(self::ROUTE_PERIOD_ACTS, 'true'); if ($editAction) { $inputs .= wf_HiddenInput(self::ROUTE_ACTION_EDIT, 'true'); $inputs .= wf_HiddenInput(self::ROUTE_EDIT_REC_ID, $periodID); } else { $inputs .= wf_HiddenInput(self::ROUTE_ACTION_CREATE, 'true'); } if ($modal and ! empty($modalWinID)) { $inputs .= wf_HiddenInput('', $modalWinID, '', self::MISC_CLASS_MWID_CTRL); } $inputs = wf_Form(self::URL_ME . '&' . self::URL_DICTPERIODS . '=true', 'POST', $inputs, 'glamour ' . $formClass); if ($modal and ! empty($modalWinID)) { $inputs = wf_modalAutoForm($formCapt, $inputs, $modalWinID, $modalWinBodyID, true); } return ($inputs); } /** * Renders JQDT for period dictionary * * @param string $customJSCode * @param string $markRowForID * @param string $detailsFilter * @param bool $stdJSForCRUDs * * @return string */ public function periodRenderJQDT($customJSCode = '', $markRowForID = '', $detailsFilter = '', $stdJSForCRUDs = true) { $ajaxURL = '' . self::URL_ME . '&' . self::ROUTE_PERIOD_JSON . '=true'; $columns[] = __('ID'); $columns[] = __('Period name'); $columns[] = __('Actions'); $opts = ' "order": [[ 0, "desc" ]], "columnDefs": [ {"targets": ["_all"], "className": "dt-center dt-head-center"}, {"targets": [2], "orderable": false}, {"targets": [2], "width": "85px"} ] '; $result = $result = $this->getStdJQDTWithJSForCRUDs($ajaxURL, $columns, $opts, $stdJSForCRUDs, $customJSCode, $markRowForID, self::URL_ME . '&' . self::URL_DICTPERIODS . '=true&' . self::MISC_MARKROW_URL . '=' . $markRowForID, self::MISC_MARKROW_URL); return($result); } /** * Renders JSON for period's dictionary JQDT */ public function periodRenderListJSON() { $this->loadDataFromTableCached(self::TABLE_ECPERIODS, self::TABLE_ECPERIODS); $json = new wf_JqDtHelper(); if (!empty($this->allECPeriods)) { $data = array(); foreach ($this->allECPeriods as $eachRecID) { foreach ($eachRecID as $fieldName => $fieldVal) { $data[] = $fieldVal; } $actions = $this->getStdJQDTActions($eachRecID['id'], self::ROUTE_PERIOD_ACTS); $data[] = $actions; $json->addRow($data); unset($data); } } $json->getJson(); } /** * Returns a filter web form for invoices main form * * @return string */ public function invoiceFilterWebForm() { $ajaxURLStr = self::URL_ME . '&' . self::ROUTE_INVOICES_JSON . '=true'; $formID = 'Form_' . wf_InputId(); $jqdtID = 'jqdt_' . md5($ajaxURLStr); $inputs = wf_tag('h3', false); $inputs .= __('Filter by:'); $inputs .= wf_tag('h3', true); $rows = wf_DatesTimesRangeFilter(true, true, false, false, true, false, ubRouting::post(self::MISC_WEBFILTER_DATE_START), ubRouting::post(self::MISC_WEBFILTER_DATE_END), self::MISC_WEBFILTER_DATE_START, self::MISC_WEBFILTER_DATE_END ); $inputs .= wf_TableBody($rows, 'auto'); $inputs .= wf_SubmitClassed(true, 'ubButton', '', __('Show'), '', 'style="width: 100%"'); $inputs = wf_Form($ajaxURLStr, 'POST', $inputs, 'glamour form-grid-3r-1c', '', $formID, '', 'style="margin-top: 110px;"'); $inputs .= wf_EncloseWithJSTags(wf_jsAjaxFilterFormSubmit($ajaxURLStr, $formID, $jqdtID)); return ($inputs); } /** * Returns an invoice-editor web form * * @param bool $modal * @param int $invoiceID * @param bool $editAction * @param bool $cloneAction * @param array $prefillFieldsData * * @return string */ public function invoiceWebForm($modal = true, $invoiceID = 0, $editAction = false, $cloneAction = false, $prefillFieldsData = array()) { $inputs = ''; $invoContrasID = 0; $invoInternalNum = ''; $invoNumber = ''; $invoDate = ''; $invoSum = ''; $invoSumVAT = ''; $invoNotes = ''; $invoIncoming = ''; $invoOutgoing = ''; $modalWinID = ubRouting::post('modalWindowId'); $modalWinBodyID = ubRouting::post('modalWindowBodyId'); if ($modal) { $formClass = self::MISC_CLASS_SUBMITFORM_MODAL; $emptyCheckClass = self::MISC_CLASS_EMPTYVALCHECK_MODAL; } else { $formClass = self::MISC_CLASS_SUBMITFORM; $emptyCheckClass = self::MISC_CLASS_EMPTYVALCHECK; } if (($editAction or $cloneAction) and ! empty($this->allECInvoices[$invoiceID])) { $invoice = $this->allECInvoices[$invoiceID]; $invoContrasID = $invoice[self::DBFLD_INVOICES_CONTRASID]; $invoInternalNum = $invoice[self::DBFLD_INVOICES_INTERNAL_NUM]; $invoNumber = $invoice[self::DBFLD_INVOICES_INVOICE_NUM]; $invoDate = $invoice[self::DBFLD_INVOICES_DATE]; $invoSum = $invoice[self::DBFLD_INVOICES_SUM]; $invoSumVAT = $invoice[self::DBFLD_INVOICES_SUM_VAT]; $invoNotes = $invoice[self::DBFLD_INVOICES_NOTES]; $invoIncoming = ubRouting::filters($invoice[self::DBFLD_INVOICES_INCOMING], 'fi', FILTER_VALIDATE_BOOLEAN); $invoOutgoing = ubRouting::filters($invoice[self::DBFLD_INVOICES_OUTGOING], 'fi', FILTER_VALIDATE_BOOLEAN); } $submitCapt = ($editAction) ? __('Edit') : (($cloneAction) ? __('Clone') : __('Create')); $formCapt = $submitCapt . ' ' . __(self::MISC_FORMS_CAPTS_INVOICES_LIST); $ctrlsLblStyle = 'style="line-height: 2.2em"'; $datepickerID = wf_InputId(); $inputs .= wf_TextInput(self::CTRL_INVOICES_INVOICE_NUM, __('Invoice number') . $this->supFrmFldMark, $invoNumber, false, '', '', $emptyCheckClass, '', '', true); $inputs .= wf_tag('span', false); $inputs .= wf_TextInput(self::CTRL_INVOICES_INTERNAL_NUM, __('Invoice internal number'), $invoInternalNum, false, '', '', '', '', '', true); $inputs .= wf_tag('span', true); $inputs .= wf_tag('label', false, '', 'for="' . $datepickerID . '"'); $inputs .= __('Invoice date') . $this->supFrmFldMark; $inputs .= wf_tag('label', true); $inputs .= wf_tag('span', false); $inputs .= wf_DatePickerPreset(self::CTRL_INVOICES_DATE, $invoDate, true, $datepickerID, $emptyCheckClass . ' ' . self::MISC_CLASS_DPICKER_MODAL_INIT); $inputs .= wf_tag('span', true); $inputs .= wf_tag('span', false); $inputs .= wf_TextInput(self::CTRL_INVOICES_SUM, __('Invoice sum') . $this->supFrmFldMark, $invoSum, false, '4', 'finance', $emptyCheckClass, '', '', true); $inputs .= wf_nbsp(6); $inputs .= wf_TextInput(self::CTRL_INVOICES_SUM_VAT, __('Invoice VAT sum'), $invoSumVAT, false, '4', 'finance', '', '', '', true); $inputs .= wf_tag('span', true); $inputs .= $this->renderWebSelector($this->allExtContrasExten, array(self::TABLE_ECPROFILES . self::DBFLD_PROFILE_EDRPO, self::TABLE_ECPROFILES . self::DBFLD_PROFILE_NAME, self::TABLE_ECPROFILES . self::DBFLD_PROFILE_CONTACT ), self::CTRL_INVOICES_CONTRASID, __('Counterparty'), $invoContrasID, true, false, true, '', 'right-two-thirds-occupy', '', true); $inputs .= wf_TextInput(self::CTRL_INVOICES_NOTES, __('Invoice notes'), $invoNotes, false, '70', '', 'right-two-thirds-occupy', '', '', true); $inputs .= wf_tag('span', false, 'glamour full-width-occupy', 'style="text-align: center; width: 97%;"'); $inputs .= wf_RadioInput(self::CTRL_INVOICES_IN_OUT, __('Incoming invoice'), 'incoming', false, $invoIncoming); $inputs .= wf_nbsp(8); $inputs .= wf_RadioInput(self::CTRL_INVOICES_IN_OUT, __('Outgoing invoice'), 'outgoing', false, $invoOutgoing); $inputs .= wf_tag('span', true); $inputs .= wf_SubmitClassed(true, 'ubButton', '', $submitCapt, '', $this->submitBtnDisabled); $inputs .= wf_HiddenInput(self::ROUTE_INVOICES_ACTS, 'true'); if ($editAction) { $inputs .= wf_HiddenInput(self::ROUTE_ACTION_EDIT, 'true'); $inputs .= wf_HiddenInput(self::ROUTE_EDIT_REC_ID, $invoiceID); } else { $inputs .= wf_HiddenInput(self::ROUTE_ACTION_CREATE, 'true'); } if ($modal and ! empty($modalWinID)) { $inputs .= wf_HiddenInput('', $modalWinID, '', self::MISC_CLASS_MWID_CTRL); } $inputs = wf_Form(self::URL_ME . '&' . self::URL_INVOICES . '=true', 'POST', $inputs, 'glamour form-grid-3cols form-grid-3cols-label-right ' . $formClass); if ($editAction and $this->fileStorageEnabled) { $this->fileStorage->setItemid(self::URL_INVOICES . $invoiceID); $inputs .= wf_tag('span', false, '', $ctrlsLblStyle); $inputs .= wf_tag('h3'); $inputs .= __('Uploaded files'); $inputs .= wf_tag('h3', true); $inputs .= $this->fileStorage->renderFilesPreview(true, '', 'ubButton', '32', '&callback=' . base64_encode(self::URL_ME . '&' . self::URL_INVOICES . '=true'), true); $inputs .= wf_tag('span', true); } if ($modal and ! empty($modalWinID)) { $inputs = wf_modalAutoForm($formCapt, $inputs, $modalWinID, $modalWinBodyID, true); } return ($inputs); } /** * Renders JQDT for invoices list * * @param string $customJSCode * @param string $markRowForID * @param string $detailsFilter * @param bool $stdJSForCRUDs * * @return string */ public function invoiceRenderJQDT($customJSCode = '', $markRowForID = '', $detailsFilter = '', $stdJSForCRUDs = true) { $ajaxURL = '' . self::URL_ME . '&' . self::ROUTE_INVOICES_JSON . '=true'; $columns[] = __('ID'); $columns[] = __('Counterparty'); $columns[] = __('Internal number'); $columns[] = __('Invoice number'); $columns[] = __('Invoice date'); $columns[] = __('Sum total'); $columns[] = __('Sum VAT'); $columns[] = __('Notes'); $columns[] = __('Ingoing'); $columns[] = __('Outgoing'); $columns[] = __('Uploaded files'); $columns[] = __('Actions'); $opts = ' "order": [[ 0, "desc" ]], "columnDefs": [ {"targets": [1, 7], "className": "dt-left dt-head-center"}, {"targets": ["_all"], "className": "dt-center dt-head-center"}, {"targets": [10, 11], "orderable": false}, {"targets": [10, 11], "width": "85px"} ] '; $result = $this->getStdJQDTWithJSForCRUDs($ajaxURL, $columns, $opts, $stdJSForCRUDs, $customJSCode, $markRowForID, self::URL_ME . '&' . self::URL_INVOICES . '=true&' . self::MISC_MARKROW_URL . '=' . $markRowForID, self::MISC_MARKROW_URL); return($result); } /** * Renders JSON for invoices JQDT * * @param string $whereRaw */ public function invoiceRenderListJSON($whereRaw = '') { if (!empty($whereRaw)) { $this->dbECInvoices->whereRaw($whereRaw); } $this->loadDataFromTableCached(self::TABLE_ECINVOICES, self::TABLE_ECINVOICES, !empty($whereRaw), true, '', '', !empty($whereRaw)); $json = new wf_JqDtHelper(); if (!empty($this->allECInvoices)) { $data = array(); foreach ($this->allECInvoices as $eachRecID) { foreach ($eachRecID as $fieldName => $fieldVal) { if ($fieldName == self::DBFLD_INVOICES_CONTRASID) { $data[] = (empty($this->allExtContrasExten[$fieldVal]) ? '' : $this->allExtContrasExten[$fieldVal][self::TABLE_ECPROFILES . self::DBFLD_PROFILE_EDRPO] . ' ' . $this->allExtContrasExten[$fieldVal][self::TABLE_ECPROFILES . self::DBFLD_PROFILE_NAME] ); } elseif ($fieldName == self::DBFLD_INVOICES_INCOMING or $fieldName == self::DBFLD_INVOICES_OUTGOING) { $data[] = (empty($fieldVal) ? web_red_led() : web_green_led()); } else { $data[] = $fieldVal; } } $this->fileStorage->setItemid(self::URL_INVOICES . $eachRecID['id']); $data[] = $this->fileStorage->renderFilesPreview(true, '', 'ubButton', '32', '&callback=' . base64_encode(self::URL_ME . '&' . self::URL_INVOICES . '=true'), true); $actions = $this->getStdJQDTActions($eachRecID['id'], self::ROUTE_INVOICES_ACTS, true); $data[] = $actions; $json->addRow($data); unset($data); } } $json->getJson(); } /** * Returns a filter web form for extcontras main form * * @return string */ public function extcontrasFilterWebForm() { $ajaxURLStr = self::URL_ME . '&' . self::ROUTE_CONTRAS_JSON . '=true'; $formID = 'Form_' . wf_InputId(); $jqdtID = 'jqdt_' . md5($ajaxURLStr); $inputs = wf_tag('h3', false); $inputs .= __('Filter by') . ':'; $inputs .= wf_tag('h3', true); $cells = wf_DatesTimesRangeFilter(true, true, false, false, true, false, ubRouting::post(self::MISC_WEBFILTER_DATE_START), ubRouting::post(self::MISC_WEBFILTER_DATE_END), self::MISC_WEBFILTER_DATE_START, self::MISC_WEBFILTER_DATE_END ); $cells .= wf_TableCell(wf_nbsp(2)); $cells .= wf_TableCell(__('Payday') . ':'); $cells .= wf_TableCell(wf_TextInput(self::MISC_WEBFILTER_PAYDAY, '', ubRouting::post(self::MISC_WEBFILTER_PAYDAY), true, 4, 'digits')); $rows = wf_TableRow($cells); $inputs .= wf_TableBody($rows, 'auto'); $inputs .= wf_SubmitClassed(true, 'ubButton', '', __('Show'), '', 'style="width: 100%"'); $inputs = wf_Form($ajaxURLStr, 'POST', $inputs, 'glamour form-grid-3r-1c', '', $formID, '', 'style="margin-top: 105px;"'); $inputs .= wf_EncloseWithJSTags(wf_jsAjaxFilterFormSubmit($ajaxURLStr, $formID, $jqdtID)); return ($inputs); } /** * Returns a filter web form for extcontras main form * * @param string $ajaxURLStr * @param string $jqdtID * @param bool $includePayDayCtrl * * @return string */ public function extcontrasFilterWebFormInline($ajaxURLStr, $jqdtID, $includePayDayCtrl = true) { $formID = 'Form_' . wf_InputId(); $inputs = ''; $style = 'style="font-family: Helvetica, Arial, Verdana, sans-serif; font-size: 12px;"'; $caption = wf_tag('span') . __('Filter by') . ':' . wf_tag('span', true); $inputs.= wf_tag('span', false, '', $style); $inputs.= wf_DatesTimesRangeFilter(false, false, false, false, true, false, ubRouting::post(self::MISC_WEBFILTER_DATE_START), ubRouting::post(self::MISC_WEBFILTER_DATE_END), self::MISC_WEBFILTER_DATE_START, self::MISC_WEBFILTER_DATE_END ); $inputs.= wf_tag('span', true); if ($includePayDayCtrl) { $inputs .= wf_tag('span', false, '', $style); $inputs .= __('Payday') . ':' . wf_nbsp(2); $inputs .= wf_TextInput(self::MISC_WEBFILTER_PAYDAY, '', ubRouting::post(self::MISC_WEBFILTER_PAYDAY), false, 4, 'digits'); $inputs .= wf_tag('span', true); } $inputs.= wf_SubmitClassed(true, 'ubButtonInline', '', __('Show'), '', ''); $inputs = wf_Form($ajaxURLStr,'POST', $caption . $inputs, 'glamour form-grid-5cols-inline', '', $formID, '', ''); $inputs.= wf_EncloseWithJSTags(wf_jsAjaxFilterFormSubmit($ajaxURLStr, $formID, $jqdtID)); return ($inputs); } /** * Returns a external counterparty editor web form * * @param bool $modal * @param int $extContrasID * @param bool $editAction * @param bool $cloneAction * @param array $prefillFieldsData * * @return string */ public function extcontrasWebForm($modal = true, $extContrasID = 0, $editAction = false, $cloneAction = false, $prefillFieldsData = array()) { $inputs = ''; $contrasProfileID = 1; $contrasContractID = ''; $contrasAddressID = ''; $contrasPeriodID = ''; $contrasPayDay = ''; $modalWinID = ubRouting::post('modalWindowId'); $modalWinBodyID = ubRouting::post('modalWindowBodyId'); if ($modal) { $formClass = self::MISC_CLASS_SUBMITFORM_MODAL; $emptyCheckClass = self::MISC_CLASS_EMPTYVALCHECK_MODAL; } else { $formClass = self::MISC_CLASS_SUBMITFORM; $emptyCheckClass = self::MISC_CLASS_EMPTYVALCHECK; } if (($editAction or $cloneAction) and ! empty($this->allExtContrasExten[$extContrasID])) { $extContra = $this->allExtContrasExten[$extContrasID]; $contrasProfileID = $extContra[self::TABLE_EXTCONTRAS . self::DBFLD_EXTCONTRAS_PROFILE_ID]; $contrasContractID = $extContra[self::TABLE_EXTCONTRAS . self::DBFLD_EXTCONTRAS_CONTRACT_ID]; $contrasAddressID = $extContra[self::TABLE_EXTCONTRAS . self::DBFLD_EXTCONTRAS_ADDRESS_ID]; $contrasPeriodID = $extContra[self::TABLE_EXTCONTRAS . self::DBFLD_EXTCONTRAS_PERIOD_ID]; $contrasPayDay = $extContra[self::TABLE_EXTCONTRAS . self::DBFLD_EXTCONTRAS_PAYDAY]; } $ecProfilesWebSelID = ($modal ? 'Modal' : '') . self::MISC_WEBSEL_PROFILES; $ecContractsWebSelID = ($modal ? 'Modal' : '') . self::MISC_WEBSEL_CONTRACTS; $ecAddressWebSelID = ($modal ? 'Modal' : '') . self::MISC_WEBSEL_ADDRESS; $contractsFilterDataID = ($modal ? 'Modal' : '') . self::MISC_WEBSEL_FILTDATA_CONTRACTS; $addressFilterDataID = ($modal ? 'Modal' : '') . self::MISC_WEBSEL_FILTDATA_ADDRESS; $editDBValProfileID = self::MISC_WEBSEL_DBVAL_PROFILE_ID; $editDBValContractID = self::MISC_WEBSEL_DBVAL_CONTRACTS_ID; $editDBValAddressID = self::MISC_WEBSEL_DBVAL_ADDRESS_ID; $submitCapt = ($editAction) ? __('Edit') : (($cloneAction) ? __('Clone') : __('Create')); $formCapt = $submitCapt . ' ' . __(self::MISC_FORMS_CAPTS_EXTCONTRAS); $inputs .= $this->renderWebSelector($this->allECProfiles, array(self::DBFLD_PROFILE_NAME, self::DBFLD_PROFILE_CONTACT), self::CTRL_EXTCONTRAS_PROFILE_ID, __('Counterparty profile') . $this->supFrmFldMark, $contrasProfileID, false, false, true, '', '', '', true); $inputs .= $this->renderWebSelector($this->allECContracts, array(self::DBFLD_CTRCT_CONTRACT, self::DBFLD_CTRCT_SUBJECT, self::DBFLD_CTRCT_FULLSUM), self::CTRL_EXTCONTRAS_CONTRACT_ID, __('Contract'), $contrasContractID, true, false, true, '', '', '', true); $inputs .= $this->renderWebSelector($this->allECAddresses, array(self::DBFLD_ADDRESS_ADDR, self::DBFLD_ADDRESS_SUM), self::CTRL_EXTCONTRAS_ADDRESS_ID, __('Address'), $contrasAddressID, true, false, true, '', '', '', true); $inputs .= $this->renderWebSelector($this->allECPeriods, array(self::DBFLD_PERIOD_NAME), self::CTRL_EXTCONTRAS_PERIOD_ID, __('Period') . $this->supFrmFldMark, $contrasPeriodID, false, false, true, '', '', '', true); $inputs .= wf_TextInput(self::CTRL_EXTCONTRAS_PAYDAY, __('Payday') . $this->supFrmFldMark, $contrasPayDay, false, '4', 'digits', $emptyCheckClass, '', '', true); $inputs .= wf_SubmitClassed(true, 'ubButton', '', $submitCapt, '', $this->submitBtnDisabled); $inputs .= wf_HiddenInput(self::ROUTE_CONTRAS_ACTS, 'true'); if ($editAction) { $inputs .= wf_HiddenInput(self::ROUTE_ACTION_EDIT, 'true'); $inputs .= wf_HiddenInput(self::ROUTE_EDIT_REC_ID, $extContrasID); } else { $inputs .= wf_HiddenInput(self::ROUTE_ACTION_CREATE, 'true'); } if ($modal and ! empty($modalWinID)) { $inputs .= wf_HiddenInput('', $modalWinID, '', self::MISC_CLASS_MWID_CTRL); } // for dynamic finops modal from websel filtering if (!$modal) { $tmpWebSelJS = wf_jsWebSelectorFilter(); $tmpWebSelJS .= ' $(function() { onElementInserted("body", "#Modal' . $ecProfilesWebSelID . '", function(element) { $("#Modal' . $ecProfilesWebSelID . '").on("click change", function(evt) { filterWebDropdown($(this).val(), $(\'#Modal' . $contractsFilterDataID . '\').val(), \'Modal' . $ecContractsWebSelID . '\', true); }); //console.log($("#Modal' . $ecProfilesWebSelID . '").val()); //console.log(empty($("#' . $editDBValProfileID . '").val())); let tmpDBValue = (empty($("#' . $editDBValProfileID . '").val()) ? "0" : $("#' . $editDBValProfileID . '").val()); $("#Modal' . $ecProfilesWebSelID . '").val(tmpDBValue).change(); }); onElementInserted("body", "#Modal' . $ecContractsWebSelID . '", function(element) { $("#Modal' . $ecContractsWebSelID . '").on("click change", function(evt) { filterWebDropdown($(this).val(), $(\'#Modal' . $addressFilterDataID . '\').val(), \'Modal' . $ecAddressWebSelID . '\', true); }); //console.log($("#Modal' . $ecContractsWebSelID . '").val()); let tmpDBValue = (empty($("#' . $editDBValContractID . '").val()) ? "0" : $("#' . $editDBValContractID . '").val()); $("#Modal' . $ecContractsWebSelID . '").val(tmpDBValue).change(); //console.log($("#Modal' . $ecAddressWebSelID . '").val()); tmpDBValue = (empty($("#' . $editDBValAddressID . '").val()) ? "0" : $("#' . $editDBValAddressID . '").val()) ; $("#Modal' . $ecAddressWebSelID . '").val(tmpDBValue).change(); }); }); '; $tmpWebSelJS = wf_EncloseWithJSTags($tmpWebSelJS); } else { $tmpWebSelJS = ''; } $inputs .= $tmpWebSelJS; $inputs = wf_Form(self::URL_ME . '&' . self::URL_EXTCONTRAS . '=true', 'POST', $inputs, 'glamour form-grid-2cols form-grid-2cols-label-right ' . $formClass); if ($modal and ! empty($modalWinID)) { $inputs = wf_modalAutoForm($formCapt, $inputs, $modalWinID, $modalWinBodyID, true); } return ($inputs); } /** * Renders main top-level JQDT for external counterparty list * * @param string $customJSCode * @param string $markRowForID * @param string $detailsFilter * @param bool $stdJSForCRUDs * * @return string */ public function extcontrasRenderMainJQDT($customJSCode = '', $markRowForID = '', $detailsFilter = '', $stdJSForCRUDs = true) { $ajaxURL = '' . self::URL_ME . '&' . self::ROUTE_CONTRAS_JSON . '=true'; $ajaxURLDetails = '' . self::URL_ME . '&' . self::ROUTE_2LVL_CNTRCTS_DETAIL . '=true'; $columns[] = ''; $columns[] = __('ID'); $columns[] = __('EDRPO'); $columns[] = __('Counterparty'); $columns[] = __('Contact'); $columns[] = __('E-mail'); $columns[] = __('Rec fore color'); $columns[] = __('Rec back color'); $columns[] = __('Filter for details'); $this->getTableGridColorOpts(); $opts = ' "columnDefs": [ {"targets": [0], "className": "details-control"}, {"targets": [0], "orderable": false}, {"targets": [0], "data": null}, {"targets": [0], "defaultContent": ""}, {"targets": [6, 7, 8], "visible": false}, {"targets": ["_all"], "className": "dt-center dt-head-center"} ], "order": [[ 1, "desc" ]], "rowCallback": function(row, data, index) { if ( data[6] != "" ) { $(\'td\', row).css(\'color\', data[6]); } if ( data[7] != "" ) { $(\'td\', row).css(\'background-color\', data[7]); } } '; $result = $this->getStdJQDTWithJSForCRUDs($ajaxURL, $columns, $opts, $stdJSForCRUDs, $customJSCode, $markRowForID, self::URL_ME . '&' . self::URL_EXTCONTRAS . '=true&' . self::MISC_MARKROW_URL . '=' . $markRowForID, self::MISC_MARKROW_URL, false, '', $this->currencyStr, true, $ajaxURLDetails, 8); return($result); } /** * Renders JSON for external counterparty JQDT * * @param string $whereRaw * */ public function extcontrasRenderListJSON($whereRaw = '') { $this->loadDataFromTableCached(self::TABLE_ECPROFILES, self::TABLE_ECPROFILES, !empty($whereRaw), true,'', '', !empty($whereRaw)); $json = new wf_JqDtHelper(); if (!empty($this->allECProfiles)) { //$this->dbExtContras->setDebug(true, true); /* if (!empty($whereRaw)) { $this->dbExtContras->whereRaw($whereRaw); }*/ $data = array(); $tmpExtContrasRecs = $this->loadDataFromTableCached(self::TABLE_EXTCONTRAS, self::TABLE_EXTCONTRAS, !empty($whereRaw)); foreach ($this->allECProfiles as $eachRecID) { $profileRecID = $eachRecID[self::DBFLD_COMMON_ID]; $recForeColor = ''; $recBackColor = ''; if (!empty($tmpExtContrasRecs)) { foreach ($tmpExtContrasRecs as $eachID => $eachData) { if ($eachData[self::DBFLD_EXTCONTRAS_PROFILE_ID] == $profileRecID) { // $eachID === $eachData[self::DBFLD_COMMON_ID] $hasPaymentsCurMonth = $this->checkCurMonthPaymExists($eachData[self::DBFLD_COMMON_ID]); if (!empty($hasPaymentsCurMonth)) { $recForeColor = $this->payedThisMonthFRGND; $recBackColor = $this->payedThisMonthBKGND; break; } if ($eachData[self::DBFLD_EXTCONTRAS_PAYDAY] - date('j') <= 5 and empty($hasPaymentsCurMonth)) { $recForeColor = $this->fiveDaysTillPayFRGND; $recBackColor = $this->fiveDaysTillPayBKGND; break; } if (date('j') > $eachData[self::DBFLD_EXTCONTRAS_PAYDAY] and empty($hasPaymentsCurMonth)) { $recForeColor = $this->paymentExpiredFRGND; $recBackColor = $this->paymentExpiredBKGND; break; } } } } $data[] = ''; $data[] = $profileRecID; $data[] = wf_Link(self::URL_ME . '&' . self::URL_DICTPROFILES . '=true' . '&' . self::MISC_MARKROW_URL . '=' . $profileRecID, $eachRecID[self::DBFLD_PROFILE_EDRPO]); $data[] = $eachRecID[self::DBFLD_PROFILE_NAME]; $data[] = $eachRecID[self::DBFLD_PROFILE_CONTACT]; $data[] = $eachRecID[self::DBFLD_PROFILE_MAIL]; $data[] = $recForeColor; $data[] = $recBackColor; $data[] = '&' . self::DBFLD_EXTCONTRAS_PROFILE_ID . '=' . $profileRecID; $json->addRow($data); unset($data); } } $json->getJson(); } /** * Renders second-level contract-address JQDT for external counterparty list * * @param string $customJSCode * @param string $markRowForID * @param string $detailsFilter * @param bool $stdJSForCRUDs * * @return string */ public function ecRender2ndLvlContractsJQDT($customJSCode = '', $markRowForID = '', $detailsFilter = '', $stdJSForCRUDs = true) { $ajaxURL = '' . self::URL_ME . '&' . self::ROUTE_2LVL_CNTRCTS_JSON . '=true' . $detailsFilter; $ajaxURLDetails = '' . self::URL_ME . '&' . self::ROUTE_FINOPS_DETAILS_CNTRCTS . '=true'; $columns[] = ''; $columns[] = __('ID'); $columns[] = __('Contract'); $columns[] = __('Contract subject'); $columns[] = __('Contract date start'); $columns[] = __('Contract sum'); //5 $columns[] = __('Period'); $columns[] = __('Payday'); $columns[] = __('Actions'); //8 $columns[] = __('Add' . ' ' . self::MISC_FORMS_CAPTS_FINOPS_LIST); $columns[] = __('Payed this month'); $columns[] = __('5 days till payday'); $columns[] = __('Payment expired'); $columns[] = __('Filter for details'); //13 $opts = ' "columnDefs": [ {"targets": [0], "className": "details-control"}, {"targets": [0], "orderable": false}, {"targets": [0], "data": null}, {"targets": [0], "defaultContent": ""}, {"targets": [10, 11, 12, 13], "visible": false}, {"targets": [3], "className": "dt-left dt-head-center"}, {"targets": ["_all"], "className": "dt-center dt-head-center"}, {"targets": [8], "width": "85px"}, {"targets": [8, 9], "orderable": false} ], "order": [[ 1, "desc" ]], "rowCallback": function(row, data, index) { if ( data[10] == "1" ) { $(\'td\', row).css(\'background-color\', \'' . $this->payedThisMonthBKGND . '\'); $(\'td\', row).css(\'color\', \'' . $this->payedThisMonthFRGND . '\'); } if ( data[11] == "1" ) { $(\'td\', row).css(\'background-color\', \'' . $this->fiveDaysTillPayBKGND . '\'); $(\'td\', row).css(\'color\', \'' . $this->fiveDaysTillPayFRGND . '\'); } if ( data[12] == "1" ) { $(\'td\', row).css(\'background-color\', \'' . $this->paymentExpiredBKGND . '\'); $(\'td\', row).css(\'color\', \'' . $this->paymentExpiredFRGND . '\'); } } '; $result = $this->getStdJQDTWithJSForCRUDs($ajaxURL, $columns, $opts, $stdJSForCRUDs, $customJSCode, $markRowForID, self::URL_ME . '&' . self::URL_EXTCONTRAS . '=true&' . self::MISC_MARKROW_URL . '=' . $markRowForID, self::MISC_MARKROW_URL, true, array(5), $this->currencyStr, true, $ajaxURLDetails, 13, 'showDetailsData13'); return($result); } /** * Renders JSON for external counterparty contract-address JQDT * * @param string $whereRaw * */ public function ecRender2ndLvlContractsListJSON($whereRaw = '') { $this->loadExtContrasExtenData(true, $whereRaw); $json = new wf_JqDtHelper(); $contractsIN = array(); if (!empty($this->allExtContrasExten)) { $data = array(); foreach ($this->allExtContrasExten as $eachRecID) { $curRecID = $eachRecID[self::TABLE_EXTCONTRAS . self::DBFLD_COMMON_ID]; $profileRecID = $eachRecID[self::TABLE_ECPROFILES . self::DBFLD_COMMON_ID]; $contractRecID = $eachRecID[self::TABLE_ECCONTRACTS . self::DBFLD_COMMON_ID]; $periodRecID = $eachRecID[self::TABLE_ECPERIODS . self::DBFLD_COMMON_ID]; $addrRecID = $eachRecID[self::TABLE_ECADDRESS . self::DBFLD_COMMON_ID]; $contractSum = $eachRecID[self::TABLE_ECCONTRACTS . self::DBFLD_CTRCT_FULLSUM]; $payDay = $eachRecID[self::TABLE_EXTCONTRAS . self::DBFLD_EXTCONTRAS_PAYDAY]; if (in_array($contractRecID, $contractsIN)) { continue; } else { $contractsIN[] = $contractRecID; } $data[] = ''; $data[] = $contractRecID; $data[] = wf_Link(self::URL_ME . '&' . self::URL_DICTCONTRACTS . '=true' . '&' . self::MISC_MARKROW_URL . '=' . $contractRecID, $eachRecID[self::TABLE_ECCONTRACTS . self::DBFLD_CTRCT_CONTRACT]); $data[] = $eachRecID[self::TABLE_ECCONTRACTS . self::DBFLD_CTRCT_SUBJECT]; $data[] = $eachRecID[self::TABLE_ECCONTRACTS . self::DBFLD_CTRCT_DTSTART]; $data[] = $contractSum; $data[] = $eachRecID[self::TABLE_ECPERIODS . self::DBFLD_PERIOD_NAME]; $data[] = $payDay; $actions = $this->getStdJQDTActions($curRecID, self::ROUTE_CONTRAS_ACTS, true); $data[] = $actions; $hasPaymentsCurMonth = $this->checkCurMonthPaymExists($curRecID, true); $hasAddressesAtached = ($this->ecFullCtrctOverdueNoAddrOnly) ? $this->checkContractHasAddresses($profileRecID, $contractRecID) : false; if (empty($hasAddressesAtached) and date('j') > $payDay and empty($hasPaymentsCurMonth)) { $payTimeExpired = 1; $this->createMissedPayment($curRecID, $profileRecID, $contractRecID, $addrRecID, $periodRecID, $payDay, $contractSum); } else { $payTimeExpired = 0; } $data[] = wf_jsAjaxDynamicWindowButton(self::URL_ME, array(self::ROUTE_FINOPS_ACTS => 'true', self::ROUTE_ACTION_PREFILL => 'true', self::MISC_PREFILL_DATA => array(self::CTRL_MONEY_PROFILEID => $profileRecID, self::CTRL_MONEY_CNTRCTID => $contractRecID, self::CTRL_MONEY_SUMPAYMENT => $contractSum ) ), '', web_add_icon(), '', 'POST', 'click', false, false, true, '$(this).closest("table").parent().children().find(\'[id ^= "jqdt_"][role = "grid"]\').last().attr("id")' ); $data[] = (empty($hasPaymentsCurMonth) ? 0 : 1); $data[] = ($payDay - date('j') <= 5 and empty($hasPaymentsCurMonth)) ? 1 : 0; $data[] = $payTimeExpired; $data[] = '&' . self::DBFLD_COMMON_ID . '=' . $profileRecID . '&' . self::DBFLD_EXTCONTRAS_CONTRACT_ID . '=' . $contractRecID . '&' . self::DBFLD_EXTCONTRAS_ADDRESS_ID . '=' . $addrRecID; $json->addRow($data); unset($data); } } $json->getJson(); } /** * Renders third-level contract-address JQDT for external counterparty list * * @param string $customJSCode * @param string $markRowForID * @param string $detailsFilter * @param bool $stdJSForCRUDs * * @return string */ public function ecRender2ndLvlAddressJQDT($customJSCode = '', $markRowForID = '', $detailsFilter = '', $stdJSForCRUDs = true) { $ajaxURL = '' . self::URL_ME . '&' . self::ROUTE_3LVL_ADDR_JSON . '=true' . $detailsFilter; $ajaxURLDetails = '' . self::URL_ME . '&' . self::ROUTE_FINOPS_DETAILS_ADDRESS . '=true'; $columns[] = ''; $columns[] = __('ID'); $columns[] = __('Address'); $columns[] = __('Address contract notes'); $columns[] = __('Address sum'); //4 $columns[] = __('Period'); $columns[] = __('Payday'); $columns[] = __('Actions'); // 7 $columns[] = __('Add' . ' ' . self::MISC_FORMS_CAPTS_FINOPS_LIST); $columns[] = __('Payed this month'); $columns[] = __('5 days till payday'); $columns[] = __('Payment expired'); $columns[] = __('Filter for details'); //12 $opts = ' "columnDefs": [ {"targets": [0], "className": "details-control"}, {"targets": [0], "orderable": false}, {"targets": [0], "data": null}, {"targets": [0], "defaultContent": ""}, {"targets": [9, 10, 11, 12], "visible": false}, {"targets": [4, 5, 6], "className": "dt-left dt-head-center"}, {"targets": ["_all"], "className": "dt-center dt-head-center"}, {"targets": [7], "width": "85px"}, {"targets": [7, 8], "orderable": false} ], "order": [[ 1, "desc" ]], "rowCallback": function(row, data, index) { if ( data[9] == "1" ) { $(\'td\', row).css(\'background-color\', \'' . $this->payedThisMonthBKGND . '\'); $(\'td\', row).css(\'color\', \'' . $this->payedThisMonthFRGND . '\'); } if ( data[10] == "1" ) { $(\'td\', row).css(\'background-color\', \'' . $this->fiveDaysTillPayBKGND . '\'); $(\'td\', row).css(\'color\', \'' . $this->fiveDaysTillPayFRGND . '\'); } if ( data[11] == "1" ) { $(\'td\', row).css(\'background-color\', \'' . $this->paymentExpiredBKGND . '\'); $(\'td\', row).css(\'color\', \'' . $this->paymentExpiredFRGND . '\'); } } '; $result = $this->getStdJQDTWithJSForCRUDs($ajaxURL, $columns, $opts, $stdJSForCRUDs, $customJSCode, $markRowForID, self::URL_ME . '&' . self::URL_EXTCONTRAS . '=true&' . self::MISC_MARKROW_URL . '=' . $markRowForID, self::MISC_MARKROW_URL, true, array(4), $this->currencyStr, true, $ajaxURLDetails, 12, 'showDetailsData12'); return($result); } /** * Renders JSON for external counterparty contract-address JQDT * * @param string $whereRaw * */ public function ecRender2ndLvlAddressListJSON($whereRaw = '') { $this->loadExtContrasExtenData(true, $whereRaw); $json = new wf_JqDtHelper(); if (!empty($this->allExtContrasExten)) { $data = array(); foreach ($this->allExtContrasExten as $eachRecID) { $curRecID = $eachRecID[self::TABLE_EXTCONTRAS . self::DBFLD_COMMON_ID]; $profileRecID = $eachRecID[self::TABLE_ECPROFILES . self::DBFLD_COMMON_ID]; $contractRecID = $eachRecID[self::TABLE_ECCONTRACTS . self::DBFLD_COMMON_ID]; $periodRecID = $eachRecID[self::TABLE_ECPERIODS . self::DBFLD_COMMON_ID]; $addrRecID = $eachRecID[self::TABLE_ECADDRESS . self::DBFLD_COMMON_ID]; $addressSum = $eachRecID[self::TABLE_ECADDRESS . self::DBFLD_ADDRESS_SUM]; $payDay = $eachRecID[self::TABLE_EXTCONTRAS . self::DBFLD_EXTCONTRAS_PAYDAY]; $data[] = ''; $data[] = $addrRecID; $data[] = wf_Link(self::URL_ME . '&' . self::URL_DICTADDRESS . '=true' . '&' . self::MISC_MARKROW_URL . '=' . $addrRecID, $eachRecID[self::TABLE_ECADDRESS . self::DBFLD_ADDRESS_ADDR]); $data[] = $eachRecID[self::TABLE_ECADDRESS . self::DBFLD_ADDRESS_NOTES]; $data[] = $addressSum; $data[] = $eachRecID[self::TABLE_ECPERIODS . self::DBFLD_PERIOD_NAME]; $data[] = $payDay; $actions = $this->getStdJQDTActions($curRecID, self::ROUTE_CONTRAS_ACTS, true); $data[] = $actions; $hasPaymentsCurMonth = $this->checkCurMonthPaymExists($curRecID, true, true); if (date('j') > $payDay and empty($hasPaymentsCurMonth)) { $payTimeExpired = 1; $this->createMissedPayment($curRecID, $profileRecID, $contractRecID, $addrRecID, $periodRecID, $payDay, $addressSum); } else { $payTimeExpired = 0; } $data[] = wf_jsAjaxDynamicWindowButton(self::URL_ME, array(self::ROUTE_FINOPS_ACTS => 'true', self::ROUTE_ACTION_PREFILL => 'true', self::MISC_PREFILL_DATA => array(self::CTRL_MONEY_PROFILEID => $profileRecID, self::CTRL_MONEY_CNTRCTID => $contractRecID, self::CTRL_MONEY_ADDRESSID => $addrRecID, self::CTRL_MONEY_SUMPAYMENT => $addressSum ) ), '', web_add_icon(), '', 'POST', 'click', false, false, true, '$(this).closest("table").parent().children().find(\'[id ^= "jqdt_"][role = "grid"]\').last().attr("id")' ); $data[] = (empty($hasPaymentsCurMonth) ? 0 : 1); $data[] = ($payDay - date('j') <= 5 and empty($hasPaymentsCurMonth)) ? 1 : 0; $data[] = $payTimeExpired; $data[] = '&' . self::DBFLD_COMMON_ID . '=' . $profileRecID . '&' . self::DBFLD_EXTCONTRAS_CONTRACT_ID . '=' . $contractRecID . '&' . self::DBFLD_EXTCONTRAS_ADDRESS_ID . '=' . $addrRecID; $json->addRow($data); unset($data); } } $json->getJson(); } /** * Creates a missed payment record from params * * @param $contrasID * @param $profileID * @param $contractID * @param $addrID * @param $periodID * @param $payDay * @param $paySum */ protected function createMissedPayment($contrasID, $profileID, $contractID, $addrID, $periodID, $payDay, $paySum) { $chkUniqArray = array(); $recordExists = true; $paymentDate = date('Y-m-') . $payDay; $chkUniqArray += $this->createCheckUniquenessArray(self::DBFLD_MISSPAYMS_CONTRASID, '=', $contrasID); $chkUniqArray += $this->createCheckUniquenessArray(self::DBFLD_MISSPAYMS_PROFILEID, '=', $profileID); $chkUniqArray += $this->createCheckUniquenessArray(self::DBFLD_MISSPAYMS_CONTRACTID, '=', $contractID); $chkUniqArray += $this->createCheckUniquenessArray(self::DBFLD_MISSPAYMS_ADDRESSID, '=', $addrID); $chkUniqArray += $this->createCheckUniquenessArray(self::DBFLD_MISSPAYMS_PERIOD_ID, '=', $periodID); $chkUniqArray += $this->createCheckUniquenessArray(self::DBFLD_MISSPAYMS_PAYDAY, '=', $payDay); $chkUniqArray += $this->createCheckUniquenessArray(self::DBFLD_MISSPAYMS_DATE_PAYMENT, '=', $paymentDate); $chkUniqArray += $this->createCheckUniquenessArray(self::DBFLD_MISSPAYMS_SUMPAYMENT, '=', $paySum); //$this->dbECMissedPayms->setDebug(true, true); $recordExists = $this->dbECMissedPayms->checkRecExists($chkUniqArray); if (!$recordExists) { $this->dbECMissedPayms->data(self::DBFLD_MISSPAYMS_CONTRASID, $contrasID); $this->dbECMissedPayms->data(self::DBFLD_MISSPAYMS_PROFILEID, $profileID); $this->dbECMissedPayms->data(self::DBFLD_MISSPAYMS_CONTRACTID, $contractID); $this->dbECMissedPayms->data(self::DBFLD_MISSPAYMS_ADDRESSID, $addrID); $this->dbECMissedPayms->data(self::DBFLD_MISSPAYMS_PERIOD_ID, $periodID); $this->dbECMissedPayms->data(self::DBFLD_MISSPAYMS_PAYDAY, $payDay); $this->dbECMissedPayms->data(self::DBFLD_MISSPAYMS_DATE_PAYMENT, $paymentDate); $this->dbECMissedPayms->data(self::DBFLD_MISSPAYMS_DATE_EXPIRED, curdatetime()); $this->dbECMissedPayms->data(self::DBFLD_MISSPAYMS_SUMPAYMENT, $paySum); $this->dbECMissedPayms->create(); } } /** * Updates a missed payment record paid date field * * @param $missPaymID * @param string $datePayed */ public function updateMissedPaymentPayedDate($missPaymID, $datePayed = '') { if (!empty($missPaymID)) { $datePayed = (empty($datePayed) ? curdatetime() : $datePayed); $this->dbECMissedPayms->data(self::DBFLD_MISSPAYMS_DATE_PAYED, $datePayed); $this->dbECMissedPayms->where('id', '=', $missPaymID); $this->dbECMissedPayms->save(); } } /** * Returns payday of the contragent by profile ID + contract ID [+ address ID] * * @param $profileID * @param $contractID * @param $addressID * * @return int|string */ public function getContraPayday($profileID, $contractID, $addressID = 0) { $this->dbExtContras->where(); $this->dbExtContras->whereRaw(); $this->dbExtContras->selectable('payday'); $this->dbExtContras->where(self::DBFLD_EXTCONTRAS_PROFILE_ID, '=', $profileID); $this->dbExtContras->where(self::DBFLD_EXTCONTRAS_CONTRACT_ID, '=', $contractID); if (!empty($addressID)) { $this->dbExtContras->where(self::DBFLD_EXTCONTRAS_ADDRESS_ID, '=', $addressID); } $result = $this->dbExtContras->getAll(); $result = empty($result[0][self::DBFLD_EXTCONTRAS_PAYDAY]) ? '' : $result[0][self::DBFLD_EXTCONTRAS_PAYDAY]; return ($result); } /** * Returns payday of the missed payment by its ID * * @param $missPaymID * * @return mixed|string */ public function getMissedPaymentPayDay($missPaymID) { $datePayDue = empty($this->allECMissedPayms[$missPaymID]) ? '' : $this->allECMissedPayms[$missPaymID][self::DBFLD_MISSPAYMS_DATE_PAYMENT]; return ($datePayDue); } /** * Renders counterparties table coloring settings form * * @return string */ public function extcontrasColorSettings() { $this->getTableGridColorOpts(); $inputs = ''; $tmpStyle = 'style="float: right; width: 80px; height: 20px; border: 2px solid rgba(100, 100, 100, .8); border-radius: 4px; '; $inputs .= wf_ColPicker(self::CTRL_ECCOLOR_PAYEDTHISMONTH_BKGND, __('Already payed this month background'), $this->payedThisMonthBKGND, false, '7', self::CTRL_ECCOLOR_PAYEDTHISMONTH_BKGND, 'background-color'); $inputs .= wf_nbsp(4) . wf_tag('span', false, '', 'id="' . self::CTRL_ECCOLOR_PAYEDTHISMONTH_BKGND . '" ' . $tmpStyle . $this->payedThisMonthBKGND . ';"') . wf_tag('span', true) . wf_delimiter(1); $inputs .= wf_ColPicker(self::CTRL_ECCOLOR_PAYEDTHISMONTH_FRGND, __('Already payed this month foreground'), $this->payedThisMonthFRGND, false, '7', self::CTRL_ECCOLOR_PAYEDTHISMONTH_FRGND, 'background-color'); $inputs .= wf_nbsp(4) . wf_tag('span', false, '', 'id="' . self::CTRL_ECCOLOR_PAYEDTHISMONTH_FRGND . '" ' . $tmpStyle . $this->payedThisMonthBKGND . ';"') . wf_tag('span', true) . wf_delimiter(1); $inputs .= wf_ColPicker(self::CTRL_ECCOLOR_FIVEDAYSTILLPAY_BKGND, __('5 days left till payday background'), $this->fiveDaysTillPayBKGND, false, '7', self::CTRL_ECCOLOR_FIVEDAYSTILLPAY_BKGND, 'background-color'); $inputs .= wf_nbsp(4) . wf_tag('span', false, '', 'id="' . self::CTRL_ECCOLOR_FIVEDAYSTILLPAY_BKGND . '" ' . $tmpStyle . $this->payedThisMonthBKGND . ';"') . wf_tag('span', true) . wf_delimiter(1); $inputs .= wf_ColPicker(self::CTRL_ECCOLOR_FIVEDAYSTILLPAY_FRGND, __('5 days left till payday background'), $this->fiveDaysTillPayFRGND, false, '7', self::CTRL_ECCOLOR_FIVEDAYSTILLPAY_FRGND, 'background-color'); $inputs .= wf_nbsp(4) . wf_tag('span', false, '', 'id="' . self::CTRL_ECCOLOR_FIVEDAYSTILLPAY_FRGND . '" ' . $tmpStyle . $this->payedThisMonthBKGND . ';"') . wf_tag('span', true) . wf_delimiter(1); $inputs .= wf_ColPicker(self::CTRL_ECCOLOR_PAYMENTEXPIRED_BKGND, __('Payment expired background'), $this->paymentExpiredBKGND, false, '7', self::CTRL_ECCOLOR_PAYMENTEXPIRED_BKGND, 'background-color'); $inputs .= wf_nbsp(4) . wf_tag('span', false, '', 'id="' . self::CTRL_ECCOLOR_PAYMENTEXPIRED_BKGND . '" ' . $tmpStyle . $this->payedThisMonthBKGND . ';"') . wf_tag('span', true) . wf_delimiter(1); $inputs .= wf_ColPicker(self::CTRL_ECCOLOR_PAYMENTEXPIRED_FRGND, __('Payment expired foreground'), $this->paymentExpiredFRGND, false, '7', self::CTRL_ECCOLOR_PAYMENTEXPIRED_FRGND, 'background-color'); $inputs .= wf_nbsp(4) . wf_tag('span', false, '', 'id="' . self::CTRL_ECCOLOR_PAYMENTEXPIRED_FRGND . '" ' . $tmpStyle . $this->payedThisMonthBKGND . ';"') . wf_tag('span', true) . wf_delimiter(1); $inputs .= wf_delimiter(0); $inputs .= wf_HiddenInput(self::URL_EXTCONTRAS_COLORS, 'true'); $inputs .= wf_SubmitClassed(true, 'ubButton', '', __('Save'), '', 'style="width: 100%"; ' . $this->submitBtnDisabled); $inputs = wf_Form(self::URL_ME . '&' . self::URL_EXTCONTRAS_COLORS . '=true', 'POST', $inputs, 'glamour'); return ($inputs); } /** * Returns a filter web form for invoices main form * * @return string */ public function finopsFilterWebForm() { $ajaxURLStr = self::URL_ME . '&' . self::ROUTE_FINOPS_JSON . '=true'; $formID = 'Form_' . wf_InputId(); $jqdtID = 'jqdt_' . md5($ajaxURLStr); $inputs = wf_tag('h3', false); $inputs .= __('Filter by') . ':'; $inputs .= wf_tag('h3', true); $rows = wf_DatesTimesRangeFilter(true, true, false, false, true, false, ubRouting::post(self::MISC_WEBFILTER_DATE_START), ubRouting::post(self::MISC_WEBFILTER_DATE_END), self::MISC_WEBFILTER_DATE_START, self::MISC_WEBFILTER_DATE_END ); $inputs .= wf_TableBody($rows, 'auto'); $inputs .= wf_SubmitClassed(true, 'ubButton', '', __('Show'), '', 'style="width: 100%"'); $inputs = wf_Form($ajaxURLStr, 'POST', $inputs, 'glamour form-grid-3r-1c', '', $formID, '', 'style="margin-top: 10px;"'); $inputs .= wf_EncloseWithJSTags(wf_jsAjaxFilterFormSubmit($ajaxURLStr, $formID, $jqdtID)); return ($inputs); } /** * Returns a financial operations editor web form * * @param bool $modal * @param int $finopID * @param bool $editAction * @param bool $cloneAction * @param array $prefillFieldsData * * @return string */ public function finopsWebForm($modal = true, $finopID = 0, $editAction = false, $cloneAction = false, $prefillFieldsData = array()) { $this->loadWebSelFilterData(); $inputs = ''; $finopProfileID = 0; $finopContractID = 0; $finopAddressID = 0; $finopAccrualID = 0; $finopInvoiceID = 0; $finopPurpose = ''; $finopSumAccrual = ''; $finopSumPayment = ''; $finopNotes = ''; $finopIncoming = ''; $finopOutgoing = ''; $finopAccruals = array(); $modalWinID = ubRouting::post('modalWindowId'); $modalWinBodyID = ubRouting::post('modalWindowBodyId'); if ($modal) { $formClass = self::MISC_CLASS_SUBMITFORM_MODAL; $emptyCheckClass = self::MISC_CLASS_EMPTYVALCHECK_MODAL; } else { $formClass = self::MISC_CLASS_SUBMITFORM; $emptyCheckClass = self::MISC_CLASS_EMPTYVALCHECK; } if (($editAction or $cloneAction) and ! empty($this->allECMoney[$finopID])) { $finoperation = $this->allECMoney[$finopID]; $finopProfileID = $finoperation[self::DBFLD_MONEY_PROFILEID]; $finopContractID = $finoperation[self::DBFLD_MONEY_CNTRCTID]; $finopAddressID = $finoperation[self::DBFLD_MONEY_ADDRESSID]; $finopAccrualID = $finoperation[self::DBFLD_MONEY_ACCRUALID]; $finopInvoiceID = $finoperation[self::DBFLD_MONEY_INVOICEID]; $finopPurpose = $finoperation[self::DBFLD_MONEY_PURPOSE]; $finopSumAccrual = $finoperation[self::DBFLD_MONEY_SMACCRUAL]; $finopSumPayment = $finoperation[self::DBFLD_MONEY_SMPAYMENT]; $finopNotes = $finoperation[self::DBFLD_MONEY_PAYNOTES]; $finopIncoming = ubRouting::filters($finoperation[self::DBFLD_MONEY_INCOMING], 'fi', FILTER_VALIDATE_BOOLEAN); $finopOutgoing = ubRouting::filters($finoperation[self::DBFLD_MONEY_OUTGOING], 'fi', FILTER_VALIDATE_BOOLEAN); } elseif (!empty($prefillFieldsData)) { $finopProfileID = (empty($prefillFieldsData[self::CTRL_MONEY_PROFILEID]) ? 0 : $prefillFieldsData[self::CTRL_MONEY_PROFILEID]); $finopContractID = (empty($prefillFieldsData[self::CTRL_MONEY_CNTRCTID]) ? 0 : $prefillFieldsData[self::CTRL_MONEY_CNTRCTID]); $finopAddressID = (empty($prefillFieldsData[self::CTRL_MONEY_ADDRESSID]) ? 0 : $prefillFieldsData[self::CTRL_MONEY_ADDRESSID]); $finopSumPayment = (empty($prefillFieldsData[self::CTRL_MONEY_SUMPAYMENT]) ? 0 : $prefillFieldsData[self::CTRL_MONEY_SUMPAYMENT]); if (!$editAction and ! $cloneAction) { $misspaymProcess = (empty($prefillFieldsData[self::MISC_MISSED_PAYMENT_PROCESSING]) ? 0 : $prefillFieldsData[self::MISC_MISSED_PAYMENT_PROCESSING]); $misspaymID = (empty($prefillFieldsData[self::MISC_MISSED_PAYMENT_ID]) ? 0 : $prefillFieldsData[self::MISC_MISSED_PAYMENT_ID]); $inputs .= wf_HiddenInput(self::MISC_MISSED_PAYMENT_PROCESSING, $misspaymProcess); $inputs .= wf_HiddenInput(self::MISC_MISSED_PAYMENT_ID, $misspaymID); } } $this->dbECMoney->whereRaw(" " . self::DBFLD_MONEY_SMACCRUAL . " != 0"); $finopAccruals = $this->loadDataFromTableCached(self::TABLE_ECMONEY, self::TABLE_ECMONEY, true); $this->loadDataFromTableCached(self::TABLE_ECMONEY, self::TABLE_ECMONEY, true); $ecProfilesWebSelID = ($modal ? 'Modal' : '') . self::MISC_WEBSEL_PROFILES; $ecContractsWebSelID = ($modal ? 'Modal' : '') . self::MISC_WEBSEL_CONTRACTS; $ecAddressWebSelID = ($modal ? 'Modal' : '') . self::MISC_WEBSEL_ADDRESS; $contractsFilterDataID = ($modal ? 'Modal' : '') . self::MISC_WEBSEL_FILTDATA_CONTRACTS; $addressFilterDataID = ($modal ? 'Modal' : '') . self::MISC_WEBSEL_FILTDATA_ADDRESS; $editDBValProfileID = self::MISC_WEBSEL_DBVAL_PROFILE_ID; $editDBValContractID = self::MISC_WEBSEL_DBVAL_CONTRACTS_ID; $editDBValAddressID = self::MISC_WEBSEL_DBVAL_ADDRESS_ID; $submitCapt = ($editAction) ? __('Edit') : (($cloneAction) ? __('Clone') : __('Create')); $formCapt = $submitCapt . ' ' . __(self::MISC_FORMS_CAPTS_FINOPS_LIST); $ctrlsLblStyle = 'style="line-height: 2.2em"'; if ($editAction or $cloneAction or ! empty($prefillFieldsData)) { $inputs .= wf_HiddenInput($editDBValProfileID . 'nm', $finopProfileID, $editDBValProfileID); $inputs .= wf_HiddenInput($editDBValContractID . 'nm', $finopContractID, $editDBValContractID); $inputs .= wf_HiddenInput($editDBValAddressID . 'nm', $finopAddressID, $editDBValAddressID); } $inputs .= wf_TextInput(self::CTRL_MONEY_PURPOSE, __('Operation purpose') . $this->supFrmFldMark, $finopPurpose, false, '', '', $emptyCheckClass . ' right-two-thirds-occupy', '', '', true); //$inputs.= wf_tag('span', false); $inputs .= wf_TextInput(self::CTRL_MONEY_SUMACCRUAL, __('Accrual sum'), $finopSumAccrual, false, '', 'finance', 'col-2-3-occupy', '', '', true); //$inputs.= wf_tag('span', true); $inputs .= wf_TextInput(self::CTRL_MONEY_SUMPAYMENT, __('Payment sum'), $finopSumPayment, false, '', 'finance', 'col-5-6-occupy', '', '', true); $inputs .= $this->renderWebSelector($this->allECProfiles, array(self::DBFLD_PROFILE_EDRPO, self::DBFLD_PROFILE_NAME, self::DBFLD_PROFILE_CONTACT ), self::CTRL_MONEY_PROFILEID, __('Counterparty'), $finopProfileID, true, false, true, $ecProfilesWebSelID, '', '', true, '', $this->selectfiltECContractsAll, $contractsFilterDataID); $inputs .= $this->renderWebSelector($this->allECContracts, array(self::DBFLD_CTRCT_CONTRACT, self::DBFLD_CTRCT_SUBJECT, self::DBFLD_CTRCT_FULLSUM ), self::CTRL_MONEY_CNTRCTID, __('Contract'), $finopContractID, true, false, true, $ecContractsWebSelID, '', '', true, '', $this->selectfiltECAddressAll, $addressFilterDataID); $inputs .= $this->renderWebSelector($this->allECAddresses, array(self::DBFLD_ADDRESS_ADDR, self::DBFLD_ADDRESS_SUM ), self::CTRL_MONEY_ADDRESSID, __('Address'), $finopAddressID, true, false, true, $ecAddressWebSelID, '', '', true); if (!$modal) { $tmpWebSelJS = wf_jsWebSelectorFilter(); $tmpWebSelJS .= ' $(function() { onElementInserted("body", "#Modal' . $ecProfilesWebSelID . '", function(element) { $("#Modal' . $ecProfilesWebSelID . '").on("click change", function(evt) { filterWebDropdown($(this).val(), $(\'#Modal' . $contractsFilterDataID . '\').val(), \'Modal' . $ecContractsWebSelID . '\', true); }); $("#Modal' . $ecProfilesWebSelID . '").val($("#' . $editDBValProfileID . '").val()).change(); }); onElementInserted("body", "#Modal' . $ecContractsWebSelID . '", function(element) { $("#Modal' . $ecContractsWebSelID . '").on("click change", function(evt) { filterWebDropdown($(this).val(), $(\'#Modal' . $addressFilterDataID . '\').val(), \'Modal' . $ecAddressWebSelID . '\', true); }); $("#Modal' . $ecContractsWebSelID . '").val($("#' . $editDBValContractID . '").val()).change(); $("#Modal' . $ecAddressWebSelID . '").val($("#' . $editDBValAddressID . '").val()).change(); }); $(\'#' . $ecProfilesWebSelID . '\').on("change", function(evt) { filterWebDropdown($(this).val(), $(\'#' . $contractsFilterDataID . '\').val(), \'' . $ecContractsWebSelID . '\', true); }); $(\'#' . $ecContractsWebSelID . '\').on("change", function(evt) { filterWebDropdown($(this).val(), $(\'#' . $addressFilterDataID . '\').val(), \'' . $ecAddressWebSelID . '\', true); }); $(\'#' . $ecProfilesWebSelID . '\').change(); $(\'#' . $ecContractsWebSelID . '\').change(); }); '; $tmpWebSelJS = wf_EncloseWithJSTags($tmpWebSelJS . "\n"); } else { $tmpWebSelJS = ''; } $inputs .= $tmpWebSelJS; if ($this->ecInvoicesON) { $inputs .= $this->renderWebSelector($this->allECInvoices, array(self::DBFLD_INVOICES_INVOICE_NUM, self::DBFLD_INVOICES_DATE, self::DBFLD_INVOICES_SUM ), self::CTRL_MONEY_INVOICEID, __('Invoice'), $finopInvoiceID, true, false, true, '', 'col-2-3-occupy', '', true); } $inputs .= $this->renderWebSelector($finopAccruals, array(self::DBFLD_MONEY_PURPOSE, self::DBFLD_MONEY_SMACCRUAL, self::DBFLD_MONEY_DATE ), self::CTRL_MONEY_ACCRUALID, __('Accrual'), $finopAccrualID, true, false, true, '', ($this->ecInvoicesON ? 'col-5-6-occupy' : 'col-2-3-occupy'), '', true); $inputs .= wf_TextInput(self::CTRL_MONEY_PAYNOTES, __('Payment notes'), $finopNotes, false, '70', '', ($this->ecInvoicesON ? 'right-two-thirds-occupy' : 'col-5-6-occupy'), '', '', true); $inputs .= wf_tag('span', false, 'glamour full-width-occupy', 'style="text-align: center; width: 98%;"'); $inputs .= wf_RadioInput(self::CTRL_MONEY_INOUT, __('Incoming payment'), 'incoming', false, $finopIncoming); $inputs .= wf_nbsp(8); $inputs .= wf_RadioInput(self::CTRL_MONEY_INOUT, __('Outgoing payment'), 'outgoing', false, $finopOutgoing); $inputs .= wf_tag('span', true); $inputs .= wf_SubmitClassed(true, 'ubButton', '', $submitCapt, '', 'style="width: 100%"; ' . $this->submitBtnDisabled); $inputs .= wf_HiddenInput(self::ROUTE_FINOPS_ACTS, 'true'); if ($editAction) { $inputs .= wf_HiddenInput(self::ROUTE_ACTION_EDIT, 'true'); $inputs .= wf_HiddenInput(self::ROUTE_EDIT_REC_ID, $finopID); } else { $inputs .= wf_HiddenInput(self::ROUTE_ACTION_CREATE, 'true'); } if ($modal and ! empty($modalWinID)) { $inputs .= wf_HiddenInput('', $modalWinID, '', self::MISC_CLASS_MWID_CTRL); } $inputs = wf_Form(self::URL_ME . '&' . self::URL_FINOPERATIONS . '=true', 'POST', $inputs, 'glamour form-grid-6cols form-grid-6cols-label-right ' . $formClass); if ($editAction and $this->fileStorageEnabled) { $this->fileStorage->setItemid(self::URL_FINOPERATIONS . $finopID); $inputs .= wf_tag('span', false, '', $ctrlsLblStyle); $inputs .= wf_tag('h3'); $inputs .= __('Uploaded files'); $inputs .= wf_tag('h3', true); $inputs .= $this->fileStorage->renderFilesPreview(true, '', 'ubButton', '32', '&callback=' . base64_encode(self::URL_ME . '&' . self::URL_FINOPERATIONS . '=true'), true); $inputs .= wf_tag('span', true); } if ($modal and ! empty($modalWinID)) { $inputs = wf_modalAutoForm($formCapt, $inputs, $modalWinID, $modalWinBodyID, true); } return ($inputs); } /** * Renders JQDT for external counterparty finance operations list * * @param string $customJSCode * @param string $markRowForID * @param string $detailsFilter * @param bool $stdJSForCRUDs * * @return string */ public function finopsRenderJQDT($customJSCode = '', $markRowForID = '', $detailsFilter = '', $stdJSForCRUDs = true) { $ajaxURL = '' . self::URL_ME . '&' . self::ROUTE_FINOPS_JSON . '=true' . $detailsFilter; $colTargets1 = '[1, 2]'; $colTargets2 = '[14, 15]'; $totalsCols = ($this->ecInvoicesON ? array(9, 10) : array(8, 9)); $columns[] = __('ID'); $columns[] = __('Counterparty'); $columns[] = __('Contract'); $columns[] = __('Address'); if ($this->ecInvoicesON) { $columns[] = __('Invoice'); $colTargets1 = '[1, 2, 3]'; $colTargets2 = '[15, 16]'; } $columns[] = __('Leading financial operation'); $columns[] = __('Operation purpose'); $columns[] = __('Operation date'); $columns[] = __('Edit date'); $columns[] = __('Accrual sum'); $columns[] = __('Payment sum'); //9 $columns[] = __('Needed to pay on date'); $columns[] = __('Ingoing'); $columns[] = __('Outgoing'); $columns[] = __('Payment notes'); $columns[] = __('Uploaded files'); $columns[] = __('Actions'); $opts = ' "order": [[ 0, "desc" ]], "columnDefs": [ {"targets": ' . $colTargets1 . ', "className": "dt-left dt-head-center"}, {"targets": ["_all"], "className": "dt-center dt-head-center"}, {"targets": ' . $colTargets2 . ', "orderable": false}, {"targets": ' . $colTargets2 . ', "width": "85px"} ] '; $result = $this->getStdJQDTWithJSForCRUDs($ajaxURL, $columns, $opts, $stdJSForCRUDs, $customJSCode, $markRowForID, self::URL_ME . '&' . self::URL_EXTCONTRAS . '=true&' . self::MISC_MARKROW_URL . '=' . $markRowForID, self::MISC_MARKROW_URL, true, $totalsCols, $this->currencyStr); return($result); } /** * Renders JSON for finance operations JQDT * * @param string $whereRaw */ public function finopsRenderListJSON($whereRaw = '') { if (!empty($whereRaw)) { $this->dbECMoney->whereRaw($whereRaw); } //$this->dbECMoney->setDebug(true, true); $this->loadDataFromTableCached(self::TABLE_ECMONEY, self::TABLE_ECMONEY, !empty($whereRaw), true, '', '', !empty($whereRaw)); $json = new wf_JqDtHelper(); if (!empty($this->allECMoney)) { $data = array(); foreach ($this->allECMoney as $eachRecID) { foreach ($eachRecID as $fieldName => $fieldVal) { if ($fieldName == self::DBFLD_MONEY_PROFILEID) { $data[] = (empty($this->allECProfiles[$fieldVal]) ? '' : $this->allECProfiles[$fieldVal][self::DBFLD_PROFILE_EDRPO] . ' ' . $this->allECProfiles[$fieldVal][self::DBFLD_PROFILE_NAME] ); } elseif ($fieldName == self::DBFLD_MONEY_CNTRCTID) { $data[] = (empty($this->allECContracts[$fieldVal]) ? '' : $this->allECContracts[$fieldVal][self::DBFLD_CTRCT_CONTRACT] . ' ' . $this->allECContracts[$fieldVal][self::DBFLD_CTRCT_FULLSUM] ); } elseif ($fieldName == self::DBFLD_MONEY_ADDRESSID) { $data[] = (empty($this->allECAddresses[$fieldVal]) ? '' : $this->allECAddresses[$fieldVal][self::DBFLD_ADDRESS_ADDR] . ' ' . $this->allECAddresses[$fieldVal][self::DBFLD_ADDRESS_SUM] ); } elseif ($fieldName == self::DBFLD_MONEY_INVOICEID) { if ($this->ecInvoicesON) { $data[] = (empty($this->allECInvoices[$fieldVal]) ? '' : $this->allECInvoices[$fieldVal][self::DBFLD_INVOICES_INVOICE_NUM] . $this->allECInvoices[$fieldVal][self::DBFLD_INVOICES_DATE] . $this->allECInvoices[$fieldVal][self::DBFLD_INVOICES_SUM]); } } elseif ($fieldName == self::DBFLD_MONEY_ACCRUALID) { $data[] = (empty($this->allECMoney[$fieldVal]) ? '' : $this->allECMoney[$fieldVal][self::DBFLD_MONEY_PURPOSE] . $this->allECMoney[$fieldVal][self::DBFLD_MONEY_SMACCRUAL] . $this->allECMoney[$fieldVal][self::DBFLD_MONEY_DATE]); } elseif ($fieldName == self::DBFLD_MONEY_INCOMING or $fieldName == self::DBFLD_MONEY_OUTGOING) { $data[] = (empty($fieldVal) ? web_red_led() : web_green_led()); } else { $data[] = $fieldVal; } } if ($this->fileStorage) { $this->fileStorage->setItemid(self::URL_FINOPERATIONS . $eachRecID[self::DBFLD_COMMON_ID]); $data[] = $this->fileStorage->renderFilesPreview(true, '', 'ubButton', '32', '&callback=' . base64_encode(self::URL_ME . '&' . self::URL_FINOPERATIONS . '=true'), true); } else { $data[] = __('Filestorage') . ' ' . __('Disabled'); } $actions = $this->getStdJQDTActions($eachRecID[self::DBFLD_COMMON_ID], self::ROUTE_FINOPS_ACTS, true); $data[] = $actions; $json->addRow($data); unset($data); } } $json->getJson(); } /** * Returns expired payments filter webform * * @return string */ public function missedPaymsFilterWebForm() { $ajaxURL = '' . self::URL_ME . '&' . self::ROUTE_MISSPAYMS_JSON . '=true'; $result = ''; $result .= wf_Link('#', __('Unpaid'), false, 'ubButton', 'id="MissPaymsUnpayedFilter"') . wf_nbsp(4); $result .= wf_Link('#', __('Paid'), false, 'ubButton', 'id="MissPaymsPayedFilter"') . wf_nbsp(4); $result .= wf_Link('#', __('All'), false, 'ubButton', 'id="MissPaymsFilterAll"'); $result = wf_Plate($result, '', '', 'glamour') . wf_CleanDiv(); $tmpJS = wf_jsAjaxCustomFunc('doMisspaymsFilter', '', '$(\'body\').find(\'[id ^= "jqdt_"][role = "grid"]\').attr("id")', '', 'POST', true); $tmpJS .= ' $(\'#MissPaymsUnpayedFilter\').click(function(evt) { doMisspaymsFilter(\'' . $ajaxURL . '\', \'&' . self::MISC_WEBFILTER_MISSPAYMS . '=ISNULL(`' . self::DBFLD_MISSPAYMS_DATE_PAYED . '`)\'); evt.preventDefault(); return false; }); $(\'#MissPaymsPayedFilter\').click(function(evt) { doMisspaymsFilter(\'' . $ajaxURL . '\', \'&' . self::MISC_WEBFILTER_MISSPAYMS . '=NOT ISNULL(`' . self::DBFLD_MISSPAYMS_DATE_PAYED . '`)\'); evt.preventDefault(); return false; }); $(\'#MissPaymsFilterAll\').click(function(evt) { doMisspaymsFilter(\'' . $ajaxURL . '\', \'&' . self::MISC_WEBFILTER_MISSPAYMS . '=NOT ISNULL(`' . self::DBFLD_MISSPAYMS_CONTRASID . '`)\'); evt.preventDefault(); return false; }); '; $result .= wf_EncloseWithJSTags($tmpJS); return ($result); } /** * Renders JQDT for overdue payments list * * @param string $customJSCode * @param string $markRowForID * @param string $detailsFilter * @param bool $stdJSForCRUDs * * @return string */ public function missedPaymsRenderJQDT($customJSCode = '', $markRowForID = '', $detailsFilter = '', $stdJSForCRUDs = true) { $ajaxURL = '' . self::URL_ME . '&' . self::ROUTE_MISSPAYMS_JSON . '=true'; $columns[] = __('ID'); $columns[] = __('Counterparty'); $columns[] = __('Contract'); $columns[] = __('Contract subject'); $columns[] = __('Address'); //4 $columns[] = __('Period'); //5 $columns[] = __('Payday'); $columns[] = __('Payment sum'); //7 $columns[] = __('Needed to pay on date'); $columns[] = __('Expired date'); //9 $columns[] = __('Payed date'); $columns[] = __('Actions'); $columns[] = __('Add' . ' ' . self::MISC_FORMS_CAPTS_FINOPS_LIST); //12 $columns[] = __('Already payed'); $opts = ' "columnDefs": [ {"targets": [13], "visible": false}, {"targets": [1, 3, 4], "className": "dt-left dt-head-center"}, {"targets": ["_all"], "className": "dt-center dt-head-center"}, {"targets": [12], "width": "85px"}, {"targets": [12], "orderable": false} ], "order": [[ 1, "desc" ]], "rowCallback": function(row, data, index) { if ( data[13] == "1" ) { $(\'td\', row).css(\'background-color\', \'' . $this->payedThisMonthBKGND . '\'); $(\'td\', row).css(\'color\', \'' . $this->payedThisMonthFRGND . '\'); } if ( data[13] == "0" ) { $(\'td\', row).css(\'background-color\', \'' . $this->paymentExpiredBKGND . '\'); $(\'td\', row).css(\'color\', \'' . $this->paymentExpiredFRGND . '\'); } } '; $result = $this->getStdJQDTWithJSForCRUDs($ajaxURL, $columns, $opts, $stdJSForCRUDs, $customJSCode, $markRowForID, self::URL_ME . '&' . self::URL_EXTCONTRAS . '=true&' . self::MISC_MARKROW_URL . '=' . $markRowForID, self::MISC_MARKROW_URL, true, array(7), $this->currencyStr); return($result); } /** * Renders JSON for overdue payments JQDT * * @param string $whereRaw */ public function missedPaymsRenderListJSON($whereRaw = '') { if (!empty($whereRaw)) { $this->dbECMissedPayms->whereRaw($whereRaw); } $this->loadDataFromTableCached(self::TABLE_ECMISSPAYMENTS, self::TABLE_ECMISSPAYMENTS, !empty($whereRaw), true, '', '', !empty($whereRaw)); $this->loadExtContrasExtenData(); $json = new wf_JqDtHelper(); if (!empty($this->allExtContrasExten) and ! empty($this->allECMissedPayms)) { $data = array(); foreach ($this->allECMissedPayms as $eachRecID) { $curRecID = $eachRecID[self::DBFLD_COMMON_ID]; $contrasRecID = $eachRecID[self::DBFLD_MISSPAYMS_CONTRASID]; $profileRecID = $eachRecID[self::DBFLD_MISSPAYMS_PROFILEID]; $contractRecID = $eachRecID[self::DBFLD_MISSPAYMS_CONTRACTID]; $periodRecID = $eachRecID[self::DBFLD_MISSPAYMS_PERIOD_ID]; $addrRecID = $eachRecID[self::DBFLD_MISSPAYMS_ADDRESSID]; $payDay = $eachRecID[self::DBFLD_MISSPAYMS_PAYDAY]; $datePayment = $eachRecID[self::DBFLD_MISSPAYMS_DATE_PAYMENT]; $dateExpired = $eachRecID[self::DBFLD_MISSPAYMS_DATE_EXPIRED]; $datePayed = $eachRecID[self::DBFLD_MISSPAYMS_DATE_PAYED]; $sumPayment = $eachRecID[self::DBFLD_MISSPAYMS_SUMPAYMENT]; $alreadyPayed = !empty($datePayed); if (!empty($this->allExtContrasExten[$contrasRecID])) { $extenData = $this->allExtContrasExten[$contrasRecID]; $counterparty = $extenData[self::TABLE_ECPROFILES . self::DBFLD_PROFILE_NAME]; $contractNum = $extenData[self::TABLE_ECCONTRACTS . self::DBFLD_CTRCT_CONTRACT]; $contractSbj = $extenData[self::TABLE_ECCONTRACTS . self::DBFLD_CTRCT_SUBJECT]; $contractSum = $extenData[self::TABLE_ECCONTRACTS . self::DBFLD_CTRCT_FULLSUM]; $address = $extenData[self::TABLE_ECADDRESS . self::DBFLD_ADDRESS_ADDR]; $addressSum = $extenData[self::TABLE_ECADDRESS . self::DBFLD_ADDRESS_SUM]; $periodName = $extenData[self::TABLE_ECPERIODS . self::DBFLD_PERIOD_NAME]; } else { $counterparty = ''; $contractNum = ''; $contractSbj = ''; $contractSum = ''; $address = ''; $addressSum = ''; $periodName = ''; } $data[] = $curRecID; $data[] = wf_Link(self::URL_ME . '&' . self::URL_DICTPROFILES . '=true' . '&' . self::MISC_MARKROW_URL . '=' . $profileRecID, $counterparty); $data[] = wf_Link(self::URL_ME . '&' . self::URL_DICTCONTRACTS . '=true' . '&' . self::MISC_MARKROW_URL . '=' . $contractRecID, $contractNum); $data[] = $contractSbj; $data[] = wf_Link(self::URL_ME . '&' . self::URL_DICTADDRESS . '=true' . '&' . self::MISC_MARKROW_URL . '=' . $addrRecID, $address); $data[] = $periodName; $data[] = $payDay; $data[] = $sumPayment; $data[] = $datePayment; $data[] = $dateExpired; $data[] = $datePayed; $actions = $this->getStdJQDTActions($curRecID, self::ROUTE_MISSPAYMS_ACTS, false, '', false); $data[] = $actions; $data[] = wf_jsAjaxDynamicWindowButton(self::URL_ME, array(self::ROUTE_FINOPS_ACTS => 'true', self::ROUTE_ACTION_PREFILL => 'true', self::MISC_PREFILL_DATA => array(self::CTRL_MONEY_PROFILEID => $profileRecID, self::CTRL_MONEY_CNTRCTID => $contractRecID, self::CTRL_MONEY_ADDRESSID => $addrRecID, self::CTRL_MONEY_SUMPAYMENT => $sumPayment, self::MISC_MISSED_PAYMENT_PROCESSING => 'true', self::MISC_MISSED_PAYMENT_ID => $curRecID ) ), '', web_add_icon(), '', 'POST', 'click', false, false, true, '$(this).closest("table").parent().children().find(\'[id ^= "jqdt_"][role = "grid"]\').last().attr("id")' ); $data[] = ($alreadyPayed ? 1 : 0); $json->addRow($data); unset($data); } } $json->getJson(); } } |