eqonomize-0.6/0000755000175000017500000000000011107050335012314 5ustar hannahannaeqonomize-0.6/AUTHORS0000644000175000017500000000001111106576506013370 0ustar hannahannaHanna K. eqonomize-0.6/CMakeLists.txt0000644000175000017500000000021111107071620015046 0ustar hannahannaproject(eqonomize) find_package(KDE4 REQUIRED) include(KDE4Defaults) add_subdirectory(src) add_subdirectory(doc) add_subdirectory(po) eqonomize-0.6/COPYING0000644000175000017500000004313111106570646013364 0ustar hannahanna GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. eqonomize-0.6/ChangeLog0000644000175000017500000001533611106571054014103 0ustar hannahanna2008-11-12 * KDE4 version commited 2008-03-04 * Fix mysterious crash when two scheduled transactions have the same date and description 2007-08-20 * Fix saving of weekly recurrence 2007-07-30 * Fix positive net result of split transaction displayed in wrong column 2007-05-04 * Fix calculation of scheduled transactions after a scheduled transaction has been confirmed * Fix calculation of scheduled transaction after the date has changed to before the current date * Sort scheduled transactions list after date changes * Fix security transaction joining 2007-03-30 * Allow user to select initial period * Do not limit sold shares to current number of shares * Fixes for the new value input widget 2007-03-29 * Keep permissions of exisiting files 2007-03-28 * Make it possible to join security transactions and add ability to create new security transaction from edit split dialog * Do not require a selected security to be able to create a security transaction and make it possible to change security from edit transaction dialogs * Execute different actions when double clicking on security row depending on clicked column 2007-03-26 * Future statistics in over time chart 2006-11-28 * New value input with support for zero decimals 2006-11-27 * Spanish and Italian translations * Update French translations * Some bug fixes 2006-10-22 * Fix "Edit..." button for split transaction in list * Show extra properties when editing transaction from split transaction edit dialog 2006-10-07 * Reset quantity to 1.0 2006-09-19 * Fix balancing 2006-09-03 * Manual updates * Minor polishing 2006-09-02 * Updated icons 2006-09-01 * German translation (Martin F. Hohenberg , Elias Probst ) * Update cvs.sh for autoconf 2.6 * Fix de.po 2006-08-27 * Miscellaneous fixes * Postpone option in confirm schedule dialog * Manual updates * Close confirm schedule dialog if no transactions are left 2006-08-22 * QIF export fixes * Handle non-standard (local) QIF type names * Fix QIF import and export of splits * Update Swedish translation * Updated french translation (Jérôme Rapinat , Antoine Rodriguez ) * Minor fixes and polishing 2006-08-21 * QIF import of securities * Securities type "Other" * QIF export * Require unique and non-empty names for accounts of the same type * Fix crash when selecting initial balance item in ledger dialog * Fix and extend date update when current date changes 2006-08-20 * Enhanced splits * Join and split up actions * Enhanced account ledger * Possibility to specify price of share separately, so the total cost/income can include fees * Add quantity input to refund/repayment dialog * Add percents to legend texts and decrease margins in categories comparison chart * QIF import of splits 2006-08-19 * Splits 2006-08-18 * Add comments entry to refund/repayment dialog 2006-08-17 * Refunds and repayments * Enhanced date and number format handling for csv import * Enhanced QIF import * Ask save on quit (use close() instead of kapp->quit()) 2006-08-16 * Update securities when account has been deleted * Auto-save with crash recovery * Fix crash when removing account with security transactions * Backup on save * Add do not ask again option to save? dialog on exit * Revert menu item 2006-08-15 * Continue QIF import work * Account ledger dialog * Fix balancing crash when to date is in the same month as but before current date * Switch securities and accounts period to date to current date if date changes and to date was current date * Fix move to account selection 2006-08-14 * Update change column when transaction added or changed * Fix changing date of transaction with future date 2006-08-13 * Work on QIF import begun * Updated french translation (Jérôme Rapinat ) * French manual (Jérôme Rapinat ) * Use pow(10, x) instead of exp10(x) * Fix crash with no from date in accounts view and empty (or no) accounts 2006-08-11 * French translation (Jérôme Rapinat ) * Alternative for credit and debit in different columns * Auto first row option for csv import * More flexible value and date reading in csv file * Miscellaneous... 2006-08-08 * Begin documentation * Add option to show Profits line in over time chart 2006-08-07 * i18n fixes * Finish Swedish translation 2006-08-04 * Fix calculation of remaining budget when from date is after current date * Display as previous budget result the result for the month before selected month 2006-08-03 * Use button menus for period selection, schedule buttons, and security transactions * Move next/previous year/month buttons up in accounts view * Payees/payers for over time chart 2006-08-02 * Change focus order to put quantity after value * Call layout() for KButtonBox 2006-07-31 * Use quantity instead of count * Replace "Daily" with "Average" statistic * Fix resizing issues * More flexible reports 2006-07-30 * More flexible charts * Optional Payee/Payer and Quantity parameters for expenses/incomes 2006-07-29 * Budget edit tab in accounts view * Select period combo * By default set to date to current date * Lots more... 2006-07-27 * Normally do not show incomplete months (possibly first and current) in development over time report * Ability to set budget separately for each month * Budget account property for accounts * Show budgeted value (if greater than scheduled transactions) for future value and change of accounts 2006-07-26 * Add option to compare accounts in categories comparison chart 2006-07-25 * Work around Hebrew, Hijri and Jalali addMonths() bug * Check length of month names * Fix calculation of total change for securities accounts * Fix checking of todays schedule 2006-07-24 * Change name to Eqonomize! * Make report and chart dialogs non-modal * Month selector instead of date edit for over time chart * Only confirm scheduled transactions occurring the current date if time is after 18.00 * Some bug and tweaks fixes 2006-07-23 * Categories comparison chart * Over time chart * Don't use "words" in date picker popup as future dates is not very useful 2006-07-22 * Use KCalenderSystem everywhere and avoid assumptions based on the gregorian calendar * Add some more valid recurrence checks * Security trade (buy and sell in the same transaction) 2006-07-21 * Use comma as delimiter and put values in quotes, when saving csv file * Import of CSV files 2006-07-20 * "Development Over Time" and "Categories Comparison" reports 2006-07-19 * Add daily average to transactions statisitcs * Printingeqonomize-0.6/doc/0000755000175000017500000000000011107050200013050 5ustar hannahannaeqonomize-0.6/doc/CMakeLists.txt0000644000175000017500000000017711106510444015627 0ustar hannahanna include_directories(${KDE4_INCLUDES}) ########### install files ############### add_subdirectory(en) add_subdirectory(fr) eqonomize-0.6/doc/en/0000755000175000017500000000000011107050167013466 5ustar hannahannaeqonomize-0.6/doc/en/CMakeLists.txt0000644000175000017500000000103011106571520016220 0ustar hannahanna include_directories(${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ) ########### install files ############### kde4_create_handbook(index.docbook INSTALL_DESTINATION ${HTML_INSTALL_DIR}/en SUBDIR eqonomize) install( FILES accounts-view.png ask-save.png confirm-schedule.png csv-columns.png edit-budget.png expenses-view.png new-account.png new-security.png qif-date-format.png recurrence.png refund.png schedule-view.png securities-view.png security-buy.png split-transaction.png DESTINATION ${HTML_INSTALL_DIR}/en/eqonomize) eqonomize-0.6/doc/en/accounts-view.png0000644000175000017500000023746711106571520017006 0ustar hannahannaPNG  IHDR IDATxwxlW\drްw)B36-B |Hb&j^01@1.`06`l\q-[nݙծJ;s_\Z͜9s#WQD:B!B)  ֭yڻLB!B(KFQq>g"]&!B!D n`j,՞B!B4B!Cr,n, iħwPB!͡U3|sǏ;qָ?KK.*B!Ds*K>lX9|0vk\JNu`Dϋ@Kq8u?~]ïi5P|]0S~!Bq ŢpD'+W|B!AA5`8Ƨh~ GnQA/2J)t;J*ezJ%:Bnl璴`:Ry>5 KdJQlyՑ53Yiq2y*Rd6ۊ7sI={aw{,p|E^F ld#9aU^OSۻ-n h5~tIfwv.4%2o(+vyG\jI]ZSk?sljv*#"fs ۛ<;V+0 ;ekot _ :%u?Y1WJ !bz0]2`1맩<-Ż }o9h`\a7%b91 쓆ЙfuUe(OdBp*f{S>/X*w0mKwv~Mٌi0Acl^o\Iy 4U~-lHx4ϥ[py;dkVηvk2(\P>>n S53;}R<}}R\.@GG^Byu߱e-eb6)BM:E]?k ~yw43Ъ8::Ziʁu_CI Qy9rF_i( v5Զp t{7N_|X'K|JFjj }]hzгdF91Fidkם_|87]70b1Ys(z EbBCPNͫ?x!l^YӸW`OLgFwԏÚ5>xGŤ[W=l+'М.QgA{UYZ7_''t\X-u}{'og2]Fʀ9'49ʇ_H\| 3~ZZUjsi[.:-f =g~wQpOb~2ғ+_ŒvsMjeIhU0 } xys1Ýu^NjG} ~dm=ڙY~PL>+X-ALulzYZn{?.YW?h?Z 2r7幄Ϧ1Eixd%9Ϳv_QeN:k7;6}μE:\64zyQ4 \xwalu3.g0m Jrqk~E^g4¯pgssW~L$,q)ؓcKV<%$ّR~p ~[b7Vp@-9j>5!wa`叔&l]Ѥ}X>k"{<%}{ZhV\uWhul?"4ՃWo ;o:t}f/m 8q[YqfcX8R3$tHFXіWaN<^7wmh/?Fp[/ܹg7 ]SX?aC[<?${Ͽ&=Xmónp*@W|VH Zh*uk%Btd[xqU}-xGf{"P\֜ kRWq (f+b,DL{sֹk=H$G4lսN]jE!n _ptx;kNZ u59 bHDت҅`Klhe,>\?a ʳF 3vӤ|c=0 }xVqe {Lda%Ye3uiC̰]ۧX8͵&dnZһc5RƮi|s\2FVOAQ"-"'usV۶fG"fGbIJc_FnSHYµb/`iKڜ>bѡ42E0"&x'ƞx[uGAeؒӛQCbB4Uko_8Bor'lǃnzO !cOΎтԷ{r? !bSbV][>78>Xm{?Tn|c=pd*B!,qɍ=z { B!B"\-/SB!BttiӦѣGF͛obݳgL2SR\\̞={–a̙ddd0zh.]%K0n8?~})((6Tݻws%ЧOz3X|y-tiii,[ٳgE׮]CXh 8;iF:p6֮uH?D}K.lذPZ#\c9}Q_#{g6Vh4/vlO;}P=ȳ 3f̘3dɒ^[S4?7Xd Ǐ'==c[oai>ˇ~g'Ϝ9sA֭[w]sѺENc}Xd[>M?os;pz K-hOJ3n[Ğmp[sdso/U ϸqXzuhYfc63gwugqF|"9s&<vZhʕ+y'YjU:T]6nȠABKJJ>|8n4 {z]:ZqẸqO?΍Tԭu"1ϭQ\.k֬a֭ٳu1rHyc\KWCEC 1Rnhx{"A#RwhGz3gҬ^.p_4FLԭ?Of͚Jj*|IV\ْBt<nl`͛+7GUV1a„ZSCvʄ Xz5~:۶mcڴi Ν;2eJ}SLaǎQyOMM7$뮻3fp2~xMF^~S=޾|}QVZE^^~߷nF0ͭOsqg~૪?̭;{Z }-#m6mg _>m6l͟Am۶q'JSl~ VrJoބR !bQM4ZF-..gXt)˗/D͑oۧ(Jz'Xl}>cԩ<-a~tuבo>Lqq1yyyhV+]:G봕֧%YV|A>оzh)o{iCZlwς6m%\,3f [li|Xv-<Ț5k(**`ԨQ[":t(_}U}ׯg(--fQKQFGo6^}U֮]?lڰa9M^X݌\'R6֮AF٨{Wo^^^>#\j9{D{iC0roih~FԧT-y_6TOmɈ#}7)?7ׯ__#FdX?=~-Υ^ڬ|-[ƙgIrrrc)))q=.Z/Y`A(} ,`ѢE|ww}]w… Cif̘?Laa!7pG]={_!v饗n:\.]}FK>|8>,%%%n>ZmbTN>l]k2-Qz饗5k+Vtxذa^{-7pC(g.R{\w6T#6T?#yDnC#P=߈nEyfTUe}ݵtڦܼٴii&-ZĭچB_Ǿ!ӧOGcӦMhƸqۚҥKy'<>o<xϟ駟SO=C=Į]Ȩf/KN''''޽{swpfѢE3o~SY`9|z);V+'|r+¢E2d#DGDÆڵ&#i}p82d^{- 3Ej־k2Rnӆa4g$H}mhqRZZʯk9B>}Xp!<@(MGxm[nn,-Zy׆BVB!:[r 7q.JUqY-)&lLG[QK>r}ۗ]vqwBk0NбJ; M+HΥg,c֬Y\~8pL*nVf,"{!KxCG#8!lU!B!D^!BN@{!B!: B!$B!^!BN@{!B!: B!$B!h4۪,B!B&8b{ IDAT?l0ڢ,B!B&4vAWUS&b5Z?kהF9rNF%B!m)b4]YY 3l0C}i$YkSUp Norxh/ѕ!Ct4]Gס]QJ(B!ZST`-t4 44?VA3rZN? j1z}|~|>GUg++W\>Gʡz}~Mǯf]C!Bt\koUn]PbL4f nK1wVriZM=\qqfyH1' (مG@i8~^ܽfFPtB!DjU&p6{U\]ʆ9_kԔ_>Ig#jk9;˚׫t{q|>rJp<-)s_YeAϯzB!<"7wMCCCza$4Ĉ(HGէ?{"Ӹ$YzSV\.?w/M~T%%2H|GiiڤkjpA_4B!Scqq }t4]Aס2rC}v]~)#x\xZoꂪ[\/ˢOFzUG3=.]tJ)-)k#G nݢt:x<83I!BV[-PQ99`.>g!蛈fіy7IyUe.M1(r8zմ^U躏2'6jׁ_}>+r7i͛駟HLL%))PP{*~bFQ֬9իWB!OSWɾ=} sX5kmG;ZkՁ}!7ѯO\WX1uT5_:Œ n"p6!0FU8zת^k|~T`uCYi9.qQkҥos2`@#Gt(w`PT8NqY%ϚuR~].RB!SGʠrt|&WyZ cgFNe213bP_R1ݜ6'z'iopysTWUq@ ̹W}~U^+p9x<^<׋ ] `͚5{/ZG@^Q)GMz( Ն >MibIħpX >E#B!^}7ь{U (^k:Tp{xsOGdU8bωS3&6eW3i|Ua|U?Pg=ϳKoR,?e3elzUSq4M#> Svkh>0~̺Ռ)Άդ`5sxQEE8?P᠇.n*{ՆRݓ٘z %55+?^!"Ƶڪ8KRiZ`v_~[: p艀?{{.U*7xI|yש97;,uǩ鸼:./8:NUeZfL ]nSY¢_gó3Gi.˃ǣ^[|R%߯r٫a)0QRcNefr%m?6펼4B!ZmU%UMY_&90 mb홠CaVQ΁p4G~c> |8K\J*)9R9cp+}2_Gū> 9z U۫jUெ|q{x=5ؼy+6[723HOObClgs2 **\9RDaa%%']B!ު8J`zS;b#Sg\A]0'&{L4~t?I=/xj7q]LG8:^/ۣQDu~SZD$y(: ^PUXt,0u|>0tTUGQt@7>fkS(ebs> %nB|DB48Hq@b;YX<B!Vũ+^7A{]Mo+&Jo&~$+ 5*aۏ%,@n9r  nWRG;&v*sy;KTxU**}>**ܔ8Cz?^a*USq٬S:+W~6]j#U[ciL8%aEB!ZmU( TܕCQәup Ͼ.gڨV@2L E^|.dMR/'<4G0rp|TuTV5 Ui~iԛ@z>!!|76a 8| I̘q:e$''GUg!Bڪ8F-S 2qe$CVGk:kr/z0$@Z`*ۭ&<ׄk8^+^J/sxp<|>t]C[ൿW?ZGzQ3|PObbnYgiͦK'C$77$`?>z !BVʼnVB`rJ?_&X,&4Md2aZfńϧ\+뻝*K}TTV^hUJSY^YY3>}ĉXӦ&%%bܸ #|>?y/199>}RB!KV Trӯo66M\.ӋRQU c'sgE7`yOx__zըW.sbo2|=̄ cYN''N3|~,3ob[99X,2^!"ֵު8mŤjSo)Et4 д4Y}ͧj~*:sONkϜ9m;%==?Bz1}0m2t@ G^B!Vyy&(Z ntDa98vt6UUٴi^zAT!BVYgάY,aĄ C| 'n!Bf-?@+B!hF{ B! WB!Bt\!B!:> B!$B!^!BN@{!B!: B!$B!}M_}7on:Ǝ˩B!1p` 'Oܚ5lذ@{!B>Կ՚5,n~i B!DD2Ǿ+))GAIII{UfggsWҷo_2228sXrelڴ믿ÇNFFF◿eZm TV!"I`߉x^l6S̻͛Kvv6> JTy<̙3{Çٺu+=nJ.B?{1~,Nپ};6I&aۙ/|y<^38##,YR<)%Kkٽ{7ahM;!x;6}μE-/M1*g@ЫUl^<8(̶92gΜZFӧׯgСTFԾB!'<nl`AUGVPHAYnl`rhn*\n DnItOsbÆ <8@SԾB!g1;=6vi`G2& VYup8.}:Ǐo_= .l63gfΜ'M̷~[kjO8\s 6lc֭7zn]$''GLң&_#}'Bbz,?g l]p6j/Y$p^wY/V[|q úCB_4DvAW榁 DDu4e-9rHhvqq1G!>>?74G`ǎ}۷o`̘1}f_;wߟW^yݻws!^zze '8z]s҅^ȝwމ68%oEQXx156xoz7"8~ڵkWh߶mLO[M;!x}AY"i#dKhZ:zl_.NdgOB^'%bg";~>o;׬y>SJKK9쳉u,..:VXC=ngѢE|w޽{Ypa<#iL&?0ǎ#//GywJ _|E<{ooV+Ԝ`O?Ajj*ƍk4G}u]ٲe ._ 'O<ƍ7ovBUU 裏8Cis_~en7;vh f}v|>Gw嬳 ;O~~>ǎ } elj !dz CA%޽{yE\6qv3nUm9= ټωGjm' I+-Djv(8 /{̞=+W 8 ^|E89s+Si4}'BbnUƎ3l%+7f.;˰>2*?nybQ f%5A |WhΪ8BDc޽L81B]'Fu:1+NRƗ)B!#2=օneTqWIrL66.@CE gU'u rbB!q*fF]7):GS-<,ڬq)جA=`w^R!B?b&wz`v¥i6fNmRv3L>W4ŊgG^!BĀ 09H{hTz4d:=&YYf,S'ǒ_!B3}0TmCc5 3`l]{!B֧B57.S ~s7v|jBTկF}:̟? B!ZЋ/h(]̄v (vnE.Ü7߯{-&Pbz~wm"!BTRRb(]q6/@ˇ\j3?j5Wvx !B%fL7Úk- A1ß B!D3'•U醥Nm7+D[8>pguQ Z!B63=@J*6J 8!elfUg@ZY=*᪗~JUR`2"#B!㋝^QRIAy<Gz#-z)5i)voY=V\*=BMh}s!Bb'PLZʮ>̔Qݱ}i˟VO-Rq:IYiAuR^+ =V0Y$B!1!{ )Nw"~.7; 9690Z:W_Ѧfq_嫭x<*I'9.Ǡ͛7w1B!D3;SO=p\3R*A+m*f$TAGFR>S(S{:`P?y.B!h 6c/WPd9.|}u&t`}8~o);{0@1A~]!ъPns`(S;7љ,<#s7T-Ac[yy#G bAELٶ͛gӭ]__}cFe@,ƍ 7\_m:[cs=B[~=tz~***ڽښSۀ:eO?$]ZK/Usr;f' ܳO:~U/kٍGz( ټ>̆ڢ|F-hI`IEa>cӦ7ps}2>>i4ͳ<w5k֮gOyuM&◭Z>[c3\f{O6KZƑÇw{Õ57\6<] /uRw#[ϔ{ok/,( #]-;K4w}?/X9s0xP?F…7PXX:п_m[j2hӼnvv{ zC!?n$*++ o=t )xԻo/eɡv\zi'w6Ç zqb'WTTȘC)..0# ]z7{'I1Bd"FlBQEQڣhUJ)mP]e J7/W{ YOry9{ӿ_ޘsMN>Cጧ3;FaRl@[.T;ԆzZrmtNI됢gQUsG%>LuAC~q yHVH-=JU,i?/WXZQM&;[uaRke~Sc͙*!kgc~孆E6a#Wvʏ;ʧ|sr5 7s);wnW|*goYzwP0`\ʱ173gΜr}Aɲo[Lp%Zi+߯/7kΥwL.YQ'O0k4Lkg~5G \cշsF8߬\ÏWj#m_I&N_~T9-[~W/_*̅Mdggs>:vV?>%MΜ9OCF>ŋ0Y]ikϖltq؉6^bSs|f+W}ukS*9eZRڥ=7n\g4rK#}Em֭prp<^ؑT[. {r^V,i?/.^}Ay5:Ӌmik稙Gɐ%ǰwZ5k ܬ#z4#;'}=]6lE%ߩŞR-wĞ,[I&IΓONԦݧ#ڇ q:/;^  顶M2},t馈;q߮ZοܸD-ܸ"=11pZhFwNYwBe\]y+==gݧo.=zT]zbZOEǎ2gN⭷P)wf^Va_.ZgSrrҹ=?wwz&TT{!lmmqRٹq=&M\2IIIlCpvnߡCk(֦KukCuٱs`ة"ԩy{BFRKse O5j(7qOh}tuJIIkv\ &Ҥ@JC-=J¨) %C} աʒ|,6C [^'Ʊcwq&w{ o*WL?:u[bmmy>}]}uڵ/Mam뭔޶7!)Y|ƍ~[YY&yw"XZZx)X^SNMNN/XEwUoJ|!nҪU+^Z))===UxDW8::VC.Dy73gN0C_J---hܸJ|A+ hkӚIa!=GFF|l1K~Ve к\mTe4)T,,̔t˥I oN{ojjBrrVu KVf;j˥aYӟRLI%zSš{f4m͓ߣ i\fD'*ֱm\m131Il υX+vvA-+" FןnE^i՘zvVyc׈OUSWFMKSuvű&f&~WܦDaqoơػol{MM/0=ɨؿjysΟ;G^:e.ny+kȈlk/77+WobjjUitAz͚իx ظa=S׀eAaǛ+eE :L!#ԣ.6MKdMWW EޅKiԧmUB*fff$'%cU`cۋIV,355s s, /ZUTڲr/~VGUO)Hѱ떶`(} թ*e6yjom$СsFt5\d/Zx4cʠʙ19LvJujc"Z;ۡLh`ǘ>-_G8?/\U|NqStP?M4Q7_+>>!5+AW!$0ls47iΟ?`ĄD%۷Õ/X 萛`R]8xp?z.y>95kV6}ݺ\xY>A" <+I?ϗrڵ"puu#(R\PuQ8f8~m׮^ѣGKR[P=遞ׯ?kW)MKmmZ[y)vrdgI9WܹpἊj朗8:#"J|NٱO;+؞:^–KbRgIv/ ;Jbխ^ hK9mɕ 7?,fŒuvt@_-\8sry//i%ӷ :::8u 2y:::z(թM~ OR{MԷϓ˔eKbjCϳ/.d]tR`k=??G@d2߿ϬY|m>l`>lGi׾K,$..,.]d)Jv,8FBVV/i<:uL.6l0'N#)) \ԩzRr9nHOO2{2eKɥKAdffٳgγ6z{;|<]JVV׮]?Q*_J[֎r?9su~`ذ &( xÇ-Q0^ hkK)ǗdxY)1<\d)if] R7}˗ >Ǥo;WyƧwHb>3Pt~.(e&(_Subϗ#.mIa8)ޞ^|6}Vj^IJNbc::2n{|<_R|x~ZǨQkԨm;曯ɸbŷJ^&OVFaKV$¨*)):r_(<*S"Q&ѣ5(4l>zoboV^)1i>sr0ede0@<\ U~{Ms񋒵aƀֳHi7.})ɮ8IS]ۋERqMf͚}J̵k޽{,UZ,Y$GqRvR=srrѽ3?77w޼yI]^4U<(~)աʒ|(]qtrCfV~8#nDzröx\Ҥ"ׂHJq,$}Ϝq)27Dz9|]rl^QyNiK iJ $_ͻ~(.{Bލ*2J΁stiސQcfl@Jb%q2T_%4gPE[E,4,zVD*S~.D{ w_(2ݧ*sE'ޠ"I Щ:Dŧ@u*+O\ωU0H} q1T%= <>hK~yVP~*!Y AuD@[c_EAUBس@ ΃sǾZ tg@m}USVA (S= <~>d[&@ p@ *SqWzԐY*@ * bľ 6$%':@ \kNx!M^j6nn.|mb^ [Zm+U !eu-  #vJꐚ$uTt ;64ƧWگH߹{Jz516䥖|WZfQ6m4l\c_+^M߾)/Aؑqb1y>si3?=X'b%0]]; \Ll н[?~C^ޓW|}+CR󖤎ʀ6}"W ROYk>1B#y˜snj̦AWHN?wsIfNCso$֭ڰwA# ɏRܜs9w!ݔ?ԷΜJ~3S3RRCjޒQ׷?3ƫE+2238zo5__拋ͲUtO0yDS5M%o==y`TRT*̈[ql=M]@?͢- &,gǩ(˫\CGۚ8ۚxC+W/ӭOhJy]:uUҩ+o\ZgW75IM|{Ťi DDFh]@ *6SfL~V LgΒNrL:9K\\͛+̹./Լ%*sn{w+K+^8ofgE;ffly{SSS[XK9I9~L9E)] C]ޱLݕ)Kw3&X`hׂNAakmh &\<*O>A&UY_ٶ}R۶oU#_kIz uN<|V횳%UQ a~Ye6mncccnێ ƍ ROhh;Լ%ګ w=ٹ -To‹ť+_w*I!uHRO; "~8`hn6hH>ƆfQL6t9bd>`ɶǜ7111Q?Ǐ8+K+KM4oւۻڲ4{{rSKwSTԔjXPą^4\.WТyK=^nsfպ@ TL,n\.iЮw>y6jǟ[ݳO-IU˗XH} |6۪mPay144TjCjWA`NX7edL6kqq4 H IDATCerl, mkv|:j9:9ǯ0vRRR*lg?mϷSPê}[̞8~2;wogs4O0I'p| YYYpI'0e4Ln=p,bbc"YF{Ǻ<}B֗FJj ?J-A6rϝd!6R!7e4vWHbR"߭]2yT2͕W:2ĩ㤦3rf|'Lù8t 餧sx{8sf}N{4d2@D[svUTJ^R^0Z鑑%W 9HF̬\͒e# żUjZΆM֛c M{X~k>|fٷx&ҜyM#bY9v$Vf9v$}0Gi$>.FԨe9]h,qobdtMxo Ǿ a]oAEEiڰ|7˸ cmMmK?}YG#4lH&:r#agkOǺRRJHϗ-E%y"˶7~k\ۺ5d\|o|Kۺ5xo8^0/?_TcRR*t Lgp3nz|/kRykނm'bh~qJLκ{#SX~}ں[a``P@ ׭!4,UWkT ʻϫ> 䀥c:e`iOZ\%t^jV.-SNfs'HKK#77R AEc_xGeJxXIF|H5HQ$SɩGlAeD>`$FbbbR-@P4 LeJ5b' Уn HU 9Z̀W'Ǯ$NNN@ AEҌ?Rx 8Kv9ݩ鹅:{Y~V$r&(YWf@ TS*z1,9Cl-HMW^SDL> "Ns>4L'\Jӆ&H@|N J|0\͗/q KQvC|ٳgvǠ%KGJ]:::U@ JFay摒ʕ+M ,JN/AɈŅE%Ԯ<ѣGxxxXhy/5~߆bhaK8VyF5 5==}aL:}!-H DZ>zzz/ʋد^O>m@ :O>eĉbooOj곷!n+++b֭Jmٲ-[bll&::Zk@P8p#FP1bZ ===tu]^###Stuu166.Ʊob,]]]bN*|=gYzm@E8sܹ$VZѦM|2|ᇊAѷo_"##INN~`ǎJe,]իWDxx8Z-Exx8*nnnܾ}[kCPw\cccڷo5s)ƱM gq0zu?FIPXgjQw [5j(S+(Ǝ#`aaATTBfxyy1a6l@DDJ9nnnJEP  :::JA swʕW߲<$$3e3gٳgIOO'==gٳ,"yrvIS'SLmfBCnv鉏qmHrLLLc;-H۶m9uƲ 9Ǐ'%%\L&SFjŊ8p'''8@YpR9bK@ r ܺuK%>$$gggʫAՕ7sN7Ov#ڵߟYnEJC⇩΃Ggaa$Sn|0Y #Yy155Ĥ/-I&`222Ԧ/]3gΰtR4iXr -[2k,mFPP-Z'@ O>lٲE%~˖-GkCP2UVA1ʱѡY#3fV,߈P/C?S 323x^Nr ]1](޽{Kǎٿ?dddpy^uŮ8͚5cѢEǓΞ={TۗǏFJJ GɩTM ՛iӦϪUHLL$11իW2uT@-rY!(> ԩS! bĈ7NInԨQ 2@ ȑ#d+SW*^ lԁHNq4(t tՆe۟lBӳ29Or7ZK LMMUF˳ .dYƍcaaAR,lݺu+ԩS>,YTΤI?>666ԩS]v#: λW7Ύcǎqqtt;v ;;;U6(:%c̟?[[[jԨq4hlo___Ǝ%3}7(*[WT$|) jк1zzBx;VVVZ{E|*00ν@ Չ5kի[ \TI+:::2X/ K}S&&&NAS=e@  &J((c/@ xǾ#@ T c_#@ U*3^Pz^clϢw>Gɐej@ (zVtlZnu152(ֵ˜vT%eҪ}*/9Ӳ k@{smߋ*RZf KEƲ ƧKҢImں;ı&ƆzD'qF$G/!skCC}R9u'/\гucZ"!A ;N$6)TtF(U^2r &xwW~]iT=z0LYvj׼+bnuq? hZ3"[bӧAattb1{3V*iꮉǭJ|8׵a_@}q{5*ұ771dxg=Pso`G;V$a,Y9dfpA4w+-q)1.%=3,Rc{5Z* rsowrxrrs/6/ѵyCu~/ Yvߋb穛t*]ʣTjNqF컵pb_`Y9j[]^i՘5-փhJr7k@Զ1'15}᜽uR*3bTۚc%jcי?F,7^yYЎz5g_@(` iˍ2MbOS:}ik@Fpoām|jN=֟>s_R5Tiӄ /3uƷ mJjՖN+(@ Tew{$jONcX=ŗo2kX;;- 5x$.fZUt[+SFҌ RѪ1C+%SREKErq;5kFPP??#.]_S믿rQ"""_>Fb߾g _N8YYYܸqh7oСCTꫯX~= |>|#G*҇ʟO?Djj*1oMt䊤Tt'2:Ĕ 4YV Vo˾Ku)̬bC=d:rՁWa7{%KZe`GwV<6f$;Nݤo;OŊ ހPdM4fСx{{ǎ;pvvV+ߴiS/]z62zE5kΝ;*q/̈^Uq!oѵQq+nMeDf8նFOW ޔc*dBD3&Ҹ c}ٶTqgv_ 3mr!QSw]k=lho=mɁJإxe#L 012[ '\(]Ue& hMǚ롯KZVm髚!#ziO '詹^mk}[ 0ù S_hnED+V>/ FVV_}ueٲe >K.aaɓ|w8q8lmmѣK.U/Ne=Off&˖-cҤIEkASAc/D@ Tw6wƌǮ*Dy= –׉qtG~]vӦM ǽ EMi=z4G.VZ_KtB. sSԲʃ @Pu"6 IDATд>*zjQ *řc/AudᦓDF#T>}5G @ T *c/%Oh@ >G[= @ ʖL+l#@ UWs{@ p9b^ j jNqF5}LPrƆVG *L8kk"Kaaa ,,,#,,rUGU`ǎԬYCCCꫯј777˗ӴiS111YfX\%YyʕDvZZǾSUF+Fqtۺu+{W^l۶ zqT#GbggǙ3g LJ=zC>|HϞ=!66Vk򪣪qF ĕ+WHKKcݜ$//^ݻ o߾DFF?;OF[d +V >>\\\֭f/$66PV-{=E>)zuRtSǯʸqǍ۷'d9tGi&/^oFJJ 6m/d˖-{>~@ (-qwwWwssZ˕WU\ν{xw=zFI&1tPΝ;Gff&0d&O"ooo> 8J+./=Bmmyxa#G+:c2-R>vy|!1x ~4yNN<77-  觀yRz\\L.W^שSG.YYYrGGGkr\޹sg]8YfHI:=ux9 qJ|RtE馎lyÆ ъhyÆ يvSh9ҽW۷ou֦*G J®3lrUGUPOOOybb$$gggʫ.lܸ;wj߸q#kccci׮*ѦMISȕTR;3bq8Aa`aMOwG?3̘4БIh#G>aۤl%gɶ|=T꼈/ߟ(Ξ=ٳgOEPPrZlɬYضmAAA,ZHV;HKRuѣ$$$ի͟111L޽.ˈD"fРAe###[[[bU}֫k&jۻ\\\8Ge\]]1v풋W}֭L˖-68::2۷oKfĈH$b8߿_B͋~ܿ;u|3͛5ʹR)rJM6 a8ӦMfժUT*=y$x<ؘ֭s:5Sڴa4ͳ:xN h֬9 -Cs_$o|q w||1ͮõ񂪄ZC!躰0$%%!44BjI]޿*pS3&, KER-Di\Lc?|`SRO!hf׮]{B!3}rĴ C9EqvN܍ʓ{ )S~G1Gi(..~gTB!3}s~1f*Wi®]蹢d xSq('B:3` 2;<{d ͳ4ǞB!D?Lb_I൤zW*}eUFʰexxxl6vvv4i~jm_] L:t耍7}wRx311ARRlll?{ ~!rss{ 2FU?`ժUr\Ϟ=*om\p$pD:2ΈSK-bI J eǫd*-=WYT6,_X,@RX$[K#թ[ZZj<&-- ~~~0665kbdee e`ee,p, pssǃ)Ft;w8m6zݻA\.:uBTTc>>} 33III qǎCΝ`oopo۶ ܹSnvmUEۗ3 !!… ?jUԩSVX퍘U@锚$%%!-- ^^^UjKppB[8$ssLb߹L(] T_η~rGf*sn /ƾ}C;w;pMb#m62۶mg} ś׮]P!%%&&&ꫯdL)++ )oF gK$㪒O+eI)<VVV011yWYmLũs Dܿϟ """иqc/^'|G*))=N:v]BcXdggyPJPP'9{,  #%%E)VpttğF_x.]+;ݻwG@@ u;w 8P.&&v<(Kĵ=W4BbѢEz繦?# !Ja` ?VZZZ .YII ӧO˭2d=,R#!!M64V~Ċ+33Jckv* w3"/'<<y*CT) II=P\=,(+”[\*J> ]|O+T$UfcʕdƎ P#?? àXV3gĦMd߇`֬Y*S6n܈SNɮ `ժU GTTcU#BKNNFǎ;$GGGܻwOau>ۻw/s 燐_a.6̙___\~Rׯ_k <ϟGAAqܹJoڿ? SSSmfff2d?E닸88q,^Yf J?+~}b޼yȀT*ŕ+Wu-.\@=!hݼ`8x 6mڄ\"44rW5g&LQpUͳ 5j|||4c7n{^7oŋՎRTb?iTF51^܍lH$ .a4ۥE)§ `ll^ >r 333X[[c޼y>}:dqQQQ[,,,dYFS̙3ɓ߫mcƌ_5 7nf͚#aaaMѣ>{UL"8h l޼s΅H$B~̫>a̛7>>>… ۷#++  jnbkbĉ044?` !D077[gee88}4`eeu>1h L2&&&011ɓ1x`|ձgTQ7* <4۷ZSqV1W;B:6-@făFuϔB$=.*&&&p8uTD?O]7B CRRBCC)ukTͲzb`pW8&h۴ 04T\}n'/ P$- #{ɞH$7I='bɒ%ݻw1m4'B*k.n$O\'{Mrߵ)ڷ`b`dd###nN+B!6-3uz#!B!z{B!B%B!Jn &R\ǣ5\t?l =B>j(`Xa# ArF[ݩ314lm- k@o:DV+́kľbzÇѽ{w|B 0)))rwq`cc;r1ٳ'all>gϞU;v\.۷DZcǰxb4k ]t͛7ǣ_~011CΝ#374ioooWÙ7Ŧ z{S 21_ɶǜ>sb 2ԯgs?k7ƞIޝn%~Ϻ kݚHO?S+ Êe+$=ucΜ&+wL6 K.C֋<|N*9n}2&?EGF!}yF68;QXߺ3>|Pcq}ǵ_O٠_{#jV>uaҥKqYȶpwwÇ#??QQQ8rٳO`dd&pyܼyǝ;w0l0<|Cdd$_I&ɕp Jq]GFDD,nшƎ; !C`{C(tk+k_beW_O_p\89B?lBXVt]=ؼ%Da?u . K KX,>7}f}0vaCcKe1<`"2)c;~#B9:?֫!0( .X\mEeeg!0h)3Q:_ `_dDekib}v8;;p B"`֭޽wiʕ011e낂`bb#FbΝ;re-[yDXn`ժUDH$Á q<[էu+g!ݺ}}z{,ϽSn]soum? ܺ#:3v8Blwy'ӦNG׏:/"~ڃ'OTrĄR3=(, _bd+**1z7h> w>|lH]lu?}:M۵k'Z (?RٺWzꥲ о}{ٺ#mvvv>/[0000rׯ:t cii x,cǎ///Bbxcm"UQ2d4[wk6đS鳧й V[UIR3ػ/ ǩcgaoQ-q=IIѲcF[\]ֻv'*-[O_N{CCWx [:errr0RRR"~;(((͛7i& >\C.\qy?l_[%k^E t_({;{"#X]pBHc(V/GlL[i\ʧ|`F[٠O#_ oUZϟ%"!>>WoF.]otԩ .ҥK:tʸ-[ĉ?~M`E=|~8ztOS`Q>m,}͵oo|bi4lr→gBB7O3sfͅ{(cska_-'R~hA \`og>?EF/Ѹp'> YϘv^z}p1҅*-[O_^?288<HHHT*Err2>sYҥKa``yŋHKK ```%KT[[pnBII RSSO?gϞχ9? t͘0MD0ܜzq0ws !BW Z9B!PbO!B8zʨaĎB!DoiO# \BBB]7B!TJ8n!B7p4bO!(og~޽P(P(DnqB!u-99CH$H$!C\egDs󃹹y>9% \UGO,_iiiHKKC`` {̘1C.xB!YFFзo_"55233hVVV|}sJ미p1` 08wN8Q%B_HHFYf9s&Fj)> ڹ{.Ѷm[17pUl2BmBK.֭[gXmpssǃ)Ftcǎ\.ؽ[, ;B! >&B! שS111R}A9% \UFOG>}ڵkadV,o[v-BCC૯m?s &Me˖!//Gի믿M6!;;Z!+%%mڴQXTK~zgŸ$J S3>й8000hNsrr`iir{FQ]QQQ56l؀͛˶#<<Æ  22SN={K.Z!bbq}}ꧯ}78~5 =`WPVL w3 a 4̋I}E߷!++ J̄Fwvv\~u >\ܻ!zw+T$Z"HnĬ*egk|6TB}O %` +Wo=0tߤ`7:*Ki(..FYYY]Nc_m;wUykuWLk< (Ly]9R{q=߇c}}ꧯ}Ӊ^ɯ~p,b#f{n v-b-|3?-P$es%%%u}X*sM+V@aX,Ɗ+0}t:U_R:u7TB>22Ruv*αX)`LZ5zH`.|3=X~ & jA]s#^HgA 4̱^za޽;ʕ+o!Cmmmqxzzj}O1w\l޼nnn())ABB6n܈'OjU!ٳ{{{L4 hܺuK.*MjRur^yXiz5kB)r)-&Xcƀ)ϥX)JJJ̓U;v/5d̚5 rk׮ĉahhubcXh,--aeepEByVVVCll,lmmakkӧO#..VVVlWqzme>׹gY&7 M̍QP(?xBI!E&#\ 0%.?v?]ۘ6Teľ_|/Bmܸq0n8缻*맹BW֭վ\q?~|jGޟ&>%(LcrLMyZ4 N^AVnr%CSf3 ^+oH$)9UM !f׮] /I$M\cW3*M1-6f((z3R ?P 6_|'EAi-pco/|^ڿψ=!Ґ$&&uH-ӵ>ש9ǯf0DF"8@\Xf~~=%_Dg.[yH$z?מzB!3",嘉REz?xuk"i^eʽK``,ZJ JkNs !Bnә8ד_@#<%史L}*[X\KqZ ,M c൤ye2eb_fI >Ǐ5\.ڵk0&''cСDD2dk<6ڢbbb0`XXXwވQ[\=IeȖ2|Hy!r^3$gYȖF&/J.(}b_"KUy*̙3-[ -- bNBN0{h%!}ӫW/Gtt4: e322兾}"55߿?Ycq}tR|wӧOE!44r14sزcwdKQZ\ﮍ^v pppP{RCťls_E&R86}Ԛy8w,Ըm[WZGbe@I~*:sѭ5&&&5zlʕ+pww׸dkkuFWl6B׮]W_iUu!bV{_~:u*͛Wi`8::"00<<]vœ'O//Xܹϟ88Zl J6>W F C1^ _wj%%(*5-1r㚛 G26_hS?nq!6,? 0HUF---5r???_5bWCųX,߿ 044DϞ=qQ222`aa,BH Vp HԖ=u{{{Mh> ł `d-љľs+Qř000-:߯b nk l# aWiGf+-2~֭A޽xb۷>T۹sg#++ 7oDaa!,XnM⃃i&dgg-P1bXXXh}Bj߆ 0fq)))hӦzgggb_lݺ3f!ԾH=zׯW+! WmgYYYXt)t,ZsADDDe53y90I䖕/K_!Փ0Rx6_տ266ưa(M62e,իW2e lmmaddHW^)Sx777 .ƍe>|vvvرBŒ[( &&fffjU%F&RWmgall ccc 4XrڲLbb0%Ce%Rr喝bl9 Ҋʿʑ`|6ec7⣴"\rQV"$9m8ʀ}b_"W:l6+Wo&[7vXB?`(+S0M0bx9`4ZO) - Exx8ϟgjGGGܻwOaXcq}tpSNxQe53=PgI!-ϳJt&}zE{cӯ?,fz3!g$#{all >7VŌ3PRR>--Mn>˗vZ899+… *6m, sEXX_ǏcĈ!Z˗#..ZҸ>22h>~TF51^܍lH$ H$8w# 1SO;@$:wzjŕ+W BBB6m ,Yk֬QY222”)SpqO!vS ''ҲVVVCll,lmmakkӧO#..VVV5 ssm>޽{sN -Bpp,U\3,3"U1_gJၾ}HCQ1:B:6- Kfăf%3IxT$011é"_OTVZ$wB! CRRڷQ}.9 Q#Nq5XO+84Ǔpq=7MѶi,,蔖J eep`d!:3D&'ڋGhh(]VM!vڅݻwu3H-ҵ>xwmc-8t9q4)O|ȴ3rK )~Sц< ve`l̆PX~,ͦ^X,4mw|P! Zlb'sl6"^|MJpҊ4Dvm#lyp.üy%%!=B!DN<hc[fF/DRƍ˒X6 %%%066áe !BNľx<x<ܳvjB!eNԄB!J !BB!(o< IDATBʅR?a79סT!6A2 "7a!Hy\8ejc8p( M4,NT6s4*FhSvܼyȡ#ѫ RR(%>~u2M}h?Ϭbi@`W}:w kʶÆ >= ]֪ܾ,\W,rmk nLHyU810xxxo߾Uɱ<_/_ĝ;wжmۺnV<'EIХ5숀{rbI2ŁZJg˳ MX}=FeJ*lNGS nMũK7I}m5'QX?{9hվ%"~ڣPc .cOB~DnZ`ic1G"=#]s?KS,pj?AH}ehhgOahoqqLq>`Ǯmh8wp=;嶳,0 @,,Z?lQe>;R5)IH{>S W7np 畁 D붩\Յ:I+bٰl{TT,uXd 8|0w>P %%E#374iooonoG~`bbΝ;&mk ŋ/Pٺw/cwr߅GĮvGb =vD32m,\y8n5UbӆPdý)`dGA ƿO5lőڏ:GbW0smٹB֭㔩}>ݰ{vF '-{wC9:RS1ʥɥy΁4q>M35BS;kgp$q=ń [ oJDJʛs߼F*rsUAm۶믿FZZ bwELL 󑙙+WܹsXnvލ,]gϞlѣ;v@,#11C ŋe1oObF . RwEzz:\\\0zhDDDhtLyf#:0¶W l f ]KWn܂BɶY?cr?G"pRz"FGp8X[Yc 8+# < &"p8t쎨juuR߰,pDpj瀤$,[\n@ @XqX8ejc?lBXVt]=ؼ%rʜ? Y˹# n{O')/--ETt$>6/`bL<D"D"sg (zįǏbZ}ibY/ 8fVcpvv˅ƍ퉉݉D"p8/^Ԩ˖-CII BCCѼysD"[WĮZJcz6TMnjd}8|>u"FZg^-7?cѭ;sG\VrߛC,~nQ'EO{xMBi>RMoΔۮӻ4S6ϽSn]sJ)3s?o)wW}9w/~Ewr051DXl3ѱ 4UF}^M9֬\WIFnnUktQ eqU9EaI`N3S3U s4=_|7o6 %a߮];Ay=߱cGB!\]]1{l<{L6^~СCtKKKÇ5:mCm0IpYY^+Q'>u7}f#N9{;{>{ `7LiuuRSk޾G~En[˖BhQ8ejc)A2<:*\|$;ץ;Ot1JQ~.#3$x2<>{b={c8u,nSe+U*:M߽) ƌ={`ԩHOO0()) ;Fh8cy&6mڄÕ?H4]ꎩP˂ j_4~8ߙx|Eހ/C\:W7w?Pnz#IZ)SM[~In]ЮmJ)jW&o(č70JQ릒~-yc(V/GlL[iu+UT}NC{*εk ,ܺhٲ%~g!77ܾ}[K.6XF㻵ñ\;a٢=~$ bg|?_T*şׯa?̙ec~\$qEEEň>vO3.GAA9صxsc&QW!ň1%%/1/f#&"7/[~ š_k@35wo|ǵHR\㋙~z җsG 5.X,Faa!b; ޘ?gBcq*뿡#8cϛG|kz~?lo/CWLT=K sZ-d g&;;[2z[=̆ ֭[L6mʨc;ddd0LLL 裏4jS||}۷OʎI6 R'4-mSTL|> r|7ڛ4q\][B2-###Ξ.rNg<{a=z1G2?K eDB3p n}IRGN1}z{1|>KGW&L2ػA f!#1wWWYyCRf3-C+ĨYnQUN_- sIwOO1ƌGnLd.]TZy-#_tu`8cfjzD(Y>sT٢.<yQnLN^PUٶgϞaƌT*E6m0o<?^:]Elٲ.\@VV5j}bڵh֬Fm~:VZx6mzꥶmxWu:ˮ/?l CRr6mULйkxsm_PeTS QjYf_{{˿l@Uݻ7z]YSնs8rkBmέtG{B!+/|!sP7ľ=0%??[-$BTE``moXoߎÇedd }Ejj*RSSѿxyy!33kZ}O|||`ee˗/W\}kSbU{;"""ѲBy_@QQ&Nqp|rBBB0rH̚5 055̙31rHTZegݻ D۶ޝEY *" eHfc}էhV,ԓii\4s%STD6aqXy=y}]u]̼ZemCc{FS-_%$$`ذaNCpp0&""R ̚5 eΜ9ׯ#<<\zLL &L`„ زeKl](u7q/..Ɖ'3`ԨQ5*;f >/_FNN.]׹MDDl*LˬZ >ٳgѽ{wݺuùsܧeR͘WFcT]O3OǻUggn%>>'ޮ}8p@sE<#`ݺu5n5۷oӧrJ˘fDEEUMh]]]a4ܯeRn̫1W_/!~;r7oބln&QJ~L&зo_̚5FK/ .]mWWnM2+V(:[nE޽ѺukmZf)[:vc^Cc֤\ÿ_ 눤?󐙙zl) K~VEѠsXl~' &&A޽hDDJp[rIIIի>Z ?|`*bkٺA(u"~SґX,U.1x@{t+7[γEEE5.ӧO̘1k׮Ç1w\Xޚ~t>|ÇpJBDDDml]ꠚyu:~tW-%lw6ژ ЩC t ?팻 .F#mGhVZu즶koeXp̜9>|8O~b`ǎv9)Tdd$Ə_2W^y{?~i(UTI[֤JsbGtwAь^(.[U\KQ ?2PTlA@/cf(2pZ&~=x K>]@J bSq41Mn6A_9;;ch۶--[VL2gFѺuk㏼*W_}{>>>ѦMi[nEll,|||eff˫Vemc)M]P;Č}3W-rmN[ "th޼9JRXdθK7B_[pO{{;/U6{RNW63~5_eGDD+H""ޛ9Rm]bӦMU扌ĉkU&^Uǖ:81chpC?C-۱+-Ys]F~pAD`8{1  :ٗS}\^:3DDDDPJCw{Bm.9VsBa ܀m[{Ōr|Ew*SCAj5ŹyR2}FC-g쉈{$ڿt㷳9P?g'UbEe@_rsz,&q-g쉈{ZApMgٺ<tBdVWbC~ [qm]fmۆ#FØ1c}v۝lO}ܵ%%%aȑpww;F$K_w%8Ksdw1gSPMSVqɒ% Ő!C!5!"x(m=w- .KXG~K" f fϒ"prR#HpU צB·[oW1DZsQomzQYXX `ʔ)6iqk!..jG}3gBR++ ^^^5*駟bҥ0`Z-BCCgY}=Uh 8ZNҭM?}BBBj>F}"FZV;aakٺQׄh~5Dd;T*jtgΜٳm߾};N>iӦU7|'N?|c۶mx']q'С+jq8Z/d+(,2m3$d[Ӣ_FHϖV3nn:*Da ΀-Z"zb+/ +yf͚U{bN:riaaa8qMuVo//*?~8rynȑUQMm֥&FC! q̕GD`6p IDATvaԩO2+VFr?O=ϟ{-Z@1gN^cЁFѭqof{䬲z-ΥCOwJΗUyayz SL y6e7r/Wi^WVÞ={%jk婩 @BBUzbb"R.u4R+ZF׮]zj|%%%W^VUtޣ>}h4"??`v<ثT*䅷`it",>-Vk,B҅4p3j Pp|7ZN-I8윒kmgs0Fe)S`Μ9(((py> ٳ=z(!~ӳgO߿\9rKEEE!"".eR- j:vse3Lj*o޼yVO$?9'gKfff9sNcX$//O|D~Do]b|ٺ3IߐsIx!e㕇䳘dyk2pگ>HhYF[AA̙318ժm+yfʒ|9p<@D질Ț5kcǎ'EEE/Ym۶+\]~,tttY<(EEErAܹseMjjnZ.\(YYY%-VZIjjjZ&uΖׄfGؑ55Jv-FQ СC&3gάlE/h({[oUmbe'?J""fYe{䑏NJԶscշ%#kӲCEY7xdܒ$ifq)L^'|M'{!زeDDD899I˖-G-'ҥKSN,|rۣM6Rj4.:t''' %KVD!11Q.nnn&Æ ry222˫Vek"ս&,`~5汣#&&F`0` Yhd`E*ذaVf͚C=$6YO64wTUbt<1<6+ݲ D,PERo,7d]ػ<== xzzUZDGĉqn QYd Μ9ŋ7vS]1oz{kz*n_Qhկ`3h+HA䮅&Zo\H`۶ 8t2 nnn􄇇\\\j=5'[o:u /"{nQZr%nCkz8Mb{U{ƔaYXw_f /ۈG3 r1o[켛 +5Cbȑ8<.<"jPݠlcp̛GsEj1.8y^ X`1[ A`gZY-tprrjrIlA=L4 &Mjfم{Jw']GVVL& xxxI,JS'"""R@z{OOOxzz6vSx ꉈi,$Jy&3DDDD=20o2ca<^`@׮]b߾}vlehjW@;޽{1qDB{%KPrT*U%%%aȑpww;F$ckٺahUGǎc~;z(&O //*mɷ~zⱣ;I&ǧC[^cƌǑ 6`ݘ>}z5d=zM \%33ǜ9sdR?\ȼy͛RXX(KBBB*-w' %ǽ괪CAA̙318ݻ%00Pn޼Yv$3f̨6)ͬYbKKNN___2m4iӦɛoiuV*܎ǎcxlj]~]<==k՞ˎ;TEΎ(*v? >>hGy_qwwl7o*뵵l]_P#;[_lgX… 2fyWjܖ_]J5*5[`Zڵq/R.Ν;Ixtdggs='de~71 _i?~|R*< .r_V־{@6l rUAUzL"9o)''')..p[e~7e˖ri7o{キƍ+mˠA"%7={[h~z\|ҶSddtڵIQFɾ}@dݺuҮ];ٰaCYZ-f٪dFSeݶK[VZ' 'N6oei''' ծ-Ր3~e?o#ׯ_r{dGK^^^4(zo Fz\\\*ۘ꿵K/$V?c@T[}ryݻWH["5±#;{؛fILLyꩧjԎM6ȑ#kTל4{1bك߇`޼ye:ٳgUfϟ/rwm_}ի <<nnn ++Wص=5UƾUhh(~sz{X,ɱ:UUW-OĠw_tZ ~gtr!!!8w\HHHʗ*ekٺQx쨶8MZF׮]zj|5*j*<5*sk=u BCCo7 %%*_VVU e2\U I/k׮Ÿq닼<;v ~iFj(ԩS; ##NubϞ=ك=z;wV`>|N~3f`ڵ8|0Ν[纉J-^gFll,tRGAv@TTU(DDDT/[֥[5єǜd2Aڜ?==kT9veϥ8),,ҹs粴0 ?Sel۶<~Ҏ;fIUm,V7oޔH Z|w{_:t ˖- .HaaٳgO?:YftQ⤨H߿s7ov/R'xl;o߾믿JAAʎ;dذak-6lƊhY|U`ܹ /^6#$66Vrss%??_m&_IMM֭[… %++KdѢEҪU+oZ&uΖEmHS;vdsckCUF%w(r! 3gڼO?Tf͚UeTC}]ٵkd ;w?,޽{EJΝرcR\\,/_Zᄇ|SNe/gΜ'|,OI ,ILL:-Zr*ڗzH~'IKK"ٲe(vwUqJ޽[Ǝ+Z'''qqqݻ / ez-]T:u$ ˗/?JPPhZС\;wU  4 g˖-Nwww6l$&&V}lTR@7o,aaaE/k׮gbb >\M & dddW$_Ely1Tޮ\9V^1cÆ {nL>\>Seq6E9i4k,YP 2^B `L22 1N*7N"j|Sok~BPPt:n|oBB OOOt:#::¼CR!22!!!pssF-DMYLL &L`>alٲ.eR,[ jܹ3VXQn{iV \4 !Rܩ^H pU?vl,k ]~;B}\g۶mx_""" xGy*1c0eDGGCرcX`ƍWzΝ+Vo߾pvvU[h޼9 _/~Ytݪ\npܹ*mkٺ_?DTT#G`ܸqpqq){}DŽcL"/bxꩧmS+"WvxlkNBFv1^+/=s#W`vΝUVν{FTT /G $$֭q_}:HIF^{ }EAAoߎqa5jh4ժ+Fcl]OtR 0@dg}w}™(ᘐq̕ojժrە:b`x赟>'BZ a2b*{`ٴ D~Wt8 ϯƸW@bJ) KT&:ѣGDHHN8~{~OԇGo.¢5_c}pp0>\2}3vZ>|s-RLv>Q"%;rڵkWwDDEEE!""}Z.ubϞ=ك=zTY&혐q̕d2AՖKSwxx%98;^233+|̙3Go.4j]Nʕ9?\ؤ\9q('.ٔ<^ i&1YTr,<\*3׌r15_#qȇȆ7d:|3yheȟ-Z4L gGm&qxLyhc3v,|q##{IBAEdbJ48y4<^VSqIXA͐[hz߃moN7DDDDI(t  YFuGn^1jVN]CWK> X0{й " P% IDATh,3 L~n*\8GZZZcw^qƞH"by{w5AD+F80x06bAлOjc`Q:'@UpѪSNN*䨚#%%_8cODDD ؟O@㤂AI'  UIp^pZgE 53 8mi5_X# iZ jp~h )3DDDDW)2az 9/@]ކިՀ`4ϋt88s 2jo͜ल@뤂7 W!"""RרQyvw-iKfՀH87o'|0.fEFOV1jx'X%?Ԁ>Z5A笁Y nW P~ пY*-9$9pwwLj#dײuOc}kO+. 5*5pO`eGƜ?^`NH3/@ Y' w֠$:|4oݯW]cK/a…={6_ׯwo[ Np 2HNNСCZ.u)u"F )*FEbhTdYk04H/=A*4b)Y*pR*, AJ zg5՘]w߰avڅ{+\]]c޽رc6mjw%""ǷpB;ӦM'<==1uT; .KٺA1wwȼ /w#n'KnD*yNgU޾Do)SPb3t5fYVÔ֭[7`O^mf?s;pss憷~K.zJUUTT^OOO;7n(租~BPPt:_ۮRAԸODDt`„ V&L-[R.u)u"woOd']~w&.Z5r򋑒Y"ŶtBeJF|x`oPv/){j޼yXx1qYxxx^(۾m6cl߾lܹsj*=:{FTT~rꫯп8;;׸?DDԴFZh4ڥl] S;D`ѽ ?/=iaHKuY{E_dFp|u:}(23~e?oլY3dddTt4k̦uVo//rѣ- ɓ'˕ӧMݩn}Sҝ@6eRٟRa~q3.* <2 `27 @rɬEW3 ꄄ+E8fF˖8g/ P2[U߾}sJk.Touo^999r'"Gw5$$$X'&&" .eRٟRa{x-߬Ãq<Մow]o3gXhFzN1}) ߏ Xkpթ DLGo\8} mM0| %/C^^6ш{/RYJTpp0>\U'""QQQVQQQKٺA1w;ϖر#x ~X {Xhpd`,Tr (2Κ+*=;!! kfC~G]ׯG}[lAb_3gDxx8FQM6صkjٳ1}t,Z}dB||<>l޼ٮ""W^A޽~f|8~xOVZ&uPS;Ԍ=<::w}wcw_`x7 ___[6m/^\.yOB8`7DDDuXl߾mڴA6muVǧ,_ff&jU|0:5c_o3 VD~63s݁KOLǀnNZ'89zgZ gi7Y:x iqx×P5v3}wzSؓp?LV-4hT*Ipo]|lt`ԑٳgcwP+WI")CX3? w'-0,(*@XT@1,)7@D6xŗp=MhcЁ=j o??؇}"jfͽ,*EFU3SZ; O⮻j.ՙ:uꄗ:u3HNNFrr2RP\\ @}ڣmвeKtn2(&/=Qp$"""""k 쉈=0'""""Rz ### WWWh4}ׯ_RRꡕGDDDDTz -[I&a̘1vq!QQW/? \^Ʉŋm۶pww|AY>@-[ ,/ju """"z*Έ#g ..>+4hP{~wqq沴CzY\p|Gѣ,vK<{+Po߾_ZtzLVV<==kUGun QlѭUtС,-44@ɦuسgO8qDYڭh40((((K;yADDDDd/gݻq fdff?(;w\zˈGqq1SOո9s@?Ʉd|7kHIIkfK,Aaa!Μ9^xn """"z ;u+.hZt ۷oǺu/ׯ8`=...3f ^z>߿xa0Я_?Ĕ;iuĈop%maaa~СC;O<f̘avKRUٳ'֮][v9o߾6?qDL8\}Νm۶jK;AQ``ODDDD 쉈=0'""""RDDDDD H){"""""``ODDDD 쉈=0'""""RDDDDD H){"""""``ODDDD 쉈=0'""""RDDDDD H){"""""``ODDDD 쉈=0'""""RDDDDD H){"""""``ODDDD 쉈=0'""""RDDDDD H){"""""``ODDDD 쉈=0'""""RDDDDD H){"""""``ODDDD 쉈=0'""""RDDDDD H){"""""``ODDDD 쉈=0'""""RDDDDD H){"""""``ODDDD 쉈=0'""""RDDDDD H){"""""``ODDDD 쉈=0'""""RDDDDD H){"""""``ODDDD 쉈=0'""""RDDDDD H){"""""``ODDDD 쉈=0'""""RDDDDD H)Sc7+(()DDDDT ,@PP+# *l^X""""r|\cODDDD 쉈=0'""""RDDDDD (qnF塈{) g̘MiTgpODDDM{) )*44 쉈``Oln٠W ""rh IѦL~@6X=Q0'EiK[=Qy\TK&yRK5DPQILKMKQ+{H 䚈4oJ"d,l3:a&8|ޯyɜyϜy΁l@THH~`O6 '''kGGGbԨQ Eڿ~h(m`~1J9sT,KN`lr2/֔wt >gzFY8+#{"""1Wq"genwKhnܨ~m_RBddv0Ͼ@C-/3@Q^=c۶m睜7|...[tĖ-[t߱c<<<ĚF1ȭ3mMjt#Zj}_<6Kj`O+W^)!_}1{lܺu ۶mCll,/.::ý{tMMMEll, 6 ** wkۇh$%%5qqq/Fm_[F۷HmҸ/4i@\L;_z)85 v~tԔnCN/4sknOc8{1.\`1B\kעo߾v!11AAA:Xn:tPf AN'  OOOIys :5q[[AnnBlhp+.q/Ǐױre8z~y~_֭ҥ_C+c=q5L :u୷rL`_Ei888#F3ϝ;#Glgo/ݽ~._ :\xQ|]JjJ?6s_}Eo6nX%K?koX4cǎ*3xV>Ҩ`/gI X,\y5w,]G5֮ʕ1V@V*n-QW&cy쉈`_EUV#??k.Ǵ&Z_w6p^| ^^$ԫc'IMy_'O㏷ȕ+q6˗QRQRs&},=8Ǟj߾=Ο?ov;Zɓ'%ѦMq۶mSc .uՔ\_ƶmooƍcp9r6'5FV#%\dM`ODDd.{kܹq(J:tQL< PT̙31efڴi CVV^ieV8sdӧ$ۖj w /*{ׯI3-Z"+댤&+댤Mv)w#/%"">{K.ŲeꫯiӦXr%ƏםQaÆ!(('N &MPɅDHHƏ bҤI6k%["؏7K/@vyT*?-l[TƷo`'""z1ؓMc`ԯz{""g=4gODDDc'l| d PV`ODDd>{Ix!sd?zշCDDDdu d9GBrY@DDTixxx[nɦ=za-22d{{i>!CDDDDDO= `'"""" DDDDD60{"""""`ODDDDd쉈l= `'""""=g|d]S 2sfmޝ;Yh48u9= "sYx`_K`'2@eҥ#M 4i5k@_>ݼ+z(D8acO{<>Z =Pw A+ \Z 6z~CgJ쵡[n="YN̰ڱ)V~-i4Ƈ FcU<4ŏQ[y{""d/&S WՂnU쉈lFcZH{"XثjAk + ]w_L$TUYؓ>|B[TMK [| ۴D`gjYSc{ Fk~-' !{&:o0rH8;;Fh۶-֬Yz*}]`ԨQx饗pĉr$WQ|LcO͛7cРAFAAP(:<˚ǞFS~ޛ aW>b(GP TJj4m W*V_?J@||U^gAxAPA߾=J7:*R`OIII⿉PHLLwNNNHKKÛo ԭ[W|.%%:t3<==e 4@Æ 1`\xǎC~5 EƬ5w\:t;wFjкukl߾k׮ԭZ ~~~ /^xAAAêU;r>ÇkFڵѻwo8p1#99v킷7j֬5kK.صkRRR,\x/F6m d<ijxбl,{}=z4\]]͛#%%Ev<˚^a@T]" BQWQceR(Ba/W3h؝R AYm,ѯ }+3"|Uћ¾RwnY/.oV`OIIIشi[*@tt4"""'JMMEll, 6 ** wl>yyyͅ}],\ ,7gggZlvF!^n]||recؓ5Y+L}gŐ+#(BJ)@%ErSb>ۓ*5 9/{RYE h}EMI%o,~vXS/;;99,[;vDju ANPzuxyy!::ׯl.]Fxh"ܿIII:=jKah 6LڵkhժNm˖-qu222T*믣VZ]6u?1m4 :N*OSķ~!C`郬a|uȗɹO.DzxIi4ܼy'N2y o/yE *~KoK콟ϔ %oYl7Bԟ1 (b~|Y{#A*^) Paw! ZѣG GZ\@ŋ%Zh!y /7o@֘Mcݻ<@ڵuk׮]oa…/믿ԩS_a̘1eQnGFF%uܹslߘ>4((߂[Fǥk\'cJm,ѯ EO _л)J̗x@BR}k  /Çx!oa֬Y郬YCr~c >6oތ4tEr_ZZ-Y<ߒwWo%XXWvXG-yf|g:ϓuY ^<Ǽ(̫sޥg۔~5 5ɝp$s-rW^,7J J X.ث(k?-):[T ؔ*ҡ~ذa:~P(̄JBff&fΜ)SX_ccɒ%8zwy;vYc;FgϞթ;{,4iRxa@r +묡ł|u,ؓǨ^#yyiʸ&MG)"RULzگFAi8P|A.ڵgӕ-o"z*aa J]4\XiZؓD@@!C@VcȐ! v6l 0qD_Fhh(گ1VXd?~7..$$۷+>eڵ Füy$|hѢr,ѣGcȐ!P;w3gĨQ,Y_/XX汧1sLxyy999P(0IgcN +_DZt5k6ŷ,٦9@9Xx~T|teX_J*xp׭OxJUtQrb.4uB>)o͛ӧЧORr`/jƎgΝ;ҹCYTѤIXK/ѣ8r\]]ꊃѣx饗{yf$%%ASϟp10En۷/Ə?qơ_~HZ%/L+,>\'wGSrYh8ME{񮵧O)5k7*(f̜S|&_Wa'{;6|۶wKZ9@[h}YW^1>rptt1|LER/屧o~[v=='e?FHĭ^/ݽ |-YoL5$2r&OA'(wKhr(Ak6n~1Bg̖㑰av ޝ;=Oh`_e#25=;6n޺Cꬷd>av-odd7$tmׯO K`'"A54%Q1k{֘a`~M쉈lv)yU[{""d<_{"Xh,ӯ%0 #VB$ۭ[L.##-ݽN@n*z(DYswo];ԡu1[ {"|ں_V9!ю<"ui;~Iݯ0U D[E=;vUfunI0W_;::aC pNEڷľ=ςG5tLZdʕ+x4hs'''ܿ_vP_W~߈D ۷l 4k:c׮h4hҸ!IRnnpԤqC| [W\%o ]ִ|}buOKKE׋kojK"Z6 /"222d{n~hԨ믿JjRRRСC8;;[l[z5.ڴiHwe )))􄳳3<<Zcxxx}JJ6[lA%59pwz۶mSkCDTU1ؓH{)+<ÆBT!/OP (89!aC֭k9G>pf͞ 9Wyv8_h4ܸq3_\ }w/9c%8} ׿gƺ񈎎KqŚ`M|Vk֯;+M\\*cIЯ_?,_yUVaʕu#$$D|>55HHH@~~>6l؀(޽0p@;v ͧ~~ ~.??wޅgcdž DDFFb߾}=zyyyo#,ZHR޽{YKYo0d߾}FRRIj݋8lڴ ظq#%5_}1{lܺu ۶mCll,F6DDU=9FDƏ= <cFݻbݺre zUVZcUD r׬]eѵU&M^All|a]NXSbaed <<:Ao)IX,<=tGHNNk6nX%K?k,H>}GoX)}޽SF>}0x`ܹsGRΝ;zx饗|r;vL|>!!111ԩW///DGGcƍu8xZ&&&bݺuظq@߾}aggWأ%f/^ÇF_>"##_Hj֭[;Zj_o0$..%]QQQb'$5111Xv-5j]vHLLDxxQ!"J8ǞDsԬYoz oz @ŧ+cHLs&^ҷk9/]wrn~5}es4l 0pQc֭Wڵ[Rө7J]/oi#c19{9}T*,\ӧOGjjX׬Y3vuԑL;|2|||$5>>>xxػw/_^zxcǎgϞؿ?Onp]vy+>{..] w_{{www}#}C z))'']t+ܹs9rNQU`O"c t!V}jժS/So`!wLq}JӧмEKq˖pi9,\{KMř5k?~Ν;F_٪U+%KдiSԨQp Ybggg{aN]qxHj^*yܶm[픮)}t۷׆*a'^`= ѣG1cx;w* ϟE _θqddgԘ>11={ġCPPPR 7&L0gyP(̄JBff&fΜ)SHpѱLGGG#""_XXRB!ӦMDGGǣGpAaÆ8qDs7f?x ,\݃JӧO:M&iGڗBsARܹs ̝;~!Μ9St:tQ QU©8$2&̕snb钅嗟QfM5kGoخwW̚=1Qp!ڽ'J6{70"|k׮ٹNW(`֬_hp_e?`{((x0E~'4tqISпw_"4d:n .0a-Z`0cL7DN?|0lق0ܾ}5kD˖-1n8=ZX L8x ???I{g+V`̘1G^d7m4L0?#\\\P(0`M6APe˖ XxdL<o߆F{s7f?VZBCh7^ğ5j`̘Q ?|~'4jSL___,]˖-CVVj5:t耠 ^"ĮI M \#@W jp͚5̧T*iӦf͚5 ÇkM9rb?GaD Ÿ!~n/me,_? .`„ 8uTEDFFFYP\z(S1s[JVnח._wvHۙ;$Ygx'OFXX7n+W 44OfHDp!Kį+z,U)I;s4ڟ ={qM4hcƌA```E`Opƞ*,7:tBX""2=$,=[I`O%g`O" ,=S @Nv턯o UǏ{jw!"""1w79~X* wv7DDD=* 00{"""""`ODDDDd쉈l= `'"""" DDDDD60NJY"##]C!""""3dddCv=֭""""zvyxxNxM/22ҨwiZݺu3ꇀ}6(FFFZm0$e4""""3DDDDDCDDDDd쉈l= `'"""" DDDDD6HnwY*j,DDDDD$S)ysDDDDDT܊I MELҠuJIENDB`eqonomize-0.6/doc/en/ask-save.png0000644000175000017500000003511311106571520015711 0ustar hannahannaPNG  IHDRoQ IDATxw|lI% LH$ @T@ X@  E 6R.E&=RH/;al$$ٙ39sfٙ3wʳ|"BQJ߾򤂢`21a*wI!f߼4JQ"zS{ wI!ؕS\yFNV;#B*B !ғ/Y~@|\?r35+T!H!7-53aoƟf !9iIDhi-Zw0Frߖ"BrR>|; 7ҔWc 7s/r1':ԯѮB!:E){w6H>;O ;{(թN5^xS{ bB*IA<&-m)mT wkԸ~C+ȻjI&z_)+P"Jhո6TdآXn?is?¿2Q?يw<~쟯i;\Z[k彟*z?mqO >\uJ `}䘶L2N:i4(s)FTiNзM4±ll 㟿 i @bOrv7tl+MowyΊ2\o~@T@n[xey.:|oV~-\]ke_D+rrIVѡc)K" r!J\ܬECu#jz\jlrP DB凚btY};/leeT@mίւ+B{ w{aœvEqU-R8ݷzm-\IN^/-/Cnn.!-P&'7d99Ȳ*QBT* ꐛ OU% gBU&]` .>ׯZ3=P<P"7_:R32Gz.w[wImoL*8ۿ!jV4!4 ؅tm)4ζN3Lo8OPEu__`֏9^කdKm ChQ^ljK|6vDrNrE1-oX0~^۞狮]|S]dkrmH;fx~ؓ~Z7EQ39]\G$S)9#/R+:z0Ѻ^5oq6 %/3z5O oG6iҞEә4|n^M=ԧ}<Ҙܜ5&,!#5ُ4:":jg+g ) MԐP?au4 a]ҊkO!r\4Ts,.Ÿw4AӘE;гU2sLdd&wG2Ub >]/K`L?Ée ,rf5,vʽ !6Af&LPrH&'T6ݸ _d5>@t`L\emJzoDgBgDAQh6#ɿZqgTmun;ÑGyU79ouAepj2YY:Eۂɽ`Uvp:y_' 7Nao+*4HÀjnv n@@s7y&g(e1Kz´•DYga]꒙|Ri9\IJ2ާG2UI!j)]GW2쯧\j(1ãVȍ.[M9(jnUqG`L&@!'7ĬDRLl۵amDBزtwuXw8B}FbR&-[hl OuEZՌBtD jV@|Nwn}˼O ^~ wCF!>^`LE)xКοJqe3D[;H./n@gi|>чI"iX]; zO_N%׻E Ү%7Вvp|$pJQd|DEQ@(Dq# ^5ڬ:NIyS7Eܦ!E֮Tg FHH%7#H'89 ')֟1G0_.&V7,cs.~Z$j"mƧ5EQ1o>BG> P(Q al9y&աQ)< :?b0w.hG0?2r}Z QEˢ$\CϢ(堚n\6*zOt(jIEo*yvT5 P$[PIh0?3/k7:Cp:F:SV&SK~7oSUtFM7f*B&v8W,́7Ǎ[TF}Y FooCP)ٛWS=-9]kUl\U(lƖo&6 `0xVkE[R";WrKOVnZէUDB> EW=  |Fq'Vu}iT&QQtzli nѷ > \ukq@atMjN_C'/o:hpWd< S S&5,T?Ǿ _iVfus5hހ MSZQt|yN #p`F0b<-aZKRlG4m"ؒ-hl?[~QiYfn Fa]$1=R`OР#9iI* aܕǗnLE-gĭ}KVb=^=N54#L`Ȓw=X~=ד%YWDž Aq/=*6_!pm1b"?~Zc+'IH:d&?fjrY.޲^^VOvSn 7DNZ:\{j `],X$? Fɼr$LYw(^xU/\~-˼&9d^>Mnz2j:o? x߄Nח')"[4wrϿǹ:|+w'j5_j=B3W(H*S3 Քwc:Eo7%VاFYF {/?O(b5vq`oY^[oXO'ۙ?0ХҲ;>㺜I_(: ^P 6^;8AMMBUW@E7(L!8oyoC~z#?WLt>7,2_Q'5 1 ,:fjY ij7{ w_\mAVʱ iLXu[Ae?)ĉ>zj轪\[޺lv{VDBR1xCt_-K坿-r[D!p3߮[/RkW\VB!*??Vt} ?B!p^wZB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!ДB!Дp$iTUP+ EQPUB!D1*3' '%7d2.'s:QvWiӦEicw'#ZYuShh(m۶eĈ_^: QU"i} d<ƒ.Obbdo'_~?XVXT>aɓ';2e =V\!zUa= B̟^d]F^^'م h߾uEx3UxW>IXXfƍl߾o­*dpGi *A^RL\p֪Uڵ+k&,,aÆq4?3]t!88(>S޽;k&**>̲^_Rʕ+;S5k,v3u ,v 2rrv`` RF n7-O.]"&&7ns=Gzzecx #88nݺzje/[hh۶-ysѣ!!!r}dž {SuaȐ!E[lڵ#((hVXQ?mZ,[H O8^,+___L'|b5ߙ(槟~*2?!![+G:sN(wGFdd$iiiVt®],/Z+-isdzmLLLA$$$711FY[iYI .x`n n ~׮]#''մk޼y[9sݻwdz>kY~zƎɓ9s ~)seڵn:bbbxW9}4| 7n,q̙̙39uՁ`ku-nmF*N)m[:Y݉ԩSl޼L^}U!Cлwo8{,swXˢE???cK}Ss2}tN:iԨ}W^ᥗ^ĉĄ ,}W̝; ϢE={6V3g}%Qp-JZfiuؑXkgڣ>"?cK```uF~ذay_|W^/̋DGG[9:^@sEqiK6100}|"._>}XsVeDKd_㚺BIgph0D_A[$8N#5eر&MX%%%ɹs{yꩧ{,iøqزe2{ĉݻwdoڵ+|g6۫=ߥmKglKZZڵѣԮ]={Zmoѣe9s&ۥվWm۶ѬY3˼d"""ؾ};M6ߢE K~ݻw_;ﴤ_9secϞ=:uj68p3mL*?˗n[wμy󈊊W_}E˖-יs-=z`ر 8UUСSLaƌرEQ9rs̱OEsmСC 0`4mժU4o޼笊;Gŵ\b=s4|on?Rf|oHWtxQxzzVS7nlzV˿"9 bccҥKg>Y93ٺ:Rڶu|2ӦMc\t2֧`#F[nۗhtBݺu}my}mWy@@@y~>LNtԉ8lr-.ӞDK[sa˄ xYx1=aaalٲL:_~YqFyXt)6lG]gyƲ3 \Qڶqt<;-ZШQ#֬YÃ>w}GFh޼9PsVeR&Y:Om, ~f۶AwaPRhjq;&"OغWWVƦzimw Җ+WoFΝ$v^E ǔ#۶mUVeΧo߾:tE1jԨ2x￟דŋy'x'Xx1)))… -,Xѣ-+R_-O&{ϩǛH:GOjB@/T^=JF5 ] 껃ĝz_a4= !DeTQ~;Epە <wH!?E`JZZ `F_}~wGBmE/Uߛ@27d u 5I@b)|[zTB!:Igw,~@ ?HU Ho_ 2H]$0\$9dddToB!|p)=9C:o0 zZ! ____ey@UVvJݑnj( !n+NE4@ܸJP֮=Ma~xNڤɧ6AO%{t44ՙo[n#44z1tP.\i=B̥C:Aom-t3Ҙ;]F`qq~y\˵# Os18@&M>|xA!\z[$y,*jwy``ooooi׮;(S]+@] *zB˂cy~sN?o\7,.^Ȗ-[2e ;w.S}$oB!H^^);;Dyzzzٸq#۷oo)-e%BTm..L&)//2e>˖-]v͊+ȪUڵ+k&,,aÆq6߾ L\tBBBhܸ1=ǎ$,,`uիw1nf.]ZrVXA6m,ۺlٲ"(mc!G .:vHl_}se…dzh"fϞͪU5o}:+W$<<~Ν;3g|7oΑ#GضmfW>nc!]HOOg֬YL82yVuV"##K]NIVUUzݾ};+W2o˖-EEEEӧر6ߟ5j0|pfϞM\n˖-پ};ݺuZ4BQuU+ٜ={/nݺѾ}{7ѣGî]a׮]L81cƔy{;44-["##3gIIIdff/Aؼy3qFËխ[7Nʲe\رca޽w^&MT|BTmʅF///fƌE"==QFOz0a,Lޯ:G… Z%KCf̀Q5kvh4ұcGֶmۖk2`>L'99{Ƙ1cxKBͥO<8ӯ\mO9;v*B!mODEboKgL R[GfҤIs&LСC]-!˂ou[!Β}z#<ɓ' GeرB c.D6h  j!\B!6 .B) .B) .B) .B) .B) .B) .B) .B) .B) .B) .B) .B) .B) .B) .B) .B) .B) .B) .B)+&!!dwW\PfMwWJپc'ǺeՊouw5'\MIpB`!N:h*""-$ЈMƺ*e]UOAד… &ujS'Y2M6dj0o.wU?)뾘={o͚СV;埠rqwV>r[ ̝g[u_NkӦ3yD>re1oȼ r𖏲1>uG]ߤoh,}b?uoժ5,X̂ޫuTɕ 7PUdb;PM&oD&MxTK?YvV~[E|V>vÆٔf"޻5%yl墬jԨO㥗:DgеKG5 kETl,6˗/KSiִڶⅩϓfYʚ5^4iAȦ=+Vy.4/,4nNW_ȕ*@ 70wzV)/qkVäo1xfܳ= ?d3 u;ޘ/?T6jOyO6իw3g>qn[*rbw{pJ۷ݴj}qvYYY̜9j.\>af|Uc-i~_/Oʁ#|3ldYyq'{( }˺uHpQIpξ-%>@<==y3xb0MQȂc[g/F#͚y0oKsqgO|}}1 j;-([pz25ƿg0k֛$^jsoҶ]46m2,]+쇔-TGӟ[wҿ@<<< ߰0h}35j /[oMnF̝e[oMϞ14oނyc۳%d̅T0*zwh UUiS&6cYdNgI! ^ޞNǏʺ=z'f9k,}ߟdk.!!ɦMpeH4h`ߟt˼Ç6=O(2p9+ .Ie&oVL&vn/D~mV6oß`اK\6[>ڶ}d~{~mwѳeX7U>զ ;wWﻊM7~X4mƧ}IHH(ҼY"e<ӯ 2L?p_yAד"n`>ӣLl͏lo"#F2g޻{-T( B{c. ~YL47n܄;wX߹sM6KLYĐ!xdff\hQy`׮4i xxx*۷o^~砂[dvٲ:I$psg_oq=[3d=deeƶ2zpK#c62IKKc۟[[nQpz2-n̜ܳom9_mݺO<qUUQM&znc*:Ρ}L=Ҫe+1ҒCxؿHt-̛1o壬'F[>j}'==I1ryBaԓc2[*kxvDEG'+x~D]Kz` Ft'ܷ_Sԯ߀13erUaߥK7^|Uf|Ǐا,6{;G oP׸CKPF;*>QWUܦNtek2PɝSmsjqp- .ٗGUJW[}B{}YY'ZJDqj1M+8}Q:'Nǟ~ar-t~u} :U¢K4aRSS]2IKO珍䨢(J W>XsZ\?ȕe̅EDgpg^~uaFRWW0UOIpBlW%alA@@ReDEb_ҵkwwWLcQQ]* W>z\P͚5hdT%meס@2jeQ6UOAדj֬)oi*'EaE i!BhJ !BhJ !BhJ !BhJ !BhJ !BhJ !BhJ !BhJ !BhJ !Bh=j督B!*!ZVHB!%a .tg=BQE(-AuwEBQ9I8 IENDB`eqonomize-0.6/doc/en/confirm-schedule.png0000644000175000017500000010361011106571520017424 0ustar hannahannaPNG  IHDR3Pp IDATxwxT׀m!B HI )"᧨E|XD@,H$tB)Yv7TܹgΜsfVqV%I@ /P(hR+Z'@ A%%Iœ cEsfnE$@ 8w QVfߩH}@ U< @ LM"/#f8yT ɲY@ U;H!,4f2#8֨򍡾f @ T2njSa$=ѭ7ƽQ!G@  E@r|#ﵱ㌍+q:w^=ȵk\-(/sG\q@ D(Q$[nUo/[߹| OU}c5;'iG_5qsqGb@ 6GuPnUo .[;e۷^68Un&p 7ft*. ʘPlE+\4HDrz.g0eoZÏ5P~﵁"+0'NةdsN>9 :*Y5SQ._擠S/+WWOWjx\A*xI&c+S]l+}~cfɩspTѪq}z(Kpo ?\4"<۟93ln2Ө_ǕM}1Gj5SQ<䶊Ч(kW..}A5#ߘl}Y!ߘ sAGuZ/ۺ:Wf*DM6̣, u:̘OGa}-?yU֯#Ey\4ޟCoJsI9߾i,M`]G>ِz 7Eo'zmvY,q n Bs|ڜ6uo4εPiQ(8xhB91~&Z_Wоܴz ӊ?3iZxW:ZDɳLHFv:lT zc)C>?z66~T z+8r(m)v[8[Ǩ\y96x'_+5>r';עE3ۆ,>K|#zKd#2h1׏c(XC] QlKK5\!+ ,P(%T._Lt\uwՂ\QD)i -3+ =(}7JLfoMWP*<ޓ䂶wy8v( :~<ڤ_:ZpKFPp-zE?J'P:\/zgNroZ~RSٙ@ ǝKǠP#mW;/'.t[; _s]ۗ|W+9ʽ_&:KvU$)_&'N6iQ)|x-WngtOVP( Ͼlk J=;ф} b2l;>hrd7?;1*[^%P(p -O<ڋF"_+Q(ggX壛ܸ :UGU(Lx߈n_pw~gǂ/(C?oZ/|u>oν_ %/WO`AiUHb\|Œ1S(5N4N(5 | I$kK$Tv(P( $ء*@@aRsNf8DC\rnLI}M/}T( .\mdBڎOZf6QR~Rt_@izbIZcӧHNhPof>-bT}k,-/v;j,ݥo5ⅯO|uލd8sRoF OGfz\j+pN\,{n ӊ1_!9,H pwQ:\g?-GPpJaB*ar"[FKLmGY@8&mwl6; |;4 _/W)r;4Hw>vh7fnބs +hT<{ac>}{ERr$1ki٨>یvhTJܝ5tjAHB+IDD-{-\4F+ջQPo,7T{k+^ڈ;xwg *n rwX -Fvn>ЕO5ӧiLIi3 tW`Rz^uڟE#"8DTv] zPGjQEè 䝼UWہ [|=L#M"oƊ:F+m g~ I6kı!g7κKgP;V#J+mwY%ל|( \+|8?BK8cr mm|CVzoJ4*;2>ĉWʘ_?yCӞvז㿫i9[`+dovW0z֟8rgF(4ƺvresV.5<Ѳ>Jvc8CPqr/!3j8pflHţ40[I2sW'{R2;w돓zn &FhpVv\~r4DƴwTrzo̔AFV[Qtjrk/4fXQ?Qm6)r3n?+,3/~ss{~^'ӢotSǿXsfA!~wdix3~ׂw^˅O{}YAiL!u3SɻV (PԨ4hڱٙd8KN-ٙW48B\ C j 7 ǦqXܶY+ےBn܎G[piRvj`mnw'N*yYHȼl]bU]dQ '~p} K.7Dek@ q9V xk%qǰQBQê@ .> 2EX`GYh);::U]1ek@ 5jfE~o_&sn[@ ʍ]8vcSm@ >@@ F$@ وQ @ < @ d#G@ lD(@ H@ ɣ@ @6"y@ F$@ وQ @ < @ d#G@ lJ<[,ʒ_ƍiZ~EMo+}DT UԹ$Ǩ@u@>NSRR􊩺fҤI|wge:O<6A@ĘAYPQ¯[Qm.[_r6mTfߓڲDV Tf1J K&+Wsxyyː!Cq^?N:Ixx8˖-(IU7o<<Sr9uQQQDFFr9nJVVU<={ŋ>}:k֬ѓah}Ο?/͛exRdku9[˵9vZOW_}ǬYn\tM%_L[@|tt47ᆪo߾&e>cB̙âEHLLdL6kˉZceU9V\4rIڱK%AݝݻwӨQ#]ݭ[ ҥKݛ1c#8pcDzm6wᡇL:X}-g߮]2zh $ImۖzO?ݻwP(Xx1ǏgFdݻokqFo9a֖Pp,""'NˋP^=MӣGƏOϞ=5+$.إ$XGm1gwĉڵMll, 0:`55ncĕ1gؠv/QQQ̜9pg4mԨ s;/c:u*7 Uc1]Kz~T<}fεiH؈<;\fMKsqqq<)֟ =v:tЫС 6ٷ_~^yf<==yYd 6mk׮_W_}d?qڵkצgk)E~:~!$%%ݒCK.ۗH:uDȑ#tԩTcҎ% 9v).ck[xڷogk~Kϒ/l1/9ccw91?n8͛GLL k֬l!GXuKz*ƏϨQlo~O2djuj!C0uTcE=z4őK\\&L_zضm2,,ӧs-ذa,;'dܹ֭s 6oތUDGG3~x_rrr8s #Gjl51q!.%>l-9sW^a„ ߿_Eҥ gY۲bq%g?KZ ]ӿ6m̙3yuE):wII[ѵ}Vg=J#]<-=8yR:v(999IR~D~R@@h@i̙&)}SRR8N:q^'$WWW)11Qvj(M6M3kJWP(d~)**JMJ ,Z+VH>doo/HݻwcU?)))/5o\|}}9sX=6k|_*ƅD9-ٳ%???]zrN8!Wrqqf͚I/6c[k.+r3 KKb%] RRRӧO%5vtjgXcTI~GOyp.)R7VK=J6ZP>|Ç{VE ʜӧs).\X*b" IDATѪlkբBXȑ#0a~~~?~qsUZ@PܹBT=_>"ytڕAqYy=ztE%e;^^^̝;kUH+9O>dLjkR=m-@ ܈Q @ < @ d#G@ lls.\quuK@ 'KӧOgԩ;wN/1c1Ν#>> {ǻ˙3g8r7XP\Kc"22sαuVt,ɷ.=7| .l2f̘[@?A}}5{,۷/~o>}nQXuڵL>Jfғ!G9me 9s쯿"::/yfbj/K8p֭[[m+s(J~شi麺7o?~:6EUsQ̭Qr"TXvؿv'=J=TR9i7X;B֭˕+WP_wᡇL:U޽Fܺu0.]sww[~.L("""wwwgΝ4iDW?vqzz}E匡8DDDp mK޽3f <́;v,۶m |7sLÁ{Y|9M65SipQÇh4z}\Y[]wĉڵMll, ɑ6r29֣GƏOϞ=ʰ\ə&}ё]ve 0Ih۶-o~)wFPxb?Ӎƨ~FT9XZZ9s>O`Zxn$l=nnndQȱcС^]HHHЫ \fMݥ.) B^PXomE4ׯKRR({%]xg +˸q7o111Y___ܾ-!44 V^ "$$Drk||"!g9rN:ai\LAceit\]]GQ~zj ͛gɒ%lڴ]~z^}UYQ,9c{9kuٙRI $SdǎB( Jel[iCΥKHII!)) VkS=jILLԻw o߾=zWh"FQ_f… ,`ȑV/[Ā]loeB$:SsX}Yť q#66 bbb6lÆ #&&۷oOǎKGe?7r9XFF @M#F0m4n/|:$$۷m۱cG{R. b*]v1yd6l=%VkF-ZpA_}UbbbŋF@9vիׯ_gϞ=ٳdKmrM65T]䴑ӗ1̱͛uV2,mwtt$55Uɓu3GYϏsz=I&߻woYx1]t~QMQr"rTKؙ3g~}Mnݺѽ{w~aon߾Mvv6祗^b9hGnn.c5j;c۶m%J˜>}:n"++ 6eĉL4{Mff&[l1xrٴi3g_xAR1l0,X >|ޥ(W^y &~-]䴑ӗ1̱hƏϿKNNgΜ;ki{.]xHNN&77={β @DD{ѫ+_~|' 2D7?j5C aԩӧIJս%g,r|/g-Ν;>TS)6 ^ڮ];-Zȑ#}6jբu֬Z zLFAbb" 4`ܸq 0Vj+'Ofȑ\rIzg_Mtt`>ѥs|L2j`رzj5='NdڴiCy JSr/- :K.koa.rrXϘ4iǏˋ &>sLiѢ9994nܘ^{Çضei(87sL^~ele-=~)?^!C3gC!*%g,r|/w-ZzDcla:uJD#SءC ZܷMѿ3,y4 &[׃< :wUׂ`lAQke5Ue6I,J{1==vm[s>\\\E?y8 !);wޡ]ϭK'OP:-mlmj9r%Ă9,bj"7yUt$Im5\^*ڔzci)FFH 4 >>0IzտhǭGPzOIݶȱNYpcXT%?/7zITlyhscʕ?3gL._O1JoΞD~t=w l;uA0iJA֠899o|zׯ_cһoѤq- dd#IZ֕AtxlQɤq~z7oބyKܹA Щc[V`woܱdSNgiֈ _5 dӓF~tx5?n7VG{Ґ]}6mnΝ԰;mf_Hw4F#9z%V,%O$5mڴmvNtժ0M$AOر'>NhHCBC2b3t+qj,^.695{ GO嗳Y`޾9Rc, &+7}z<qX/:cܲe3ѯ3q?E_1kC;2S~1cW1??gƌ9$=Ys3{6!|g960cN2Oc:0i͉>r~϶m3{o2 oss_]ys>}n3g^~y|ğ`80U_bi-Yr~=Ê2`\}=:ʶ{d)xnM:ux{=_ˍӺˋT?W oY4~LjZhɇ~lKR]JiGCL)izuw'`ggL†?Y7l>KwF!$$2/*Av:u&33#uuyy,[A߇~Bxx j5-;h`ƌ9z|>KZ@RS,)S>eDE~,YXlZVڼ$Wyyy['?kא'cjFC͚5ܺu3ozrcƒrJY=kqOwh)lsQZz@oV6gk|m Vk:7oQF db*[@T0&ȑüP _NPjnr[q9r _}g~zׯO!٪5ǎՕ*+r/wȱ3<ǣ}{GoނS iެCB,qK67SN@zx-'N׫ Zj7KefZ]͝-"زe3]tյ ғQDv@`C3r暜1fUhĖѧEDcr*mEJM)%MHHn믍Q&߲=yyy4LVCGqrrݿ5XҧICuu{6طoBVEP-|W!x]bF}(ؿur1''KYx/-#"x>p\RSoq6Û'ˋݻ lGOvv6ر_8 g+ ҶQmʢE xgP*xq-ː!/Z(k~[MTT7\\\ ҥK7~_[|jm̴k 17o$7711l/S1\JiwFFKa=fQ{U7kBt IGG!M1'r*K)-6l5o8ԩK͙tI3f1ء Pp㭷uGɛ{k׮!Iǎ@۶̘1Ç#IZ6kСÍT2+<SmJ O{{aD˥KQcޣ]y2!r>s̝3Ch4Dzٳwԙwy>ӧNɨѯcJϢmj`„׹|20bHzk>\, z>?` S~̳+:Z3NC:Cà`qVŕʔ$y,AQ=H? ]{ߏ#Su[9V\4rIڱe֬ưq˚[Y"cSruÅkx;3[34uRюq׾XGB3n`{,BFVUoLO-x!l(.M0a_dLt6ŝ@G@N\L׭tuΒgfҭŶ>nmWXî{8t *U=EY0h*~A=/Cu-]T{Z/q>HF.lHC]* ˒ު!޵]ru~0iw}SmЋ>mQ+Yy u;6GԪwsiHڮH+)9N<&_Ϛ;>dRS숿'*q'>=g@ '{zkDdsVnI ;xZj_臮-^2WO_ՓhLJ/veҒX2rK?p{G/i}ҬŶ>nmWȥ0q|ehTΛPɣ1jՐ}'.yttWoQv9v 2 IDAT~őgѧ{I}= .[̐12mTO4ddrMs3WR4| bp-5<1gp^z2k3yS]Ñ6:[4pcxHrrsÜz {:4ፁIIO?Կ./lҿ6 Z.ۊ;9ϼ+#?^\IN\MI2/iⳝX8+$`cxP~hlZTZ=xu܏WD(0ԕ5yH(>nmWС#=;V+ +W,c&>kTFϒcQYAãxN^LQ ;5&Qnw"۝7ukw569mR1LWsv ZE_䧍.ǤhE'-3[txw^m c Δ]K`ZCa݃gCak<~n?actl˷sX#:}k&~䪑ydT ʋZN^>K~UJ%;\p=whB5Q*qmZ9C YG`oogxm,)/uE,(ci-.[rە. ǪMNۇ5o\ۯޙZ.$L']RJу߅Tj9>{Ynm0ĬCGsOJ[)]E\b( 4R 6LZ-m?zҍ4\;iQ){Qrk,(O]OF8ET6*IK62{ӗª(%Ym}ܒۮ_7Ͻi['ꈃ ~֬)㖜v`x;TY!$- {Jo3˫~*旭O=dyt;9~6TMfة*2rvC;2w+ivE0>~ޜ@xg 9p#5-&vr9zmD;oj14`y6)ڮWh"j/j{Uφ=) /үCQ* .?/o>q2k3j8ϕ4:"Zn?tkF=ΪxH^kG]1VMP9Hg?n_&=vj.ݸWϚ8>nmWXCi ^ޚ@nn.EXfq|uE9V\4rIڱeUXʕ3 h޼` FUjHJzy`Xj ௿Nbx̛ 6F||F"EYwMQ ==cUgQX62&4oΞ1{ 4#G[_vZyɒ:lڴi')۵/EL5hiiѱ&K?'z"!! ݯO0`0y~#Fť{jISdB\AH]U 4TĦ)+_<=G @0(ZzJ]`n]ѭwgߗ}|ph:vkr%afaVш-t/CkKN',_ j#ro-==+VnZ0.aBE`[ gybiͼFy;[OCZZWEm11._v[+]{Q?m;²5# s+36ցs}Gڻ3rYv3C׶(ZE}6'ob˪҆mkd~˖'XkdK7Sdoc;FE"pq0op8Tω߼PdApev˗D>}’e0oN^wE%,,Y>}=;/^@Ƶan^.?/зw?KT?[f/_DVѤQS=A&.h֪1^~mb˪҆" X*V(㦮([#lR Hf`/44~=}7[K!%%sgΗsD{t?sf Qhj*w6^l%mʹ(^B*gOTO |y" Ȭ00Kꠥ!^|rmV-(򫏿2cS?2 8E p4R'1.Of5.Mߓ?~kC7mوe[VXOd,/=9rYe {l[~URYܼ%"%5Q" }IHw寧Nyv&SknR[f<=iCG[G_٤mb%/9qGul+[cæur8w.l+[c}f72kk tn"cXP*O3jج>+SW/afa,3c-FE=jec]v+ Ub݆52mkX(ju.L~3B] |B6]I=]%?EdX ^Qm+M!ɩdM_a V{<ٍcKp_MUeu`RtE*x/WA&o}]|Тm3(] %,MҺ ڟcĶ1tp^Bڇ4}Ho+ c;Y e*Z7Ch^} Jׯ+o+7o3uph iS|Yvm݃ H}:'=Gax EJiX2)^m[ܶϙcu3- k6ῄdl\ְP Ex, #F߻fϟ-Jꙿd]r Ȥ/ XMkC_B2Bօb<ݿGdxB7l ؼn ,ɗ(:թ]>v&-J)Ut4ane=:sRPBEٶW-*m(ׁ~:0ol ? ###Izx _? Sx,I|ƿf-@:Μ¸Ic5[_^ӧOG"piЍefBh\gn6ի9 }</)X0{ZhzTDk{NuUaPܬ8qvmK]r CG 1M`x/nFnNdNXfy\+Wz5_]ط +<-qܴ㯨d=&7-\ZJGŒپ8w򢤮+P/a]Kr ^fM\$y""Mǖ94-Ywoܗ 5ph_L}sp:R}xmT ~Ѵq3cGЪ}sdw5mVF]+6(o>|7ѩ{{;5;}{)0P򇏎aA:xFb*ۆݺaO[ӗ'OD֙ڳ~|sIOO2eRSSe^fM\P ҃KXj=,:s o6}CQHx _!P1}wmغ) jCG[h߶#֬XYe򪛞ڵi^زqWБ_Ȯ\=:Hڪ 7oݐ䉹F ܟCYOA@bvUKo>v=Ԩ>SK#ܺ} 7*נ~Cܸ+ C"E1WTuϷoah`(.1J='ccPv= ;6I~BjUwa}S.ttt`dh`Ӻ-R? #%UvSRSPXSI2[V6yf}C~9AXYZ췱.T.t26=Pju$|e֬ v v:#6_f- GSl1(]2mCkČ"1Ѱ(Y*m1fh,Df R_j+^uUZ':4{ݹ{[>khh@/D xUѱ]' SR%5>| <ʫ/ 9^vU3hҨ$-7UtLxXYGҴ96l^/s =0yW}Fo+f͆}/cc0utS-]m;j8@qxw8 ٖSU8s4P`A\v=0b(I>o?LP>} # p1En#PЗOaX&@FM1i#C#\z n߷ϢN:|uB\= 8LxxMm:H]ml#mHl^kZUg*UXq=v6ۂj%X&]8+Ghca(ۂ默1n#>Uq=6ǎ;Ϟu&xNB;a <njG"E)d&Lcءk[xDN(X N # ǔ_Gyv5X[Yk@H&+c"2mUI~pV݅!Fㅺ~Dћ)y"C={lмY pa}pa}isҙkRywM]-T֮\/O&WOӦ˕mmm|t/_7̸֯-ԫ[_  l>>& ԱBҖ`o 8;V1YH(\PP!~߅;HٵmP;-XZZ {_cN-W&lZE ɓׇ %-  “ʭ+k %-Q J=7j㯨ɂB.#hii ellE5}uZ KW݇5;_qw?sKW V/[\V1\G$DZGO~}Lmmm}Р~CAWWWj9B7mwUւ~a}Aвy+9*SVlɂ{_XϿ;/4Z/8z |5oYW[l̟{qw%3nZyWz]Q-E\C{u].=;ލV[ӯ)jo`(>{ A+qow򫵟~ ў\> S'O5nݾ0qdg oxdHD 礥NJu(]*kLگǸy~&.hH IDAT-<%1`=~> 1'_=\ѻk^w~r H."&FSonգS>s!""%|N~F6J[{Q<(T 9HDDDbx.Bԥkwܱ#}>m:G"""MǮ!̙30`,--QhQ8::bʕr;.]x(^8:w\k%K17o-t,[ 5kք1LLLe˖!==]mRpa۷_l۶ %JwRUzz:PV-BKK VVV߿?ΜQƍ[z\]]aff8::bΝ9Ssɓ'Qw޽{h۶- ```6m޽{'VFT/_Ν;s`޽;wTW^UVhԨ&MUVx0aݻǏcĉXbE}ɓqӧ@۷'OV˸dHIIپ%y?XaS &`Ν_rwwGdd$Fr^xڵkdɒŋ/Я_?KTyeG ___}{%7nMɓ'x \\\иqczJ|?*E:uKK9qDcJ勊Œ3pQhj*w6^lŋGLL J(!ӧppp |ybE'ȷYnpHHH~^wxyyѣG J߸q#mYe>Coߎu!""Bt9ooo$''# @*W*_OjZ 2)y`tÅ [hРQ{Xw$%5ư>jyRƻw?hGAndwM4|+Vҁ2m X (]]l;.l'''K=,!!F0|p XCCppp.ХKxBhժ5j`۶mRu HQzu֭DiEck˗2e^~ SSS~ZjXf lllebժURt~4Ɛ!Cds kL2+WT\xx^zСCJSF^Ϛe,Iwtt^~h&M*;o<")) qqq044СC%;u֭[x-VX]vIg%\ڿ )) {9so>Q/VXWWW4hؼy_f:uªUdʬZ ;v̾ˎ;0o| s ,^ᰶFxx8UYfe[&==o߾zj:?^---̜9ǎkwww,]T: u,>ͱ#ʯaggSNA\zU:N߻w2s2[[[ܾ}[&Ν;U:2:)x422BRe?15k---TX KcrS6ML$|ŊXl:$|e₰08::JE|-Z@tt4j֬)/::WlqQ$::Juӧq!C'NU]>|*U`ԩ רQW\A r^~1zh,YDfWBBubƺ]v;v,Ξ= :ڴiUZgΜAӦM%i({򳌳WYgŬի(]䵼[lP89I?b.44-[T:2'Q>$&CCC6LveqmĖKrq…Xb""" ܰ{n!)) III GtQFaԩĻw;9rDŽ 6zWWW\pA`ŋpuuEϞ=2.ХK_HIIq1 0ٖKUVٳwpmݺ5?T$''ѣ9a8wҐcǎuֹ};ybY&<(9OFݥ~Ōu1j( nnn(P 9r$._?R}rwI&رc3fd!X``YmǏ.9rzYD(V֙HرK.ś7o",,L,|Yf/]*I^#-#ݽPn}ϼ)6U=xQbEk޼y#WX1#** e˖Eٲep+VL|Eիak}Ƽyмys1%J@%0|phBJU ٳgt(Uf͚3fbAضmΟ?ssscڴi o777ػwo+v4i `ԩ011)f̘yٳppp)333L0#F$ر~ϟ X2NNzs`yʕObda:7okI )RRSq$"\kӷo_L6 ָy& & ~ ꚽRUr_.EbZ^S^ߥWVL4K/1tUŠACe_L'cDO$$$@ܹ@:DqqqA۶mq},Yرc[DPG5k:cFgyo߹/U.ZAmdŔk quua"uX[ ݺ<w`&ܼ':o~OM)o%|e#&DDDk`ccHDDDG"""Zڟ0s 1e*ZԢ(jw+ߏCw.0.sֻ3^+69\IYU8r4"~i#==P00FR& W,Czzz?Uy +Y5VG%L17i,J5Y.Z 72&˗˜q]#GMteCmQ7@.mOTĖU#lRSSɓaooA3-۹Qؾe'74~$߫ׯжS+_=m;™`\X|0k?]8Ppy K , s ˖JU_=o/<̝9_a۷CNX0g̊bʴIHHsm8d@th V}Gq&d^ϟ?xLQñqm_ҋ/PqmkcQP!l޲}B]D1zHLdZD8&K4k<&H~7oوf(l_lYUڐJNrsK-'txBY>+Ϟ&uoI?\'B__ޓ+(̜3BSSXl%mʹ(^B*gOTOT/^CxLa#x-gxByK|*Iߥ=_?~$G٦-ѷl0Uخذi{TIMGM$igx#99HMWXزʶY3ү) ~gTxTZ#کLIfo՚pT:pT m 鈜,X |S# Ge{끑cK^kkPjYF92A܁?ñNu6ցmekl$O-} l Eͺ7хoF޻ ^|!sm &۔j'?Kd/Pu2NEDƠCd_c/]){qw<4J?|$=߳[/GʶNeUiH/9pA<ʗ \x.]iihѶJ.piϱb:h8W/!C> 7ȱ G XOX0}鳧X0P*€ش6%$#d](f{$a1m^?K®{0w?Oa@~``hJw Z{[n'?3aAhڸ>u[LdA ":h(éFjOQ`ee-̆1@ɇ8TPQ+쟌"*m)YyfXIIҋ0odf> Sx,I|ƿf-@:Μ¸Ic5[_^ӧOG"piЍQ`Amdȼbs4*t9}NG?F8}<3ڧcX(޿^emIo~:]{vovn#8_T2R2VA&.(TH is] ]bdVXjS o_/$''#PBW<DLm| Ą2jZ]g¹qpO8qH8kWÜn'?/:bX@jƍWt76U*D)|LpUe̵]7qz 7X2elqm>޽2elزA7 WY fC-SVnfM\cwLaR:kެbbeFt)l+ uUӧOV[}ˍmðuvt&umhgOI>u/TvVW]QKWs8 ݴO_܅I;[k_~444x_%4m ˤoڲQNQtׯp% Zh-.-5,T&}kX(Z̶/b˪"j/]@YFsbuUkV`Ͼ]1tF iSq4*޿ûyq6zt~\qɂKW. Wt36z3NݻT|10hx3 !WRRRУO7,e¡z LC]{ǎ¥G\|=Gsx~o?L!-- ))):q :U]8q"9%ǎVW;yŵgٿ[Z]ǢN:~9<'c;a ?yo2dW`b-ѵx>8T͛7|Lp? eQ,FEp3)tEbؠ9fT_fm16%`aS Gf-dnՠC0wlX/Ҷ9 ZT?3_/)o%'̌;kWޒRJ9J.Oqp zտ&LE%7ly`T/m߬L1s V_~0+ee̱^Z]䕞{c߁z?ak~LT9M~ z5Pt1l݄ [Ɛ oLy( G"aUVe-y`Z4ۺŖU "Ejk2/R'%"p5]W[υ# &""91x$""""4QYtADDD紼8HDDDD1x$""""<h H4DDDD$G""""#DcHDDDD1x$""""<h H4DDDD$G""""#DcHDDDD1x$""""<h H4DDDD$G""""#DcHDDDD1x$""""<h H4DDDD$G""""#DcHDDDD1x$""""<h H4DDDD$G""""#DcHDDDD1x$""""<h H4DDDIDATD$G""""#DcHDDDD1x$""""<h H4DDDD$G""""#DcHDDDD1x$""""4U)\zu?WW(,XիWnP>RXn]_~؈Vzuw;"*?hDDDD^HDDDD1x$""""<h H4DDDD$J~wz\U)x S8/eU Ui~<摈DcHDDDD1x$""""<h H4V[^z7ou7&&&*H[GyXYFʕ@#DZc=;*Y$Pr%DDDD?˜1c&95={c-"""APǡoƦV>>}R1я8a=oSߡ~M;RJFSS}+ڴn, mbx^ތik"""duf𾗌>T{> BZƂ#Q2f>)*vvpΟ̂{olG"T:m(WV ܺ艠.5Uf_jj /C家nպ-.Yb=3Y< #yR[.^}zuǙӧ9} }zushаQ4ho:*xgu"""—[t+UwLٽ !^\rpwܢGV׎5ڍ>t &%aaJgDDDDIݶ݇ru :v[ofɭN$LN2;zwm-;*Sryڸ~nn>3x$"""N2ǐwn[3}'WTmN^l r|mݍ:A `v#ET= ߛ BnK-Oro?o~p L]w4Q@rd3At'uWKWI}2gx1{ŷՁ>Qٽκ֤Xol\ m3 {<s.A]W:J8t:tZ ߧ䐶 ѻP*puV20?* J'gmɌZtANSWQp|=h) ]RnckR-hsGwж4),oN1 v=wgCFCUUA]ѷMUjԜ<<`(,+Dn{_3y@Z{8s..%؍zݑӗxck&.s0 &HܢJ~MJɔ rdN){r8^T'L橡! #%~4&&D|/8(ppv{Vo[pR%%Ph(]prwQ]/ .}A+P9*I:q+xGt߾àP/w.S;S3Sk;NJshEvGBĊKCZaӶEi1yf(VpFTfڤ7K-/=&A8WwFBMd)W.M6ݷK~ :P#l"->mY2{$ύ `\Z;2ґYQvo<1Ǵ'? /Td=[JUy1gؑ?JӇBQeo|E說{=m2cZ.}C˩ T:tt5pgw>Ӂaԕ/aKrG2:(_G=/wq]ZtrFh`t#ߋ:ɲ5SSg'?O)yޔh \Rx4|@X>x&] mu=Biz :-|55T_o O(/GWV Z j\x+ǵ "u_A\b> ._Pε?~ ?e+cWϧz}o쌳8f n!A8xtt쟐G﮸\#n*tJJ:﹦CEDҿ[7Ow&'?_[eZ~>]]Q~ Se R VS^j2\ur*u q(l.0BnCw2y뽿 c /h Enu+ 4*~ EGw8P 9n:35/)uuW:N[Q^[i6Z:]E :ݵt:gJgg ձE` ( ^ ܼQ::FjN̻OCkowʮdDi}:ő V}}f4ݼP88ppcDUVYU(lO&k>Zwh^U-n2" 㸑;u,ɳZ@z&L7(T(Zo+_Zrs ú|hvfۤO{ jЛߩmkRIލ^Nrb=Bks3MӚ)¯>9H/߇ݽ8qP^NSɱE4*Iž3W)Wd1a.t qBΤ38yP:gXcDZN)Z9#^u@N9YY;d0/iiUX;~ZG =5Zwڸ~zߏUZ,χ+898?/SE?}RE]PB4ڤq/v'w'fա8\~-]+'N}3J{͕.Ց`_4elK O?Ѝ'U` j\h?m< @HvPs4+itsgLߖ===Uz(`D62zçykӯۓ˲G{VNs^8ݦr sKxBƙ+ fpC$!qjcUi:u\ȩ~Q~ƯC%N9D]S:e:!&ͭox?rz,U},n(9tk1uH{>v (XƬ߲X&AP0-7qeWo>=o4|-o0=LJN%UX:^}8_a`c{RBKefk>8֘zk gWF )O~?nOC>̥S:{Xya}< ~nF~=Yqe!)KF>gRӎӽkˉ[*6(>sl"UHWˉ4G;f<=Z7G.!MꉣomyD*p!BjϾ3sQeq[6<^!Z}$ۊ !H!Bf#B!B!h6x!H!Bf#B!B!h6 <>}:ݺuߟ@yǶG},6m ϏPzt~_~%ݻwdVnBq9x1bl޼믿QǛRbb"3fĉk.~閮Z}YΟ?)((h!)GՏx4SoO?q}ѿn݊C+`E{bbbHOO󸹹tuRŭB\ezqv y;mXr%z~ڪc׮] (( FΝ;ǖnwú>^zw_ͫJ.]gС;v[laĈC=ę3g鲲:u*:uuDEE1}t~1c?j{޸q#ͧ~Z'O?ă>H۶m dȐ!|uҥ1m4g&j ]Z1[?7H߾}Yh.ך6ew+xq)S/XbϟdԨQ i޼y$<<=z0m4~G|?رcOwݻxFÁ8}4=z`ʔ)lܸјȑ# :$MBB[n5{ }646mIOOgʔ)[⋍*6eBlҦM˳1j(~gvI޽HNNfС_u}||ppp //$?suɄS^^NPPP=6""NG֭Q*&yݳgݻw y˖- 8ЦoeŊݤ.>o>vj<"""ر#ٽ{77ofذafY_{5M6ڦ,}B!MGRYm[gƎK6m(++رc^I&Y?TD}akeff/KW)Sذa=O6^o:cB)={6 +VL۳gORSSRRRիW988jM RMj߾=֭ɓdeew}7pyog߿2 cp,k,k?rO?4^^^&mJ!čæc,ZG}Ǐhc֭3ƘoJ p%rssyQ*<3a8] N:բ;v,| /DGG7]wo}CRXXʕ+ 6gue^~e U8;; /BUU.\O?1݋/J"..Çh8}4O=TS?7T̙c6?%>ilBqbO=~-...;`uƳ>1СCٴiZ^zѳgO4 6mbСvZ믿Nv9s&`|'ߟ fϞ͸qHHHhp۳e{1v튿?{f׮]_)SgҤI=nݺŚ5k1bq{ll,| ;wf̘11l0on2SO>ر^z1i$yGMj kOLL_'<FWF!BYxXB!D}dB!B!h6x!H!Bf#B!B!h6x!H!Bf#B!B!h6V2]t{SI:0rMn={ ?;LZZZKWCtB޽B4CБ|PKWĀ0G̞ը}] @F2-]!,2M >$/}b7׏TUQZZicm AGlllKWEFŪU$B4NG6b?uV&Ktz nB[H!@ӡj,odv$Bۛ.J@@L8aÆ٫&񡠠FvPGYݻ}ؔ׎;Xv-IIIj|}}ׯSNeȐ!Vq;|-EӣәۙʩәǣiԨQlڴ ۋٳ'b~Ҟhva#ҥKݻ{ロKڳfs֬]%*q'j6$Ӭ^cȧ~ʴi}' 6̪CrRJEXX'Nd̘1 >>zzg{n嚵}DFvLFFvri֬]gdsNkoߎq}޽Y~=˗/>o&1h W_}Ett4Nb֬Y`fGxk=n t\jW{7n?pGbb"/X!D˺c#'Odܸq1dٳ'q6mbذaռ$Cbb"111ӻwo6l`R{Abb"Ç~hLJ͛7s=HXX?8yyyuҵC!NG||<%>>NG&vZy~oKaM}NM61tP 55]vq}BHH'O6.o899ѵkW>cV\ir,1jutv{o=Ҷm[{h;rss#((H׿RZZj6okX>n !,k رc;v`֬Y3~r,Y?O222rٺ;Yl}/^֭[kŜO>e˖zjYf o7o6I|r|MHJJ{#8|ߋ^'!!jSg IDATx$$$}ftaA} ml2-ZDFF)))tؑѣG`^x9v̛7d^{:T)++k94XZR=YZiO&M"!!LbnȐ!Đ={(//祗^5-!exPTTd|tRV\}݇JGk4YYY{xxxLLL ׯ7n뭷Xt)FRѱcG}rWZE߾}qrrno}ٙ>}[ob իYt)3d{=t gggڴiëʮ]Lp{;1z3&Zt~JHH`T*|}}y饗((( >>;wu=,YGy亗Sŋ)--yfp=YZiOÆ 2aDRŋM~ʚ²fXAA^^^L4N:Z4m4ѣaРA;vA5XnϞ=-֭;3ՔM 8Tu&mI֜LZ8VQQQuЩS:k-}mذ/\rj۽Tׇcƌ7O=P9˗yWرcƛ<ʚ²f <~'za|ݽ}-Zٽ{7=ߙ3gϷ\&ޚsBS3a=ղHYWgnwƍ?viU/=5Y-py-M&MɓywLL6]W_JBou9ۓ5-!e=T/--7G5իG6|-{,ΝKBB?K,1n;سgO:wn|P(̞jҥ Onݚ\}^n>}:z1c/vì[?CWWWjɺ'OZύ*11o|w-0MUR ,mhOkTDyzzo>݋7Is.\HPTݻr~ģqʭ8s,t]Jjwoc\{VOΥڊ/|_q]CH X׿׏2e WNZ'l%%WٶmŶ ɼ 6AlllKWEYj'Ni>GkSKtDDDtUm"=={Q~M>$bbh(-y߱6IH#6 FŭۛUV7L&L`ƍx!N'Cף=R!!q新 nB| G߮wBth:Kx ݮkD/eT;;5;vvZPү_?Nʐ!C]JH:{oG񡠠rut:=:iٱ:Yk?{<~WRRR޽;wq333i۶-JK:3g?NΝ-W\[9sKYv <^{5o?Ϛ5kpww'%%+V0vX4tYKTT''NmI>ʓ3YWsg}G}ď?Hqq1:t`ʔ)̟?ߪTx\ ":G7.c;8k|2ذa&389p)))L8<<==/"Zj/EEEV:Ъ nO˗/SZZVER燇GUVVKii)lLkml{/V\i6ݻٳM;w믿fݛ׳|r{%5k1{_ԩӬYb!a|ƍw!00t͛GNN˖-kzT׸[^Kgͥ 6KL̓Wi߾=gϞeÆ dggөS'***l/(( 44FcUUU(Jj5.\ **Z-YYY Z&++7}RΚUtn1k׮g19OHtt4(8::ҩS'ILLk9fغX믿қ#u5nŋ8qӧOsҥzǏjիWĉ9sFzKnqѦMQ*~xxxR4A~~]mJ ؃ÇswZL'l2V^Mvv6k֬᭷b4'Ofȑr9,Y–-[Eϑ䣌^z= Ǜl'!!^5;&{Xl-"##:vѣY`/;v ͛gy7")) @zqppwЬKKCRRRkv HMhY[PP/PpdddwA=pttʕ+(znhիWߟh:wLaa! YܼJJJ̶ ///yzzYIII]mJuj?ܚV^ҥKׯӇ%K{deeqၳ3111_ުzH t팽z=ۙ^=Ec$$$0`T*K_gΝ;ۿiӦ *vjR}9{,3fnsEJKKm^\ڮ];v,'777M3VKII &!;v$44^Oyy9~~~fI~~>QYYF!88\qS^^NVVǏ={TPTu֫T*=vٷ)e7^6 Z_8pɺj|=m4ѣaРAګkN&fgha T:uTgaAddkoo:inݺ5ݻ_@eO  qwwGףViժսyyy>}VkKɉ2.++#33:\\\h4cO:lBk`M)/hpf#&&3z&h"ƏݻΜ9s?j*,gava?[ok{t:N:ży;wս|g=***(,,$,,dP pqq!** WWWMէO:yĭ)==6ŅpU*f^obM)j{g-]j1c/6;0^ҥ 3ٶ~ufgϞ̝;~,YbfMD'/;}tz=-evaZ6YwI)J uQKKʲRKVVUuuvvFPPQQa1^.++#<<gggJKK3P(cC jwWPRRZ"n-T*ڵkGΝ:;UTTXjM)CSUUeRqVv < 5j۷o :u* .`̙qa4 f72_m`KE5k1X.oŋO?йsgLœ9smo.aʔ)\j:CD@L鉻*۶mj޹fmt q:;*J܌7Rt;.ԼsB GGG ZNzGGG\\\LnTQQѨ6l ""XCՒk=Υ2V%==@vk%7VbҤIu.-־e:P:M6z'phMqv y;qkxr4J255Y-MUڭ5j(F0S3Mrtf42}ĉf/X 3Zjf`5~a ( NjݛRUUe>Jm۶ )**2{/k%5̙c|{N yEZi>Rq#'9=O5ݖq 0lչsg#BEKSz=7^c٬\ٳg.nj?N׻͖6' *2V_1k֬zI!ì1!D;CE!XܕB[H!D3ٳ{0rxb۽{={smn]t!--`,n}_|A.]\B47>g%l׻woVjBScҥKcm }zhr!thw.ݻ*JK+-'eCMx4!舍QqkfժUz*+m{0a7nCt8!n-8\*0>$6Ba Bxt ]gҳ׈^!Dj>>>@tt4'Ndذa*F4C8|޽7ƦvڵkIJJBVK~:u*C * l*WXGӣәۙʩәǣiԨQlڴ ۋٳ'b~Ҟ<qEE.]b޽|8}=(Nٚ}DFvLFFvri֬]gdsNkoߎq}޽Y~=˗/>o&2ydƍ޽{޽{ԡzƵN7Z:k.ث=7~#11ŋ[ύ.33wwwBBBpqqApEZ-[6jdeeGpp0j,ڷoM._LYY[R <-CVG`` nnn/\@hhI]R'888htZ[-=ݝ{_&sss#((H׿XCdokG_5 " ={G)ܯa١CItN#>>XNCYv-BBB ayf 7Ic/ty[0ҥŚK۶m9tPmDpw5t͚{ϏmBٙ` M၏JRۜRڶm B;m۶m֖qqww7bϧe鉣 @48vnC !&& Cyy9/pMAAq1رcfg%++>e˖m۶x+#G}z71'!!^5{;Ç 'l2V^Mvv6k֬᭷bMz?˖-cѢEdddBǎ=z4 ,^ ==cǎϼyL]|9o&YYY$%%a(J ,- ٞ,-ִI&Pg}BBSL1Y11ӦMk%%%xzzIIII }924!...\z.ecr55~zYL֥?JE`` /f˖-Zt)+WCRѣG}^{5tog0j5ӭ^Kү_?ӧK,޳5%$$0`T*K_gg_ IDATΝ;ۿiӦ *vjR}nT/^Śdi= 6z-,,oe„ &i{Ǟ론IJU'J29ˁK='NĉdffR\\l~֖d,r7 vR;3gts̩e:mAAɗ~e^yvAnnqRi9JNNfҤIu[5'kg3xyyV-KKKc&HjjU'**N}:uTg}nHvv~=1cSO= 9recRǞ"^JXXzNglBar6Vx":ecRFII Oj֖apq [D̙ûk򺶛*駟ѣiڵ+_}T*4Ut:GXƳg=ztSe?Wvf&c&Mbc;&ir1ݞZS\\˗ 3RT=zkm:BAPPqP)T &''x<t2P*{>\\\hݺ5tM)>P=277K.Iz/fϞʕ+={urRx ϟo\w6mdmw^ QlիW/=z=V}`Onr?b^3f`…1l7yҥ 3pZ6vIkޞ0j)jО,=AuO'C@MXsɚZm :M5uvv$Pm饶oF16S:b)..6)eԤR "==] ,f͚Uzpiee%Νcƍ <3vXnݺd )//o1z1f޽u?ϋ/ȡCݻw3~xt2q{⫭tL0S O΄ t|uѽ{5߰a>|8FbQQQARRSNe…̜98>F̟?N0+7 Kn!0/,4kb|*jݘ|g?m-1ITbR$caݭts~;չ9Wx\\s>Ϲu 777֪~]]N>E9x{^G{AA&jH[a,]-w~z_˝ɤܟew}"*NΝ;ܜFnЭ[7 CCC]-2z}< -hcի꼝'.ϑ SwH57Uzш!7Z_BMG<( {WG!F"JZ|ݣG4Zҥd#U'$rY[[#//...-]Ҏ{ }>1o_mm4}W@0^D}H叝'O}FY[[3}VxCcЁ3'WB!Dg( BPA!B!:C!Btj!D _׵gi׮֭.!*u<$4hPKݻXtF9r(А$XE!DxD-բѩ8c$&&" QQQ044DNNۇsrB{ p=VVC8snd_?{Æ 鶛""" k=.Oo6N8ww?gggNAGkh~q 󹾾wwlG gOLz]E  4e .HLLD.]8|0”MZXΞ K!;0K!X;w~CTtʃ =z޽{Ç-} [v|c޼y x,Ok#˯Gy:upcSa{i0ҔHoO.?"mڵ璒BXn4vHLΟ?'O>8z̶92ΎI#y1 sss o&;=}*?jK3H$R8 <^u6Kpʔ)۷/0g"99f͂9ͱxbP(DddڦY7:{&rK/BCC}v"''C +6mڄO>wEvv6LLLZ7,, wFQQ233ѽ{wVė<~T)..111111ܟ'3?..˗/gS&O"8p;Wk0ut}~s8jZ:rOĹgeIS;D_U8he#022677 `jj`>}Zz{EDDf͚9}v={`oo}}}cϞ=|:{b̘1ǨQEFFbܹ3ոu爍'3_0pNTŵ_pmuٳ'6oތR̿p̺cǎ>^y|HNN֪<򔔔ؘg- jO\HSӠCB2?9;;#-- eee̼2Xp!+E4O4g&!||FV:UcxnرF <ױcG[ꫯj*c0c ֈ6E4!~o󹡡aO.7v?Sm 渺e&^q̵*3ik< ~o `4MpuuUÇǙ3gЯ_?&&&*!P\\ CCCTǎe湺bxLMM///GW < >ӓV|uh?NjZh<ݲxb&8|Tm3MSs$lJz^XX m;0m$wt>bΜq\۷bŊX-ptģ;0r ܓNxzz"88rK^HKKCPP @JJ +܃ nT~^CZZk^ӿqּT1Biޒ}FVV߿.?k<̋kPMvrּ._U۷o3g]xړv&Or{xxpO@HT=pcǎ;v,+ 4.G\SY,apw_а:ФI5S~Jhex8;;cڴipqqAbb"***P[[LXAAA#F $$eeeE )))2_2 HOOGmm-q%,XI P,#++ |  zddd`2PwArr2°|rt8jsrǙ`gk4?B6ⲟƥ?qhB2єA:̘&֬]Jۢ%߇[nsΰ}#n>>rjIz;-ѕ|i%>(کx{{+\FSx]1wh _~iT{F#DWEE! Eo%oZ_A!m5EQSSzN5ϥi?H85`>N$GZZ*ZoBtḥikkk{9qNhL萭- 1 i+x{d:!B*xB!Dg( BPA!B!:CwCYYYkbn^ڵu+AJt;-!m$4hPKݻXtF9r(А$XK, Q%<"R "m <IEa!22b jpB|xh֭lx{³-]5T$Nw3os3zIzI!UQS9p>!i.Ii+@pG1Xzvhă?#nXR6At,==7n̷j啔hdff={Ę1cb 899qؘI\i۟\\\ݻ]^YY @tKe~?)ŋn@EE91j,]'Nef'EZ7S-Zm#G^Ξ +9{7n}OwNyر@TT }aܹܾ}[aÆ MwDrӅLJ|~'NtǏ35Q4g.\֯EȈxoNh6A^Qѱp=CwJCwX .HLLD.]8|0šK1 2"n'KW?>͛0Gpp6bl=E$=sȑ<ȈSfHN\jll8;;ܜ?x;efff3grssYfXx1qDGUSz~חZ\R'6n܀`c3}$,/(%a 3ߜf9:uo8cn={Ǐhj{SӻZ4G`Ν(,,ӧO4СC(..FTTك'O QXX 2شi>ܽ{011ʲ899|2jjjyff?P͛7޽{/r^{qݻw޽;sЖ(--e&MȺ 39p\gϔ{^ZFF`u%M>I#UtCLL kyLL 8'777̏YTՕooolذEEE8z(BCCq9$A5Ę1cd˛fϞ7osQ[S,s8jZ:rOĹgp02[>ENn.^JAnGBNۧ M"ɩW΃3|ӗquOpJ\\jll$ٱ899aƍ:u*3/11;wDRRիWYC8p `eeŚ?|p@ԩбcGtzB׮]5ڎ:${5ԩSXhe7P˗O 5jadd]lmmq {MYf3gd߸qHIIQ]ec|r3w7t*LqkYփq!9}<~1CX21ahd}zUTc*v$fχ~ި, T Ä X&L\<:8H+Rx1n݊$0OmAlL8Qas^\XZZ622R5p*/㳮igtUݺuC^```O>֭ۓԩS͖7ĵuo+Z;v 3f`\~ʂ|mϻKF$z2TӧO'x'~|8Μ9~011Ѹ||7w=RSS[So\SWuޯݻwGNCkq~tŋ8p+ I$-׮].J]덡Cዣ_o_3n=3 s漍Wdؾ+V* 'W2"mٶ-sC-=Vxcmm+W楦bĈͶʹ4a4`].E>WV]tA}}ζ's'E*Mҟ<<<.ܟƑ=zʕ+HIIAǎ1vXV.oi\ nT~ &]xRDCM3꣣"! 0!~pw_а:,kV|)w%yZP(DFF둑3i#F@HHPSS^f{Bׯ?:ܽ{^^^s^'OƦMS wʘ!%%EnP;[9{gΞ1m4 11Eff&VX ꭵEΝu溫E?-\P<<}g2ҥ ѣGf/777<~5{GydH$BBB»Z$?EnQQ^E!@ee%.]Jbk**+uW yqL Mw y`Wfڼ$bvZ+/Zȋehv}@hO|||yQNKt{;-!mSSV= "bjѬ SA|Z+MբڢBZw7yyypqQ4ʖPSSzN5ϥi?H85THi^ZZ*ZoBt%ZE0v 0O%D4oHjBt֖Ԅa^v愴Bi( BPA!B!:C!Btj!D NkqVvKvZBI1hР. ݻwtR=rP!I1aCKR$pph=###DFFB,A.\ IǷtQQiص;BZ ..%'h:߿_2 <!08pxBx$DGG#33ٳ'ƌ+Vɉ͑fY7e`h{_TͅzjӶ? !!ݻwի?2x 06EYTt,\gτH$bYZ:?_ܹcU,_c<{ {F׮]믿tx ۛS:._i7o#>>*CiY] Eڵk񰳳 gH#!!SLA߾}aff9s 77ɘ5kannŋɓ' ϟĉѧO=zTl'OĤI`jj ,[ؘW2I`@>}0yd|72L NbW~!MQ=I׶)kgTUUK/===u[(xTդLfܟz#==]fQ__q1JJJ  ѷo_XZZbݺu7?BT-`9~8BCCq!#** {ɓ'YBCC}v"''C +6mڄO>wEvv6LLL˺IIIƆ PTTG"44Νcݻw޽;s6(--e&ŋcƌӧOWFMΞ:{sҦ)kggϞ5_]QxH8İ ..srssC\\8,_5 (,,˗QSS͛7sf!xHeCa޽3f 1j(tqqqpttz͛71112/\˺{EDDf͚9}v!رcW^y~)U~"̜9ݻw>qaVpvH̋~.m&{|ܻwnK9ԞAdԃKrvvFZZʘyeeepBV\{000) !v/rva„ y&L@nn.kL0tPMO5]7++ nnn2eЁYZZ622R8+'O+1qDOz&}^[| uiӏ4mgu444ӧ^z%wYZ(7O,^ <>>2#2Wҟ?@8::"** ^^^`P)9(..FyYL4 [nŶmې H;;;OPPCbQOOOڵ ܹ3USu>B>IJs􋰰0BؠVVVXf V\n9(..F޽eݻN"D4=u!>Y_++&ML^a旔<ƙr}r)it1 4())AUUb1sM=LFFF?Zd.E)'c1aƏE!]CޟQY'W y1L Mw:w ss.իWyitO |7oi]Yo[FHE!Za g744'::ҥk׮8;;zbҜ?'ND>} pQ|JJJ  ѷo_XZZbݺuf+qɿ)IyL} sAnn.1k,/Ɠ'OXJ`@>}0yd|7Kell'ObҤI055-[69r666011=eD /Y˛ ;>>vvvL#G+gGU($҆ǎ-.P}wWΪsiym- <ђ9&&L!Y%q8m3$$;wDaa!>} ooolذEEE8z(BCCq9ֺNNNGaa!._f4ERf<ؾ}; !C6m'|w";;&&&ŋ1c  ӧ9/o*,, wFQQ233ѽ{w&oCll,?#B!6oތ{?.^JӜmǏGhh(:bDEEaϞ=8y$+~&Kym.u$ Ϟ=0s߾}*eYrmzP֟4mm +D;%u|V;QB^Qѱ={?lHxxx`ٲeCTt,tW+S'^#)) vvvf͂fΜ̻q|}}0*!??_pի6l3DZZXȔ7n܀Z.1]C20bfӦM̺… xwn>}:֯_3f(LmNNNظq#NʤILLΝ;ĔA^?.j6 )S4III7oڧn_U;Zε Sݾ(F߽7*s$]\JD",Y2#K,H$4/uD@ 3/++ nnn2;tg`غu+PRR”K:"\WD:+R2p;&O WWWcĉׯMYZZ622bm;;;4M';;'NTۀK0aּ & 775O^?S< TaNN("QE.WΪsm.TՃ" T !ZD/dFPAK|嗜OOOV0͛JӤ!((Ȝ&ӓssE\\.^(T\X-믿˗/+\mָr k^jj*F4oM.\ꈋ^{M&sپvVKt4*ߔB4xwe.3M$&&Ċ+t"==ƥK`&͈#2ǪUX!%%EfG%`\|Ϟ=CUU.^p^.oooBdeeYYYWP(?wޅۀK  zddd`2PKy4i.uիLTU\`شi>}z\~oJQ7]A<<<̟?"f>舨(xyyyrS;i$lݺ۶mCff&D"ˤP(d.Ė-[X; xyyÇEi\oNصk222йsg8::n?T\]sEyy9?VZ7*]oڴiصkqm\(..FyUG\ʣIp#.z-TTT<֬Yu?U\ ,, B666֬Y+WU߿B4>)w_~ʕ+qڵ.Zjɋj!'H$T> 4}{a['dzyy ۷ԚrB40v g!xƔ)S{G߾}tRx{{tTj& tv,jI@wB!Dg( BPA!B!:C!BtB! B <!3xB!Dg( BPA!B!:C!BtB! B <!3xB!Dg( BPA!B!:C!BtB! B <!3xB!Dg( BPA!B!:C!BtB! B <!3xB!Dg:qMٜ BH)ĉB!/2N8\3$BQ BPA!B!:C!Btť)uܺhp;Fu ӦNV@!D!NxwK iZP]kFvЭ[^ʿtQڼyɄj$ ӴN֌@!D)X XhCjNէn}QAQvxxBxE;b~P? ڇBZC2۝ܹ{yVsдYWNQy_Zcn?ah~W ۢwEKӶ)  ~ N&ǹ!ѩS' {7{we{UCM^?_B?ԷgѥKfȑ#`4F )]tBR1z$tTCy ;ۑ8CTUU$\g`@L?'N|p[w`ϵ-\8o1r ^aU^+)-k#`9dfϚӧem_U~-QQcZ]ʇs?d7rL?Ǐv( (%kcϿO? (DG”)θz{aX};BNZ:M.A\|wGb I?!0c|!dGDJrz%˰}.-i6mдTC#e6d#ev놀>}89MA-OS+70fXNiUS./_tBZCvN>E 2~{@Z!JikL_x{;H8y Xys5~2SgX\I|611ml؏mqb1RY>iiJ5sl?8{4/;fmڴS`,#ተ}8Y:V~-QQ׋/Cx>]ɹr7U}yk#u( (NI2uSañSjihh@aa!?Ssq0k<2<{ II?CV`Opա~2rt#ؾ=_}e$ݦ:iWfr]MEuu5pJ V~-QQo1&9ayx***PSS[nb Źr7U}w-vSܸZTWW!55+=h;5koll˖c*C0113o~ ^}u ?GL'c'kܹS>U#^×N}2TTcJ//Gsn[m߇[7йsg5D&3Z/C1lb1~*)28|!{_nA,ai;\KSR'8kU!/X-WtQڼj uP(i*BuU0{>Feq^Br5p![3D;-1Z{)ӚF<^~ :BX|";ҵd.l}.uM <o^Nj%xQBhG |*r :=d66vuuգF?󇤃{LfI8 gfd&O3^fСKAʕ&!4D{81h* ylle*]i*'%%Ġ&*䄚8pBA҂Uz^o[AurvEC~H: z4 5a{.T)Ө݈%M9s& %l_~]RRbjji*WTTXZZbe6 ,ϝ;;^& ՝\i 4ZEob>hHnjm3,0>@Wͧc&K#GQĞO@r*[E:QZ[DL6h_Ω>\I܄ ȠAr"aBLDZz) ##[n١nS( 5#0lذ#G555dnddblllU(JYYYnWFiVx +**HB&M\\| /.3yTtyTw&f81R>_RR.G]]dѣGaaah͖-[|~qq/h4:f|G###7o|>Jg^Kw{J?||V﷝J׷۶nb2Lw~۷m*//L2^1pGGPuuu۷o=z4;X_~ŋ544QS||<ǣP(t: /[,00pժU꾾:**jǎ:::!+z9'Rxzz{^$):>Eq1+)1) ||Vu rGӞ?u:%9ŋ>mݺ`" d2&wΝȼ0((| 5ͪoȯfda*|+X)[u]_Y/|m@@zAXX']+zWUͣ\s/sss7nF 0`~Um_S>+=+6G{/A`Z/Џ{ %ZZZCzpT׮^2774&&&h/@Wj:Tq]aX%%%P2Oҋ_}  i]-._d¤w& H/ H/ңEMXw+Ōhk^+`,@!i$#'& P_?Ĥ_15M/hMzQ෵|$y?[^^Ai6!">|SiYozH/'a{{;tBp KK>@jޮ5^zA3ZW0}@z5 ":h#bl^@"G^&'iޗ dȐ ǃZ@'i[ں'$UTTϟiqիWe\{u޽1A;lee i-/XGͼrl6N~/FCC!Cͳ$dف***rrr֚ŋ++++++/Z-F`J#XQQQYY s? >c_ΤR_u"##Dift҂ ⋡CZ[[_tzee^ss󔔔B>~$57LQQ(%%ٳxꕥFEEūWW\))Ǘ_~YXX(nzݼy\.X{.+@ :ft(NĈ~KagS'V\d իW.\xӧv!*e˖ 6<}qƍ }JzeeÇiii -- iKXƇdffRt| rssLLL;V/+<ݷoڿkצI|m۶㝝CBBF9r`ggx2֞ {IN<==+**>|֖yxxࣥΕw,kkcN0ad~'ޫ?f̰|{SWW&W﬙_LԴcqLjjzyh.w.gԊ Ȅjzq3IBƏ"##\2cƌ?~<))I&Uի/bmm_gYy#G^>_UUhooi䜜ÇsC1L̔d29rSSSWOyyy4-""رcqqqz H\|-E>"+Wbb֞˪K2<`ZSNť~߿CCCiirhh(suKB;} 7wtm'0 "9瓓k㙉%a&T{u~U]{/ ߟΟv^[kTw02  }w LW_LwVUU5kVuuuTTTc2T*UQQ^$%%Ġ&*C;p@RRÐ!CvMͶP(RgU[[:uj]]keri/_pAEMҁO]rr2f=z3˝;wl 2 v1²e2' 6tşD^^d{nD}:oÇ@S%&^?Y)Tj|rTiÇ9s >\IIi֬Y}힣lC")>-[?~8******11xs3gV*~fZc|1b SWW7hРf%%%|Rss3keUP/⒗_n]||:i$lyԨQ---Rb@5 5jbzf_R-o UT9fR%ZdL(35D"|.*ʧ= 2$E,K&U͛7[la2ܸq#00ݻw^^^}^z?.$uuuTj Bt{ m,bkeե/%oILLw^iiittti2,׋f9uJnNy|6++ۿ|_(Ғ`!X YOyɒon.*{WwOYz5O&OҪ}"^ɓ'7lpQFɤJ+))1cpLoo#22qu?|NfD6SG722u_622_)JYY-^cc_U(vGwQƇ"2 ''P}}"u8% ku-)/*k Æ kj_WWuvʔw1Si]DJ('|BJJ('''b5%©IOO_n/#*=i$333J>~4#22YJ/^w/_W_o|QXXbcce˖F>_\\ HPP(--%%%ᘉFt6l6L7o{ZZZ \]]QzaaH- L#E>"nؔ@bkes/.]*n %%%߭Y ;t.ptWܹl[۹JJ#"\\\Pt3f ;vMАx:NP>~8eʔl۷o}||={6a„5-[iժUϟ?0aš5k6n܈vQZZ*̂Q^x! av@"""<$$N5 bshh(B8qU8}tyy9HϯY\bޮ5N<YHr---WrǏ svv4UO8wD(~u˾=Gھu<?}㷎= ߾m |򅆆BMWz&%2L~< ªϣ%"IrjgϞGhii;BBB.]a^/Fۺuk_291 ~$qq8Ι}>Kq8??;w¶lA^xqƜiӦ_ɉ`tTǖ>|^PP UllԩSXy<7o}c?9)jY .|.7txV9WWWE ?!λw =ȕwnW ֬{<۝*]__`0]jhh`0DFzJJJX,VPP^3Yg;l :p`0ZZZ< C^XƍwQ)I)SHa=~z ÿ] ں'xS;|H"jjjn߶y2~=inݩ'N$xkI#330eggV__?n8///ȑ#䵿oa)< /IrfPӧ jj˖9{xo" bf{Q_t/ YxFe^_'3z@94%{xHo011.,b gx%ɘRv쳎vI P$@2&uÊYozHo@ E.kbb!?Xj7+fe 2hLhPP|@z^@z^@zŘ1c ׭[C{GʫI_>4.zI&ڞ;wNRl;;cjkkZJgVVX|:Vq~WWWY Y蝊JDs8:IKrr2Hz<\.7,, ("~zEEEuuunnn~~~}C -/R鈊rXȉ'c~WXݻw_ѩU;w677ٳ 1bƍ;sՃ^pVVgIND,sͬtܹs}dNII AW@_͵RSS3119v^SS2a555Y҅H tKrt*jjj79sfܹG<OGGQMOO733SUUR=,Dұ?s挝ݸq՗,Yr| ׯ_ٓ,kkcN0M%$;՞\^^7>DRs|ɕ+WXEv횳3>իd\xqlhhbeeURR/ծA233MMM:AP0>UNJѺtfVK.t @z֮]kkkwKpر8N{xx,XO>=< ˼-!!СC\.7---:::''3ݻǨv***/y㏋-7CNKIIr{\\ܮ]?~\YYx-[lڴѣG>߿TYY944$;%8ZV***s!<~xp87b۔)S!'O~8ݛ>;::ؽyĉ*}J/[ ,Çudbl&yЩq.hbdxeii)jjj7oTUUEW.\e;޽{8OvvvXw^VEE%// ,i'8ikk311vvƍÆ(ݛG| ](n߾=uTtI[[ba GSSg:ݓ;wL<5hwRR._~zРίN8=sLA"""3fڰavY|u'''Ddɟhb7fV޽311!&Y 8+t'/ԅ󃃃/_党lxŋST+++MMM!Rc˕K|LI;i`` ȹs1gϞΞ=c_9BLJٓI&aˣFRuH"K Bt<ڴiܔpBY~}dd$Çoii1b2|p2Vq޿:::fgg;;;߸qCMMo9zh~~ݥK֮]KIDATdȗ-ADeeH*l߱D#sͬ޽{"g%%E%%%Dzڵ̙3ZZZ׮]3gcG(h;.'''HQFGGU#FK577"뛚Jc/[;A&@箛Y577/OK/|yy9JP$E611 >z706lёۯN[[nᗍ$$I{{W^766.X@$~QQ~Cdc{B=qq ܹs?d2Λ7O^{VV6OlGKKթSVVVóiii666]  LPDRM, [/2 sͬ=z'EdŊ7o{ZZZ 믭7n꺍͖-[|~qq1ڽA]]Q`0|>N줼orrrrr@\@@N/))%%%k֬@${w Ȕ$3CBB ֯_ٳߧt͛o^l .Y&;;;%%۷o߾MMM={,6VAl̬{noooAݻhѢ- LPThL4Nl>f OȟhbydX n߾1Cz]\\.^.[[[GEEرCGGGWWw>>>i8qԩS/^= (&NЍo0zh% SWW _d; W^^^~~x˗^ZCC?,, {n@${w Ȕt=ի߿=yÇ;wرC[[[__?:::((hÆ $"3׮]p˜1cXqppywҥ ¦2 =lذ_,[I^9::M˖- \jo@@b!?јF[sͬΞ=p;7i?u݊~ se=</&E/nu @dOB!HQO7R&K]n&S6r)mpj.}#뛑$w8~B!GE:>*X?h~LGr#R J)A(z<ڝˁW!BJ#,7P͏#g/2Ll3fL YcaUGC{֩Q(*B^];Kn~é4TAM$^oUcMC|),8CזbxDΠf\07W]z5onFW _Z<_ >-կsâM_\r|ls9SMG\l?⬶ pqidƑUZjl2T!mjrg:{z&<:ᔧ1d >m 0W2WLLz m?*XǪ~w,0_V}@ RV.a7}RsCy_]?h:Gf'*Yk3|WUu.XĠʂ)bSm_R^61oV`*yyrTFq{K9Gt t.~+XͨwG^AV|%_YdeTdf4ξc&\?v9L~BQQ<-g1WY/_eҹ~B z0]!m\wz9IǾ/|ˀxzR'4Oi}OkWbw9p(،(gm3{r8eۂ0|3厗įxU0M0SxꂾTS'/Ø :VUWq L|zo]R U)Re1sh?xy Ϟ-^{J*6+ws<ҭjnfnrJ%yA'sZJϤx<\,ޱe%旫&c6)<Giۓ?]6 C(x:wCSLɠgb%.3?bٚPl <><P>r}zW"SAסOF*%6zȾO2ڞW~qxsBҕ3Z%ǥ&ă'',<RNH5O?\2~M>CQ`jKU5lK^>15yxCK넯8 Ա`}*I5^c۪5ކbʖex~m,xb=7C͛6$-~vkGɁMkkrG:ǣ.JUr j;Ydiɋ aQʞמ?\֐AEPR,eMw+Ep$ vB~>$uLQH!NUvTjWPOvqm];N(f G <15{"3%Ib`:hhe֔tFDDfSu$'&k\p" oI*${fEA:n̶t3sptŞĞB3zv•Ķs}ڬo#|&k< arTmx4[]u{ԧf^>M]ڶ_8:~Pώ|IJBjtf{RؔFxYjjKMKh;hjklAS F܎b'Z&]zWܯϵY!9u[rb}M>E,RBF7dGW y[mSgYqtt"ؗ V@Aec=xBS "D7ej@y0Y(t>=0m(Cg`X~wXEaQ1f~w+_ET oc0۪3Y+V3Y1[Q,S֯h,Ճ7EQ/V<&`9 kjJPmkV]ijjFcC2L:r7..H5}y.6\֪"_1XTMto8?ss;.o@1YiHVitC[>%bun0|=߾ctMG/(J!+J+:z)>|ew.m m>ddDF෼SBG 01 l}$DS%]ڳUv\@k:<K$jjE׶em@VPn۩ kBD ħ]oF!HEӣȯrFhE?u0-01J-#?޾O/cG*Yqn$/~s;߾oc˳P6a EbBCPL_E.o,Biydz*%sZN=sgšk|/ xzcMHjn &],4]hD+OMGOWa*k[u4zp_%cq,IbFqMc469ǍsvHj,emZWn]*_u*c(\N.Q(-gN],-XcǍݯ.D,[]ycI#g͞"^r ֓k,AF߶fpt 8sg6#{wL8\ Zj17K9U@~_yqtLV{!<i:WRُ̚/.?nxW+lfGNf+LĶ.nxKBz?L&:ֽ, 5S˧𬪼?h?,gu צ1Eobϟ#ڧl{sZǮ-pql}%sr8lk!N FfB4pE΃X=F\abJL*h6/]kWXW]ss~LGG q0;R(;C$vٞRg-~[b{{fpF-8l<5!wn`揔^c&M-30}!CO<<(f+qi%u <3۪kM=[z0r[~p \+W׶{sv--@81vmҰ$bOFXіWnfHFn}};\Y_]֗PџF `- n3r皎)D,qea MqtW<}y֟؞Ɯ<_Up&h,G_ %R4 Db'cO|%芎bYd* qm:aKnllcډLVLf ~o){m:Z,$q@uYyrYav$(P1Yk5{"zbuXlee U8U%ؒO<ڶŞCO`6yVP{"V.L#Ӻ!֗PџF `- WSu]g7ϵWŰ:a˳5WZJV2UF!Z:́m_zkv]j{jԄu^R]kn_#uF0;12{ nLyr k Ya!۶f{"f{bIJcDsܺk7M_97X?DӖF>OuFh?Ee(Kal{!DLV~YiMl\ YOAEؒ;֣tGOsZQFfOu!bW9ʝع7 Zr9-N\r6naf;x^3nbܢɹ!MտUW|c=pd(B!h,ZhϿ_?4B!uSuF_lB!- !B H`/B!D+ B!B!B !B H`/B!D+ B!@T}jjjإjpBqq1={gϞ7cYMZSFTGMxי1c]vC 6nUV5w񂌴iKilӆhЎކM%RYK,],or4>N8]㏹˚Hudm]8MyO0`L&{aɒ%u],ZXMKowmZz4Dvlz !DKu`Istϟ<<#1؋Kپ}; u_~̚5KHvo6m6h m(Aς_}&MSN >w}}v 0a'N$??۷-ԩSIKKc̟??oFcǎ=ylU(eɤѭ[7.2rrrB҆ m6?ҭ[7:uĔ)S㏣hKMM?N ##veee1g۷/q:ln5amZߌsCԧ.ڶmʕ+ 5rv=ÝۻH٦j?7AmkӖ~^TO7rm̛7#Fzk+s355zѣGӱcGF&,5ٗg.\ 7_ǻ3<×_~ ϟ?K/4K/vCo3g<{壏>bɒ%<3dff2w\|IF]g}۷իWĭ T<}..bNݿ5=|<SO=oSN9%~cgԨQ,Z(077iӦoa69s&~;'xb|"m:u*sӧOxYpa:WV]VZE~ 4?F1cbl߾e˖1tP^y:vj:/jԔHyMg$H}mhcuƌ}L:5fѢEs9|5kj?#MLpBq[%8s95ݗg׬YE]TmT?,\1cƄ i׮cƌaѢE̘13iҤ}L0!d݄ ظqce۷o6mTRUW]Ŕ)S8=z4&MK.Q^m]vv6?0 .$++ THuT7#ljԇF֧>rJ_UU~nf}5ϋh)osiM^4D"isac~tm_LJ1۩ʁ]㎫~Æ u("5PM 3j~~~?㏫MW#t]NQ:cҽ{w{&NSO=U"V׏ʮ*8pdeeiZHHuT7i*OCZ{,]4ps"ZFmZ:7~݆YPʚ^ MVB֥#Fv7//%Kwj7={xb6l˖-1HO?n <8pPXXf۶mQKQΞ=7|%K4MU+W䡇wyxUmu3rH}X[3F5F_y|j볲B"WS#MksH@3G>tjzmH R틾ں|n._!C4d-Xwuw ҥK9~I'Drrrm)))x/=Ι3o~ˮ]#m3g+믿rsL2￟\TUꫯ^;w!vyl2\.,YݻGC+3RnӚa4g$H}mhkqgSXX_֭_=sO0MKsnkaddd0gN?&,9E5+B\s5ZRg˼B}<+N4St5%#eڴԾ޺TϣZҽ;{lٲn-/ G hxzi%҆Cu9%wڴi\p޽t.RnF=fKuj1B!DKqy{F hYqB!G{!B!Z B!h$B!^!BV@{!B!Z B!h$B!^!BV~ӦMlڴ"B!O DBBBSE!BQG6X IDAT5vъO08[E[vRjMsa9fpH!B4tii)@pHΠA e|ItXC֩*\tNNa& MmEN1`@j::4C B!Dc1y`?ZV+:hh:h~(,%7nquۨ"Ͽ9LnYn7+"c1(.q}~3>ׇ~T5~of]2qIH׫W[tϯ( 1B!De8o6[Y`,lցcW.bܱ#Ig[_as)'MjϷsѹ灃Pֹ->)E._E^5u4^-B!G'~S}2tc $3ĈaΜMT.=uey>qII\~tfo}WzHېGUqmS+z}u:ve 5 M!B25ʬ8FLp(;j0N'ܩ (..6w%>pwe洶*x\>C^^tzҢ׫U}?N<ShۦkNaQ1E|~A|>ƠV(8N<v{ uB!ͧf1tp @f&3m D3iK/p$?{8񎊿 Ti:CaɲLq-W}xU?#GBW\:_G~~1YGpu"fnJbb1-*ïQŋ$;0GǏK.Q[!B`VZ] )-u_ꉽi̟'tzu^J>]*݇cشiS%F!B4ZoyRU-bxSo;yƻ]dU;q|Aǩ2:r8v|Ya|eXǹ'w֡ Kތú5Xe$TˆhF S6wkh>0~̺ՌajRMd\x<ިBйwdOORU_WjCIɬ:c: M6|ݧ !BĸFb FךږO.#7N  (d~mWҕ^]Pq*lz qj:. NSp~ix~(bܽ.rWSZ3 SY{SG4\./.G ^_ٿj  vyBknX,|~ 5KRqB}Ufi=G׺ݑB!-[͊c!!Auڜ>+`<6e0tС/0,m!7K%-!|@N-,b=Rm(՘0*l<Բ.|>?.ˋU4c].7VχfGkǯVeABII"+Xa=B!"65ڬ8ssk[;83&] t_똋0A" )ؽg&㰃5ۊ-mc/HR {u|i[z\Q~|{s9|U۫jY|nq{x=9Xwlұc* ˉgNc瘓IHSRUEQt,x`X,`6|`2騪耆7{͂߯Kff.$<J} Nq RRbb;YHHU !BhTUxz;oN"ڙEWL&H'HtWkMwksP1b  nWBÇ8LvUrQU))u()qSP ><O}XJPTU.R>4͏_}j/8&{~b(ʕ۷/}5?L||S,B!ZFB|v|wI }:KrYP?P[GUMx<><?^ ׂCU-^+^u沜u M ,:׋P(~puN>L~m۶30pP:DR0q.FuB!DhD+!?u9RǞŜql&X,&4Md2afbqN>JJ 3T̂%ZUӔqb֌q;v,|=&@JJ'̨Qk!|>?;yRRF]o!BѲ4ڬ8M%`)7\ؽz9hWr8^njxT;;9uZtN=i4~쩽W.rb۸K l63fH. ر >̞=%Y9餙X,2^!"5ެ8MŤpun*Dt4 4Y}ͧ:uNZϜ93v(Kǎ98t(];GL_68/K !Bh:(ZoDda9rtUUYz5wfT!B4Fg,0b̘u޷w X!BL4hB!uSk`/AB!8B!B+P!B!D'B!B!B !B H`/B!D+ B!B!B籯짟~b͚5UQȑ#9㛻B!"˃q5fyD%+W^!BDd8/OޘL8'xB{!BQTCqDlHMMu{~~~D!B4 [1 B!2+B!GnTNihƔ)SHMMoMMM%55{qѩS'F|P-+VpYgѵkWҘ:u*~iH,X̙3IKK###s9;w۷+~Ѿ}{W_͊+>ѼB!bG'|vZyy֭[ǐ!Cx'3|~ztµ^˷~?r駣*+Wdǎ :+{Z~??l_|1&f9׭%lt5^ovKk8EAQf-om<O<7tSTEٝ;w2uTV+~-3fxbzU-E1rH 0SҴi7n_}z*˗/租~bРAՋ>}/l2 $##LNN:t`&LH^B!oŖԞ l\z<`E>h`HY#;~xDN9 g*<#_ݻ7?ʲef_UVhѢM^B!&/Xυi ˼|9G坛.tfz~oq)& :؍ ~hvZ~a:vȢEHKKG >jƍכ6m`uG` R={om6kVFi$/!BX<`ԡ\<\3#t+6bs n˫6)vuS>`Id%\NJJJu=[R*TU&==GyUU)))ϑ#Gn n{l{lذ8䓣.g_M^^v6m0jԨi$/!BX}0ӵkg>=ugƭeN'{3g(ukՖV2۰YW-nG8&'X9kD!(V+r̩~4ϗa8B!-Xr<'jOSLl'ZsfL@ӵ} K}:D'0L[PU k)B!DT8֖E*ƿ+ t`ct$Cym&LeԥpA&>~b*]ǣ(]!Bр @ˇ\j=[]L8]Y052x!BѺL`?_\Ljەz7Wߛ vVk2B! L`ߵC{%nw6V=* V'Q}*Kpe'Fߎ^lͺ#B!DS^QN9 veRTC/&̄NԢ*k*~*~RUO&..N !BSǷUy}SR*L!Ocn/UpOSG8 B!DLl6sY\vv=a}a_W 9VuBxJWع7sO$>ފሹ/ !BSL0W>'?:s:29TpZ)-8lէ|߯x<*MIbtODbnK~5k4w1B!D=9?p L&_O| O"11*WRRʢu8>.M$%%3?Tԏ7"B!aʕ Ej)Ё?=]gl_;0s܇e{)))$''cZci}yPk[#4|P7Q+9GAY4kg]U?G} >qĉy'Zo`fqJ/ز=MtKgpgm+U xľN6sHx+p4M:K7Q39GAY4NGZׁhƸqDZr'a9III\8YrǺ9e]̚ӥ.-tiga@W;};zpp8d2@`EWWo&r4>i㣃hb:@po6q8l6Fū _iV+6[ VՊlnU}9a9Ϣ(X,, ":rÊ!4o"<9GAYV&Յ{ѭkkA>|&OEDz+}׭k'?biM>e\t1ok׬6mR3f,\z9'F7^h#m|t~[YK'3~VĤf.M^]ٶ}O)}+V kx^brƏ?Q{`~~ w)'`C$-s䩧Eg_$!!M6/pх5Zlچ mZL,ߧ\p]:kG׷j|%ojaZddtsO>8+3A}=9.}]i"#~Xw~'~n:t/Bik쟦n؆ m,_FuE]z>0_M$iUaX,Z%>-O#w_п'F]=ӃK}kN9y:}tcT[^cե"[2}tdOqN_L8>ztOO駟̠3#r1yxʤBtU=ϟIӻ+'{7d{|Gz ΐn}4[oͳo!.vuh=k;?"]4\7{ tT= ja絀~j~~mN;{2p@/.86oȲpb ؛Y\a>c6 8q7͌'bZ8p>"4#Gl6-'G`X>|=rzU^֛#cX,FÏ<ƛo_f1X,ڶmw΃"#a=##֗hc]oGưaÃuS:4i2N T}w^zyOS3@]-Uӄm_x1cjҦM. x_/p9םs|HHۍ-R{_{LSk1'd̛7k1)*Ѵ'Uuyy$''䓏쇥d0L!yo߹ګo} ||} gs j70wF /NēNa;gn޴c=8ppsl象͛"Co߾nj I7v8ng^!q: v5HHrr25#-5T7sM5&dQƄi w_wݍkM^t[d #F"%%5.%%#FtLDGnnF>Ìܯ[ù;Xbof,_;wVKa.;,k/ DԨ`IQ5VT?c4*)Q,(6b 6X#"Ă%j 0' >V]]y2sf{Ξ;̌.}{Q[&,,chh!ڵ22Eͼ_}h۶-TRݻ-#WTcX[[ C%""BūX2x1Fޗ5CC[DE死*-/77n}_&ܾO8*zW*ylq+vv5SӃkV ]SSzKSFh裦\e/iȡ4qY(z9Ν<}yyyl+hJV,_N?wn9}-p! VMWrssdgec4efo۶ #G-/ŋlْHGJJ vbj?~=zݻwեgϞ {U駟x㸺\>JQ-`РA?ʕ+Wݻ7sUYISsHKKJ~6XwE{Ϥv%//ʔ!CU>1ׯ_/Cm[ߡv?(o;Uر~e??ºuki*k/^Ix! )mC˱wW"_Z 6:5P^T>o!5.A\|Q&勥܌3m[7s5?~sr7o>o%SUqIHxٳsuDݓ /ə3?Yy,]s300 11QF&&&ZAyV>ܼy;wn{<|'OsINNVjEAAAhii1|p&AAA2rf"==@ڶm.5bǎj,Z\VXAձ믿&77___ٓT7l@Æ ˗/ʕ+K:t(K&++Ǐ>qq-MoРHL|Azz:'OՌi2eyNr~sdffٳ3a?$Sd(4:UҔ;U9,iir԰)M8;w,߻ )JZ8`¹\vDµkWYpcƌWچ 3bh||rH$^\FV}*C(|ڵ@O:1k8IIIdddpU&{7~*_OeVBi\?Gς\'dϼR{nջ/ |(ZJ]E ʔEU\}<@N]R\1;v)וrnm|~Kx9?Ĵ~gec>1ϟ}GնG/_F uFhh(gΜ?ܹstСT?hE(8VWć~(=622J*㣏>tCCCׯ'|75jP^@ oTK-5lP}}},,,iܤ fϥ]2}>i߮7m fΜ.6+1OǭV[{,~'yy|ظ cǎWX'A!"~TC '׮]AGGN-Xz4CO3g~~K7wO=Eճp>m?zu[&y͹6T}O<ֶ&LW>jק"J򚊣csmSINNjU39:O[Uz*kݷLi]?{t!))ɓQÎ#G;hjjXԗ}*sgUWLYWEy3g)2Ӂ|Wگ+KW.a|viOVV;nӧu)k4>)yteǑI  кukv/ 6n: XNKK#-- NFFzzzddd```iii'Ҽ999hk<:((ٻw2w\y4ɉ/y} dŊxzz*->]Ær^AΉJuod[1]JCel#oߺuo)9Zje_~ߔZo> *`5ٳX[;[/n}FFF<{ CCCiZZZVVVj*hݺ5DDD쬰LUd9s '-Z?yR9---rrrȐ_ʹJzعs'III9raÆIU%xy3de2KySYDEƳfz3;D`\>YKmewZKEς&irrr!''q/s}m?R?|0/^_~2F=䏪ۗ9ҥKݝ#HNUUfhjjͿӧOꫯd޼yR9GGG d;33;w0a„nݒwvvc``-[,>U+bRool-|ʿ)T66r۶w 4kԩ3Kiw`.^Mr?w>PÛG V2d!CsNnʧ~JVdɒ%ߟx4hyTqvv&$$___ի!!!2۷oӓ 0w\4iŒ3^}||7o>r$`Μ9Ycs,,,6l~~~KʫQ ^{UTsymm"]^ҫw_Ҩjyo> PMӧCԤIv]l>Udt)PyWTԃ(CbNa>>bSb!~hm@gAeLw/êX2D){5~7YPY}%ӧ]k @=,lþGS] &Ph#e> *#°thߎەw5AD){5~7YP}W] @ 70@ Jڮ8;\(`D(@ P 1bpFMڵ133ɉu)\+::bmm5~)ѯ-J߾}Qt]^#77իWӢE ͩV-[d[ϱjժ4k֌9k׮1elmm122RZBCCCY&_~%)))o̓puu ===ػw=zDݺuАK+~ }}}9٨(郱1ݛ(jޒhzuuug޼ydff);KKKtttaoDORR昛T°pvv&..{38p˗/ŅN:Mtt4]tŅϟ-ʕ+&**2c :fΜÇYf O>X-J랒¾}t]w3g܈"--#Gtsͷ]vѣGwtз^Iyç,8LjP0 ֭[7[wUάXOOOܧmJ,XL~ m۶޽{Ҹ _-S3R WK.<_^MdƏ/g+ӭ,}۶m,[[¶mXx1;vP]ͫtTefkOz6iYK2ԓ`A&:?ACpp0~OKKq)А4Xx1+V]Ͳ"""2e )))cƌ\p;ٓӧY~a OmԨׯW)ߛU#z\rE&nҥlڴ~дiSvqqY`XYYRf2>HLL dgg*,,7o?''';vpyTUq{S5oItTT@֮]Hʹw-[gϞR‹/033SIVY?Jdڵ+gr6mի ^z+''`.^(5j-Z`ɒ%/At+K_jR֭[vZ|||Ԛo^KGy4 əUHζ"%ۊ,033߷#Kb !S*{a߿SSSW^5Ց۸q#bhhHٴi~~~R9###ٳgBxx8NBBs-VG$''sUj֬ɴiӊ~AHBrr2?3>,K߿'Ŗ-[_Ƚ̬5ⱷ'//---444pttT9'7nqPƱchڴ)riEE㯓$:**G"ɉYfU͛7ݝ͛72qjժxB%Ye*իW\^e޼ylܸӧO+5!nݺ58 Zn-"L7n uؑׯ+㫼yްOYF_ Lkٌzuj|6[T9Tm 6dq/֌wmyKV6mܹs9trwܑyUWiYfܿ_jjLPGGPPAAAj }}}iժAAAlٲX~A}mJ*cӦMXB&`ͫ+tge!7nLDDyyy*獊⣏>M-OuӦM7Na=nݒ}6Eռ%Qs~wPNBBBhڴ)K,)VNZjӧUUO+?ƍDDD$i&v%]S(ry*aT 6V.vdGKig;<1s;f3).8o F~\5b5,rXJ`` K.ѣ888(qvv&88X.>88Xf).UzիW^Jڵ:J/.;;]]R+,۷/2X͹|r+a[|A{/ŊPeWKay={T?czYl]T[,8::ݻ|2K.-U^<==%##CazPo֬N*VfݻÇ+ ω'xܳ@XXtXer/AOq 往(zqWFeͫ}\RyV 1m2>1O;XQ.U##+W&ganK+Kd*$UCkV{o TC?̚5kHJJ"))I:ICm9̙CXX餧sqFwuVUСCquu%22R:y… 2dȐbu 44r Fb.i3|p~g .d;wLRSS9ydTQ믿VN'O2ydH+唄۷3dȐ"]wسgV"11D f2W\bbb/PF^8uiiip &M \\\h׮G%11 .\RU9sNxx8YYY0bvJhh(^^^/۾};}s|7޽{K_V>yd9<H򒩷7qqqH$Ξ==T߼ iKzmCjִeQ|=-2$y2D_N$CG$W&lh Wm:61*I ZsY`wޥQFr扉R9 BBB SĚ 6yf֭I) IDAT->>>(]yFU~~~t777lllaĉCYt)j… W&6l.]b ̙CjհdѢEj sĈRkA‚sΑLͱ`ܹ֭Tl޼cniiIxx8aaaaggDZcҲزU[:::tԉ5k@' .[[[8 Vy ,Y/ԫWcccD"< ...^ӧcllLn prr"""??"7 V*cJT[Y###\]]5ka?NݺuR ̘1C'KeͫpTerauҡF|'3R1kNbYy?)T5fSZT *V@PT)gՀ0iȘj' ;Z(K#7Ft2VRT WRNg(@ O2 I[;>z5=2si2F}d BN i FIU!7R @ P AU\1 kg!} BP(_#4guxfDuw@ b*a)"9] >#_Y55=HHb˗dEZ_t ^ @Sa t]s,LHM}/ʨk\<5|\en:GJT$%roVɮ-S13"/W/2_QY_hi:dd둗CXT @PXe+ 1%뵍~@  cש]ӑFl3|ƹ^XڙѺ~\p 嘻 vmklX3hا܍~m9'BߠԮ_+;s\uPVEGnn.kWӦC ̱Y$ p5ůyyӾB-[L̎:U4%p>s `{bgϟѡJ=0r+YadGN;Wi>UntL?냙1f؛(jޒ(/TmAUߩO(k_h7o cAB>HCi#hiϾű{^8x_\F.y<}бC'n_h:wB.~cV~ϡ#=f> B,D'SI5<)R9?f͙:ë*:Ml\,;ֶW.\6ᣇ*ό|}ͥ3]:u^#E?[gt&y|e$: p_s(b8ZZZegUP@Y/ASa| $g"S켗vY.L~Q_mMytШ>S'Ogl4רa鳤rkЯp!8ޝ{v}sgWKoᄟ:Ihkg;vs.YUvlkXHZ:bml_X@db%hyJ*Ҹ ѰA#<&~VYŽ@ V|OX'%&R5+ _OyMf,[%Q<_{9 ^b5wtbW7 *ocf@7 l2sdB%E\_ZKO+*Y ,꒞!v8 $d\gT[1ISezUQUܹhjj_*:*"̫qؑ*Vݔ+M/<§SE擖T4]!A$4cG1ldxCɏ4У$:ʃ53sU4hl. 84eϪ}2y6oúzGӾ>{ʗS<04=+'O$5W;3jM12ףe޻KzHiT1aDFΥ?.IfV&.E2r+_s+J0\vn+V|Ǫoyo/'YKU>J 3)GР=W]KRcyjaؾgŧ|9h6l$ACލ)lUDGyyiߑn\W)}2?_6dd^_P>ھ>cXޫo6:U406Y3hծ9^l ̃Qm ^ckh`iJL-T/KaA~YH-!= :44u@\"eƼEs9ծ#^N=DݖC:ԖWמoڤޗ,U&c DKV飯OKVl1m;UWaтń*9 šU^vsz ~И_"q%.EKzܾ}K^ԫg_lY-eVD9Fu+/x{P} 9Up"/ I#-!Kf9oǑ!yǎԦ)˾^"Sh+oejhbW--X/Ka\dזpcăhjW~@Xʑb_AL.9X.~t⬶\n=v]WUvUUG^^UAUӾ$;;[.ٳ> ׾ټm\[H+?iWK vsbR5oIt_xd/ ,FkgNgMd3~g_ⷈ_5ud7;YR9YjZ<'3S…qjec0,4)ͅqdfJ1hV}ú 9ZH83֐DRR7>%!Us<9#=#tNḡQL.ΪʅKɳ/_`XWR*:*"kкC ~ 9Bjj*9;CF .sao 㾒=+Nz)ޓy!)ɬYDOr^g})i; ;y1C1I^ۿHLJ$1)5s y6н[zvwn =JbR"\t#+ܧKxNq'y$ .F9ŝI/xϪחSrH$\_N}keA&,f) /HOOÌ VO{SS'z ΰ1My,ð]:ܵ;^nյ 'ҽ[5KF"NYSG&OĢFUl߳9LL٥oǏYRPyfAD9Siծ96,ضc+Aw*87/[Mm kUcR.ZΘQ2 Dx9a;e嫚$: KX8ϗha=lߠH%;,?upOfXWL1֕f,&Afi & 5I-SP}ز eoUMsc"5ݿwBjS-`ώ}T u<|:ϲJȤ hݺ5{LWFdƌ[gUu̜9Çfe{Ϗ]vYbZ$(i_NNNlْϟsU222ꫯ W^<|dٷoL-S.T}z嫣<ի',,+W/0}t6m֭[ߴiW&44zY͛iѢEYW_P ASSl45 ۷/3fɉ o߾*ۛyKܻw~abb={Ȕn>e2bl$;G.Mv 23_FgJXlLIbjIi|oЧM455 ddelU_k<\~M鵬3%15 T7Ş={X`T&(UX7쌡!tޝM6'322 ={6)))O||<$$$0wRQү_?|||صk=QF;VFn޼ylܸӧOk8::e{{{.[궝'}vf͚%)ʸ./yKe2bg l;~Ր%b_(я m0o'ry-iO⒥Ǚ4 =M)S>kCVvOR~KwyNUz|=ruԑKWoI&Ν;2r ?7k֌KWp#((?CflV y,[:6tttXx12~!DDDRlZZZeYEA%"&&&MvR3Zl)booϭ[#ܾ}{{Wˠjޒ(Zjӧe( IDAT0`ө𕯸ھ>s7n̩SY&H$tuu2}\n*+K۫lٲ?U={J czYlY-___22Y|ӧeN>MƍI&r_g1AjA ů*'舷7w,].(r3kYҿ}CR3Y#Ĕ kHm ,M5,}8uꔴ?~CLbϞ=ZD'88ɓ'˔ȟy6УG\\\h׮G%11 .\3yd9<HexԩSqwwҥKH$.]:&MtRHOOraՋSNFJJ 'NP x3a^d_M^dM45}]yHcC=ϟzCgoO>MM ̌iȎ?V?mM"%-S^Sʒ p]5j$k‚qpp0BBBP[̌ 6yf֭->>>ZlUGqss&NH=h >.KΞ=#TZ+++qssc 899kP???F!@ʹsHNNyXXXuVvܩ4-‚jժ7nTҒp°Ύcǎ.r*-bɒ%@z066o߾H$;>ooo\]]122ՕYfL}6m} 2ɓ'˸qU׮]8<3o<-===Yp!rUqo2٠( |GlFFv<~7_~>ckyBȔUzԐ C-ٕnj[Wg+1!9-;>яe{uI_#}Rҳ}?ED*Ab6Mʕ+ 67owU7›ޠT'Ϫ즐+Rý0W9w!n>,2;tj|ԣx)f\%AebĈ̛7:up AQ. @ 8;;ӧO޽K57nSL)j a @ (\]]Ω[oث#@ ˼UXj@ ^rݠJ @ °@ *j([^Pzdffw@ 1bpƹ^XڙѺ~\pK vmklX3hا܍~m9'BߠԮ_+;s\uPVE`egCG0lUiq3V|ONNׯ1)rԪw-@4jSAM&OԔ7VA{VѪU9Ǐp.:Uw1-~ *dcY̬16DDTUDGEknhK,'3hTu,(=TmAUM]IJN+;sJV@=:{y36o |3:qZ4Eӹc pyszJyysj2} o ,ΪH|*V@/_vN8{*DZsk0gF0gx1XXXzrKIJ nzKgtʽG܋~D.tsL7S5oItTT _OSسc;[8/ƹqZIi{-M-zu.L]tٳwwyWDTcNN>L144Јoׁb묪Eƨᣕ^]gC6Xz=A;FF\f5hܲBKK ذGr!< :k+kLM%~P)dff2|uneVYɀ}2&6zbS5oItTtuui#6 כ qr_GңfUѡdlĸ17f6wu ws!VKzFL\|6`\ qQUn@&ME[[UUU*1<}Fvc8}DJM;RM)E&mڷ 6JLjڔD+ +-ZII3˚}w|}ly^{yyݎx)-0}? 3N1H bHFׁTO1%Go۴7Q1lXxײEptم/# >~ISoEGb5,BEX'e[!$$Ds5f1G^]\ܞMv9 ǝNgǝߜ&M2c S Cp65u6MF:0'o-o 9kԙ ۖd߂! Gc,+?5HIv|ͷܓQS] SO*abaͼhdRnP޿ƭX4Jb}}=22vLeȋªuka7o0yჾ(gBZF7y=5Li)023S7;n= P̙Xd%󙕕 mm0--mdggqײW/aaWYs`nf9(_)+ɣI0?'YN4[qwlj}(7R_x̴[cfWF97_ A9y>@؏!A<|.7eP7*MJ84Ao4*B@@o;z%G#.CzEE$$$%$$PQQ\ѧ"y퇗7&|?x??؂2ghN}}=B .6zY|1`5trJ/=V|a ,E_hBj穬`7c_n.y- yMFCzK#GOBOg4=kh(3Źjkk&.iӍza , `2EPUK1lΖbRTRm`em# 2Ogs[^76Cu3}.SW#p'#4=B1SNjg0h@}{p<ë&.)D_sV-_ϟݡ4zcV;XZ̄^M`Ÿl:}ܼzE5AK]bRu_(T@bCb]S@`9?sM=+bx`*h"*b"⡨ȱn^˶FGWxO Uվ8gupu 7n^Gh/.n䊣~9i̶Dm]-n\/4Ss+9iΘބn$/^lg+ٶiŲU8_Mn,\mt d$t vaᬿqbА, [mv#Ӎɒm̭AMi>nnb)燱cظc[؂79X O1*r",eݯV7{y*B:~lU [E +0f,DDD:?ްLu};О[L kqA٢hhG}}CߍףHJz͛9ڂ}J?D7b'0@= UFE5rk27{y_d)@K'@_c(cvk{@ BKa %:Ы(*n-^>W SJP]]ݭ\r@ ݗ.e؇? eihDyUǍxl-KyIY  >/|@ tj<,zbFq77{y\([\^?!@'|Fu#%@ |yiFi<dJP^ɛoE7{y+x_(GI*r  qq֋nf Y@ _@13>TTd@t{#4'e!B&{McMT5}AM  @ a!5~l+# `@PRTb]ưSANe֧~eio0i W@ B0`< J߿a?==2>A1Ȉ֠ 6Htn4B K(x@ jFOeAZ>Ugttþ)dy- @ie;T!b rrrñcX[ff& eee̝;_,QQQD>} //SSSDEEqm7/:$%%Yn_9/iiiزe z IɎ[ 2m!0DEE˗/s-;;;q2220c HKKCZZӧOGFFOmlktt&m ̙޿ ru,]ư4TR +gAF~]y ??/_Fnn.Ο?ׯӓA|`bb)Scm; GGG_͛7!$$n^$5?;# v?*3]ư#WS(-ƿe0l&{מpxܶm0zh@[[NB@@fϞ ;;;@FF={6G\\a``@M7229W Ċ+@rr21x`5ؿ?<7778::0SEh;~L<^^^PVV 6l؀'Np-+ٳC a++++lڴ ƍaeeZ5:&4'::aaaHLL ""===ãmh0}~BBȭMqfƎ<M@jSBBB}h޽{^Ph4*+ammTښuW9lݺUGK233I&qylV^T HNNƪU@CC4 8y$={D~~>SB(**鼄aԨQN:ՆGHڹu֬YÔlٲ6?22E&e[+mL~搕(tuuR]p!%%_?prrb{Ν?~$$$~埽OAVVVVVk!>$,7!A0lM$:PqZVDD>|VVV iYYYfBvv6r?Fuu5N (**aaa\ǫ;wK.V祳M IDAT===Ɛ;weee yyy̙3D@@fϞʹ>!** ˗/ JJJp5xxxƍm ȑ#TGff&0mmmdeqk3g,,,Rʕ+|uwwÇQTTD4AARR&NȓQXXTTUUaǎ|^'///ڵktp}E1bAD@ҋ*?zKZȱxQP^4h*ՀFm]ÿBBBB;w0WTT@BH[7&LHLLĖ-[PVV?WͩGHHn߾Ͷ^N;/_K,7w>|cǎѣGg,Z7noNqѣGT;N>3gF ^FdeeAPPuuulr%%%F[S5:v}F߽{3gBFFP9sGnU[çO ''ǓlNNw޽MMM[,/Spp0ZII D߾}PǾˌ \@բS>*nJ0PQ̷mْOUZbv#pqqk +hnid#wI@BB055ӧEkц͉ѫW/^|نGHZEQttt\;㚝1%e[kgtՅ-Μ9^V/=zObժUPUUpCiiiexZu/faj, uḱb| u,hEA\\[駟555|uuu3y|ihh5j/~˨6hy|˗/gJGrׂ5RSSLMX644E1lYYY6lAQ={:444kthhhI=t"##H9nnnuZ|j /cƌݻw-XRRRHHH@YY(BMM 2O!I[@|[ $$Mbµa?leńkRxX< 4.duwwGDD455Yʘ06W93332ɥ˫& 333 '''bΝl" a߽{Æ [ZZ"77<ӧOWWmw .GL[KΞ=&O6 AAALAAA6mZm/yFuttK.!99a h.j 㱷+X7ͪ߻w^^^ԄXcV'Bҥ { (s{_&Tqmϱ@_M_壺 FAJJ -?؎vիWqΎo9;;;8::"&&Dtt4/_mUG7o_/b KKKb޼yle6m[[[$%%=-6oL|||{{{/ {ŶmCTWWqqq\?E>رqqqشi}/H9_͛ÇEHHLR>ײjZXX !!(++Cll,l1ZW>|RBAAΝŋy*kwGLL TUU[n!>>lkt| 4Yo?ػw/ѻwo\~!QXXBJJ vvvؾ};O$E 󃺺:aiiZg޽{C^^NNNLqv?io{)%ې[|ܨRcǎqM>^F$=0ZS BBÓ*qɨ h4ZWWWt{ciwÞ 4K҅m.Μ<q g 0c9 'NFzZ&213昣o9průG}fNl۲'9WŹLۯ`a>KG0jөCubq4K{/ڬJσqݻRaeXbײKW@QQwb_r/cM6ƻxSL0| ~=⃥l`4e*çe+oqW/`8ՠSG Xz=H@I^n\ !A!L42b u6\ h@[K'Oĩ~9c6֯ ddd[̜1GK8\ DŽ !! IL14•̫VKVtyio3ahb+`;[]/FS{k#ܽ8];EN' Jʐpײϟ=nviۯG|0g6n,deda~#̲¯G|hogNGY}z01w'$>^?1q= anfrχmGg7q/Ӭ FCeU%CZL\4ͱf*?o5 r'yV UW-Dn^.&NUG[4L6-b y}1ڒ! jZ}QV^Ɛ(<~71x 3+_e"`HdX܏ذ2=@ ~@y縮"Rt&飇Deȯk[Xb S:5܊Bk晃֋\G{?r |!!!x?@gu7qh Ӏ 5qI=H5 <͔(HʋBcΜ;ŐNg[=o^cs% IyQOť<1B[p/w: |[˵u S ={bb+}tas|LMMK,\zFÈ# HHH@BB&L@tt4['N!**aÆ!,, ?ѣG#55|bb"N AOO-޽󡬬 aaa`ѢEHLLl3v=Ҳ̂ m&AZm6rO>FMu5fLJ?W#¸W-9,Z_9/G`e gQPX gis#//9KV3u׷݁4CDD?p;CTfF#7O v0xz%QD~\;h @jZ /GF &+0w,$=zȵLVV&3kii#;;o&CNW98SugNçe8{2bH\ĭ߱qybDވB\B,=?:6 -.[+gݼUsxjYmFW#>v _Z K\r~E lxy L(([),*\9y)VǸ1߃FaXr ~>0l QQQhj ¹S8y4fΘQQQ>Oa~gK=3!#-8,#=?Z­Z cǃFAIQ t.3j?~ 99k.TVVY <AA}իq444ՕuԐCFF#sBFFś^|PuuuE߾}!--Gr)) AЫW/,Zwij\ ^7\x y Ֆ-?rǏT#K@\\&Ʀ-4yZFGGsbc0|pRŔJGs⼴?A4e]kyr#K ͱ y3gb 9ΐpx/$$v9޿N,]rrv R0D ,ܼ\Q#uMǷ9z;YV8w]vq,0oi*c,ׯ0!m!^zAO{ɓmKrS]07I`9㥞uc]oŹg>=: mKT/}//ײ嬷\9wBѩСC%%;z6NN~ٳgaÆӚ~7Ih΀lAAAPx)`t={?c8:eHIIaԨQؼy3oQ}?zhWc7Lo =^j`0)G}_Qm.^2⼴'WQX- fCtlp/֯k|Q^G_qPgv7R ͱFT2=-m神=H PíH nj%% ]r\KTþ:'Vqț#(|جX'PŰ/] @II HMMÇ1kҎ ?9<\ 111<'8cbl3-Yfk8ڃgڏ4}C`f2o~Fй d%޿C>z> &Cg.^5R?nv@йKx|/?s-ChlUUU,fy{ɵz;8.=i9kFq# ?nߌpo fXX"C!fc+3lpx쎢OE͈p\[D>xa$܎MҲR9#|) (//GUUbaroe\ ҥkf\ ߣQ\Rb9WCvrdc,] tqq{555AYz6n[W#So9999;`Ёq/'xą|kQL20ĭ8cZVAPP),k !.ln$/^ k!Xњųt6'Fo(yr/ +,eI HҲR ~  :g.T}Yz={J(}{+X"b"["r8},bc0x:::pvv iӧODCII Xn};wpܾ}PPP1ЧONTWW|8.]Q ߚkCMVL4 &q8@ Ж|ծ8@ 7aO @ taO j,! IDAT@ tǞ9wއ D%{@ @ {@ @ {@ @ ocŊ߿?䠧cǎן +++(++CYYsEff@TT,--ѧOQQQ\͋III}:222X3HNNҥK111CKK +WĽ{:y\!k$** ӧO"DDD9s &&t{c!7 qe~:<=? ]PPsssL<̄QXXȷ@NNomUGyy93ftnV\ qe `ee''XnHKKCJJ ˼TY?֓qơO>xl2,Zc'"//(++CHH._Rʫ+1eÇLLL0e-SNŽ{PVVnnnx :}3~zddd7oބO$|`۶m ѣ!""mmm:u  r~~~={6 ##b[.>>qqq}ׯ_f^u"00+V$''I3̄֬Y;w>^GCGGG߿e;EN/>>¦M ++ YYYlܸVVV[{.N;-z^~ sssBTT___899A\\e~#n}//2((:::,>C oÇʊ!-++ LZZZ[ǨԩSEEE!,,kxђsaҥb222߿?ϟO7ۛ`pqq 򭬬RzٳgQPPg޿\s3f ׯoiΐ GGGh42zzzGaa!RSSQUU;v0ȸ(**B}}=}7!#HII!hȑ_\16d9㦭,:b|iy38w#((^<==Q\\(󣢢|r׮]nܸUsxgΜ9@NNJKK+Wu_NRR&Nȓ,k___ 33222Xvm?n֞OM>EߛD\]]kC~5u~uR`tjſw?RWAQ \TUUQl T^^v;}4I? 邂Tii)|II %$$ķA]vˣWRN8hJeeeqmKR/uyo߾THH5uJJJz{EOOpEQ@ |8WK=bbbTNN۶N7Zܮ%?`H+,,$%%HWg+_!?ywPPRȤHRR_Q^P<<~j ߛDM>EmN 0Hu/φ=,BB<*Gc?AF*f}1P =0k|O BPۘ """ ++ː'!! HII1WTT@BBN<ѣGLMMqi]>-2Lyy9:ÇW^LytCHH(fϞ eeelذkbkk aaaի066f7oBCCh"BEEGLL LLLp NNNݻw!--͐rj6 vFgggxzzĉ8pvu+77>Jhhh(ŨQ3 ݻ=zZ III3ݳ =r Ĕ|X^!C!^xAOMMŔ)Sضӧ5kS:/_;w.1e׏cG8r-[uJo.o;ɩZgVb=A)Z_,/1}UtqGLW~DMM :pڕ@O S:ә߼yuuu444XNُ5 }U^u<˗kh6zzz?ۤ.n]={6˅CTT ;;;|}}Q\\4SCūWȔGrHMMœ'O#QV,X)))$$$ E|fچ, 6 (ꋌӧOc툎[- ~)===|u4cǎ)*Ws>ohh@ii)s݆~^9t"##H9nnnr\fƌwrZMG6aG&3Jqzz#DlY{IR,U\d_-NZ ޢuuu}X킿?MMM2&&& #M0U Lr߿?򪣉B̌cmIjj*a.\/bɒ%8F<PV eb? DEEWȑ#())AII }L0?rvvvpttDLL *++QYYh,_k6^u4yH޽rTUU!..+V`PL>ᰳcX3o<8;;c͚5twaaaY{ٳoll(l޼)j{aiiB̛7"TVV"<b!!!شir1-[]]]?~o߾EMM jjj_z6m[[[$%%=-6oLqtt-/]w^l۶ >Duu5Ƿ!/XXX !!(++Cll,˙dB`ffsssL0(..FUU?~ӣkxPHOt6dR3JI?_|WFm=ұOt~xJm%UUUEuaYpXrmjj*effFIIIQRRR)´WW^Qf͢ddd(F1:}4OHyQ^^N1wXY!zoXbo(]u]ˊ"+]QP (kB@HH y!sdgnbbb=iQQŋT~(%%%JEEѣuĉ8+i$ >! PeeE4kR:1IEQ|WAYxs;%zXiBAA^Džbpww]:ݻ=#&M&а;\㣤A JJ>~D8OXȽXp7`!ӿH*ΦJ/**/45 UѺMJgeIFfN6rxLp T$>\c@ ) NE{cx@ A e Pn)]> ckj˦7[)ƈM s1q d67@ ủAM(z4V@J]J+B!Zܡ1r¢sDZ@ BN/?l2P\Y4T|RS-&7]T7!@ 'L,.KzJ7G9 &E%)(S`BIAy umrf2xW,KF[.ڷRr_MSL6tkU @ T}h @±4ExE_M< 3((PPT*$',`(,wW,EeR0@ `7S Enek$ڼyq&r"2|ib P SC5v@ Bm`{4-,  `tkL@\8VܶUShpyUPTۅ@ 8i0\> y< ds%l6 ꓢ4bSSيT#؆5V7F~8pxsϓL G y°.3kՏDAMұtd/ 6s22"z_/TYFA!PUeG@Pچ4jxSajJPSO,0k •wo Fl4ll1b#22e->ؽ8|K%+pȿJI0~ٮ3k+9i> ß c:Ξ8#nZZ6q8sTϞժ!iBeߠ^h֬9^D4L4 S\&VYϡĎ{`Rmgql'|`=!#3Cf`^_L9p7>S8 M[WMm;k>CnZ>\CG׷{j`7WFT| QL}u]Z̍qłS((,C|-%(>TTK-džbiaG߶7V-_#Q#`7aڼٮa 2Ʌ CXm\%d [ g6$qI[Sy~yD<*sdw3Ss.=;`-;ᗟ'a!7Ubؽӯ(R/-̺:=닱u0}B{ uЕk"chtu0nFk}47q {$_.8w*Pph0-Kdb0Gpd\ ̃*=wp*us )(0fik=t%#]y0̚?:ff^O$-M,V~Xg3tc¥HMKEd) L&rr[}tuta<{!|>/Lw{w"ښ؉#b;v͂es< _2%ʓKܠf h\ޯ`*,ioU;H;71b#tjBUGvşUP;LbS'MIO RRS0p 7n^/=8O`=;n]ݦyj~pL`oݦEEƽ<YO>`hVU~TJe-[(AAAʲ =vah'aF|6xrOECFءIK=41և0[\ ]9uLZk=-Ec,\ꎉ?O6K?ph?̜+~VfΝk6"K.:{ ;"̅KضgCv '"z)k+?d<=Yuw&f٣(`U"2;|SNԑ3.I<:X8qJ^_\PX7CT uթZ< )3hx6,-۷25+TuQS,\]tĞeuBAGw#aݵl~ؼC ӮWMxt7϶7V/_aCKndۆEU4*>ץ]K5bK/YY0hNN|%%%JPR"(%x{oRCާ*ጱcw-Dt7 IDAT6]䷋:TK,W5eѷO|h+Ky P|ЀbkR 6oوkEz4χHz~~H)܁}`?8pri(ϭPthAbP/Ɇr![Y+.2&qpq,t[ 8q . g7A|a eL4+_;= kz+)U*[t"`>2&ZN:̝5=vŘQݺ;l B-KY,ڛ(ЌN;dz;t*\dsPUQYFfV& ܩ_a@?lQUo[%ٗUs.@NZVIP}tD$T,9rj*>O#0" kOfaTaBpT,^N̚03eeF؟:{]ˁAhel"oboTf9f^+SHH(^qUYlTjPQQr< Ndkafj.Qϋ^&٨ 555(**6̝v`A\ (藃.^"77q_"Nҕ? 7yVX(x< x}3LDz+2_8kE엩x>x|!*fΛiS\jVeL삃ppȤ26یkG(,,E؝9kxR/v?ϰ`zn}ᅬ,x<\ sWCY OEH,XꆥK+BXb?%"`J98iLKⰔnץ@ٷ 99{py-5ci޷+9ޣEEEx.~iYK\$1|>">W>X "nP|:~8 PG !AAA>ĩ?cUq<ɵh0cːz()`zAաV1ay/($u*uuuru-NՋq5< ӫ^.26Mp3FMpey(S8q̜͜>;i4s6̙9Z Uvo5>[cf<} @.D^l㖭}1^*/O̞IAQ_W9sY6? aD$$~Q x\I~ڄ4X,la}Ac:&2\.ΜO hY`#ؾ+._ifXj0N} ύ[ЧW_ݿ."'7:ճ7n\-ys\*Ny(BQQI) c-t3WI]Oxt^SS`XZ_[o*\DE:I Y , lѺ"؏$MTж::`2E'𑙙WIrHHG!_,8QCW MPO .cz26_a¹1mf}E h=5a p?aѹx;4KO1=͚B :SPQQZY-m1i޽͚cƴYX侤"P4( XK)EHL/N3cHOFls"(**BYYuiK3&LƤ c.@ A@ipd2999X壅<8x044e `4Q\\ XF3Q@ c2䠤%%%H/ȑ ߈|͝%Ј @ B#@ B#@ B#?< kkk߿_8}{{{ 4U[[l 6G\\q50L׷{jh尐"B ~~~ٳ'LOcI#M6Err2_m۶V$ʮS޽i7nĦMD^Xлwo|Ayfp\l۶MDʕ+ 6$_n݂l 0ѵ!AaÆ ɦ*\.-ٴ4t_|TT.`0o>ܺu 1h 6Fhx] 8uH1m4z tݺup8I_x1YNeF}SF T7obʕx򽽽z߿>~+y|@ (AI_?@  //?EUƂwK]yE02dndb, <O$͛pvv+,2t?.]*sP/lb2۔&Yg{̚5 QQQDcccs̜9SL@@b`nnC233t2GffΝ;CQQ&&&8rH !{ƍ={X,A}U\~]bĉ\#eFC@Z-__~ GGGhjjBQQ]vŹs$V`޽;d2iBكK )))pss 0o!ѤIL8"*-ODD젡%%%X[[#009ٵkDaii)&kaao,BAOOEPPTڨȉ'0uZNEQ>|wwwL\7;*((`IX,Hɓ'uV8q'Oo3g@GGcǎE@@3Fl~BHHO7"77.]֭[qʕ?Yw^xsSN5jfJ,5R[l|ZGǎaÆ!11yyy#( ///ڵ YYY9Gy0x1OKݻwGff&PPPUV O>>>سgrssf9s9O+ԜS T͏,'J<___ה@ _nLq8P;wPb:wN~*((|||iet֍@]r*((ӧOSoxx8%//O 0JHHrss3gRǏ:'>TTu\nѣG)sss*))I$]NNͥLrL&233.]DQiiiŋ)cccUHF<###*>>JݕVVVTrrrH;*ޗEQO?DSEQ߿(>/"GQյkW*88XDMu֍(z%լY3H)###*&&FL_˗/苌:tPKh<0 T?ANNNbdVnoQTAסD%&&l|:*22ZyyyYˣ4i"N~D233)UUjohx8|*5-I}NJS8u;leL,"݇`͏;)륗V zckk KKKUOOO :TɢEϟqXZZBQQnnnϟ &biӦ8q"޽KǍ7{A-.eZ>$ظq#.]MMM<狕-ܡC`ooGP6(Ohh(:t耦MI!+\.yyyB-lٲjL&6lNx޶m֮]+qӫW &&о}{iF>M6h׮gϞa"wϐbffd2`0ХKQ.+--6wdG׮]cǎ!!!Zv% y0BvvTT̜9FFF:RSS2t=ڴd^~I,-)) ...hѢ`0CZ$*=/CرcG*йsg,^?g:t>tuu@I>'Oĺu|SSSƊy2˙Iܹ3>~(^qUYlT<ӧK̓d:egggDEEӧx I*c…صk𻯯"ex(9bOB#""EqfffxXzll,jޑܹׯ_ _N:Il*%ac!P?ݓ*7a!<<E@(C~jl ~k`/i?cǎa֬YHKKEQ(..@R?&L]va2-*K9Ք߂? sss2{EΟ?/]!C **JL.** UKFx RޚXll{m`0~z888`ՕNm۶޽{h߾ȑ#ÇHOO%ڵH/ǣ"ǏCř3gϜ9CHoS:ڥKX'?.2GEEE5WKQMB{鉂e߇͡s玘|UnVʼnZ ZZZ"igϞEJJ rrrpi˗/i޽;z-;v!!!vŋػw/rss+S6I9777xxx 44<<7oӱbŊ*}ksaR_3߿|ŋ>}:\\\jܖ4FL?RE?Ǔ'Oŋ eL& ___Wyf,_=Baa!\.n߾-u,BaժU}6-Z$ g+Tŋ#00vBNNrrrg?^'bݲhhZG p֭["Ɗ+>!$ϋ!C舾}"88999(((@dd$~g8:tpUհO:>'JO>hJLe:*QAAATzz:UTTDS})""bX9E|*11:y򤈎Ήɳ(7QqmTT5dJMMRSS/^M++jєb;RG5 .KuؑيG˗/S )eeecǎԎ;(SggQQߟ255(333be233) JKKήR_xx85p@JUURVVO]zoARRBS,.\@:VXjذaH~Zꖥ+Q3 iulpp05`JQQRWWXa~rr25vXJ]]bXTNӧO h8SCtuu)yyyА3f0cٔD)))Q;v?.TU,#Pדge>  44|>VVVXb&M$R2޽{Ν;̄ 4oޜOϞ=Ö-[s.UUy>T6"4,*L aQTɾsM$t7o/WLGڬ*qҥj@ P]1@ AvH`O @ 4H`O @ 4jm=~)&5X+A P)Ş@ @h@ @h@ @h5V7F~8pxĵ߲d'431D3C8Oj[!<mHpVT4Pxm^Dc٪%hi e]Ƥiz͵ЭOgZ65XZzF:zo-ʍW# O#!1fNFVPQD~墢_`77׮ҕ;>Ǐ: 1i8qՖy.¬ t:Y`x~}'R_&7o`p45ևZ7cq+,l{n!БHOOǟ/ }*:+W/c"r16"6h6bXGdfe,[|<{/-^QqKV">ӵ;va#h6]g@OO!nW*s1|?At=qF`ݦl$>]?~EJ!1ш~!1/e^Dטʷ~zYx/0u4Lq(ԙNU$=#v`;p0>?la82bɰdGgxnڂ_Ʈ_GhlmoY_trq50:Ҿ#T*E˱a&0%AX|Pn_Fs܄ifu7$~7 arjll1ƶJڐĩ'nMy\̹"Lͱow쀭>o2`߬N^[Y/p_by[mp_Z$(r[uu e_>{E]닱u0}B{bzOꚈp!<~Om#c*4| ;oA]qTX@Z6zle)7 IDATX, x"iobXg: +p. BFEl2۔& 9>/c1о?,X*cGqXIO%;kXul#g̘6 Q1QxHX/X76 q!1}WB~PUY[?yT,ߺwg(¬ 8"_uK71b#tjBUGvş5{zHP_V ?K{ҹgϟA>]ݦyj~pH`g.$]<,Xɶ1oe{,E2MZꡉ>jpTڨȩ'0eT(|LK1ɵb"<~F[ ?nn"'L;y8223pqaZBbRͺ{a YkDʡu{H߽vX,Xͺ;R3Q f*^c.}BanQaBQ,ڛ!*l_Tn gJ,o,W<~6T}T@v ׶pacR7xꍌ\᷄7o`Xf#2⯳c+]jd~lkh`95zNRPt.N]|VPSUB}Tu_CEEEL^EE2eegaoٲ}{DIݺ} |a;p0ܬ N9- ;t©g0m02塣c6JSͺ;Ν T'fɮg/ky9XZX`abѢ&NAyTj 0k>kɔ^ץ@l޲.CSSS$,hVSSId"w`!Xw~<96WIҶQ[aЮ6i*'Ɇr![Y+.2둕y]!ϔ((\1ץ@<oa대 ;[{]eWTjgz C{PWSɫo C ߽֭w؆+J kz+)*;uX7EQ!:vԳW_) +޳yru622ao WV_*#I_a@?lQ8`P< &K3w|cFCw0-[R/BvN6ts-+kki it?vYY_$0D2AQQ%+/Pֈ,ZٓX:\ B+c&x+~#zKWδ:ԡ3? W\Fo$٨rrr073~5ĬsoO&ƌ[!p9ػ-t<߃˿OW B,OUo?/SD>{Ri/Τi[ÑC!?@DG~i-ģ]>z055Clk7obajj&\]ӣ{Oݩ|U.I}.'Vo+f;qu2aݫnR+E{xpOg/kY[cC1wLZLv yh= 9HL@F&i*<7{Cń>> ??_B!xoµ035(cgk/rvC#-222vC[S >60:vgMsDZ2O/c1rXiw2&a *9鳦$6U8+tǃGfPRR܍CƏXk8Va%(7b?Tdygϟ25boŖ ڊj]ۯ-~:tƝ{ҩ+y!}0iӹS,[gNKjB:[=QPP 1>{ɵhii!;;[ ,0p3AqI(,,v P/P0kOr(..L5vځvA`/rssCt/e'͟">W,t[,Y "nP6cx rv *BGqp^8rp;ĞdB`7C1/#'7x,JWš%ײjZlY^KKZqi[ [m S( pI$HL>E|ZiBZ(*Q/Yx4~'_`ۅwHghX*^~k7oوwߢ]+Zsrrrzzz:9,;VX(^.26SЦ]k4k_6a&LP2tmqܩj/W[T\ &-Ҭ,uacs}+PlؼNda1!''',LPQVݛѵ5F`>Vʨγsx-͚6zǖ_魳SE$Ȇ"!}IK=JII 6H: ?B7X" 1/`+h+B PR"@@Sn";%i6y.xXl==j^bpww]:uػ=#&M&аW7*c߀O"UXhg2g'̬ - G]Y"7"(@@ {K3]p8|h*u M()a`?Z@ BAW@3UD j%%PCdx<$|Azfo PVdBKS <~1F*+dƳ xF;֞@ Pw1 //#*+D< i4ܸ6JN( Vbm7itt\ '@ ՅWFUC.tIb7"KұA~w&jEaQ1XL(#?- 6ݛ I(,,$@ 4%J:J x YYb;5CAQڊCp<&:9-5Ѯ3Kp7*ݡ@ P31RK%D Z:f!c6ǥW9G m= ,L%gPK @ iFwBT|)WV%yU|~ L49<4KNC-qS$ֆ5/Gf 044ĸqf-!!!9r$7o888 $$DtlJbfHS64PVGJz>,L!(.A @G[oEwm#==.\@jj*N:˗/[t[茌 8::b``ٰ#233eOOObŊCbb"V\ *}k~~~1bfƌ۷ٗN4ɓ2djIiB夥W^h޼9bbbiӦaĉKznKHKKիWppy\p5fɓaggزe bbbЯ_vٰa<<<0|!??׮]Ʉ}}h -4`2Q̀r QXT¢tigY[ֶCrz>@_Gi ҳ0xi4h/_ t đ#G "1c Ѐ+ƌ???pm\zUL׆$N< Z++Z[4i=Zi~@@Ν[k Y?0p@X`/L BΝ9rDܡCкukX,# @ިJOleRRR`޼yweY`Q@,# FP,A&b"1&h? T(ED(Xc× wa)<LMMk׮:σr=x...сp:u4gϞŷ~+?uFb FڵkxbhkkKMrXz 666 b2LԾo.ĉ@ &˾"m͍/<==.5_/Τ.ѻwo S;bQBḢ6x\"@bju/ z5{qRD]apssKJJB׮]%dtǏ+,R8::BOO2dN8!?6jgL2EE2>}:l"ePL6 ^^^Cpp0V\ǏdXf^yzۊi ְAVVPRR ɬYCAA`gRcbĈHMME~~>p&E!66^z)<puuP˄ yPpppP(ϊ+~zdggݻ+WĞ={PPP{bٲe ;}4<<>>E^^3f(L-/&р(;;[jpjI$>!c9|>L y0CC))Yi%'gR\y0?Ϧ,z,>͠O3(55vтïQtL|eI]TXX(3ܹŋb***/!G\.Wa9.KfffL锞NG%###ڶm[>2Q;cǎTnY|iHIEEuܙDqYYYK8;;;:vXޘۗdBCC Bzj#?? 򆆆ɜ9slmmg@ T>4*++wte*)) N:@]tFLx<KM 5bbb$d($$D,ԧOq~ɓ2}agE]ם8gggܹ3f-Maa!c5 ڵk'&S㋲rpssݻ1w\]0rHnܸWWW5'>fGiiiί^[{!d̙3aee> 666|SSS̤Drr6ب]iӦIMf)EL>[noݺUblUU%vPtW/  7S5GP֮]3ggΜA^|zdIIIѣ.]"RS/ $%%1ݹs'ϟ0tܹQl4u% />n[>}ŋ13y75vp82ՅX}H@~[pPPXGO2Cn~ TT8 gIkpSNbB!AY_ZV 5=TFFz!^oX!!!077*CI:tHl+rÆ C\\\\\jaÆթ>(ꋲڵ+tttp?\. ͛7caa+W>fH񁹹9r.];x"z)7# <7obŊr(7rٽ{wݺu(/.]H|ᇍb3gun%:j/^D=Dǖi{n[>f͂7JJJ`~_gR68 0f@G쥎m'AC[ps TCZfZ@ݗӳ=*y/ O> IDAT6: O>$kƟ ???9AHHrssQRR|]qٺVSYYIyyy"}.&#qM 8znIGCұ xm^#tz#44iO=hߡP|2ݾ}ʥųv6.. FBB!9;;SllOr#WWW&>O={;w2ZDFaa!ܹٓSECC|QjrssUVԪU+455I]]$mٲ㑙mܸ|Bzcǎp%&&# ԳgOڽ{????255%G&&&c18W?!!!4h RSS#---rqq爥yM>瓵5>|XnӧO= Р~%j_uj6 .k׎x<ihhPnhƌt5\פmmݺUBرcdiiI|>%ڟ&>nNBBBhԦMxԶm[3f..^3*DT.;!?#1 e857CU BʋL q#JQ8QQAQq%** !D&b^'0ԩku MMMhkkCGGGsPZZ5k`֬YTS3Ƥ$66'N& DCF |-=?{xwũ :b<3LX}Ò4 xAEem$'O*V_ѽB:::ֆ|~-RbaiLOOO޽{_7[,,,,,,$M+;ӱ̷ף=f`c@J @Q^!.fLp 0~_j6BP(:TUUQFǏCo?6[,,,,,,$M=o>%øq 5TU*P{Gvm-X}&MI&5,,,,,,}p8PWWOdk䠢wա mmmmXXXXXXXXXv^ @GGG˪I*$gaaaaaay y~y孇, ;YwvĞE\v̜nF ہغc $'s'=Nޤ-ڛ!qb ,"cƏч`б5\>uFXD\1Д :ftnn߉O ~D'1l/FUȑXXLz@Ƒc;[>@.4-'ĤGp7 mV Dbңz˵$"BH3҇z+Utlq""2v`4Oy4N^~ :ASW&o}@@lmm . ---o߾4t86o 턌  8OӰk>?y Z%&Qc]`o瀄D$'b났,`76l^qQ*~q>3Sia_1esWCs EٔXؤgc~h߾bcer:L'ԙoo,\%,$'cڷS42232CYs>> @ ӧOq9޽[YfX~ߖHvm~nH,yHnF|:j f};%?f E]Dd9ߥ6~g6o^PvzM_)W! ?9`(Ү3s?l73ti=<RHN6XW7vA7k]t;_,3IPٖעo|>KυaǍ/6uv?̝3OS6j4}2HaPrx0٠U[!Դ.ö |t0߻K䕥0j ڴӁfk5|bɟ<}-Z fMkߌ|d ?+{ĩu{zK鳧ٰ3r䛃/OZ bѯbWuv-k:C37mhNOtCzFD߻"/(RLΫ{nL߁ v)ӿЭrߦ?|l h{;dffQCmKWokT^{PoϟxeˈҥKptt6$!w]|h׮|>z)&tLqII Ν чӣhY={?m۶ǃ!&LK.y 񙫛X'IaW ͻ s#e6`hCp2\ڨ;{0yN/Mɪ5+<y޼k%vm߃ؽ}/V^X R*!QzXD(n<z!eƪ?Wĩr} q2^gկ>0B\|D|\|,),'DtM.]qr-10pByyiSjf勬yxp;Zژ9{L{aZ:w\F2+(R+{nӘ3+X8s<"ڋOF}3Nv݉oj<3[)g[^~ϥ,z=Ќ})6,FR7,,YBBN/sΉFEEǣAQJJ _Mh"RWW'r / #O׭[G<*3-K>}?~JJJŋ@vvv2iII y{{ˬ)7Pf)%X eʗzG\.Wa9.K`zN)((ulVLmNС#%NS@i4$@f|ޖVthX܉#ڪ# z0U_ё/P-(O7ZFp8TWpȴ"K/Β9x<VUXG9rjՆ;7ť="MMMyKgNɄûOy=׶o?:tRuoiыI[IntQt222 ƶ+KkQvvvVVV Xz&cd<6b兓'Ob8pC Md+**>ZZZXz5`" ~~~߿?|>u@6Eh ]*mDiYbcߌFiii]v0a.\?r$8K{`/jhhH"OQQ444%uv8q54;wbF5 hgN"M ǗF4a@{AqtL cϾ]HIMK{}*: ܻWt4?]zͅ>$QS&NŪel04҃|7/ZV ICSCE.,*r-V:.MC|7tQX(3o߉ǀ~>~_P>W&qp4N;^ޞرk;.\B¶-شTy+ Pn ]qF/"??Xltuܔ}|ݸq`aa!ҦMMm):.>#gϞC(sſTbw :c#&x(A"QCFTδz|e)ɢڻ(bvL&5M ǗaZP5$ZSg`blag`ݯV ٯ%v쩞nSt4?$=p> \P~cp!2r Q .PG_z $~SS3Z 6}ҕMjSmDw^sq=\lJ;qm>Po2ѷv}MakkEaW^IVۯ}qk/```"apuumj֬!035*8 AGI=!N 9;C8 ;qQ2QMVvc8NAQ_Z u.CrE|ܽXCCCb)dDzWo497޽p+VBK7Ki)..)55K|Hڵk$Ԕ>|HSLXf*))xVݿNYeqtt'NPFFQHHV,-^@{j9;#MM!ij i3s%Vb'S7葮M|>,z[v2ZDFnZ!YIq1whvh/ͱxVVM)ig3U,W4fXjϧhb:O !Oi h ݋Mq&HSSi;Q|d -#$>|mMיƖ|>iEC;ç-'Z@.FPSHBM! wv[%GChpjӺ xRΫ{nyёǨWOKdddL6A#266jE/ YHiыm&br.eed"ZEr䟑V EƍakkCJM3f ?~/^ //A^77oܸ˗ҥKͅw߉ͩ}6/_ . 33]tŋ1~}1k,\|1n8͹gEui&xzz";;[&ep6mڄ#++ zzz:t(|||СC紴k֬YKlzgeR䲰(XLj"ܼܮ4 |iiiطo;UVeffHLLDbb" dee),Xn~BqF5ѹꫯs5ؗ8p ٤ADR<+5-..J}QQׯ:t;w ==SNń 4iٳ ,,￘>}:LF>ʻ3220x` :ϟ?#33bݺu4iqeq 8Ycy7Yx1-Z3gѣG(**©Sr34=y9Mie(9] nܸ:th”:?#,z߿( K,x[t) zj1χP(ŋxmԆ4ŋ^!(,,T/ACmq8'''̞=S͚v3Ou͛7#""GH7n wwzW,o!%%߽{7NXҥ ك}GGG#,, ^^^[XnXܹs7`ŋpwwիW-^YY JXXBXXϟhKZ Rl#/8rC.2E#K.(.. %?^l S9???̛7ON"6j4 4HaE͓ԯYG+((|xKKK\~@#<~(J}o'$$͛kOο~Ѐ{1@(ttΞ=oV"^N}]<}{©Sb̙3R0L0!!!JQ֮]ŋKKΫ|>ͱ}v }'N5LLLsNtKKKX,ۖ<=< ttt+++8pcQک ֩weRݻ7ttt)\ cJJp3ߏN#e mA qd4]mv֯_777$tUBK.x.8 IDATr111(--#!Cĉrcj6{)Sځ/իpppfϞ-pvލL޽[4i/22F?fΜ@UUXbXUh"|<ְAVVPRR ɬXׯGvv6*++EDLb =K6N͊e<<puuEttXzbb"u&k׮HJJJ :: }޽{rJٳػw/-[@QӧOVBnn.BCC!J Ŵi兼<cʕ8~\5agر1bRSS???oXk׮Ύ{/񁯯/򐘘mmm̘1Cej4{;ϡRam Xzooo ȋ׹_$ y;Ҷt2."Й;Jy~AN y("js^'%%%-NꪧBaΝdnnN/^WQQ| Gr\s[;W_ [hVXKqrr¡C$:$SaÆ!..NB...FFFuF5YYYŰa[/~LS+qF8::BUUU?ɓlÁ'믿|2|||`nn@8M999T\\Lׯ_NjɽW^]2fur[ձq?l#/OZ"GGG:uL]9}4ۓ@ ׯiǎbQQQ@Nvvvb nv Aiii %$$}XNHH >ڴiC<ڶmKcƌ{ޱONN&wؿUں$&w·c|**\ TP^U*.ø솽/`'H|G{^ֶ(-*T*_mQQ T P·= f|qPXPG?+c\-DFFF孆G GW3g>x\J*QV^ T**_@QI:|.*ts a׽ J8m>F+Whv^ ?BU0QE+ r9I<;pn^M"5@hkk =QVZV>@?)6y,,,,,,,,,G%?F+DZ((*G+M>TTt oVCB5tWA>5^zgaaaaaaaay aK*pyU qS@s^x\ ha+uc@ag]Q\ T5. &_|P[\..īי]|cVL)DE r_*p@F]ۍ @#Y=J͗ja8O|#PP\Tǩ_]yMYTwv^ \7[W*hۊf^PWy?~;:C{n"iZ<>ۥbSTUx*|R*|UP%T[kW0fh;H]8OrC{ho'~ljP?FvAparfbC@Sj0ؚѹir4U|tK$ /F)3HIMԯ'4[@k9vXnXte嫗0嫉"=|o^:LLzqV mH$&=bd{ӿ&@KOof~+ї=$,"D;#}REΆ7a,""Õf}6]q^U tĹ\c:FW Jg`'o he?;҂*<. P墤qbno0G;!##4ھOVefebX9 !> l?ƺ +;Ka9X ᧹A#<{~uFnZDFp%4E9q >suâ_=Զ4 Hj;񈋏;+GEgc~h߾bcer:L';IDžٝS';gXI.p$BÌ 8 xq]#3y\nشS!q!2r^ 9_x/Yq`ndbx.]ル񏐗^ON;+uTAFY9ʪ8/**+WUALuDyN9:.;n.?gG\? * P@,mtlb6~[oԵKWlvCc Er7Qc0s(o,6o.VH.B$"!Tx.C0~H>3!}ѐr(lj6 5Xxcp"YCG$V^a\fE7vX#~6}\?/r=[׏ ͨ-3aæu?f͜'O`æuXٰ7`ҕرk;^糵nk|QckaZy?aQsa8y.GFC]]]oI ԟvW zu/C[W O!T硸͇8oBmTo{1ZPyyWBJdUAUEih߾}qZTY GqIX\0;^"Ŧ0suFmO)FCʡ,n߉~=OS׺53~X\AaL|x:G>@6~;qxp_,܌S:5fm} 76ߣ}]U @A6hV5mL H'4,DSْQ2r(ٰ3r/OQukbp\ZZt,:fta ]>Z]%<}}ZCF&ؽwDuKhVYwX,ۖ<= `Xij `pX-XX&U{/(}􆰍mnHHoµ09RyϓPfAr.AYBwFd߬ƓB03UAjmn^\?IBJ~hO>VX1(+-ŰQ0C#}8!'Fm߃Htb!Pׯbpx.%?suCDd8 Eq{v#3+{vRRS>6uڋOF}3Sy*~_UkVůk~e|Dہcm,܈CiI z.Yfz=ҟg4R44!q0C\|, =Yv/s|{ctxholϾpŵbIIڵD.][_]Byj_7>Į{Ŋ˰P(_Ә3+X8s<"Dai\腬y8?\˵_&zܾ a#Q*_c:?|8\ʻ25k}/_dÃۉ3Z ;^ mڴA'A.*PXR2 ͨ=R$)(œWE::x.Qm#!>s^❪"hhhHkhhHal,YS4!?8y*c# 6jRYY0unr(q(//ERӍMq*$v¦--@<rF|Z5{N'9ʨQųLr2bcEQs#e?})B }Xv#x }AUU,yx' GT^@ר6 | #Q#F`DLb&N'O]XTM M(,j/eegA4YmJuy=6Cی ։dVY0a(`n! J_foىOGBMM =-za@,YX0ѓ F| m-m|}AOK͑yF޽I]>ao5+Rݖ ;^_XcSuX}o,Q\V* a绛 |4UUJ 2P2A ,]S!K B`En}DqNC'5CZ\@67DDc 3l'LX|;x\\>uF0TBm8 —'\T b懈p8q‰S_dDHD]P|xE͑𺐕x3*o܆5[_Mꔧ4,ZPz oF kfX{D HUTV)v"v`ok[{v׵+bAwkŲ"kCd?x3KHIsNN;d!, C_=6K7FGhF шz ]=Pq~aߗ8e|S'O9"epi̹8t(N7=5wAFf\yE/G 5-!ew#CyrFGpH_yR$M6 7=/?|@~< 999ɽ FNLΜW]V(fx!6zzx&B(۷o_*%|LesoBm6%{ptup̻cm0?.A9zs˫5=,c ϳп ph4Vķ\d{z~!//ɹ( ‹oUAlm#Uc#n]4¥_z;>e֭ڔY_e%%'!( IDATl.3_Iʨ琦 &>_8+0O[[w pCG"$4Ā~2~2.bU`;+.u<㧏}N@II }ep:m,q%.v GE9-7m+߫h^:w9 4I~blںAءP?ɐ}o+5Sc3|Xz)-YsGX2D:γǶ[#rӞ;`qҺ,]pp(-Daa!򐓓L!%%߿'">>_~OqҲؽ@- uuuK_-\;}F;2O H.Drf! y@czA-(sK*k N>NvۦHNA; Uz=.8r0n)(=n\a7W!-- GƵWn 5݂9nZFvN6ss3N/sH8e]|cG'*>  7X3v8lܺaԫWfǍ1|Twlh| G|\ƎWj])-ϛ9YZhSp_+}o>}DzF:\|{;Hbv8>@OsQp7 Cff&rrrsSfNʥ]x\v  5-ip=r^fUo=S'OE/3 >.tsgB,^MfZ{?cTv7ao)rss >\I\>CVV223wOdR9l[ ^w<xISoeKfU=9Fp/fL0Ft&·!k&|ə<0gCJ69<$e"%%^_eZX:h -OҩѱcRi:vT6]&Mq7n^5té'Ѷ.Z7fǍذv#&ORf~طޫQXw{ 5B%5cTU8035}صw'kS\<+s.soV?aÖuض}Č9SnIӴIS<}tteMqi=yۅ6}4;j Ԕr7{n 6Mٺ 6;n9}6F:=}q-mwoM6oʵ8v |g@O4Ҩj9n8#Ͽn,˾e"mrD!/=ĀUQ:ߒ3Y,Z6TBMBJ _HA,y Sа-ZO?ܹszs)~"\o_*O>SN_j.b]ngg#_ll,L (**/_.wW^aѢEPSS+]EFFbذaPUU*HNulEʨNi&ܹsC:塥ѣG[jePu8޾}(11G|߾}EBBt˪_>䠪6mڠ[nb%##S% Cr~4hqeٳ wQQQBakk$-[o>X#V\ÇYgedff = //sss\t ۷o* UJ` lva…xYeIʰi&3 v]?^h Xt)\()** ۷THNNƆ ~ٳg#((_b֬YB=zPPP?HJJB&M(LRRՑ$^nܸ(**BGG?!n߾9sM6mTyҤIʲ)6(o-MGDD5"piKCFF@ ''ǹ.8p֭Wf_ - 4440|dffkOp9BII 5رcP9 Ŝ9%z]^qqqN޻w)))e ĉѬY3(((.]JwhРlllC?|DÆ ,ݝ |:uӧO )m 7\Q]\\\0vXih߾Pvݻwb{9rss1p@4m߿?nܸQnQӧ1uTNC)cժU7oWn:8:: L߱c֮] gΜqiddd̙3غu+Ν;~ G:[5j wӱaڵkؾ};_.Kj}}}z VVVXeDEECB۷oh,[2j:qѣG?~Dzz:>+W]#\\\?)9,,, Ҟv܉ -- QQQhذ!Ν+T)*ȢyyyFff&Ґ_ӧ8Ç"Ya6gc=LMLrrǖ-[ooo72[f&L}90?frssׯ_3'Nd󰰰`"""fΝ4>???^zL߾}X&--5k9u͛ ښ+ʊ-x222BOT֣<999̖-[J]'eR'N` ϟ? LeӅҧ1rrrbck׮1 LBBsUM6̱cʬ#2Jkٲ%]fqM̌IKKcT$maر#0 L|t 0fff@>7ӵkWa&$$i޼9gZlɄ קOC ϟ3]tܖI&##V88YYY0rrreuيQJlPRRb>~(vy%{ϟ?.իW=~+==bsiO_ԯ__k;,&>!59gLd&{&uy e?x\n,s?c'1_h,f*~Æ jX\p+v͚5ÇѣG(((C8wPnnnh߾=h"@``@8pZjUUUڵ @Xd>Ev킦&$ʊqGut6l؀k׮QFTTT%LVVTTT$Jwq 4***PQQ N8;wJF2F.]ЬY3y)cҥ8t&'' ~M0pXYY LBhh)=CCCm/^d_t m۶EΝ ȑ#ZXXX ,,LT`rrr˨_}r@uيQӉ.XfffXp!N|􄁁4 xx ѣGعs' PԢ:Z҄vsB[mthNEf? ---]lZQPPCЄPXX(NZÇΝ;vEիWꊴ4>nѢEXv-lܽ{ӧONJ+ʬ32.\qƉ5\F2jÇ#)) ƍ+5.\ٳgXp!,Y¦âEo>۷Pشi/_O"77)Hݱj*@"#%KҥKpqqAjj*RSSq\xQLRNˊSFm#6jgg???dee!##8;`XǓ'O8!E0x`ڢW^Djj*rrrs]qtGGG$''#;;7oVyY݀_bg 72g㙂&))qttd0Ga3JJJS&//y-3uT6 J\Z2 3?~dΜ9ՋM'Ykkkv`͛7ErGyu,~%/ b4hЀiРcccüzJOÙ#G2 6d###ĉ."ZFff&cddĄ}8eNLwaFOOg777e 27fRRRϏfׯ(++3}an޼ɩnn33c F]]QPP`͙˗/sZVԾ7o0vvvhkkDDDKeiڇ󕷍OۗQTTdTUU[[[͛7_2GfTUUؘqww:'3dI&LzMMMfԨQl 8QRRb###ԩSb [mWųŷci^<+mrD!/=Ā0j({?FZZ ѨQ#c…BY m|ڵ{{hcDMmCBCCVVV7o8~wwwlذŚ5k`ooG]tʕ+R~ԣ,prr=G!5KiB!vٹk7-DVv> Bh7Gdz)V 8ؗ  Mp_A\vM]t_U}Y9?ydL P,\0Yb-ľ.(,D^OU#Bj%1qHIIZ\]1p% x|p ''(%T* !`?/_(x(Esu| r5Sӻ'RR2R9V3I;*m91 1n " 4d !ө!O{BH T^<Ԣ:b?~+T5 0'QG9ZԯISO !BǾ=[eC[iS=:8u۪r !֠TB*׾Vvs{uX_Q@}/jiǘ1c}bgkk߿󈋋ɓ'qu5NR8p 7oǏ#::'NĜ9s]vܹhڴ)n߾-V.\ƍoEDD&O#55Mw >VVVx5^~~aHJJbUdݗ\طo8k׮!// ŵkפ^F]#i;^v-o߿111}p ]V #8K"<<߿DzepQ\lV^-rB o>{EAAT˪*fKϟ?aÆѣG3Ν;Ǐcݺuփ~NmPFf13刊C^z"n-n'2aiiU\nn.`oo_UU|}}1f/_0 F}ZK%P'mEm޼֭ ;˗/۷/"##N'-*OE߼y3&08qXZ]077 bժU["33S5kРA64h֮]+]+bРAxv܉UVwܩrk3IqVMMM_|An؞J???8:: ՓW^;\"-q.*˗/f͚(:`bbSSS}|i.:Iڶ$m3g`nn.KyD* զH Cb/ؓX`<,Zp1v8&^*p:k׮ضmrssq ---hcƌwҕVjjjz@=o޼ 555ի)6GvvD骊 f͚Yf>>6mtqzqHh@{=;V(رcNeKsGEE!!!}{Yix=^xm۲?Mӷo_ ~:O>ŨQЪU+hiiLnn.֬Y4i҄ϵ^t Ѐ%.\ =S'$mNJBmdeeľwssA}rr26oތ={v! K.E^^\\\i...òeD.uVc_yyWY@U6ÅdeKI R`O꜀/^. #JDD.]O>1cEۿ?\]]+WcZRΚ5 p9.]?GZ:iرcQ^=!88 7n]u, SSS`СwRɻ,ZBHH޽Cvgo۶mߗYܹs2eJۡ6m LqfΜH|Υ޹ss΅BCC'N!nH;3gO"77/^i0w\6]@@y氱[8vZ̙3mڴ)5 BCCC:u ӧѥK#"q)/*SU6Sa%KH S~Nm`4G2(((@bb"@]]򈏏Pԓ ''D\N9x<4ir>DΝYYYhѢP95-'';vDZZ Tk cOV˗k.x{{QFN'>3+OIec~?%)Nϟ3УGǏj* !!ФI$$$խB 뾰FFFwȋ&M#77~~~߱k. 2s9e111Ǐm˗/ܹ3ڴi/_]"<<Gǎ!//oߢaÆÓ'Oct@QՅ>f|+++͚55_<{ @Ѿe(((` .#F`)^ٓm=|Ύpm6K.BqSUu!##wׯ_Wܽ{ذaNEEG eee 8Ǐse\SBZF===?~1|piݧIS<ee2OEVELYw<-[ڋslؓ:?Ԧ@V"Df̘saԩFrr2{u(2sL; ׯիW]t5X/_Dǎd/r&k;شi7yKNHڎgL6 /^`/ izzϟ999{0k,,]T OI4v!MGXXKM'>+q9\IH޶i3\L4 O~Wc_>|`{>/ءXFFFXr%'Ru,Ʌ߾}Ö-[pSNXdImE}ŕWك(++ً?۶mAu+K0o߾8y$tttJNj/ ++Ν;c5jTI& .\۷ocĉ2d{珯_s(,,< !ܫW{n<}iiihڴ)z3fe( oߎ8hkkc_.hJ#I;F^x>|hkkŋnUAxb3F O.J#v!#>9J'Hmx+^G߿ϟ?Ptwɓ'cΜ9BC$U x{)((ĉq=t /^ٚnغu+4i2{!uStt4vދ@ǟAw!?zڵ+={Ç#))%U=W^M;UB~ ^z|` ѰB$AǟFYYwޭjT#GhҤ ? !}ƍҥK%%%ٳj J-'!ڍ)S9Ғ-Gy)G0 Bj:Aի=zt1b>99Y˯[i@k !v;;;M6zܸqΝjW>q~Vr۴lUBHm@Cq~PXlB>} ###={~L8Q }ff&:uL}A@@>(( رXu?wLLL3338qB`>Lgi Yt)fΜ)4}֬YXt@N8333hhhD[~>/_F߾}֭[cڴiHLLdDFFbܸqhݺ5455aeeWUa)/͇/"s-B!~gdddƍ… j*ٳػw/<==#F222eΟ?$?Ӯ_ÇU[na8~8pQLONNfsN|nnn?_|Ν;8pGE\\;'''ܺu_w˷o>ڵ  *,YΟ2e lll?bk9`T{6̈́kinӌ}_u^(k׮`!A:-('RQ`ۻw/6mڄ$WWWAQQ8vmڴAǎqmEٱcp!lmm!@0/`sqq̠sss޽[jGypssC`` pa:u y9;;ܜ[?ݺuձuVcccakk UUU((( 'OIHǾx~y˗;`RE?pu?޽-!X~3##B4ckٲ%ۛ{1^ɓpĈرcq}hjjbԨQ?~+Lhh(P zУGi%W^Mĉ:u*@]]](z|``` qbϚ5 VVV6lЧOlRr!{]B޽x_<^rݏ]`@@kV/ǀtK#* Bj fΜ+W C 뗺ȑ#cdff g̞=nnn077GXXz.!0$ @\\΃w @,(۶mܻwk׮=-[&V9S=@BJ!7otYYY;vJPN=!ڀ{8pcǎE#((={,u6mڠ}pssCXXlmmvvvXv-;+++*7oUΝ׏ɓ2?0x5qmcر#ttt҉gΝ\[111޽;K^ቕ|<!"cxzYYNe_7 !|4ƞ0}to׬YuŋEVVDvv6233q}iFRc?x< t;u6Dhhh˥1B o޼ַo_l޼[l.k.̚%8 bȑԩSO6 0`;CY.^1b,YYfy7oJL6mѤI`[V˖-ƍN1cڵk˗ eoo9sy5k-[&0w[sbΝAR/c+33BKcV|?V2#̙={B!?,*Q999 MիzUfMB544+08tz/_~6c 3cƌ/>,r g̘!P/QnKS $I9*R0'.q˗ʕK70 7o,-{`5ػ!!` `֬ϗBj 0ISeg*%_Roޕxma\ڵNVjBj 0ގׯ#wEP`O!6JP@{{_GkR0]B!{B~GBj7 !QsB('HG xI!v",Tw5*Bj !b322Bvv6y{b@!B@=!DB{ޞ\s! z9=Y[[ںA!INNN9"!RgYZZߟs`/[!B!T !B('B!B!:{B!B+!UQX㫻fչeuWT!gZ F022e7 G=!UԿ xQU!  A]B!AC {B?8BHWF  ;BT$$x<rxb/?fx\|{B!> À?"&b}] !Rez0CHukiȥB!UzI]_dA:PSSc_+++CSS4i_5!z HMMO? ̜9]=AY=!!Q<{o߾BFF-ZD׮0a$XXXVqmӢyS|X UPItz쉴\| =իѻwoٳk'Ȉ._222tʛƚ5kpQԯ_aaapqqѣ9om?QהcQ= _`hTxC1.FXbCq$Y<'Ҧ֭[cҤI1b+DZR IDATW`̘1]5|kAo Im ///x{{CIInbb'Ob߾}X;"={ϝō^h@ިQcܱb?~u$ūh ,P~}^gΜ>}@SSFFF8{H7[&pU<###p%-Z@&MӜ8qfffЀ Ν;'0w BCCfff8}|555\|}ZniӦ!11Q(]MFRWaŊA}qK,a_ch֬ tRdee({?ӧOؘ8qB}L}ސ!C w5}S~f,vX Bx<dddz֭4qe jtݦ;SݫtuZOoK;wF(;w`g;zУ9pNh`~mqႻoJS|"#b/ѱ>t[v\*;G|+$i޽;BCW@,\VBll,Ξ={ӓM3e <<?~ݻq vݻw|rlذ111r ߿/Pݻc|߿Yѣñc[nW>99}_a޽8rpQ8;;ۇ]v!66PUU aaa @NN^Z?&ѣ033ÇC`Æ OpyxxuSr|r:tH:u Æ =_Q&O20ݻw^\`0<\r{ ^GDa8<|͝ ~_Ga{G xӵ4+!ؓJ4={ ;;;(**ǎ#&66PUUpIv3+++(**B__ǎ(СCڵ+K3͡sss8;;Ewٳl>wÇ֭[O MU qtt QXX(%/|RۤqƜ҆cĉPTT:Je_ ggg:ggg|cJ,_{wĵ"Q`A\ "nx[wqwZ**P\qmťk]j]TATZ7܀Ee'7#C2 ̣9gΙpIRR{쁷76O-tdeeeb[Y2tmchk0##`uprr.jZDIW[^mkذq+s|[nCcӦm|*'--~cS'DD΍=bq{,M4v~Gi= ###۷1qDt?zyypvvF>}в_{.SaJV~ĮGw|e=xzbի߿gggzlll|'y}[nMH]addlf"o߾ŪUp%3Wp޽ 7771 b۶mؽ{7ԩSg}u#e!33S4`kcgoo/s'O{w~x!_&WbL/Jrω1c(ps K"3)b=.n%UƍԩX,#--  cر@̙3~~~˕N1-k .]TCMquxxxT 8}4Zl @b)-K_'y}BCCc׮]TfYNv-_| ͧ-siˎ+J/Ɲ/:Z>,Y #F|7!& 30wܺڧ}yD[;k<~RqGi*a  ɓ}sҼ7o"##pXΝ[]~]qّ,.+t׮]9Oǎ+]CM!aaaDrKWʼnGPPlll qqq .}g}x־+hiiaܹؽ{7n߾Tfys'O7o@VV¹̥ye_vk?oƳy3m۶cwk رo_v?H$bk6nڊ_OΝj~8m7sn?4Ǟ𬨨8|0ѽ{w99d,[ 'D"B!bbb0vX&رc#::qի(**³g @bb"̝qdqqq (..FBB0k,S7#++ r.0` CŋɁH$Bbb"O @ǎ,ܹs2ۊ .}/qm`}̨Qplڴ ӦM.~m/t#_W_zCHIIHT/^{Gw2k\ oBQQ1ܾ+aLr2\~9@"ܹ >n%P|\v 3fLSZ~\3c4ܸqByyK˖5>o697C"}shذ!7oggg[NgUVaHLLX,F.]0o<&7BBB ͍۠Ae˖Ç077y3bΜ91cRSSaii 19~DMfƍP(7駟b…=zID@@֭[###Ue˖;Ce˖͍'{쁿?ڷo^+WjEnȑ_W^ fB`` }.&O%K ,,VH̱3gٹ+~y?"nFF{4h K tuÿgwPx,,,1Çݧ#4$O`fffwwuش{IH$N5Cies9DIIwРA8;w->uUj.?ŋ!`ooL8I_6o|7A+bݹ7(zYw#3f?x v9k]s$d(OLH+8qx]j(]7>>^a,ŖG3lܴ{xw2R׊4oǏ)7 0a5jI)ÇpB}Iu ޽.]휵 ,MR~9irBH߿?&LϟE2eJTabbsssDDD $_$D| ؓ:.O!hcDznS}hĞh1*zk?R`O!jC#DWš{B!#}ӈ= cO=!unXwMMWZ_ C'=r=j**%%E|ЉzP`OH5YppM=m͘ \( f$꾦:1|j볖B5.2kB!ʣB! @=!B!{B!B4B!hZjM$%ݭjRk$#Z:Jf֫kMW^]ǜپjض('BjmkMH=!DٳBţBayG_HJ _Y((,‹̬LX,HrQ#B=b >|F>I&Hy'C"0 B*M,+|Ske/^V/`"}]R`O!b{6-OScm4bO4{t'tvލDdgg...>}:W#bb1;Hf=iO_DLjIjF6/#2ܾu 99011A׮.2uq|K;^EH٩8?:ڵkfxyy!!!^Ç#GV7dB꫔L4 fffڵ+;4ǏCCC/Ǐ9%w㫌[^֚ oj2|[h:_ɓx6&-7:Em\ZF#/_FTT.^ 2o>lڴkGz-0i$ܽ{5ѣG+;G&M(-[hRe(}8b׃ ~LGSqDxj4.^8Ne'u;m[x@s _ĕH#ݻ@Z`{K.03338Jc3VVVh޼9믿8cbbleh>o6n܈~!$$͛7'|s~0ߦM0zh̟?FFF022¼y0zh>W 8nb1_Cѣ0`,--YDcҼG-`aa#Fr KKKXZZbҤIxNTtEâE  YiЯ_?T8RVe1氲ԩSk77G̝zzzrG5}fa5c?~S&O}[شia~el1{:޽}[㣿ս8l|JHH@=_qFܹiiiصk{ִI&aȐ!>RSSSN8:'Թs0c SN0_TT<==e{zzٳԭ2eT捑OX~=^x֏ ܻw˱tR<{ wޅ.\.3^xXbŊ .+V˗/qqDGGs>شiBCCD2<|#bvv"\\\d۾bq'/={B_9>{:_O&x=FaX?FtL7noT>m6t*X[YPASqall4Ν;apB׮]7N鴁 6 ggg۷S=('->} wwwfܹ4'OСC۷Gri/e!##ѣ/^ 777^x :T}ѥK>.DFF}@+V`޽BvX.] ,, cÆ ֖͍\HmЬY3Y;vW~tdd\'f̰2h +R1p`7P:'"bܛlĤ |zvT>!eG?~>KcV+4V:o222Bvvy<@^Xzz򂻻;<<<>}eK3!]rr2QRRmmվ0χ~+?b|7ڵ+ qE?[nň#*]FLW>.>.&x222&-޾}UVҥKHOOg-߽{}Qxeǹ^vvvJQ]ؗ' ;; &&}=[Wc[VJ9q2Fx Сnn=`aa:O6mXuCBz 3)b=.n%pvvQscر@̙3~~~<Ԕakk D7ߺuS^ip-fLJQ0^ɓ' =9s&W9}9]<۶-, PRR69,Y#}kWa;LU)z%Yrr H${\z\p5ֱׯ|Ey!22giii>(99:uBll,$ (P>ZqqqaML%%Gk?ƧxJӹsg*<\QFfDjY|O4"6@<ݻC"#!O,5@"#>1=f`㦭iܹ9V>V`}V!<0` CŋɁH$Bbb"O b$$$fb5vXƢ5-,,'KfȐ!ػwW?ǡCd:tZuu>~M\2jê8pֱcG#++ 8wLyիWQTTgϞLJq.˗(..͛7*_x/tJX[^}Ч;&+WBܹs ߇@,]رc ҥ߱o1cnܸP|\eKxٴe7EiM!|Ylܰk. '''NƍPoooO?… Y7fy{{#$$ hРXK_D"fIxbtχ?o>U2΂ ֭[믿8pGARR+U,Z...իWN2+M+ ӾxcjXǞK?Ʒ={ߟ+Wd݃ BHH-[sM6(**Bv0|+3U~\"g=_]8x"NN]'r?$17lƪЪu, osNmt 4s7l޲U+O"uU=GՐy$Epf^; #""ꊁZH$BXX̙9ODDPPPP5#ص{ztEϞ=k*~8s ѹsg|5jT=z???p&xJo0AFF+ٳgxhkk ,رcU.pL6 yy~Gъe3UͰkxN윚 !ELL8 jsrsq5>0!! c/_%DSj݅BHF !UG+@!B< !BB!('B!DP`O!BUqFDRݚ!-wYP?HG%!uͬWOך !9}m;Pp_OP?H[ܵxRMof˳D]X,HrQ#ֳgOS`O!H$U%IԆB' !TD"Q+HW!('RizA:BhzĄ, IDAT,,///\tF#*o*~tƍ[[[4k ڵɓqʕ*2B;(233ϟɓ0`[,ZHsTA 5_ll,&N333|g;cxxx/cٳg1daÆ۷/Ξ=\8z(u놆 cƌ/7 2? M4:tP|S?9*o*د]k֬+>|:::9rd^]IǏ>Okv VVVDtt4qVЧO}OF^^9cǎaլt޽C1p@!-- F{Cjj*޿@lݺ:s-Xx1VZ ߘ6mL,^ؿ?F$B~cƌ7owww2篭Zjv}>Uߠ{=pssݻ_ׯ Ƣ!dnR.]//^ظq#ڵkeCAAk_TT<==e{zzڒk[bUye<]tI3gR<:::֦I$D"fV-neq УG~lܸ;wDZZvڅǎc۸q# ܻw˱tR<{ wޅ.\K^M$&&АRQ;i$ 2Gjj*q)N[4n+WĞ={XO:'''n Qo=uv튆 u֬iw[[[?c疷6l ÇWxZZZ8x \\\иqct탍 S]vUX2+j޽{~9߻w`jj ?ٳgC__fffA~~z?M6*ZROKK v킝`cc}!MSݏ011ANNk1a#,,Ɔ m6 >:u?kײҕ}s1n8־'OC2i۷odC$wׇz'N(2qmtoV8_2ʒH$x91uTeAxV:bq{,MnX< cccv܉ 6zzzڵ+ñcVHA +V@ff&~G/_%/022ݻw5k5kp98%%Æ !,Pԥw޸s믱b ĉXnN<\0{l_8<~wi'[@^^~'YR#GÑ\ر4׵kbdr'N`);$$S]啩qFs޽#G)k׮pqqAFFܹB,^S{BBBpa Ij9֋K0áCzjWy 쉌L1߾}sM6 Zl)??2 X#\edd`;}Xh̴򸖱tRL8.\@AA pyLA>.m۶1jB^aСǭ[<%%%رcΝKMMԩSѰaCXXX ""Bñ}v\\\^[/.o|8޽;mۆP4U{"ƍԩ 8}4odff"==XX4ƙ27rpYIEmXt?Ca͚5L+VHZԩSUViӦ055իrJ<ʔ!%H<|VVV7oLRʏKO^?y)8{ggg\~rJw^wѣ޽{#<<\s0!!_~%pqq{Ν;߿?r߿www>www)̚5 ž}< w #kOJJB޽Yv\aɒ%ذahժޟCCCsPz]>j9֋k>yCRRRiB=a  ɓ}  ..OKKK\YGGGWD{o ЦM㶶rx!lmmUNgggp{(^µ ꫯ| ..5+oeHikk]vؿ ꕟc_v{c\{{{#,, "Hq(bp5ֱׯcǎ@*oCdd$t` GGGX,FnnLQ[-lذQQQhݺ5`);]]^\9wūW[la֏?7ƕ+WD"qZrԭWu]OeP`OPTTT>|޽;kM;"<<YYY(,,Ĺs0k,9,,,'ӱ-Y˖-ß HP;6Pնn݊ \|Y|?\C?W9Y_Jݺu Z\ː!!!JG+[^i+8 A0tP\x999DHLLәW>>>GBB???>&pQߎ;(((@~~>ammJSW|ˋDG:v숫W]zM̲#t邀/HLL+.XzK;hiiHHH˗/YC\\BBB`ggǬhR=:w,acUQ^\{b(J 1OkkkxxxŋXnk5سgо}{j Xr%+MPP|||ФIG߾}j*^mڴ BCCYu}n:lٲ111 Gҥ=͛7#;;غu+9竜nsQQQ0a ̵aÆ  1x` 82ի (**Bbb"<==1cƌ OW:hTMe˖!00wZl OOO377̓7,--1sL,\GK猯PQ퍐n۷&EEEx%8]G?~\˗/ɘ2eܴχ/Q\\?%U{Ÿ~J^ÇǕ+W  [Vm\fϞ7o..&L ~z̜9ZΝvZdffOVyqEחa}٬4n+<ܼygϖ}׺#Aڴi#wjCwԨQ5jzWhi-o<33_ڬY3\|~~~Xt)9{/_Ff͘<\әbQPP;bڵ0aBuZq-[n&̵Yf!((7nPjδi0ge~IױW*< T>N6 ӦMSx\QeeC.QriJ)hԨM6aȐ!t @XXqMbt J6llܿXlܴ'OF~~>&MX[[cɒ%}E6m `ooo'Nd̙3AAAz?rѣG#;;ǏGjj*ZjŋC_\tuu Ç 7_^~ܸq˜1cVZaXh[/鉗/_O?ҥKef8*Z '<OҋPg浓0""J; H0ȬNjޮ{Ы+zYU!W!All fzӷx)88=o+L_R**FQp}`BBƂ_ly=æMw/TB!'@__$n֭[Y+mʔ)x JJJ3gҔ^h*!J+*jjhiir <}?_&('Riα{B4i&MT-eU6vBH;bO=!{BC']ƈF_C' F~p^@ &]i㯫A4R`OH5rBA !^~C]B!('B!DP`O!BB! @=!B!V!BxM$%ݭjh .&'' Dlmm+LCm/.m !JsftU4FĶ0ji .@ڜ\UB!t}g!71FcGQا`РA())i.wwwDGG+ 2UE=!DDRԖ{B!ڲQW?ۜ{B!k[RW?jڋ{B! <|ҖՏڼvBAM͵+F|76SstP]mLB,C[[066>=zvUK]jZu~=z_KK hذ!```sESq!Z&'{H$:y<'r[[Gƫc*λwsssC iiiHMMEǎ&&&PM QTT hڴSz1ڶmrBj2?a,v $ BcOyz`.P|mۖ !HТE А7rzzzųg  lSSSF=!ƒ >MFvvwwdffdicJwlݲ ^ ˖-=*iKU3334l999JJJ```Ptd?-- EEE}}}AWcAƍѬY3hii(677GVVVFFFJJJ F{D"FFFn0^,C,bK(ǏLhh*!R ͳG=O#4ϟCؼe;޽X0-ᜦ:q&Aݺu  W`aaH$"##͛7g|M6tttL2uɩ<ȀLMMQPPd#߿G~~>XXXYf(..Ɠ'OаaC'D"["(Mogg'O0SjCWvMWBҀ:?0rhfߨQcp)0vڎUpttªUzsIS[UhԨ_QC&M  ###nlݺ5 deeA__y`ii SSSA$̌ULXXX""HOOA*!o3TnUҿ)6{B!TTh8:v S h.iSU) ֗ըQ#deeÇJWphРp?>ꮧ|ND055E~~>| YXXTS__0GJBt*]v6.B!PM̱?v?3gN+))A߾'}T.S  ;;ZZZʒeIׯ_aÆh۶- D?ڜ:::JEڵ+k^&*((@ `T+Nu^ !Zgee8$޺+zKNNDffMо}M՛IswiNU=7ҙ011QZDBoߞ'/#/oEe]޲i#5T{ĎNU[etWͱ'BxPO @ƍe½:uӧ@ʥHJbܹs+W,e՛KMc}}}b ߼yߣQFΥt梤yyyT1?"o߾e155˗/QTTĴP(īWT. b% T4j(,,usIy|{B!=G@e=cҤ)\ (m,t9Kyˣ8BH-$T\R.?R\ExU100@zz:D"ttt`ll +++DzjZU+SC]E=!WUOIOOW+_U300@&M```|qj_eB!<_- YSxK}nBSq!Z{~Q[: !H@(- QBH%98t#ѷoƈN [YYʕ+pssZi7nJqjs)ksUQ`O!Tkw(ᇃC']Ѝ7JʊiWyUE=!.ED9jM+@!B< !BB!('B!DP`O!BB! @]j'''յB!B*!>>NNNS`az @!B.'''&s`x[Յ)MgϞ*!BH9aaaUV¦4B!R4F !BhUB!B4B!h !BB!('B!DP`O!B`-!#WIDATwg_lyTSu!B!pgؔXf !B!ݫzB!B*AJj"B!,YڮIENDB`eqonomize-0.6/doc/en/index.docbook0000644000175000017500000010705111106576553016156 0ustar hannahanna Eqonomize!"> ]> The &eqonomize; Handbook Hanna K.
hanna_k@fmgirl.com
2008 Hanna K. &FDLNotice; 2006-09-05 0.4 &eqonomize; is a personal accounting software, with focus on efficiency and ease of use for the small household economy. &eqonomize; provides a complete solution, with bookkeeping by double entry and support for scheduled recurring transactions, security investments, and budgeting. It gives a clear overview of past and present transactions, and development of incomes and expenses, with descriptive tables and charts, as well as an approximation of future account values. KDE Eqonomize Money Finances Bookkeeping Budget
Introduction &eqonomize; is a tool for keeping track of and monitoring personal finances. This means entering of everyday expenses and incomes – when you buy something, receive salary, pay bills, transfer money between bank accounts, invest in stock, etc. &eqonomize; provides tools for making this process as easy and efficient as possible. You can then effortlessly retrieve information and statistics about your financial situation. You can for example easily identify major leaks and direct saving efforts to the right areas. You can also monitor performance in relation to a budget and check what your choices might mean for your future wealth. The purpose of this manual is to describe how to practically use &eqonomize; for those who do not find the graphical user interface self-explanatory, as well as document some less obvious efficiency-enhancing features and explain how &eqonomize; interprets the data you provide. When first using &eqonomize; you should read ; especially the first parts and , which step by step describes how to begin using the basic features. provides a more theoretic explanation and description of &eqonomize;' approach to accounting. In addition there are some reference sections. Using &eqonomize; The main window consists of six different views. When &eqonomize; is started, the account view is shown. To change view click on the corresponding icon in the vertical list on the right side of the window. Accounts & Categories The first time you start &eqonomize; the account view is displayed with a predefined set of accounts and categories. These can be considered as an example or a starting point for a setup matching your own conditions. You can either begin by modifying the suggested accounts and categories or start from scratch with FileNew (CtrlN). Accounts should be created to match your real world bank accounts plus at least one account for your cash. Categories are used to keep incomes and expenses better organised. Each transaction must be connected to an account and a category, or two accounts for transfers between accounts. To create accounts and categories use Accounts menu or the context menu in the list. Budget &eqonomize; allows you to specify a budget for each month and category. This way you can continuously compare actual and planned expenses. You can also check what your current budget will mean for your future wealth. A budget is initially asked for when creating a category. Then you can update it from the budget tab at the bottom of the accounts view, for the category selected in the list. If the budget has not been set for a month, the budget for the previous month is used. You can choose to set budgets for only some categories. In the accounts list, budget and remaining budget (budget - expenses/incomes) is displayed in the second column. If not all categories have a budget, the total remaining budget only summarises the categories with budget and thus does not include actual expenses/incomes from other categories. The Accounts View The account view displays a list of all accounts and categories, sorted alphabetically under each main type – accounts, incomes, and expenses. The rows for the main types displays the sum of all accounts/categories below. The list has four columns. The first simply displays the name of the account or category. The second does for categories display the budget for the selected period and what is left of the budget. Unless the Show partial budget option is checked, the budget (and remaining budget) is displayed for whole months, thus you can in the default mode see whats left to spend of the current monthly budget. The third column displays the change in value, while the last column displays the total value. In the bottom of the accounts view, there is a box for selection period. The period controls within which dates statistics will be shown in the list. If the button for the from (start) date is unchecked, all transactions up til and including the to (end) date will be included. The third, Change, column displays the value of all transactions that occurred between the two dates – the change in total value from start to end date. The last column (Total) displays the total value of all transaction up til and including the end date, plus the initial balance for accounts. If from date is unset, change and total will be equal for all categories. For accounts the total represents the actual money present at the end date, and change the profit during the period. By default, the period is set to run from the beginning of the current month to (including) current date. Thus, the current state of accounts and transactions so far during the month are shown. Values for future dates are based on budgets and scheduled transactions (whichever is greatest). An account can be designated as budget account (default for current accounts), meaning that budgeted change will be added to the statistics displayed for this account. Otherwise this will only be added to the summarising account item (thus it will not necessarily equal the sum of account statistics). Transactions After accounts and categories have been added, you can start recording transactions each time money have been deposited or withdrawn from one of you accounts. If you have kept book before, either on paper, or in another program, you can either import a file (see ) or enter each transaction manually by hand. Just remember to enter the correct opening balance for each account. Transactions can be entered in two ways, either with the new expense/income/transfer dialogs (where you have the option to create a recurring transaction), or from the transaction views. The latter option is usually preferred. Expenses The first time you record an expense you need to follow these steps: Switch to the expenses view, using the left-hand icons. The input focus is now in the description entry. Type in a description for the expense. Your free to use the description property as you want, but I suggest you keep short and consistent without any inflections, as a subcategory for optimum efficiency and good statistics. For example, if you buy a delicious red royal gala apple and have an expense category for fruit, the description will be Apple, and if you want to record additional information put Delicious red royal gala as comment (others might find it more appropriate to use Groceries as category and Fruit as description). Press Enter or Tab and focus will move to the cost entry. Enter what you paid. Note that the value should not be negative (except for refunds) and you do not need to type in currency. Press Enter or Tab. Select the date when the transaction occurred. To change the date, either write a valid date, select one from the pop-up calendar, or increment/decrement the displayed date with up/down keys. If you now press Enter, the new expense record will be created, but we do not do that now since the current account and category probably are not correct. Select the correct account (where the money for the expense is taken from) and expense category from the drop-down lists on the right. Optionally enter a comment (memo) for the expense. Click Add or press Enter. Enter adds a transaction if pressed with input focus in the date or comment entry. Otherwise it moves input focus to the next entry. Repeat the process to record another expense. When you enter the next (and all subsequent expenses) expense you can however usually do it more efficiently. Date, account and category will not be reset each time, so often you need at least not change account. More importantly &eqonomize; remembers the last expense entered for each unique description. When you enter a description, all values, except date, will be filled in with the properties of the last expense with the same description. Even more so, as you type the description a list will pop up with all previous descriptions with matching opening letters. This means that you often will follow this much shorter process: Type the first letter of a description and select the correct one from the list. Check if the cost is the same this time and press enter. Check the date and press enter. Incomes The same process as for recording expenses is repeated for incomes. Click the incomes icon on the left and enter an income instead of a cost (still positive, but instead means amount deposited, added, to the account). Transfers The record a transfer from one account to another (for example an ATM withdrawal from a bank account to cash) follow the same process as for expenses and incomes. Click the transfer icon on the left. Enter the amount transferred (positive) and select the from account (withdrawn from) and the to account (deposited to). Refunds & Repayments You should record a refund instead of an income when you receive money as a refund for a previous expense, to get the statistics right. This can for example be if you return a product and get your money back, or if you buy a present that you and your friend will give to a mutual friend, and you receive your friends share of the cost later. The record a new refund use TransactionsNew Refund/Repayment or the context menu with the refunded expense selected in the expense list. You will have to enter the amount of money refunded (initially set to full refund) and the date of the refund. In addition you should specify the product quantity returned by you. In the first case this is clearly 1, but in the second case this is less clear. It can either be 0.5 if you count it as a half product, or 0 if considered a whole gift (none returned). The use is more obvious if the quantity property is activated for all expenses and incomes. The refund is recorded as an expense with negative cost and quantity. Repayments are used as refunds, but for incomes that you have been forced to repay. Split Transactions Split transactions are used when a transfer to/from an account is instantly used for multiple transactions. This is not when money is withdrawn from a bank account through an ATM and you go shopping (that is first a transfer from a bank account to cash, then multiple regular expenses). A split transaction can for example be appropriate when you pay with your credit card in a store and tell them to withdraw some extra money, which you get as cash in your hand. You might also use splits when multiple products is bought with the same payment. It is up to you how and when you want to use split transactions, as multiple ordinary transactions can be used with the same end result, even though one way might be a bit more correct than the other. You can create a split from scratch with TransactionsNew Split Transaction... or from the context menu. It is however often more efficient to use the join action. This way you can enter transactions the usual way and later join them in a split transactions. Select the transactions to join and activate Join Transactions... from the Transactions menu or the context menu, and enter a description. All transactions in a split transaction have a common date and account. To reverse the action and transform transactions in a split transaction to ordinary transactions, select a transaction and use Split Up. In transaction list (ledger) for the account associated with the split, the split will be shown as only one transaction, but everywhere else the parts of the split will appear as ordinary transactions. Scheduled Transactions Transactions that have not occurred yet (with future dates) are called scheduled transactions and have certain special properties. Scheduled transactions can recurring, which means that transactions occurring regularly with certain intervals (usually on a certain day of month) do not need to be entered manually each time. This is often useful for bills and paychecks- Single occurrence scheduled transactions are create just like ordinary transactions, except with a future date. Recurring transactions can only be created from the dialogs, with recurrences specified in the second tab. The next occurrence of each scheduled transaction is displayed in the schedule view. You can edit or delete either the single occurrence or all future recurrences. If a single occurrence is edited, it will be created as a separate transaction, and any changes made to all recurrences will not affect this occurrence. If the date is changed to the current or a past date, the scheduled transaction becomes an ordinary transaction. When a scheduled transaction is due, when the current date has gone past the date of the occurrence (or same date after 6 pm), &eqonomize; will ask you to confirm that the transaction really has occurred. You are then given the option to accept the transaction as it is, make some changes (for example the cost of your telephone bill might variate slightly), or postpone it. If the scheduled transaction is not postponed, it will become an ordinary transaction. Securities Securities represents money invested in stock, bonds and mutual funds. Securities and associated statistics are displayed in the securities view (accessed using the icons on the left). The create a new security in &eqonomize; use SecuritiesNew Security... or the New Security... button. First select account. Securities are associated with an account of securities type, which cannot be associated with ordinary transactions. Enter name of the security and select type. Specify initial shares if you do not want to back-track all transactions (it is always preferred to use transactions instead, for better statistics). Specify then also date and quotation. Security Transactions The following transactions are supported for securities: Shares boughtWhen more shares of a security have been bought. Specify new shares, price per share (quotation given) and total cost, including fees/commission. Shares soldWhen some shares of a security have been sold. Specify new shares, price per share and total cost, including fees/commission. Shares tradedWhen shares of one security are sold and shares of another security are bought for the same amount of money, without transfer of sell income to an account in between. DividendWhen money is received for each share of a security. Specify income and income category. Reinvested dividendWhen dividend is received as additional shares. All security transactions are listed listed as transfers (in the transfers view), except dividends, and shares bought if associated with an income category, which are displayed as incomes. You can list all transactions for a single security using SecuritiesTransactions... (or the context menu). The Securities View Statistics displayed for each security: ValueValue at period end date date (quotation * shares). QuotationPrice per share at period end date. SharesShares at period end date. CostTotal price paid for all buys minus sells, at end date. ProfitProfit during the period (value + dividends - cost). Yearly RatePercent increase of value per share (for a share bought at the beginning of the period), during the period on a yearly basis. Includes dividends. In the total statistics displayed below the security list, quotation and yearly rate are weighted based on the value of each security. Predictions are simplistic and base on previous development, with respect to dividends and quotations, only. Future quotations are calculated using quotations during the nearest past time. The quotation one month from current date is assumed to have increased at the same rate as during the past month (or the date before with a specified quotation). Dividends are always predicted using full past years (they are assumed to occur on a yearly basis). Saving When you have made some changes you need to save your work. Save the file using FileSave (CtrlS) or the corresponding toolbar button. The first time your work is saved &eqonomize; will ask for a location and name for the file. &eqonomize; will then automatically open that file each time the program is started. If when exiting &eqonomize; there are some changes that have been made after the last save, you will be asked if the file should be saved before closing. If you in the dialog toggle Do not ask again and click Yes the file will automatically be saved each time &eqonomize; is closed. Before the file is saved, a backup copy is made with the name prefixed by ~. Also, at most once per minute, the current data is saved (in the default KDE autosave folder, usually ~/autosave), to prevent data loss in case &eqonomize; exits unexpectedly (if for example you by accident hit the reset button on the computer). Import & Export of Data QIF Import Select FileImportImport QIF File... and follow the instructions. QIF is a file format that might differ much depending on the software that saved the file. How much details you will need to provide about the file depends on ambiguity of the date format, how localised the file is, and how well accounts are defined. Securities, investment transactions, memorised transactions, budgets, and classes are not imported. CSV Import This function imports data files with clear text values in columns separated by a character (comma, space, tab, etc.), with a new transaction on each row. Select FileImportImport CSV File... and enter details about the structure of the file you want to import. Transaction parameters can either be imported from a column in the file or a set to a specified value. Accounting with &eqonomize; Overview The basics principle behind accounting in &eqonomize; is the idea of money flowing through transactions between accounts as reservoirs. A transaction represents a gain (you receive money), loss (you buy something), or transformation (you withdray from or deposit in a bank account) of money. A transaction always means that money is moved from one account to another. An expense (something is bought) can for example mean that you pay with cash from your cash account. The money is then put in an expense account. This account represents the products and services you pay for. It represents the money that you do not have as a result of expenses, and is therefor useful for record keeping. Incomes is usually put in a bank account and withdrawn from an income account. This means that income accounts will have a negative value, but to avoid confusion, the value of income accounts are shown as positive values. Different income and expense accounts are used for categorisation, and are therefor more naturally referred to as categories. Other accounts, which represents the money you actually have and often are real world bank accounts, are simply referred to as accounts. Accounts and Categories Transactions &eqonomize; has three different basic transactions types – expenses, incomes, and transfers. Securities uses some special transactions which are described in . Expenses represents a loss of money, a transaction where you give away money, mostly in return for something else. This can be a payment for products and services, or a gift (or you lend someone money). Incomes represents a gain of money; when you are given money. This is when your at the other end of an expense, when you receive payment for products and services you provide (often as salary for your regular job), or when someone gives you money as a gift or loan. The third transaction type, the transfer, represents neither a loss nor gain, but a transfer of money from one account to another. This can for example be when you withdraw money from your bank account as cash, or you transfer money to a savings account. Each transaction has a number of mandatory or optional properties. All the basic transactions have four mandatory properties – value, date, and from and to accounts/categories. Value represents the amount of money that is affected by the transaction, date when the transaction occurred, from account where the money was taken from and to account where money was put. These are the generic property names, which shows that all transaction types basically are the same. For expenses the value is a cost, a positive value representing a loss of money and the to account/category is called category and the from account/category is the account that the expense is payed from. The category is always an expense category and the from account/category an account. For incomes the value is an income, a positive value representing a gain of money and the from account/category is called category and the the to account/category is the account that the income is deposited in. The category is always an income category and the to/from account an account. For transfers the value is called amount, and the to and from accounts/categories are both accounts. Mandatory Properties Generic Expense Income Transfer Value Cost Income Amount Date Date Date Date From Account/Category Account (account) Category (income category) From (account) To Account/Category Category (expense category) Account (account) To (account)
All transactions do in addition have two optional properties. The description property provides information about the nature of the transaction. For expenses and incomes this can be considered a flexible subcategory. The comment property is used for any additional information, not used for categorisation, about the transaction. If you for example buy a pair of shoes, you might create an expense in a clothing category, with the description Shoes and comments Shiny red Pradas. Expenses and incomes do also have two properties which are not by default activated in the program. The quantity property denotes how many entities was involved in the transaction. This can be a whole number, as in two CD's, or a fraction, as in 0.56 kg apples (units are not included). This property is by default set to 1 and does not affect the value (the value per entity equals the value divided by the quantity). Expenses also have a payee property for the person or entity, for example the store where goods where bought, which receives the money, and incomes have payer property for the one who gives you the money, for example your employer.
Scheduled Transactions A scheduled transaction is a transaction that is planned to occur, thus it has not occurred yet. It is basically just a transaction, of any type, that has a date set in the future. When a scheduled transaction has occurred, it becomes a regular transaction. Scheduled transactions makes it possible to keep track of and be reminded of future transactions. &eqonomize; will request for a confirmation when the transaction is expected to have occurred. A scheduled transaction can be recurring, thus it will regularly occur on a certain date or with a certain interval. This is useful mostly for bills and salaries, which then need not be entered manually each time and you can check &eqonomize; for upcoming payments. When a scheduled recurring transaction has occurred, a regular transaction is created, the occurrence date is removed from the recurrence, and the scheduled transaction date is moved forward to the next occurrence. A scheduled transaction with no occurrences left is removed. Securities
Command Reference The main &eqonomize; window The File Menu &Ctrl;N File New Creates a new document &Ctrl;S File Save Saves the document &Ctrl;Q File Quit Quits &eqonomize; The <guimenu>Help</guimenu> Menu &help.menu.documentation; Questions and Answers How do I change the currency used? Change the money settings in the KDE Control Center under Regional & AccessibilityCountry/Region & Language. Note that the this only affects the currency symbol displayed. The actual data does not use any specific currency. Credits and License &eqonomize; Program copyright 2006 Hanna K. hanna_k@fmgirl.com Contributors: Hanna K. hanna_k@fmgirl.com Documentation copyright 2006 Hanna K. hanna_k@fmgirl.com &underFDL; &underGPL; &documentation.index;
eqonomize-0.6/doc/en/new-account.png0000644000175000017500000004646611106571520016437 0ustar hannahannaPNG  IHDRm IDATxy\T]Tp/DEђrv,4W2ū5S7Qq 7n,u 7pA4=STY@Fܜy<ϙ3_.'p¥FLxic֘mڠ8'󩈯RiCxRHDT#zrOY\A9YqiqtIJN£G;NDO7ATWuPk%)VޟjQ1 ➫ZxPG 1ތcs BB+4=bW=?}UǍP~G8 J7Z.| p#%M@JYmj16JK E%* U>/_9 }LkF鑂{Wѯ  > n" d! pE.rqgpK^Af.x5}"t8 8?߭K>Kvq ,\ܲ`4 U>\o]m?5j^C5_Wl2!4(Т|[G7>Q94E%*b#6:Cvu/f`@m**>Y^idqk_@AֽW5T>/DZYKm?5tijo f+$,jiP6ma$EU9~rw)\I>wQ\Tbظ-,ZѸocG1MoLzzZ*YpGPFJ6#\$Dx8[p^.`!@+7;l5d5ճO:q7[h6ET4ζ=g债vJJjOJ{=\DFũ61,ܡ4[?w;]*#,۟ q:cNo]_zVH~P'៯5)إ+snaD774pX{OCpW>3p\(/m\_Bk/۱m~XcۆxF0 c >5āֈrB߃ JTInimX\s,e~>}G'?c7U[*>>W7VV긧xhny%9koc{6"2A@;? qu~[ PX`o/zAUnצ=֍~m<0-:Xitj!-Q\T~Gߏ7 Q&i Ouײ2oÂ-[|:6s( ³×{rU}Z9כރ4[l)Hإ+ӧ^>̯sX49<p?f|u/a+Phu ,cYEJDaQzR{A_B^#׮Q.'ITB !~O:Cۑl et%lOK#NPχ*/! Yޟx;!xS\@PX(+ߌy'g#qK_ZwEz_1]ǾKi@e`.@!T! f#xQ0~=+{ǯ[B{ Gej){㿇k5vqB~j\wJT"[y$?Z8"9=()BvMqd6GJtB ]cnNֈIHBj#l?@nEnh8s6l4KAXRVnkɩum k{,=4uAN^8;(h^ד`6uPX(A,*cFTn.E6Az }YMZǞ[VPXL #ccT؟ٰo,9% | C A0%Ez 6'|U"؅coε {BG(˅Bi,^")Kx^[vh,~MZi<>GxwU>|Hу {#˭W*ƹ]pǹsh>9, 1 1W |>֣59]_anV@,.@n%.&?g]8(б#~zqױDܕ?SPv:[7ss k'7r [(l!(J* ZJiO *U [JJK;@D %:o8<ko'!z~(=ٿvPZBNG.5I(Bai +22Dۣ#>{ ge VƎ{7]GƵ_!(aZb5wun OR\AY>Z/1FT;hJ>hw7\3M}\ui[@)!թmr)-nPbdlC_ؗ梽gg8BPhEJHn׳. nJ+02 9p+B@WXB~mj^ ?&Btt?sU7ąG+{ymdV IPK?SU(B! hbCPXh {b L^Oi稳l-5mm34xZJcV(:6߮-K8vr Ҥ̶e'ɩQ K-.{nwP:U-t.weOv@wKTYwK?*wVyFkPW!/{BB^hyѫcTXa'8Y##7ȺfP]`kO],,G,Ed>?R` KS'.&"vOu{1[/:xoqKFé "m<}uFۜ#!aFw@P{j&aHuO/(=rkZueĔ㾼LAv^ <:R$O#XUߤ@6_Wwn7vC z< X(UCGPhJEDq%J9-W=zGPRQ_R[(Bq#b J+(muu`a[ֻ WcQkGW6Y7N(7uI=\Q֍(zn-`U6u4s^EnP9I{ yPbXX6UQ6%O9P䖾  AiQ`aeK{g'i7}YWÛ(|A=OvJ rw s@UT +[CdHإӷ*[fh ǽS^Muċ`\//5ۍzU޶׿SC>TL}QcωC}غ4BiJ+;ع4ELXle<8Jk[ػ5c[K+l] Kn6¶~cPXZkoz !XYCi](mε) s3 O(h=lk KL>  (m@P^l\XX  >)`am#ε6`e JLJ;Xv6u`V9\ıK/fe >17^q_~0ʩiw3#{6h\ae zNiع*vt=3WS‡i5q""2W>LÞĘ$F⮍+Q%1i60i60i60i60iɈ{c3!)?P zfs*Kؓ&Nk5_@73L0yŵ"T*L^AsLT9(B2#zVoe^;eW3LEDDϊD]׎9Na<&2͓3%ę6U UCg Gƍ,:bثf;Z>|NN{ѳHeW8ӮeBߙҥa8|gL\x1_Y! Ztǟ~ډ^A!"0tj]IHeδU3m/Q~vQ:?w/lll徾~r*Ỹ?̘O%!CWSj#9RUL K|#W_?t4mpvvFdd$c֭Z۷puu6oެFʔ =9[(Dn\!JNRaIPTl쪳|gcW o&^U*؇W{yFڥmۢwWEhӺ>>RSUgڵDNѹs}:PTT8bYfaΜ98}4 cǎaqx4Ҝ=0A8zsaGtiT*]tCXؿ״<5/|)[g!?9998/3=b!6W O?!(hթ^zc׮B1Él8qy&Ono~wgsE8>W1>:~./%/rR#F`֬YXdVI0fܾ} 6Dhh(^{5u}Ϟ=1|,XqqqPTGHHHM!L6o3fLÇa7Eϛ_ Daa!7oG?OՈ+N;#tLXv(cRi3!}l1sxo-İa##0ga q5bu|oã!ƌۘkJ?N:J| #BP\K)D4 yA ǵk_k5+b 6Yٵ"x!;aÆ#q|8Vw}+x|ikL_ڵkU%=+Dy*~{D*ggg/@Fjjd4OůIelS#5gDQiS-6ixUADUyNI*ۿ߆ΝoLD*^l ViLϨAƞ0Ғ*ϷJwbi;uDD5?GD$#LDD2¤MD$#LDD2¤MD$#z{ΟOn=3xUZYޭsmwK,T)q3i?vnj+Dόnݺ!lqx6紉dIHFd,IÇ7XODDUg3mKKK G0`{9XZZ o:FQdgg^zWybzz-i/^-BZZBR-O1{l?W^Enn. ۷'ٶm+qv IDAT 88}]mwJj$Ƀْs=iӦaFۦ 44hٲ%N\u3oߎ޽{xא#Ghذ!6lÇkطo ???l޼YvAڵ ߿?aii:`kEFFbر;v,"##k;Dfc"~m|X޲e˰fźu[#>-66چaƵkPn];V];w.??_u8q"-Z,8p?>|DDDƏoo3f1cmߴi>s|x6mڄ_غuW}Y񞄼' MCľ#Bq-Ӱ'y8;;k$ 6 66֭ӪOMM >k7h}#yyyP* QV\x[VeddqxgϞ:u*ۜ>}|Ο?ڵ+> 0@vDQDdd$VZ;vyVRR-ZhР -- /"_ I6VߡC,Xl޽p)WٿK}qHñ% a%}ܹsӪ=z4{nܹsHIIѺT*$''###Cca6 ھ ~|o;v .ۜ;w{69s`8~ф GΝ 4hΝ;m>11z(իL.cjIڂ `O@ll,͛͛cmkΝ3[gINpqIm|zQﬤAbb"%Ķm4Xm۶%>wM$U}#yxw'h{{{#<<Qb֬Y3gN>رc,ӨQ#=zY]aaaqe4kL7'ywݻwTu .Dݱzj9YYY_>vF}%K0{l:u * /uêUDxxx`Μ9:uFff&f̘&22˖-ۧѣGcԩ#AaŊK]j/]=bYb/^$SLjWv6^ B@@n޼hcܹ&kՈ@rr2֭[%K`Ϟ=Uڎs֭[عs'=„ 0c $%%aX|9kIߏ1ch5,ۧ}СF5뚻]MECW[Jh"k)(|=!ϛYpqIjJ] oooܹsGg{]Z_yʕ+;;;cΝݻ,** -¡C̶]폾}bڴi8q".;{,BBB 5$b~FFZh]Ν39 EQnݺs4ʳѸqcdee)u]sT8={ݾ1ǎcGKn?`X94 HK<\=_iٲc'''2KMME iov… ގGBB;>>Æ *7u$_ׯ_B@qqq=999*GNNY5w.ǎ1X_%it2F6m`hԨQTTZݎU* :0z6h(о}{={֬(KV<%ʬkv5]*#Z?UVX̛7͛75TjZĉZ}||*sm۶[߮]J hh atV˗ѢE kv5]k}qၘD~~>ߏǛӧ#..EEEChh(&O\혫_6m?BܸqƍSϚ5 sӧQPP\;v ֈëGn*oW_yE֭[ꫯe]sRWIp8vsm^a@翥Y~! M\\$Z[[֢W_Ine˖M6J%^Z۩J*oٲEl۶hee%zzzjmb=D;;;Fڵm61 -–111"Gjj%IIIbvvj*Ҥ8t+L133S\j.)u]s5Fy–i[w Kv–_͋];LIl"^="Owٳgdeem۶9s&|MlEʕ+6m; Dxx8^xkvh޼9>V[#ވIDy&m""UwD|K,!{UjcǎϷJf~F :lqx-H~*#~~U;Lܩc "Y䏈HFdIHFdIHFdIHFdIHFdJ_c=y 'Hno{oLkkk WWWcСӧO?`֬YHIIPz{"spvv6[gIu=ey.~֤eT)i?L*%ˌEN-((3gGXl}3gtuzZ0u5|Mm?O14 0_:믿ָ]|BbZ[[CѣG;wܷwSN&GՃՖ%%i_^uARaݺu啹C{{{̜96m(߷o ???l޼Y(^zS/))) ;ZlS"77Wc=]t9;;cmllAAApsslbR}dd$₀|FR;v@Ϟ=OOO5 iiiCJ_oߎ>}aÆ_DFF" ...h߾=nj`֭h߾_Z|h׮Fq c\j?uS6 k)C \zo<==^z~_U^V17$>@cÆ ]V_ ]tAB“(L03f@RR6oތ˗c޽6eY3224! 7oDtt41wJ657"44sŭ[sN=zTrw}˗믿Frr2"""tRرX/FRR)STj캞} ǢEpMիd[K,1{Axx8֯_ʕ+5OXr%6l؀d]Whc85RYM߾1tDܾ}صkF>R;s܄&!bR‡i#n?OE^^D]>QPXXz*..;RSSĉѯ_?ug"$$111bɁ?\bp]߷o_L6 : ٳK/:E!**ʤ1:`e32ׯǖ-[sss>vܹs&NJżyмysX[[t PzxVVFիWA^۶mh1շnFى'~l1eH髩N8GX}||tƩ&66Vc)ǩ}(e])4eH9nCHH6n܈Gj$9s>͜ǝT^=&~[+q qml۶ zBNog͚9s(((@nn.;pdff"??5 ~)QTTSNi"HzH~hh(MǏ7nq$׏78s pL6Mc;cEJ_M5}tšqqq ɓR>i$8e*o„  E||<ӧkrۇR֕O]L}ޤR <CNN= ///c26swS-c7'AˮŊEaKEJ%~嗢_|͛7EaK ^lllD///7wءݻ=zvvvصkWq۶mZ1?DkkkZ+vW\(֩SG}}}ui)׋ Z۫H~FFem۶)^ڤe˖M6---f͚+VШ7u)cX_-߶,RgddVDR)6kL\lVe˖6K,L:N C)Ǹ~V\mSzR[)nݺb:uė_~Y؄YTCDd*_Y+((3gGXl6S#СCqQbΝL+3Qm9m{{{̜96m(߷o ???l޼Yիx뭷 WWW ?V [lQ9;;cӧ6l˷D@@\\\о}{lݺUeKź2 j;;;cǎٳ'QF!--M!Ad.]~ &`ƌHJJ͛|rݻWfFbb"n߾pڵK]Abܹuv܉Gjl7<<-͛7oWFDDn:,Y{l:##Cwa믑,];vhb ,^IIIL"}Gҍ}-..;RSSĉѯ_?ug"$$111777={:cӦMCppDEE_o?sN[]EСCU<((gK/?t-Z(u'OUV6Ɲ;wt0}Ȁq||< Nxr?zh D@@ѨQ#u}BB nhߺv… F+ҥK޽FYݑQֲeKNNN5i[DD>=믿]U*522240.\۷ ?3zpkaaa1 "z TkEXXF.k׮Ν;gt]???`ƍ8zFn۶-ܿ'Nh=Q?(Ѻuk/Zq?"̞ qml۶ zBNog͚9s(((@nn.;qG#::yyyѣG奮 Ŵipqƍ7n}>}:PTT8bzLƍChh(Μ9"9sӦMM!"c6]plllꊀ|Z߈ٳ'ϟ  ..*  Q;v,pXZZK.ѽ Ü9spea&yҤI3f n߾ "44~޼y7n޽ Qu~(o#77cǎErr27n? 2?DDƘ9H*^=""&m""yf6FH٤MD$GLDD2¤MD$#LDD2¤MD$#LDD2R寱\Hh4 IDATFs}oh@vYŽ?sJ "z6UJUJe /fT% 3wb6紉dIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFdIHFUY9 {fӫy򪔴4]XN= ZfeU)i ""i8MD$#LDD2¤MD$#LDD2¤MD$#Uzdر3cڵ^JI￯DDϤJ[] 8MD$#LDD2¤MD$#LDD2¤MD$#U?"*Y8::~Ğ<jGO??_tԱJ1̠,a_H7j;UҤ'|]mvɮ'JI '?RݩW|M'U%O`&+y3 }vW!ð϶r=֚UMdF(BFH0֚fŤMdFOC"cҮ>LD1OC"cҮ>_NȌYeCVЦU3ع{vMi=HOWbՊeUGMUE?v?/&cfoΥESĩ*iQU^s>8cltx3Oa8>_2ňoͷc܄IUJ5urR;z!SaI*X'W:vuje&l"z? ;{{uyCχлKQÇ`c5Xcb#* _ب˽}|rX_!iszȌDQRl-&1lmmlmm1)d lF]J[?ԶFLkkkc>wZj*͝ ?ұ>Low |4G@֘w.ر}ִ_azIȌ*BԹNs/3>d0&|#5mM$Сo?|!oq>`Iؿ5.+t>_CQN̙=S(쟘:&b}&%Z]}(fΘ?™uz ~>tIiVl899wvvBvv b͚֭k"igggnݺ޽4uqz&"h܃X  5Wpnnc:#2y!aE2us*X*RZ-4EX*Q;J[a9IMϿsy= LQFcG.{^KJ+bС9r$ l #(Yi ¸qQ+m:tx=m69a"t%e(+]hsNȏˋ\@G.ooiyBaY2dVZju B㼟U(hmmCHHHZ<@b4_ٳgVnY.Wb[wכ+g&f;YehߦbjyNPk4֒LuXWY~m'M/M̜K6+cƼaÆӧp7+]|Ō`pU!o//CXY,qP9f.wz>g|JQ;)+QUYt*W1 .v]}ĉQ04]1L0rj k4_c4_Dֲ%OTϰgW!N}%NLXb1.?6XV#?o=JCDDN@Mu%Z[с[?流srQKĽ{`ۖMlx_'ObQ߀ܵ.9=BG %S;wߠ` ޹ UX0a=^EͱZY6cpw/!{|J56cǶڮx>iz26oow1jhYMHS!/3J`6% FdU] m"53!=cvgyi&㮾 mHLĤ.?vl8aۼME)iHIMs\lTiCHd Iёoqۣ thk'wך{M$2|оjtx}M$2? CHdB1M$2w C;pD"R釻3Rp_} &Ri{{3ߨTሉRt9FQhԣ3L݇I o猡Me o)S*.^ Yh4UKF;o1$44נh@9>{HBDD&"60$MD$! m"" ahICHBDDbwLy?DDR%-;<{""[hi> X(_?AD$rr6P aIENDB`eqonomize-0.6/doc/en/new-security.png0000644000175000017500000006122611106571520016641 0ustar hannahannaPNG  IHDRh` IDATxw\TGwwRBfA؃QcK' G5؍11k5$*DETJ# ˶zLܝ9sܹsg'i`Y1}ł ;v2 à }gnd շMAi_gVƅ"=R6ArR㑓pIDey>! A 0 U%:'/.PYQB SYU%nNg:?+_ڏ  (4Z*)w:ݾ=J ^ Lm$Aa3~je4/1Xw7?Uʚ#`_{ x}` g~HqUw2O@OQQgvp lЄmSԺUg]T Wyy1į?>,m2(~_FsyY7RL*10תk:/[4LJ]fkcx^Z LٛWTݦkhШ_)C(Nsl+B{tJv"Mi8/p5v(`AjU- io~{]-ѽ EOaQ/qEQM{&ieסQ"?\]U_nei_Ui2y-(Bړ"8}8V>*Q,k-!S#<䢹»qe9xƦf2FppOMԡx|zXoEb1Օ _m ?զݺ(׷]/uFZ[Ӽw]6~SOn; _޺R_uy $=Ĭ`)*+QUU `[vDeU QLd2EEý1#,Hv@{' yxUW!A#t}g"m?eo>nr|M_w[+#p2@I%TW'06f2 - G=E^3X|%߃aFwh +3ľH{ =E}K'R=C[s,?kkF㯬RL}_i5Ҵ"#쬍WWZI&65/)?z.?eo1 }RґW:7qOʰ;os4氱 R?D*6[WK~9L"c.?ѲSzSHRcjr2eү^ 2,^N8ipB }AA!M\uz @4++|= |=ccp72n %2|yaZG *! Pj+uvǖq~a>B׶0h l_{' nSva^Ql)FeQ, ?$8,|'mE(iZᣛX5qc7{&?c=x,ʖ5C3/7<5V\]eejgy%xg~LX#KԿ5FyO_@'\u2q5g?nV|=ĕe髫C2E;[ 3GKל9kqy\޺FrMn‚mgP-fQQY-+0 *(-ݗG[i<:1_AU9\K Asv]$X2TB .-Օ(D!~7eZ:l<"QBGtqy¿PsOs4m]kFQV`x;y9(-cy SKTWڸ/l Glb&_<Ĵ6FBl;6roZL<n'/tD V1[S^uy6./~IHDL±Zon]{\ El5 boWBqE6Z/]ʪs+.GUkϔķcu!;M\3)x =PU+S`,Úvn ř宯-G/#?n<ne'!3`_GݺaAAuy A^I%r D&n]ԾW;Uy1Uj(O禿&Lؓ(sjjW9/rr˂0D~y>O{ͫ W9m(EL9\!@NFrڱri-mmPK;ĦZe1a\P]>~q<>q- .JxWvĀWf킉aea=pE6k>o' O`ּ5,laY2@e&X, qej~ VUlEwm6NW 0<#?bťe٪{Hde גsݫ9UF2-kڇhT^,r+skIJlOx<m͔yltV"W3Ҽ+u V}rbjt֋,IO̊Yr q`EҋNIGH=}<p0kEϒĽ)=G_VF|#؆ <9L&jujA dʥBe7!&6po!][aTY fZ@<!>oqsl*'˝Bʉ}%eU0'0Vy-mjW/p¡ކI51Œ G?\ɂe:*MMh3 f\DtUmV`Yrsv5&i M 0Vw4ҫJ?P3}P:Vo 0_jHąρ|)+W#1sBڡi;gj p,tCۖ#R} Ķi`in|Q5Rc(|kJ.GQi%,͌$o lQP\`g]I[.ar?l"="}4iOe5'xx] iCi1gS0g}Zk4O5#S@`n O`]cJGbϕJ: 8ptru70geLl { IJ1sy\Ox *w}kgįmyO.M&T(ۈ|ҾGH~6jTa[ulU#9afB A/|vpka8sB5kY@?'*jKj#4W8+Jeҫ+KQ*Q!ʊ !0&V-7m./E~R4abm Q*E`x|XF@Aej+knoY 76 &Xgd>qeJPUBN\9ma*tߤ DyJ0FB˴6T־Eq(+M78P*?-+L tF~Q) n0ߴ!e:S.6Ѡ BtfI67i5`5 6J̚R36qSFr0 ey.\&8WۍD]@_QQ/iS'[H߯}Lñ́*iІ&B6u7|3KBݺ0jA?U 0 WyE46Mګ" F;Ɩͥz_u) ^3+oʓ| +r^ZAD-lY[Qs .A_'8A rA 9h 4AB @!Ma&0PAA( G9as:܉׷>ޭzA& sL}Blݶ]뾷uvh&M4wc(-ҷ)F~A>@,Bq#F#䠉e!k!_m$C M<,ꤳ&HO rЄC#hBԎs1 jeZ hA?4߸q?\=Nƿ:M6Ζ5t}+ !:E~B޽|~BF?-m$#K{c9E;cuu0UekG1uG3[6ʥ,ބs/,h*iP76xU6-KqЃ o&֭[#??BCΝakkN:СCryΞ=2B:ln>{HL|(w0r(ƻS7ޥ4p+ YY`ɒt_{,Zbvcn?xDv6u2re9?nvwN6 +mu4CCC}v~Æ :ovBFFك/Oʇc̙Xp!qlڴ gΜy DhD,cyضuLm_Ys _S_Oǩǩ5$ :~}>ΜeeXjpMj ؾ+V~{ I&M`ѢP̹s᛭7qA26n;vldĒ6mVJWdݯ_?D"ܹsGWUU{bԩҸ ]t1t邯 [loܸ۶mÐ!C`bbٳk׮)_/jF0b%Cjj*bs6>`\ϊtqQ #`dd-lb8{7zꦷn$4|] 6[KR];c5/o'ZVoJA׆e(=ʐͯK[f駟b۶mؽ{7ɓpqqA2={ӳgOܻwO=..cƌT>,+`رc+֮]ݻcƌOdFu(BSE񹹹ut)99٨[T鑐Wڲ&"H}tLd㛀t/tx|//A6 6lg`oo]vaȀE#YI"L}$q;{۷qv.[%#D:yΙ /Oppp о;'\ӹփeŭo"۸S]4xy")9Ma.F/m0 fϞݻw#..O9&ԩ30PXX '%%IFarq{ .XWWWeňRֆAsEm۶Ído\dA IUxE% >ؼy3&M@v`Ƣ ٳ/ҥKq C$!22#GC8^/XV~N׮aAJz"775},d\;{{\EuXFmڴŎPPPbg!22VW/E-ԍ8c\oFEE%naŊlx9hUsƍùs0aYfaʔ)pttDpp0BBB{IUVapss;6l؀Y %nuDr(,(@wV.)22!!ax@n ۸wn!ޭlو! ddͥ^\lQn1et̟ ?vXS|TmuڏjvP$gU(iRU!99;w7 Eڽnj6x(**BddƌB-"\CNeseCN…YիW{nbW]EPJJB!uV8;;bɛ\2uЯnv\Q7}A2hMtvO 0xhM{qh!& e/\Dc9hr뎯 ݻT/L@z\__54aHNDG/mONAݻumpG'W @!Ma&0PAA( ZA<2o3B#:{آw;D0h$9 }BRscC49h 8_.Է)= )i @!Ma&0Pt⠅B!Ǝ2  p ]#xљްa֭[]$xљnѢBBB`YYY <==1|D"iP(ѣG8::CBB"""0d899 dj IDATcǎpY8p 4BӇ}qIrܹ3RSS2,_\FfӦMXf RSSq=xxx`ذaXl>sA{KoiS'#';yyy999r:yyy8,w7g?tPF>))ǍBvpwsA_NHmvP׾'atEVhp1}mm۴O@NvLRUu) I(((@nѽ{!%%YN2?<[g.8! nvw:\W}u]X,CPt|6mΝ;]v᫯±c4wذa KKK̛7S@菚X&~ޱ}+Vp12M4Ewr:"#/ 4d.Λ{ Iص{/m~V*?md՘H/֬Ùb|9}WnucU q}:7kŋHrKU٦,9?gQ#G'#.] C9#ضkm܂q 6_ \Y A3a ErV*rpzNTWW.\@f ­[ @HHP@,Y4?u@qxPk׮K^PPooodffC\vދI&T&=ʐ~>{<<<酅-KBbCL8A իB=jQxm߻{/ ogo ѰwPhk]ǟ;_G^= ^pK]U٦j/) ??z.DDK#F3g#(zԥ`̟}J.^-/[i%<^bI(._`e:ƖQq9 t3.]H34k ]t п@||<Q[&wHHHfOOO666D!t}ƹ|H$ˊVpx~Zn OOOw1mI3 {;}УGO8::).2iMjV/'_m_'Hϯ.]@߾Aн{zե'''kn2]vCbCNv7V%H!RJ28y$N8!V]]-uBѭ0zІ9@kX7NكDs6 /bYtXwBŋW/#b֮Yɓ` mb=lϱqY>}R. #^X6Գ_e/)9 ^HJNSev ŋ&3gTDDD //бcGDEE)ե.]v|Lܕ+W-nffB$0A?2n20(9{bo ??}Jӽ}Wd<6?Νۤi @,Vi\GmC~~.\ػHLz,nܼ˗ ]{o\VK]n\q=^^mk~22))I_ JĤ*t*Gw߅\5(}\t xO.W>}t͛͛73fHee˖!77~:>chL8^.5or2dѣ1c`gukpV,QRR+/cʔIR)S&+D(..h899Ksbvh..zV?/  &riMXo <+bӧ}˗ʕ+(/@jj*,/W>~DXqqPQQqqXb)O,ѣ֯_84 uF,+ .-T7rA*Ũ \\uG'Z(J#:u`B^ -Kb|߿?Zl-Zcǎ9s&]Ӳj,#,'cP#|_ѯ_?,ZUo, .DDDK$''#33ǎ/^o"##nnn`|6xz*p6ULLLѣGGqq >\geLWc [}`ooL0AΦ4m111*e$pѯΒ6ׯЬY3ikǥh*Fyy9Ə9d8ѣG׾3gb…HOOǁi&9sF*#44˗/GZZ?/*-cӦMXf RSSq=xxx`ذaXl>sZiS9:ƖQq9 E|X[[Ka̘1rr<^`>>>˨H˫$uo峳j*#++K-u F߾}1l0tpvvV( OOO666JTbffKcee%-[ٳgÜs \.ڈ tc޽獌hի=8Q,###CWCQ4VS`oN3LLLPYY)g͚59r$"##bɒ%5kBBBl?F֙rtFkf͚G*jjP4DX~̏oVyڱcGDEEaibbbpQH$.УGFw>}֮] @reeeiM:KrA"))I]d@jC۽84S?$'OO?o߾֭>iŋtRܸqDȑ#2 KPQQGa6 CAAp9̘1Cȑ#RŋpuU&RٳAAA8;ߏ ӧ055E۶m1yd7N#]ֹ.\ڈ +2$x+"5im>*h,hXp]1i$z!󽤤gΜn*, 7uY8SddSdt79h ߋC&ּ,0t]LqІA*G]?HQfP ^Gy 9h h9hїch7={UT9h ~C-!T݋קA'z䠉Wݺ6ī-#0PAA( rA 9h VqO̵s'^ A̎x8޽ $rG^Ij&M4Lo rG^}0C8~4ADc͒!!A $%) .-T7rA*ٰ_PXل\ u5=ub|߿?Zl-Zcǎ9s&]uA(:nr2e9ą """_~%cǎ/~)6BRR KKKXZZbСHJJi^}էW <=\ezUt~~Nd4ؽ{7`jj cccxyyaԩpN"יwAFF2220`!77W'y%ɑWpA 36)B;v }􁽽=\\\0aWHBhh(C$qiӦ$~.B=z5k&M;{,`gg___8p@FwRR>C}ʼn'ddh*7oƈ#0w\X[[s#yf՗"$84 ;űyflذ鈍%͛'''%K2ѹsg"** eeeX|9g6n܈iӦaȐ!/pa<~Xku!55UW:<<3g… `ӦM8s4رc1p@$$$ɓ' ɓ'9ו gbrG ɫ/9EZ.49qHΪ@EQNiP(uB׮]4T(1+PRR$&&rRDDDݻHNNFTT|||cr=2d> }:>} e>ۻw/BCCѶm[5s+VIؿ?,XOm۶ɓ1n8ln=}UzjB,s̑L:ׯ͛7add=z`Hży֭[cĉȑ#s玌YӼSDW6AdA40ILLDHH"## Z8>~C&MRz_2d̙ӆ כ6m*eOT!Mm M r Ƴgϴ__M0h$'"gK7miЉ9h{ *B rA 9h 4AB @Us:܉׷̎x8޽ $rG^Ij&M4Lo rG^}0C8~4ADc͒!!A $%) .-T7rA*ٰ_PXل\ u5=a|c|yGȫnr2śiA IDATut< ěCzz:Ǝ [[[K.8v|III6l,--aiiC"))S\j[F#EXOWc^U7 jF=xdggc„ =z|999 ;# ddd` BnnN6 ɑWpA 36)B;v }􁽽=\\\0aWHBhh(C$idۡCЩS'ڢsطo2۷R=WXuRWMC yuAU BS6mڄ@_vvvٳg6oތ#F`ܹ5̙#F`:ې2$84 ;űyflذ鈍%͛'''K2ѹsg"** eeeX|9gN>0|]evalڴ ;wꫯqꤪ\C ^ΝÔ)S'L2ٳgG3g$oCPJC]h(⠿;t hѢ DDhw*5 &&&Ǘ_~'Orοe|ܹ3ѥKi~JΝ;qFtUFώ;^J=4uBxxx ..}0`~~~&'']vrm۶EJJN6gϞA$i LBOOO666OG%;;VBxx8y<_ݻ={΅w2q{FBBڼ&6:2RRRPUUq.))\JJJt!eh{.h0N}8uabbJE,3]/ , >ԩnݺ)IZZZ+smHǡ-z_f0Z'+W&&&hС\"W e/i׮._,[]YԃK{p ^&)))ATTX윁C'yRFeU 4R/)y{{#,, (++ùs0c ʙ5k,XXTVV͛ ۷/-[\TVVedOPܼySFO]{ՉK=B8]1p@۷O.~PoРA8t\C0h mH\š͒V\ӧӧ`YVC{"44m۶P3b ᅬϟ#88pqqܹs1|͛ ???TTTM6;w̓>"SNEFFZlO?#FP['.\l … ѥK̝;+9͛???n'N߿G;wddarͫI"C"RӞ:h9qHΪ@EQNi`BV20vF_!>}%K(,,Dǎh" >\eD 220`Yq8888_6mpi2Ę1cʫ\}${q%9%M49WUo Mٻw/&O˭$u)pۮ$o.\`SvAGnnn]|MmڴȾ̙Esrss{=͘1æGO||zeSv5iĮmƍ?8.%%EW\QHHVZ?.r~nݺ޽z߾};:F^E?4ʥ?נcFcMf)OOOSNiڴiJHHɓ'L}Էo_r~ok֬ƍbS%rٳgk魷Rhh$)11QÆ ŋ/81qDW-RHH$i1b ߑ1r+W˖-+",۰?o׷1C޽[~~8q'|'N(33S'O,y999ȰY̴ ڵk>LիW+(2Gڭ\R;vթS'YF] l6G0`4m4u];5}tM2WeXVDD]AnY74dgg+66Vhԩz&IJNNٯB 4o\￑SMdٲe3fl٢7h@~]ÇՠA== .O;$uMҥK*UE.*VFi裏mS]w 3r ի:~֮]6m(((Hݻw*>>^Ν˗KC N:JNN{ǏפI_ʕ+VRRziӎo} ,ԩSm65l06;vԚ5k׬Y;:ܮsڻw]{ǧw\vME:FJ mS^t]f7 BrʪU5sLoRƍ%yT2e:u/bX? մi4}t*''GiV̜9SK.URR֭[`QFyW^z%Ign:9nȑzc=tBOsdN:)**zɓ'Cj߾}*22R"##չs"_1dM:UwY/^味W3(-5jԨiW^=_;:F׮]յkW/O?~i(oZ4⦿ܪ4;^&qSn2s1KI%r_3Ay˩\D@&"1ЁC`( E@h0 "P4DSUTQZ0;%//I)o֕+W믿*99YƍSHH̙SRÔ*@Y*%777y{{+,,LJIIц JzTJ ]иqrJ͛7u֪Uj*^=zjժ6mpj۶j׮-^Z?PO<^ըQZͲe5k#rn[///v}]e˖) @5kT``VXaS+44Tkז ӧO۵\7C–-[*==8!!ACرcu1ZJsg}fmӯ_?=S:x?xmڴZeEEEi矵a%&&ڌYfѣ:sLs[`,Y {z7s=J̴n4w\;В%K4{l͛7Oqqq:vRSSUjU5/$rStU]xZF4rj]{GN$uYÆ SNmݫ%''Kj׮{N:١CEFFꩧ*p> (p^^^ڰaڵkgOHHЬYuBWmj„ j߾~֭5kK5lܹsՉ'}ʟgJUŌ:}pۍhff<==ۧ}ڵXM6ҥպukw}tnݺq?nE׷~``Cխ[WBBBo{%B e=7يUe͛7_ZtmҎ;\߮]7kB EWI&ڹs]?.@V}U?~\k׮U6mݻ[ǏI&믿֕+W$ڦgϞڱc.],%&&nݺ(EFFjz~G; [ ʕ+VZ ̙3IiӦiJMMUNNam3x`jϞ=-[ڜO*66V&MÇUvmEGG;<ÇkРA:~^EEEk׮S*<<\,KK>jT p>lhiNpbIr) hAyyQe=̝;O̷iaCoJsj7z? v19R.멸wZ֣X,Y,Rխ$^/pҭZŝ\K [!ЭZ $^/΃n}tRӆմa}uY>\gvegϜQ4Qb(1q +Ͻzy3 zemߞX"v}JWq 8ɕ7ᤘqڷ/UcM#)Rܬ7OSa7V{T.Ai-qm h͛P:t^P}zc8j@r6>oޥ|&wkyHP>tR[6cIџ~Ҁ~}Kh"Iںx㧪\!-~]x'&4K,,99oWЈUJ*Uhx(^Z&I:x@{t++_ujl81JnnnևfS'5ix5nT_)feeeY}ƍsj6ҐA:sM[[]yZ Qp [֮S'` n>҄ K4$gߴ|- jRiۼSS_1Z_|Z?}{ǂն3sP-rfzf]HSLWEyqƏcm-sM1cZb[듒5J#G+wzgkڲ_4K}^pAի{Wu]pkjԤIs? .Zj箯YLvmC4etk[A;ﬡI nk3$z;w~Ov$5iTZվ} (C9)lj7aժt6\_>{6SժUOʀ~ZxoXrNtjtyyyYh3gh}{N>?CTbEׯoZjζ}{Zx}]M٣f~~r.uL_얟]XG>dfOvwG/ᩧ m72b6jU{M׮]S؍\ oNNҾ9$ww:5hIήKGץԗwҢջO|C;uskLhmMݯ-\._o%eXg׊u}TR%Y,yy˛6UJʮOE&K;w(;;KYڙCz)EKi[`XiK[ӧYUJ|!!V{mp._9rf+ŢFst>טH K!4eD޽SW^ѣG=Z1Jf{Sueggi׮d ze%IzL{]AG$I 6Tnv^G{/WWt:N?s%pFT@`V\1Kx9IDAT1ёx{y)@-]REsה$IW"h( Gnym4adΚ#GW͚4tk}k;g&MK5Nq@r5]uoy>q)yS\В[￿ܮgYڵWvm |Q8 2Lh=ȡΡݴIb;m:(C΄Vځq#?CGJt7(C%APY*%ЭZC@e?MB@84PF||fJnVo""Yt2*u4P<==w|2k||̷<== l׭UhhR/)  8("G|ZfY$EПw|IJtKv"'ԨQPմz封C`( E@h0 "P4C|ջRջ{@*Uݵ8o(րq,N]_(l Y3.lamIENDB`eqonomize-0.6/doc/en/qif-date-format.png0000644000175000017500000004071111106571520017157 0ustar hannahannaPNG  IHDR3v IDATxy\TU0"*H(;{JmQ3\\(\RT])2|ZT]\A %Q֑uaf"99Ν=sgFAP"dg7ΓH$VBQ=&"":)Bs$>ã~DDDT'IK} Jx<&U""KBhdwqdkWQZR$ZDDTCYAL9 ||]d)}e9 5fP` R_u=:_IU¤JDDH$5Tqz|dq-pWxzUv J+tlPNDDG"1+7{7C)1 %.7G}ԇ;=LK_@DD[u=.&MooP/,X@г Q"+VWti֑Y员Ϝm{"d/*CJF!'5U>wz7E#gH*կףpQ ӳo?| L+g2A(r x@N IӚ9:%Q\ð0FvY1NkcBl3Y?9Z?36L@Ь_G>``t[m^[l|jmt_&uu0LUeN~2 aQ xJ*bX0,bh:4sn>8v&/kml/ nΎճ9N]$y=piqs\N˄O P'!xXޔOuӜ SL1Wb߉hWo2_JZUqOR_piR+B'QZV\nqqRq,Q>?cxgO4tw*&?!;p=|u\PGP4 W[d`3Fo9cdW/\T P&Niŋ\> d6zli[7 #9H!YJ%60(g6]SjF~9yui!}:bdW/8ZjԬ{p]TG1}1KqM>. Ư*U_:U~tmֿq[`>O{ˡ@MF&y`? dh_Rz,q+«#S{cs8jb`ڳ*R;G}Z0n˾ތݻ8u@kr eE|\_,zM雚?'O[ QeYΗЇWWu s|ɩ`W+)=JbAX;Ab%5uM=s;B?] A~7Svż0gS^w?Vwoj~BǬ W60DIϘ#V_P[WB۷ӿek}\ EEP+$"Ml-WICcG WHqRQ-YxCWܸO ? 22s;yhL l^ bv<ػ?qXuȜ)ƧlH5ʋ 5ƫ-/.JhW ph`Fc JPV\AYTrՙfU]?IYKqWV6sW; kVnmtTI`f}C|f+uK$Eo(MU|]HMY]N6r+ ($(-+XgA;u |qqy,ܼmP.sPed¡qH RK _Jh r+Ywg'ҳ޿nGKHmco=wWun܅dvNT$pI^{;@*,~ۊq+!r}Ru?Uw[`u2T/ ZĽ>nCz9OUBj`\If7!oԸ]rmu0z;OI$*ːi"$^HMD %ǂR`emicTeiSJVZC"?Z^\Dg=+ŅP*S 6D=%o*@xsg=>лEH 5իB||)%|2+%bXɬMGuIy}\?~FUMoz#;_ߧx}j|N6z\!LYEA>P^LL ͸y,H%5 [6itWvjy9.sԳ׬,ѯ3jmgC{Ŵa UVҡQE):꿂PG^L:"u%׏ cv?0]qvok˿BuWewi%XK>3ܑyqllQb= ^S,nhUX;XcL`o'!8h_c#ۏA+~s ͼݐ]6콄ϴEJ|YJx.h~=v{O]G)b3ƶ_{( /Wfy}4pF;_ l놷HhTǘ~kq W_[m(/T'TոG 1m1L)F-=ݛ:rE9lE&Y{ Buӿ#cRvmk#/1 Ʋ,_6#5v].B@*"cJPtH Kxs1}y9]Ɩyx9(/+Dj FwM=@"Am;^v%9P+*f zΰ%ACI]2@'f#.‰ϢDq(퇮!~ޣ9V2ۊ L0v몗z S?2A@a%P^G)_aiq5%['7~ƊN~UN _A;wkf?^D{fvpy*7Lک Z{q2;GXl2;ksT}5DbcG^ Zoz@҂l֩ݫfm_8٣]Ko,c-7P1 c}2{ػ?}f+56|[qQSo0=P/ԯKzmrc*skRzϔ҇J12ۊ~o>{YX\Zto e^W=+zqU1ru=&Qmn'TR7[; JTeV6Hx=̌5/n]͢)' N  (Lb).M`FJ>΍ H||]L%z8DDի&DiPׅӿDD8OT$뜈.IO,␈qKIH$LDDD"aR%"" *HTD¤JDD$&U""" Wյ$ lll???tFQŖfS1zjb_:S{.222#F`֭h߾=v%D!u.DDDb2{W&*_/^s|DDDu(֯_ӧOGqq1,Yn۶mpuu+<==Ѿ}{̟?:iUu+;vI&DDDo.зo_xyy >,ۧQG5bL>-Z@ wh۶-<<<ЩS'ܹ1H$%%iA}EDDG v 8xF yfܸq9r$-Z3gT:5{a 8իW#Gbƍ}߾}4hd2qY`Zbbb/_FvvCСCXj.\W_}׮]É'zj$$$`ܸqZ,WDDT$~}&GJV_RYYYzc(J4h5˗ ߿?=#G 00P]Yfɓ' WU_>,?}]vDFF"<<;wԈwQhj}BBPTTxh֬J%6l+++ܹS왺RJM~F23ܽ{.0o<߿YYY(++S3PT;wZw5bJ>gϞuҮwbbVVy<___`eeAP^^F}EDDK? #Gď?^{ W^\.W'ALuwk+XYUt7F}EDDC*駟'OV9s0qDh+,, @ŔkM ˒m۶~+c_Q2;#33?#"""pmhרzr͚5(**BJJ ~mTWV~>C`ƌHNNFYYn޼M6o߾_+++̚5 nBVV>#XYYCWDDTJnnnA=^x'OJr111x駟cǎ՛Mcǎc׮]hݺ5yxyygϞسgU͛Q^^m"$$ؼy3"##E1.%""^/'"" *HTD¤JDD$&U"""0IH$LDDD"1WjF] ""zhZʨzF'M6="",''ǨzF'Uc=*HTD¤JDD$&U"""0IH$LDDD"aR%"" *HTD¤JDD$&U"""0DjpQ{jϪmۆVZiGAMn˃O?zwؼysc6qP5c˘= FЮ];,^u'oՑ]]]ꊚ̙3w!<<\Ը5AwuL<NٳO;9s !!|޶掷q(=iTPYYΞ='ӦM=j3qDǎk{/v؁ÇcΝٳ'aoo={bΝػw/+zU_]?*{2 aaaX|96lP!5ŋsǃ=ĎkLݻw#** gױuV߿c +Y%(ɿ'8lWWW?~-[T ((7nǏG~uΜ9 &zիOHuYll, TN-,,Dhh(.]T3Ϩك  66V&66Z;֭[rssxjJ<00Po-~Ce}k(F:V5jLd/)(++n߾s;u1fU֪qU]cxzz̙368:>=\]]uV gmի>DDD۷/o_x3G}Z9fYYΝ;w}}|U}gh#F\Swޘ2e 飳sK/Ʃ!3q'e8*Eׯ1ECj:99:u(zۘ;w.bccPlKƥ˅ Δt邔+?q h$ Uy}k}+v 1gzq&JѸqc꫘ šC?|08ϟ͛7iӦػw/vŋWAF☳OQݧwAbb"}3'woq'vxCwo۶mhr6mѣeUocΜ9h޼9lmm@kZC"|P;.]p_KXҟɛo ޽{Z .\5&1u`„ Xno0s|XJcM6:iZc^z(|mcoLߧb0x0nwb5O>Y (;:7QQQHHH@ii){iѣf͚lĉx74x3&1&45x034~s;S?** SLQRRT3FA?i3A!]XrU<'^/,*߄] ЩS'aƍ]tдiSA& ͚5,YBDD`kk+ mڴ/_Qg͚5 HD^dOBf̈́/B}.2_M+r\Xv.888BϞ=7n<.kvUyfs΂(K8qD9>,9{L&4mTꫯdWK.  !88XXz8=ތc>50Θs܉ל~|IF8Lyt<'^XrUxjvF%:QFaǎΝÛoǏPh_MՖ]bƌxWS!TL_(++Crr2&MÇz!zk~*i+k׮ xٌ IDATƍW"ҋIZC 1b@_"""0IH$LDDD"Qm6jժV~'ZR哽LW3gw}W+ h*D8o;0QD5=Yle˖-޽;<==#FΝ;uv܉nݺ!!!ذaQ}ܹDHH~111 ;°~zo޼={4hPmc7.C*WWW777nWdd$퍁"%%qqq߿?|||aÆiOYYYZhɓ'3m#"zԈTUSJ}W_| "==O&N^qaԩHOOdž ;vTݻٳgغu+߯^?#::+V@FFV\Ea˖-q/^  --M7t3eh_ڷblWtt4ϟ4$'' Y0c ")) 4iF̈!-- BQQfϞmֶ=jDB}WWWO8~8Zl.APPnܸ߿?Ə~9s&L{)SO>:GDD?3<.۳g,XXbcc5n]ƌи+}ַt;֭[rssxjJ<00P}?RXXP\tɬm#"˪~-Zhܮ_z0tPvVV՟H'%%[nz_p]t(ҥ RRR4BBBtUnX RnW ...GU^~}6ΝXdeeq@D"vRDFFpHRk{з]CӨQ~ 7-JKKnXbH$em۶HLL4ݓO>C]#Gh=zAAA&bX ˒}v#>>sAakk ZnQ]&ZRÇzB>}:fΜ'O 0QQQ2e <b̘1cƌATTN:R:u SLرcM)c54.KUMm1xb䠨v곺mDmwΜ93f 233!Itsżypi(Jb„ նի>3̜9/^'{=^z GFFF4iI&aРAfo1c54.KUMm1֮](EN-ZG}X-6"L7UeDDD"aR%"" *HTD¤JDD$&U"""0IH$LDDD"aR%"" *HTD¤JDD$&U"""0IH$LDDD"aR%"" *HTD¤JDD$&U"""0IH$LDDD"aR%"" *HTD¤JDD$&U"""0IH$LDDD"aR%"" *HTD¤JDD$&U"""0IH$LDDD"aR%"" *HTD¤JDD$&U"""0IH$LDDD"aR%"" *HTD¤JDD$&U"""0IH$LDDD"aR%"" *HTD¤JDD$&U"""0IH$LDDD"aR%"" *HTD¤JDD$&U"""0IH$LDDD"aR%"" *HTD¤JDD$YmΞMa=BBޱqT UB}{ Coe`qbeR%ΞM¸qcqBPJ%Jۿ8hndqR{Du P* hc  SU{KILz•ZjUk1f[(**CH8tDT9ro6yk4Mnl[G`ɸӿDuyٿT>E(kT:SYTEuuuU/h׮FXضmЪU+82A  m۫ziެ1Ř@\\9uUK™ѽa/+ { ^ 44Mվǎyk׮v͚; T7.ug9uʏ ^z*WQ\\\[nØ6mv%KUO,3gw}pQք~zBř4^())A֭[8vfΘNk0.v?@;wmkMIIg洩o}M_ocv:<4<1ǎqa*𐝩Vfkk ___ؿ?u֚$رcmHP)Wi?vɓDZ}6ꪖ~SgD,rWKF 51Mվ]0O5eR)/Quj 8WLUxje6m{,DEE -ZɓP(@=5[yJ;w[n@HH6l`pnnnbbb wwwaZ6oތ={ 4(1p@ ..|||0l0ܹsG5_:rV}#W6֫W'EaO?UWTDX[[eV/ RRqEW\Fҹ2~iΝUXn5J%֮]@tEƘ:\ҵsJ˯U*řx y駑/ CZZ:"̞=id\^Tbcc1n8L:ذacǎjP5&ψƊ++WbѢEزeFŋcHKKCvv<::GZZ`֬Y1cRSSwwwL4I'RxuDna%A5Թo'UW_ѯ_RLoRob I51Ai?-,~ٶS}ROWTӚǎ_S/f:r TYiW^-<==_5kɒ%oп"88W'|bVX%KCSO=ŋc-[Z|ݺuxakk 777̞=rk֬*߷o(I^ ;o꿫..7R)`?Z$$#-- Jt=^Տ9mtT ?ׇ `ccRTޟU=.T_:?fh{(/TG.E}ۘ;w.bccYY :tV1mptQ֥K{JHHZi~W-[*WMm?3>:=G傠A.Ycu/xLhw_O>ê0vxXYYZF_ЦMAAmn1uڽAy=UZտWv:JU;v 5joƍʂ1sJSr\cZVlRTgD"1\Œ'RQ"am@hV?vgQrgSp61 :FWaI.usۧ JgW\/֙j'UB> ÇWcΜ9h޼9lmmh'Htqm- G(;z(D%OzO~ UkP૥4xYuܵ}S-))7Gر#^x ,^999(**®]0vX8|ֆN>3gɓ'Q\\ B`Ȑ!&s̘1©SPZZSNaʔ)Zc%_ g_m6peVh. }>gr݋/m4^WnT Ǐ'wzF_Ս:\H(T ."%UQSU=aaaOѳgOzk׮ETTZn hѢ>#2g3A}qN1w\̛7ORDhh(&L`x_z%( =hҤ &MA bT_OlOuy@f* 6DppM.]B4k2\ϔ6m8m@U>j4/'VZWC^n8/nxip8 : f<.q@PqW^~߯;=h7 7߈d#թTO?R)0QW#ᆵ& 7lS?SS_SHDS=|#G R_L*A+W!/#W p YG|Q^D8 MީBPIOO7]|QhƯTT<}>&BBՏ+K0Q;$@DJDDD"aR%"" *HTD¤JDD$&U"""0IH$LDDD"aR%""_S8zCkժUF3:nڴe999F3:qTD¤JDD$&U"""0 vW^EzzzmYm+O...hР1㏟ٳI|ԅ#c3#AP{]Cv &'VUBMN94/hUP?NxYF'V&Uz$W^(++y=zMNIkht/mEKg&a/'JŠ/a柙TKKKǻヒEmN{UAD3u1KtmoLǤJ5>a>>q[IJ->Y<mK|I]tID"5++>~%jJx*5D/,VѻߙxTCLZ$&A^^wSOFk"TM4,yhxy ԩ3tdc}{cА0ͭcj\sc:x{v_;;;uypX|/xQ[ՃNB"A@aa!n޼4...f+// (•+W,paa!_WڵkGII ]f42Tƽf@ʷ~޹#6mIcSθ1Zq&ӧBP*ѼySbhΜsٽ3Ǝ=ĬmֻpR5gv-ޙ0:׏;^Y9c:Zjv`(,,Tk۷hmZa7}G#bsϢe ?t6mZ߯o/o.;Xo6"Ib/@(Į} Ap%⛟C1 -#U+sx{|:.](q(1I8s:t4ɐHHL;v ض˿GCR%?GGLξؽ9?u:%]w؏$$%_Šk웯{.̃/8Kt(J8;;e˖prrByy9!ˍ~pkY[[%%%'xP((**+]ƍwޅ7<<h˥|0]:wP'ԩ DG^웥Xp Uq /i祐 6[IVVV과<JHOO͛7*#;;׮]SO ؠEEEhذF,//GAA<4o7k̕Y$1T<0⿣0wl,Zs֛Z4课qc`cc%_~W77;^m RT 󓪳3rssZX'rS;m[8~<[mw'CVᇍ򆭭-кVߺR5!Rsao`0%T%{QŨ_>QTT,ܹsprrBzKe(//WZTT֭[CT"??JR`A`kkNA <==5ʬ-b%U0z {Jc}PP$'Cw%,^6nAAAzs$Zl&H$P*H$Fxl߶EQo[HR`~OÆE[Zjr=N5ߪE8T偁A?="u j$t0p < (++BR7Q~}ܽ{&+--EVVB%b7++ (++CAAnݺ ׮]Cii)A@iiV&M֭[|\G'!s/Z۴) >d&bOp P#uBL6~0M"0(o33EEEz8q<5|:ZbǟXr쩞rs kn=/<C^^pl"}w<}A@Xk޽{݋ߛѿT.3v<>=ǎAII {'L~3gNG7F& UCuaakkk#+U/TdpvvF&M<==!ˑ A`mm ܼyK۷oCP@*aÆprrB~~FRM47 FAP:ڽ>b$^yyT|IB)nTי;{ڶmˆ2N:ysfaǟ&Oyޟ[ /\v[񊡦&Nа0l~=o P°.{%Kќҥ 'aJ65ʤ3nzقOpe{`w;dΝ; AP"8I5ڨ~ej{_ BQU;}_{FTۇZUQFZeJQ}[^^{ oVUZ^^ZXWR...(**Baϯ)J9rIMMˆG"Td{ v͚5%Uk1t0<_>"B{Fk_-HƝ}͛7PDsss֫JqqGh*PU1-BMd/ϥ\2\{Ta_zl7o,UQb$FxIDAT&\R5/v&Uz:++V6LqƤJD_Ĥ`R%Ze#Ǥ`R%Z^}d{vϸ41*=|}}~R;vߍmT$2/Sc=Blt}&Uz$~رcfRt-x ?|e`~ ZԷ.򑏚O( J6Sds:R (V[ ǵq[x S~|JN2{{`hx> R^ި' O! @:Svp-o N> iO?24cg>m5Dv)mc[锍(_#[__i.{q3HSP(CC!lA ᢊ1!.gdޙZeQN՞~pebgv[tY`}Ɠ*Sg(oIU qhr/o2տ>eݰSr/luEE(..FaP5lbٕx *@^r|ж;jJ-/ƹ|>fh\wգ/+S)4uwB]w'| F Znv7Kwvċs=y8W˟#&38%:~Cn^ ۾b_M_^@#6\¶1%mlcm_qien8pv.H$BYp }/Pm&IDy;X=)$PsCHJo㕦N~O]4qEA.j8uC7q8OD"7*IꎝSNkh偛z+v^BȬmVsoj\69h;r0rޗI.ϣDܤ&" DqQmFl,'f٪v>y\dH4p0sA4zBYaH}9 [YfBBaB s2H ._[]Sh[o] *4r<|ZȫGn:` w P)oSR~lʎ:E//huq EA.ݽ>"`pCTonC,aċ(4kWU;O ]+wŶxEPo)ߺ @s+ r|R@$AQks r@$~sE1`dmb{^:+ea_xEuXl5(|ddI~T*J"! >B%}ַۙ-~/)9X/ a!".[YУgSCT]Pǣk@MgEz7ơW '݄CM_%0vvP|7,|6>.L]7砺wK$;h]MπgS8TsGC ecOecڂWZz\Zu9\# UQC3/W|ћ/Rff.`4pP6E'IzĎ-ѩTS>\ŀа;\AT 'Wm]!qtȡ4PB(vJNpptĥT Fu@ި]^%Kl muօ|̤_ Ƶ,+\ vMד8BXZOY tLM$eARAI eb2z7HMkb?AdfKl9Մĩ4aM*IT~Ɛogu/_!1^`_ :~ߛݦג32CB!XY Ԯ^ nRK$e:7˷h[{܃uxUP"Nߐo ۧ j8][-o0FN&BHR2c#8vpYc_F|=z0eHW\W\wщiúHSģ%P2D neaWQ Ҧ!"&C`xZc}\=V[w54w >uq+}Ǵd&H3JDX OgD%}+Gɋ%ɖJ”U{p2ɖD  lȄ/Fߛ W$ؿŨꙹo)bTQ<Rt;(qtx8{@)]{g>p1;ʝ|_=/z-4;jѵD"wH7P!Q^^rq?RR"Db-{",=GT8HX<):}JvsĸM{NCf(R x#En ݁PEaYcw>*`Cڟ}l SV$jGppvӜ49R{t<\ܫ5žč3{X@/F]ʾ,(M:H$»[2?Uʇo<\/51%N@}th1ZTkx%c!҈+/y gJ0jQ1c;YrΧ>}aJ"jVJ$;ؕx{pmb#LIۧ-ﱴ[ o]_K%)>6/{bicKO}4 1ǣ=*[zB,q0kuQ/Of``3|puC- qvJ6-cj\O_˜MgVO]'vua'nf7@$FMU: 2mc ǯOpy+Gow6O:?$X'qx5 ]gp(Eg蕉F%2$(DZzMyx~<<߿bC?J .pp  q)9=(CVq@sMOm)"y6Db jDzߌc4n>?P}jQAsHU9(éz]hGf|^аpٷ(.Hg=Jf#$N8/ϽGP?JQH!qrK=?88BRӬ1(E>'ef 5FQ ec5TpV"Gc%?}m+Rfl\4cbsdhLɻ-LW4Sҥpg%{I h`_PI'r sOzbe){|:ׁ4רD"88գ1gC%R$J"ǒ\7/H,utH"?BX " )z 'p u!vpXc5Hճ1 vXEaV[G:A$qH$ C ؅q,_R!#vK V1P:\=Q.8iDpz H$OD"1UI+2c3#CKdReޯY_^]+d~`DFofpK]?b'8ֽpZHW@b皞z*f,F~k[^vj74^|MsXEYQB$.5 1rwZuHUhʅgeBEsd8ixJ~=Y_Wp¾2%|]cH4K~]O)<1$.tO.^  }:HDWݻJdǐȺ\Js&j ^WӯO)\jPOd<=j=œ ƻV*b+ZI?ʘpY.""""+cEDDDdeL 1""""2&\DDDDVƄʘpY*TUN8WuTN۶mѵkת.Nf̘QաP9˖-&]DD$.N:*K.gEDDUJ)$$$VFWDDDDϜ '\dk =redU@DDD WBB"&NG9&NS>iX|4cFc6"{N_t |_~Ài`# jF#33CSd{P j_ ?Y۱|MQ(v&OPuqqq0afΜ4l߾+Wľ}4u /jZj׮>n];j~/nnmY/t;p/šC`Ĉ:ϟСCuڊťvbb"BBB*3  תU r\TBc^EDDz*_vjRimY&VAutСVYp%MYb;vζbV;&ZkԨ\)xuP?mdm /AQv,an{777 8sJJ%+"(HW.4&7"""sT)E\wo`p]…s^: pVʖ+J$q WZ$_ת=1磏>-[GA &fY۱|,aׯ$ 4epvmڴc wqqÇʒ-ќ0{em"l.J+^ʕ˱ju VEc'pFN_O*;uw4oB8Uk$&&ZS-0jD?bڎƞ={4g͚ٳg(((\.Ǒ#G0dMpL>GEaa!RRR0n8={bΜ9DQQN:ѣG[и0{em"*)2T7\ >F æakOpEEEHHf? %-¹sgxof%\~񿝄\.Gnn.N8fm*c޽=z pBI&QC_y,]gFÆ 믣[nQQQBpp0|||)SXи0{em,^EDD S QšA>|rr]߼^I|83b~><|*ӥ[-[6֭[_O7ԩxD$@Ru65j zGˏ=cp<ѡCG|84n/x;RTص+̘1yyy*߅ pqL4C!""5p8ENEd$j/vْeZՖ-[S[oKo?j;v[;?o{{KjoHSHDDDU˪ W&^|m=L#)"""bՄ+UAmֳyG{k\OO+Ť"yyT>ñ$""z0AK""g .TUJu膞}С?Fd2!::EDDT8y2b':t.]TudHڶm]V %\V 3f̨P3[K. 0ʖ-+$]JΜ9ï}"g_.]_R cEDDDdeL 1""""2&\DDDDVƄʘpY.""""+cEDDDdevp5nܘ'""j">aq^! s2SX3w)6nׯ_*""""J;:>>&Mf+prHվfl98EDD®.9od&DDd+?DeҹpIRm, TjO!u`NDD'\ `G,[I 2!}xي*;~ztׯB,e ي*K6mڤƍP*ظqVBjcT*Ů]УGxyy#+ IDATGDFFV{!<<G`` }r:9ڷom_}m߿!!!L&ŻsN ިSY߿L&Î;6MS7dNDDѣGk~޴i6oެI'\yBDDpYcԩZuBCCѾ}{رcܹsYHOOƍl2Oz &`̙HKK۱rJ۷dXd RSS)"<<sō7{n>|ҿ}cBs`*vsǓ3\DDd+n،f} 冶o\}cg90k2T>ՔJ%:3[ÇR;å TE󁁁ZkժuX`p=ͶbI_|Qŋn:tNy>d[}CBs`*vsǓي*Mvء3å~4iggg{ɓ:[j`\pb_6mp1]\\C %tL1dlEߥ$[oNU3\!22ǁ0~xz3fٳgQTTg"<<'OY0{l>}8r bQB qQ"%%ƍӬٳ'̙LԩSZn cgOޥHDDR=z4 Rk Jzsl޼gΜAŋc޼y:&M{ 4Q0}tzѣ,X M4ADDF2|1B{WtR̞= 6믿nݺiGEE!++ Axx8LbQVuhτ_Tj 6p@VVp]HOOǴiӪ:gǗ:$ fWu8/ >JRl 'd2o߮Nhh( ɰc:CʖKRܹz7ԩc\H\RvB=___9cB_!cS^eCDDd&R(v&OPuqqq0afΜ4l߾+Wľ}4u}VVVrT8kNr!qIRhڴNvv6p-A َ}.O ϖCDDdΜ9xL4Ipɽ.r/"#תĉ8uwF&C!,, #4uΟ?C%N%&&"$$±d2B@ǵjՂ\.<6#d|eN<o\m۶E׮]vz¥N D"9sRtUj*JL"譫\h\"Ȳ܎1W}ccI<DDDCi']O.KDMYpp0.\`]6mp1]\\Cdbܱx*ӤI e&h~{<5kfϞӧOrG!C4u1}t=zHIIq4{9s 33EEE8uF]8%+k;jܱx]&\޽{5{ `…G&MQFi+Xt)fϞ _Gn4룢` <<SLPBT앵kTv:f-te WBB"&L$+; T*QP4o]2J'"""R4[no"ᲇ$"""˨,Kab..{H"""L eɓ=LEU~ K^Ɨ_~mo׸_p kԶ!""zޔ=hI򤲃He hժκxf=luDDDTeN)Z> WũT 'MU+aκիWbrT|LL3SȶaړiRVt[ ҟ;]W?jU >hVۯv|صu|||0nDPzFju 6ĮիprrF!Xx)jשF =5mRo US*kxݧ>=x=_đUVF~T.E{8{d J;æ"&zVFєY yҾBLjZ6mdx1'Gjkkگ[>LGbOݰSo7*RP۲'N ژhһ>}65kлDDDϢS鬒 ~/ WdTkDl:׷o"!>[LF-pgh۶=@&k ?ŪH MVE@@ @*YAb9mw"zr BQ_næ[ ODD,Ҟ*}+%M}tUW.J Xɓ`ݺh|Rl]'B,kڨz :uWNqʟZeZkp\.*34dNq'` \ ^y""._+ M|Ë+.w6nE… p:u.T*ڵk1duYY;4kLjB..BVV޽~6mZU\:<&NT HTU2U4[/0V=%\})..Ftt4Ν+ٳ m[vnݪy?7V[|FL[DeEXf :Ұa0x`?~Zp*׌-.˞v/X[{bРAZeC.kJBڵоZѧ2T򌍹e}7էqc*]¥P(p5L<Z0a̜9iiiؾ};V\pAcܹqvލÇGdd$,YT R) /B_|B* /}1cڵ:}oݺ z.݅hjjʕXx1RSSqE`РA3g> 11Z\ׯGzz:bcc|rڵK(DDD -- gϞ;N Y}ʭ|mڹsЩ 6 }ARRn޼HZu^x={V8#55ǎC~~iMCo_-}S1KyTLR߾S{?։ȯOp\Wœ Lph̘1yyyf4iYAK <==qQxxxh 's!,, ǏӧOG>} nK/$]v&c7ӥKo?#kjd2vڅ-Z/C1"** 2Lo M~H$J29UaiD$z5]р#GaQFHRoh޼ÇC||<5kU޲eKܺu @s_矱diѴiSMli1v̚j ~~~8 ΝC {NNd2RRRPh׮\eоV5OETH,sC1S~, 9}> :ș3goVɽ.r/"#WK"šC`Ĉ:ϟСCuڊťy p<S1l0x`! -ZԇMlذ?毽,G6ʾ@͚5@뗿i˗/[nZuu놤$@ǵj!m?~ wwwQFgϞ4hڷoh憜Aqw},XqqqwiBU5b.Sc*4򄌹>BDz2ޏud7 D9sh%\JpssmH$ iرXr&ZnOnVb4h"""pxyy!66ƍRJOCwjVGHի#''Gkk2d9_~1&Mu\$jB5 -[Ğ={gggiX"sSK s}5^udwp `\ph6mرc׻ÇZe)$~8uN:LSB0D$aذaΟ?7o\ ,+*.GrZ=-ZĉZe'O4fmԨRSSue2°e>|ZSRRШ0%>>G&M FO׊Fَؘұ4gec*mo6٣y}:=BhsAff&p)=$H0zh[֭{ァu:@HƼ8t&6-f+bܸqǙ3gPTT3g`?~Y4hǏ]v8uVِ!Cp1!77I~7o^?!7c!22ǁ}kDv4Scn(&KDzi[9։]<o&>@=`,\gϞRDvi+`ҥ={6OxyyaƌQQQGpp0 ѬY3L2E1 F˗C,cժUaYfaٲe퇽*ǡ+}IqSz rcƌAzz:6liӦ74cܸq}6T*1`DEEaر1c`ҥ8s  /?*FZLns\y|6}ݎbj dXVt?a+:QU"##qU_^pcw)^\w}kJIzd.g9w%$$`ذapֵA7nիWap**RS$o 6hf+JYlRzVnԱ(L8 ,fѢE8q΅_~% V!=>HIRxyy!::Z-w)hެ1r]}`„ 0A;w[~ „_P˺tuOy""z~0g.E1""Äi~/bvDDD $FKݹsǢvGLֺ!".2KNJ>^^Y]2YkU.2KNL<*EDDDdeL 1""""2&\DDDDVƄʘpY.""""+cEDDDdeL 1""""2&\DDDDVƄʘpY.""""+cEDDDdeL 1""""2HO!!!xndѥsC0Y 餉:1Y vٚGÄlNBB"&LndegJ% f!ؽ[lڣaE6IRA4JRidk,DŽlJ/"3[:n [rL&q<e[ ޒd+Ynӧ :cJ% <==1`̝;nnnB*"++JEuq*֕=a/pU} WT1ZۯHb7l ͚5Ք_=?ù0v(A} RRR0w\L6 6lDU&VFCLgmXi KHiɋ!>U66!qT!^{d9Ob7lƠ@kݰYppb͚5bT*SOcVVgNQVl;gCLJ-HyW+6!qT!^{d9ӧ4RĦMХKͲi&(J4iU\*ٿ?BBB L۷ ///d2رC˲ʖKRܹz7ԩc4?ڵڷom۶k.^^^ȑ#axZ\T*,0 IDATe OXKbNY޽h-xf}rZ@2T*Sڞ,dꫯB۶m5S޽{GrЯ_?ݻWMff&7n,hU~6/"{7A7թ˭ޭ3 {|՗Z#B֗=nI}\A8Nhݪ)׭UΝU޷K8w}&>x:S|=B^ C~ѭk'mr7OGͦs/`PTزe 6mڤ~ӦMزe T* /C ]ɓ'#44Tk]\\&L3g"-- ۷oʕ+o>M"<<sō7{n>|}Ē%KL\ׯGzz:bcc|rڵK^TT"""gSN5د-++KӟD_J\it8d`\H}~FA~>|P~ ^-4.]ŢKoOPz p=f1=Y#F .}+~Bdd$6mڤ9WZS/44۷Gjj*;|̝;kٺu+ d!Gll VFWju V^j|[ĬFUt*V\5#B֗=NĤ?qR6mٯچ}fz{!FcEGzpT~q<~HSk7®]hnݺ ɠR)qȯ>SIɈݰ11q~M!uʎ0?ñӥ:lY}bMtVYu뢵o =6p_#(JdKM=HPYucǎ8wVXUgŊ֭[cƍO5u/_+VgϞpvvF@@6nh];vzׯNJ+ЩS'899Cĺumٲ;wիEСCf%?!ce:e'N߄^xpu[k6lq+t+%]^_٫V²eо}{㰼$;pvv-[ЫW/r$$$hc3fL >E6HЦM0_k5ulٌ ?C۶!8@&k ?Ŗ#CBbR޽'r9Cۿ܆#5 'Xz-ڵRih?j_ohڴ~g(*(J| D,[m[?BR/A]z*DFD r888y󖈊eQ˷~ŋ㋭_s~Ǯ_ukY-Ty?Kt9S\:taaa8pFsy :TX\&&&"$$Dv d]|ݺu*֭תUKs*2VP>(O_Zff&/[G #> &u WE߾F^x x ކ\GqWj=._G腻/^ċ/UV`޽{ZσڴiY/Zj%(CG;t˗/iʮ^N;kԩ3\S1b1d*Ǎ͛7 rEɬ{͛<.k=QrޯۻǏnzvl߆ǎ[{4$&cu-:RVDFN_[uuB0ߗ/_~<?rےnnn8pwqUT?HcF xHqW s-WQQTLR@6r+ӶߣYY" B撦\ ÅzK3gΜ3s 3GllRy ܹS%?1T:655Uܺm#0Iݯ)2 W7oիsn޼pzyy!77ׯ_$&&>n;}W1]LC5Ӑ!py\~2?ކSWbQ~&԰a#;IB&cؾ#ܻWuZEĕQvi?c9Ȱ|UXxr*B.F> 7Y`]v?v~fp=|vvv8qBZrr24.i+MhrWZZ*C}hҤ1rRRcWys02qnҤ>Ӆߪ(C\w i? "";vDӦMIII yLLL0o3sիW1ʾMQc;uƎ\ 4r ع#SF2>[ebegbb7!8x?ʨ.NeU6>t ĉ.___L82 D7g0qD߿_0ǐJ8vƏ/ FPP?\xw۷QZZӧO Gpp0PZZ4aYuHJJV׸-6mݻw!>?b qd2R)<(Ɖ$XZ淲@JIc]$Ν+988`Æ {.=zN~:f9rSOAL"33{gCFƙ<i3D#ͯSzH/$%GLLLUwbIݱS1%1lplq4¸qA=ϛ֮ƙ3x1|knnnXj>tFeTӽ}6<=\={vǙL\vZcJ_2 7nkbܸq;v,-[ׯVX+W"==2 ݺuC``̐!Cn:󰰰@HH0?::prrBII lll0|iT &@*b̙(,,D۶mpB;V*?]\^i+MܣcgAeܼ_!r#VD,G>nW:ୠ. ʚmDVV&7n{bcL0?(h/eRVۡ+""/k5 EEEիWѮ];̟?og֭-Õz SLAhh(Wvz{ 8x>z/2`!k #$d!ZL)zn~YdT9F&3f}w ?lSu(e{ (7^!qmpw%Zg ѥ#f X7ڽ~QTtj\<\v m;a%]{dL=f J@ !$$>2sέQ%+>i%!?@jS2l[IQtHU1DZcG0idӠ݊cGt~mذؼye]q.GdK&v7{ UXHZZRRRjg4yE/<[9?rf 55]*ɻIgU?ݳ^lO}gQ\@BVuO߁:#kkd(ڱGcEG"qľ{̤֫ʕ+- ık?5cj7WOifpQ0"AADƠ_CDDDT0""""2\DDDDZƀHpiJ Rʩw5 1>1~|0"S>wNbT4nPe>1g"\dp0;w^-s3v<|/bav?0"ė׌.^>?(x1"`/_MM̗7DtD lJ{C/U2g" RSq&#S)z. 333hժF˗yuV w˺?w.|_}P;SR&_r pY~ Ν{.7eDtGe~~&"0+qVX .c8Y3}DU@ 4xG}nݺݻwǎ;ѯ_?XXX]v6mnRy>fffTĴUMj2=?NyvбC>dh׶]VTzakL Lrr… }6 ǿWvnGwWtx q'T߮m+|>l:ul {N5snB} .B9vnWZ͛7ۋaݹ=dI0,^W\] y:`,_/__|Gx7l؀kҥK}|}yf"11ׯ/::\t0Qi>d -[ouDpU{Qڬڋ*,΋/={̙3Tx9M6#>YFȳ~zDFFhڴ):u>ۗ={qUۼy3"##&MGذa6mڤo۶mpuuE&MK/aժU8rH%<1m_UOT=)8:JXr<)wbbpQ^ǹstd29\LX6߶m+V|aj$gX۶~PƘtO.}IIDž<YFOHcѸq9#VoL&G>!J}vzW}3iUקȑ# w}S y2220i$e57>F߾}k]D"*_^^ݑ :w瞃T*ո~Օ'4!lJuTys5 Æ@W^}Zv9c&v+ԱyLOr52yiS֬Y- ={5j$,SoA* +uAsB* iyyѣB={*XZ?~ n'OBg`-ߠM65DLDaguoBx*P2۝;w'*2Ͷ~CClǎ0T1O|OU/_3\2ÆDnn23TS=k<Օ3?0͚= 3+?cFY!C~:d29 L{꫟H; >*, 1p^ըÇYYYB23k׮o֬ݻQ'NPHKNNe3111m%`oo?DE˯cxa d'GT.VE03`01|:[#tB9S`mmSmVLCj)r*IKKEpboM4\.CJJR}fa玏WcTOLDaW7g'?Dfw8q"/| EXXRSScHR;v Ǐ#((ǏGII .^a~;(--ӧq[#88iii(--EZZ0{l,׺uk$%%i4i+M:Qՙ7NLT*Ń8K6VHI9'OdծX|T;|,Du} ::e:Ðq%%@xxNQmVL틈0dff*S1-6mݻw!>?b GBRq$nN oĤT_LDapg22quje6ߍ77nƎe˖+V`ʕHOOL&Cn(,3d[aaa8<,,,"̏Fpp0PRR̟?~~~q„ J9s& Ѷm[,\cǎը"""k׮A.!bJgST$ζ yiޜDƍѽ{Ol Zŋp re4xK|^TZh~31rBY-O<\v m;aB "b9qXo tIB`̘qxU{'\6]3iA\0k“_ݼ'8(䫎@'OTHswwWI#F`Ĉ*癛+=' BTӧ{{{[|uU1c`̘1'j'iQ4[1oo>GmGb*5Vz|Q뫜o7~b*WWnѣ`h}w B6mbdTݻw1lH=o4Od >ʂt!&Ru=^ch4}vCw)gӰ{N|gAo#ߥHd".Z`|Cfg4_D/dѪAo.h.jXmUԤI}+зOLD R}=-߱a. AZ#E?v0"#8b=ps+Wh\JJ2$G'E[LDÀ O'4m3QhwU'E[LDÀ  Hsj"""1""""2\DDDDZƀHpi.""""-cEDDDe 1""""2\DDDDZƀHpi.""""-cEDDDe 1""""2\DDDDZƀHpi.""""-cEDDDe:!..:_S^a޽A霳.,""""2\DDDDZƀHpi.""""-_):l}D7W*pL!"Č)ڠ|`;'@׫&"#jH cIDAT)DTՍ)ڢ+++sf^5&}9QMT7h^.)rr}c 4\DTpR Dd\\SHpר!kB)1tp,^67oǚQC3\Uq;{oW|٧zo+N8˳4t̙>w?.RHVp튽{(ͯ8jwD~Щc;*La>Xo-LU,kUanuU7~c`ΝsP_8U_뚞.}⤛}cھ<pM|6!m玏q G~:#–bP>;v#)0_q -/6!6& }-r9.V[0ږ/ ذa#rr ؍R_? D8ŷ{q~5^R$:F᳹9^N$VAxJ!}cL:uxti{e}A"V\]%]%Xb O$I{Eb=7!tI'C"f]ǃr^@$lJĸ!8۶}7q1Xj zrXY+VDH11Q*Q?C\ݺbjlkՍ_c4o +.~3Gְ.pp4tz #)g, ]? oyn߾p֟x *o>hRTHE=tFvY̚TGT1Eǃ*M@@,4ic/(́[/}%8ѣ.UH.*(ȇ}..np|Ư7'Mk^1lt8W{ukK&а.5xӬ2d(5juk`BŮ{˭ѴiS߰Կj,W&!l.~Zܗ7?mgyŸz*RW㼺:״ue-]QFd ;zkV ?S~ҿpKUcp\6RiӦ2))JW7"==U y8";;..uydD\SIL_8x|ڵ; %%TY<54O>[[;&&&d011Q-;[SӧB965ರwٳV ?+W&u}4jhߛWmliSݽ($HayueUL˗!;,JKK}a y`pL:?~ IV(׺ҺĦq2܉c~۾"[!`μ޾z+W^/쀹& ^E7 ˅zO/b/֖9k6<=_5imDVf7n=z"&6WX {L Fܿ6CHH>|(z-[1id>DDDD%%%ε*VW޽GḄZw޵Q}{1""""2\DDDDZƀHpi.""""-s۷q=}WNl/ByRNFVVjT?H$psuU *ҥ+NXYC{Pt[sjF/.>jt1""bp}WV]\YY٘0=*2In,:rr\GꢽpQW۪k @}Bpi."":PW I]EDD ^y_{H|oR>6Jiݾ u=trGi&AXY٩ |q:).mZI93\DDK5lddcђѣg_{kW#+++V+k0 3n<]W7lxG~:B͟Fnn.6%aқp5֖L ꀦAȏGd| n\HӷwzA~ &go΂\??}>?BcW$lڂM qy.^R$"O.C.xڽk_f͚)k֬.ۅ4d9FcfjnI?x+.@ӦMU=GDزPt@7gG, ]baU/1r;[ f[ ep{xyug+v޽{>;{oW|٧J ".""j4>{6 n*230SN{\ooƙ3pqqs8JoǏvjn>wG<%w?DB|,.^R$"O/EExj53{EEE ssΡoy9DQQZh!jɧ#SS)'((}nsg{0hkBg$NN8}<2Xb=xhڴ)ovTZTn/ud:n4.EDD b2'q1$Q1X+kiۈG\T,AVhҤ r9RR_]WLw@JJ8tqDvvvm .""j440 83bH839n_j2|.\ߧO_7'ѣ?=BVV&ϟ﯃\.6mýwC>#)_]]*Ϟp ҥK Y( \™3x1b$''.^R$"O. m՗_ &z ֘>c`eծ|rps 4ײeKtqP3+v`-[#8b=okf;ıVe0""]˘lR틴@YAI$Bi5h/BAJ}RjR$"""2\DDDDZƀHpi.""""-cEDDDe 1""""2\DDDDZj&ϾϘ Q>+Kr""""!_xN """LΦk˶]"""f?k,IENDB`eqonomize-0.6/doc/en/refund.png0000644000175000017500000004106611106571520015466 0ustar hannahannaPNG  IHDR*%a IDATxw\T!*-Ŋb)cƒk^I&z-&WlPcA ?Ȯ, ۔E3~vgy9s;3ߙ2ߟ-G ̈J$ i;z+6  ɷINJ]iCRM{'חƿZC ?+f&pR]r_>JDI6Ooo^ e ɳL@H[kꙍvm .p;?A^aJLJɶa8ypeD"1|oy"V:5-@y}53TW[9s䒫4bamOj vk P&nv'D?Aͫ2*65Iz˦5m1Eݛ2M5P 0S-jzO8u#Ci~_QͰnTwf[g+?fo@Zn[^sm۪qn: JsZ,//8Xl S*Kg6^m8pX?Nо/H$ 6淴-\8yA>#HC`7"`jd ZX?+GrH|Dc; imŸ1d#v]*,/DB&yg㓍#5nTZ{׾5&?/>ӷ4y-OX:ȓ6u,▶tWg9 ^via ;x%w~ֻ&,7`i@űʿLYymH$}\AF|Iy2=tiL%ſbh)w "-+1g>gU!'YvH$<-#t7OV>a)~KMŨḧ́u5V%rHչ|STmc#:%'FN ԰ YYvsŋHW݋ȑ3U7;[FU.M~tZ*m?%lC{ rxS-,$y8=,$Zc>{oKzj '$YDž'w/r' qj؆7d\029DBAn^<ӤE 8%X@ ݯ7~0ٝzAIRh/a3]j5:ߞS 2 r9 Gjn*f^8s9_]Q ~wRvD9j:(ǚH,-mUKTdj7Ҷ2yVd9Oĭw-)Md4K tO/wW%MWJcݏKn \Jރ^P"eP9Vʼ8m,%dO`il'3^OLΤ}MOwܤ<'?[U~ 8JCq.կsPMTv"P_T>;X86*R/OSKRiԯĂ^KK թʂQ=iȍέsqe$TtLi ªzvJ$,J؆ k{*كų_$9 ZT +uaq$DJ3Q}2 'SdEgv,d|,XTƲȄ"Ϣҳ<9\qJ$:5qbkӓRT%',픶7~NH,iTsTﭽ3{ߦN~%z#Z۠oX븯>h{kS_~r ܸ H$>ɤjpͯ>T\շ5'Wb[$p鞔oZNH,O@92(<,-$TR7t-ʎR@WgӢV\|hO5Rɡ 4]zI+ {o>(<J]Br4W\&gWr""Jȴ/>]0FM併u+a'F5ֺ=%]y2=c\"e%\C]qq52g`#)է!ĕ*.̱iոjbK$}H^OEMegjՠo;V񣒃3익J$/|Ġ _,~5[ոT[hnG ꄳM>*Wb\ZO ],ӵ=?D&63UmdT\q]k!÷F0K~՟m14oA.gW#RrfqqVvzO/%a<5PLˆz=6J 8w+U{.~#.WsILxՖ| nRnPY/{=vI55G*w35(]DV|+$vj$OR{@=ȃRBs/*WSgݻB[XVƩQ;$(&mk~GqQ $)N۪Ƒl*YYcemk!ȑXXr,,+KC_X8LZ`icmel+c_.HH,A"Ү2֕b?i"I ֎5vF*٧?s7ʶ2+k۫}?OOCJ/}bFg ׍׀^%;{j###4[UʮZU5LXWbem:kʷe+uKm>hk&4(o\A~1~-5k^/']^=Er~˻uzq!@'l epKTD")5!^E,PRwF+| KXꎵcu_b'VvUJ|Wr=L~a@.4ܱ43B!F+*bef*@`f*@`f*@`f*@`f^ 8{aY7CcQ}}[С} K@U9E!RΜ.*[ф]rQb%_VL-^r>>LFS6;wlB%?rLYYPP z HLrGrAnG@ 01򳝝5kϏӽ{wSe=* zT&*55Tn޼_wδiOUTsQ +6664oޜ+Vh<^Jqttё~qUC^Z*gؾ};m۶z-nݺU1Ν;yשV4k֌p t񲣘;Ge>mllpwwg:tvi0 tܙG믿mƎ;Xp]rr2ݺuG$%%DPPݺu#%%Eo;9stRf̘;wHIIa̙|7%Y7ndԩ,XǏs]FIKK3I 6oT*/&,,}_P I""ƵO ~g vͺu_y>$<<͛7SreϢE؛*{޽|\r777LСCunWĪݞ0c /^6ݻwʼYf"""T|N4 GGGj~fϞMtt4VV&ˋ7Ҿj'N`߾}̝;x!M4QaELXQO4Ws;3.yWWڵ+ܺuG<JHƏԩSILLdӦM,_\EE>S[ښl{2x`Vٗ}7L:Uo'͛7S~3I MXZZba!4t\LkiMEL!/BFFJ^BB 777Kv]߬\}bccC-T^ޔ>,[wyG%ڵk4kmӦM~v111ҩS'qppcǎϥO9G9Ν;uLEܼy1c0bĈ6BP8G,u#I_7TL1oOHMMIѣG,XH>|Wܹs 2D-_if˖-/Ĩgeef@VVv?fΜ9|Wp!&L@ff&ÇF]c̚5!CrJ:u#G㏑JZCA^ׯ/EA\Utg#wmr28'NEF_wÇu?C&2,LMMU֭[1c{YL Z$88{{{ӧ[laѢEJ;D1bY`իWjժ,\ykC\.˗/NHHMExJ^ k5 J,YaÆ)bbb?>5hz&,[jg_ ֯_ϧ~ʾ}hذZ'.]R˿|2z5nXQ4] 5믿Ntt4YYYdgg:t0Y xyyavڥѦQ|hr2z)wa֭t҅o(}||Xliii3n8k&::ZmOٳ9}4HR>obWo?>QQQ4iDMpp0[lQ߲e zۗX5X<<>0F]Ba/ՀGhe2]l 6ؕ~w|M|M0Y{^&f̘QQQQ2k,fѨ(jԨ]ժUٰaSLw%;;>3 Tbu1vXfΜIll,mۖP[~5Ƹq?>'N 9>Cߞ`V=*A٣\WcנAvءs|}c 0_{wx)gP (oO/?}To cR&$$0o<|||DDD0p@&NNNN0p@"""Jk]cb(vAxx8={GGG&M,߷oaaa̝;۷osN:,駟X|9}III^Ku/_ŋu.\ӓ3gf͚ō7Օɓ'+EFF2~xNJbb"6mbٳyKq1#F޽{5\걩k]cbtUd,^!aa\{⥷墟..._ _*y?^o_D{īTݻwqttTȠ^zkk]Cc, _F``WO1tt䄨sgƍU;;;#Jܹ.]R[ 9 b"ϝ;ǐ!CZX);f_8A-,5&K,<*ƋSZ|LFRR?@ OOOr9nݚXPEގ6q111 }=g(e҅hٲ%GZެY3;w'"UVuׯӢE =\.7HA^tI-xzz11IϐꝒ~P_]( #44#GSnܸرccǎ%,,3gΐǙ3g eܸq&?}tfϞӧE*ra~m;qOP^z~z 6pp0[lQ߲e &kLW&%ٓ%K0{l._SLQ;HRƌCRRc 8$Y` .ٳd2 1ԩSiӦ 'N$,, ggg~BCCMroҤIjՊ {qFmF\\m y]8ů)ĭ3}T&*⟵G[qFȑ#uiH~@@ڄիs fΜ?lْc IDAT?:/:w\TljԨATT̚5 Ν;E5vj}]j ų~ "]Q Zjn:겴[67oxZG_Q](͵l#4Adڵ/P 0=!T_D ^7maTl!TŊK—qKCUp:og  B%!TB%!TW11'O_JDܞPQ1teUk#VB)qq?n%'5l2ܧ?ٹc\.7sTAI(ޣe{JCU9F. JB!No Q ^zT233iٲ%aR/ܡCQ[=bcHŅ6m1|H:wbujW&%0_ vIݑڵ$+sE7W.]BTBC?嫯Vŋ Z ȝ&kѽȋ z6oܹs,\\ Uy@.WV9r~Vߢ/~ZIˏ ݙ~5 SNr55{ҵkWez_???\]]gƍ* -Ž; wwwFArr2E+֯?>ZL&c츏>|̙SiҸ>Zy3mZO|Vdݷoaaa̝;۷osN:sO?HJJb,];vވILLٳ8::2i$z~dTR칳kN-_Sׯ8w={/T8}vΉ$\Ƣ_goroW`E\HʡT\it/R9I2|&U$BA¸)O3-Ko'EjHII[nbii @PPKʻv̙3ѣ2o|DFF疊滸pI4i,OKKLJw\Xf-#Gɓl&=t:,u d*'u077+6jX?ӳ2/==mpU$##?F$KxӶs~__ڱ:IHN2Udd$mڴQ@jhӦ QQQx:wOi.]R[8 ܸqcHR%zTER iT-nJJ K#GH!п7{o+^yUj׮aÆ*mRT.AE9GvD<|/nc67ofڵK@)Teg+sۊ'OԻĺCӤIS~ܴZjcccC~~>)}N>^ĉc>t/G3nEڠyo:Gwz6MǏs!n߾M*UTiٲ%?jժlْGWi͚5رct]wq|||HOOIwD\.7kAkQ :e9:߯cri|^i#ˈ9oooЯo/ƎP Bѣzy(>G+Wop,U۷ӻwo5prrW^0BCC9rO>ƍ;Vi_Zرc ̙3qBCC7nҦK.̙38u|Uvm5dWs):ts. zw $==Ο?Ϥtd29^^Mە!fy|='#Jy$cԩSWY^ԶhҖ/RL{Tz'sm޼ŋk-6l3gd̘1ٓ%K0{l._SLQږV; J3f IIIԫWɓ'3p@MDDaaajՊOĉ=z^5|Ǝ˽{f9G0q'iNL]hڏ6 XX0.;uAC> iS> _wJ*ߖ^S^~T2 LrOYf- %#="x 2tL>XWex{E='x'^//ѣdʫ~}T=*@S`nLsTB*.-ؾm+:ZMT s_FBUNQ衸\ xzu*8ڷ3bIw@`f*@`f*@`~嘘/f%"nO(D*cn},&7+!THuر"D!/?ux-v.J <d2r"妤,XP d% zԯ\f@/8&?ٓ:uPNؾ})C sYIF (/*Sܨa]5Q}'|L6k׮q5N7|Ì3LFot$!ZsܹsL0הz*GGGqMK]Sأz{hس]՞={f޽t{{{޽;{8pL9.% :5jWduF=HJJ")) uFJJv(ozSx֤ң2ߺu6mjeL:Si!aaaԪUƍ' JUwA`` nnn3bU(SXlƔ4h:͛.DDD0p@&NNNN0p@"""ӄ⪟l~Ν# @kyNo׮]֭[=zΝbAxx8={GGG&M<5*Sqلj*5 6п!Pb޽ z Ç7YXv7nYexh 'OfʕYݻwNM_ 0YYYZ^oD8z(ohKQ|QFͯJݺu!//WWW;}C zjƎ GGG¤& }=g(&ѣG3{lS)J3fe899)_a(B&K4m6?5kпܹCn@ҥKk<˗N>$S:1dzϞ=֭}HRR)O>8991|p}.]3g)))q)>>>>,[4rrr7nm]6%-V͛o`ȑXYjTlٲE-˖-mg?3vExx8nٸq AXXZӧxyy1qDFYv-aaa4m(7ob5|Ǝ˽{'KbذaL>]e_ (K&MUV4hЀ{7m6D+xGg4qg>*o{%))Tv͟bƍs<ȑ# 8PE 6lȮ]>ѣ*6ڮ7IHHZj)j믫͏P$rgj=5j[.u'**J"v(_74u#|{TԩfbРA߿ggp ֬YCdddY7EPA(m ͛73d|///~RjWų~Evʣ4׮V1#4}TÇW*OƊ+[nڵkYn x֯8ܤW._C?:9rܹ2xO3!T@' BNܞ o ň/ C;| --XcI2n`~b] N>XA =B#J =B#J =_9&)˺A*0 ء"HJU9E!RtӱcG/3J@ 0{P G@ 0{L*T;xzzRF 6l…c2XhF̙3lݺKKK Y$ VVVԫW?'Oo֭i\`y"b'&(޽{ ٙJ*Ѻuk~Νk0rrss9pJXBBBV?y$M4QڤM׸KڵKGzZ>[PP_Ŕ)SV 4u̥Kx뭷Xt)׿4]SD"e˖ZmےƴiHMMUO?eʹjՊX͛7%eI2>3Jg~__ڱ:IHN2͝NNNSZ.]D@@J^@@ *yEEPET*5Isi\BٸqcjmĨQҥ ߟΝ;?zjժg}땢ԪU+l|"TuV5kl2ի,gʕkWxrXjFdM ma2L}єw4xboN9p:ub2ӿ\1񝙙ɮ]_U9s Uvqh {YYYqqqtIŦs&-x91P3/\4k֌cǎ?~S4(ZjmxKHH֭СCET\__d2233H٦m((Uٳ'{fdddٳgy?>cǎ%,,3gΐǙ3g eܸqhQL>ٳgsirssJ>|~[/?k&::Z~9z(deeq!ׯb<0`VVV*9{޾IKKSɻt~|}}9zJޑ#G#8ٳg3sL֬YC֭[.&//O9;˜1cS~!'Ofj`.\HÆ iԨ ;v,ժUS1cưd4h@ӦMvkbذa*B̟?0N8Ann.YYYDFFҷoу)SL^^Ǐgz'44 &p)8y$Ǐۏ`~OiWrU:Ă 8u2m2e߃?~<'77oooL!CTve`ڵ,^;wAXXcǎW^R⪟%T]sTB%!TB%!ToOEJJ e DjJ9yԢA u+c4*V hXPV\`X LQ~M+ |vlIu+'DZM1w a6+{UڐbT=1B%0յ/öhP ̂BB%0 ^Ww2͉W0Q F!T~}n& y}@_vnߦfQM-qJ :FEl\.С(Fof4CVH9dL4c=*s0Ξ1s鴙i[xUSs[X-1l;یQ'ċ-[H> BD x"߮Zp; *Y`{`Ĝ8/Aߩs mx"[*nݼɈ=慝L#ٿ~7lmm-Zdշkv VPhr9rLyF>8;;;2;;;> 7(2.[yVK/`|2 cMP~~!gMWCZ`OR{ԯ/o 4Ǝ&%%Y}п_o4 c{m۪V''=б=?!9 P Ѓ?h;B*ٳg:m>̰l.Fw2|{Ү]{l o+ΝO{_,Viw߮d޼_CGq\>UDE`|:u:_fDGQ>|ILL+|XJ Fcֺ..ddd_L@^^>^͚PP~eddPJ;~JՕyҭk'[UxzzPj5f̘M@vJ+V~Exx4`oV~Mx3fͼjӧMG m6!T@&ci}dTT{АaXZZ|j5v 0EeaPURt\\h/ȑ$'? 6T^JR2:txUk{G#JR`h/y _~.sTC`ŊXz*r9gΜfʔiԯ5r*ۯm!&4oA|||EےB%0C=hڏaXQ,,EewhtzvʪsϖM/H ߩSg9t( rrr;ĉXr9^M+HOK#;;|:%T%;nĉc<}[n1edeyH$|gE*hF0J F#˕˼yNXƵhҤ C`^W[{6m~Ǝy̌ >۠1'ޤɡǍ|:% ]\kϺ?"Yﯙ76hР!a2mjJlmPw܅ϸv*5?cey,R3\F-nIDAT5jNqtE,0}7x74-Jū4oт5ѕ%T:ҩSVYvZٿ2ilGnzЭ[m۶ 58 J`rτ+z*f:]t]o*Y`w1' amIxͤ(O0-K^Я!J` '*Y`pȜBB%(s<<ٲGb^//!TIjˁʸ5ơXIo oJ``زma!TQ͇OS*>o clk/B!DFoSmvعCM:(P(_PBHL=uB!@Q"Y#7oDdxTJyŸ{I$U2t!-Øq+&W!B0# 7F0Շ(6y1vuOZA=SN*PzPUPTMQ]|wкN.I ++կ~73Fp&ZP¤meϻGzM_hfӕ(U OLdÞqg!wIwThGV:֑'GBvUk COb<|W~ě9+0h4-2(޾]}R_W\wůP'yQa孭ο<#tٷ\(ŝ5 kϾh@$4(i>>rbVJ}T hsI&]~ŔG~o,VRcbLۖe1XĦjt}[ ISeڳ5ua67-ؙkGq>Rw3fA ;yKZPOe`( 8‘C7fLxɈ8F{ +v~9ݿczk؁A gHF,l*ⱏsgLsi)w|{)o>ǧ}{I.A K{rƘ^3'>%稽,%'fCA79[JAW[fG0ޤ'Y+q#{KϹ!MNgH UV+qE_<[~m6խk˯K,\{6/lrۊN^+ykZη{ȱ˿4J]xhq<л-lw|^/Z8T{LM<wLebK0ݳ$'@Q Ɉeb[؏ j760q 0E|J&OIM O䮗bP/: ?9 ˌ容騮6qK1{.侳2)1ֹmvҐ@T3OoqfPK|(L}'F^lpOn/{b[Ҷgx8w}8xL2c}{cc?]suHi۪Skɢ7O~X~g#'x J3P=Έkkn;#.Ӧ}',6@]( #Oc~uKNɚ^Hy靑J}K$L+޲my'gb4(<.*EI]~rAQp4Vnn>w"E˭-Ńި^( }swC|ޣYn1؏쮽j,\Gp[Q^Zy h!>ߐ^'f, IέmKO7?ʅ+q \RA$ ygןOոuG(L`-i+fbPESXR+?/8AQtŠ(\SGҠ$ V/]Wg|ƶocCSO﹡xkvlߎ׋~0_O򷣡ϯͺ,PTfl"K, hE|oח՝! ܰYjzSS**h_RH ⥜r4Q$QYxt8}g|"nJȭg@10m73Z&gzIN]U;9&Paq}F3g5EҪ:Ͳ3l!3cWfl$Gk2qsKYy?k4%m;$XBlC0ı?b`E\']:/њhJ,M+I1=2bsCo?+{8Fk<Ѡ:<.9[sm Gr]Wy:L5dлm/qao!!]?]hhp VeeJՌw OQ7fPiw5XׅdEOV*.ob{ `bĢ( =oOOQ^QQߺEAS=(JCua0[0Z3ki4c1cQLUsέh3YlL :EQ:$Zs30ZlsJVmk0ז]uU險c[2f-odKlM=sV.ktj,̱`#ӝιzҜQ &4)H#ջkݖÄͿ%u/ >Cf{6zhTkxּQ:DN㰝q0,JP  -Ƶ3(p<{xIl:}N[p5w^^b{o lkHWI#d!}{q@ I '8p?h]GGv^$|u4U ?bզ}u&?ah6PжkmU:*koniA~Jo)6z˪B_4- sG^]c8ᾕQLifțw7蜍'z[Н+^\otfOд E b@E/PIEZ^_]ǫrOaPBL|zgrqxyxq=0 6ȃgdPxWQP/c2xXU{0_;1$aH49oXU鿻n݂O&%F%%u3x146u(޺Emk k71^zƛ~Fyiq5A10)44&]5V۶f??\mQq[.iǩD'EoYC/ sWۈɖڅ鐻f 7 nt{m4 L:EQ=X~DQE=.TZӄ+V8|Bt[{.?//^{< 1}l_?>[H4?"+O9GXvlz[)d1:3'Ua0iToEF6Fs]]S}8T5G/4@37qY zkZ%m>;WM]Gܰ l%.sIw[^o۩ӉOez?6-.!"j)Mr^<]Ԙ~˿ s6_hsaNuEQUpTF#0F֯TA58 IQ XRXEh`6oUL5MkfZE!G:^L1&f+F`0c01YMl?l 3Y0gБ 0'hC1Q#`c04:7uLĦlOF1YjqTcId"O{rGmi[5[@̱e`4֌VP&k+WԽwg套^"//_~z{/>solذnV.Uiiip K3g۶m<,]4O??)..>}:&L`^<osu[pik׺s[ԧ%yZ8 yy k.9WSow=6 WMm\OyT=_~! ._'//W^y!yt{-w^~exWy';BF0m )p,[6|ut뎩3oO駟[o[U Y|ybqq13fয়~h40{lnv̙h>O>{3g}W<,[A.֭cȐ!eee9fয়~waۥòe?~|<?~<;w -[C=ۣ>z9VX?LNNWf$-- w͵E{5u^4^T=6dxc@6W?=ynC=H_g͚_OL|r?|}Rz䚨_3f/[-!|~'^Tmh{@wƍh`h ˖-cĉ!JzĉY|9f`˖-|Mn;2eJȺ)Sm۶˜{= Gi̼y6mo0a'|2}-5f̘ y衇Xl|>a߆s9N>Co?>a8ӃAow]sm^y)=6mk _>6lϿ-[p '{{SsG3В:uR]t0UU G-xb>E~ wMSEy=,Y_3uT~Q$u͛78>#)--UUC҅s=NGim}ڒl{eժUuu5v>7v^DJOy;MVfGԯ۰=~i+!DaرcٴiS[RRʕ+m~VXAII {,Wn2pۇw}n͚592f<$ͮ]"(U࿋z-orTڵk_1CLL @f5W7= ׇ͵k~֫=;6X_PPrWP5:|љmT=zjԨ,"tXws}?rZ.U.Ys璘`[RRs >X`nvn7{ c_۹iMOqq1~:zݛo.իWp8fʕ?ȑ#y)++t矇^8vKO?E}ZW_eƌ|v\.k׮媫k sͅk>SnӦ'p}mq 7`6n܈aƍq!i{mKnqlذÆ X`7|sZմhz_uB;o<]\D0zH_u/J1c_|1#33.n]ٕ/1B!DWqEzFB4fB!Bt, B!$B!`_!BnJ}!B!) B!$B!`_!BnJ}!B!f۷}*B! ?b:p; IDAT,B!B6djncK/QSL"lQD7gϤf:tA%B!-l]]] 3b]~Lmu8`vFyvV}#SN@iE ֿzj%%eh(PB!B" Rf3h*>(C횕8y<1-[ q27/jlU~*a2rr{y}MF^nׇ+OVOp)Y[UM>USQMB!"jRૉ={ ˙|8[6eRfA8?\ЯUy*!}~SxpᇔW8HL[ivߏof㟟pǂ[U{@ߧj(xM-B!f㩮n]VSkNb*l1*,r2QC16hUnӍp v߲ ;*ZU6{}OkB!oНXws ӏ[xh3OG8gZ nx*n/|0;_%9rIJ0v8>~{1p{G˻8of_fH;t_9g۳nNjAH2NK"GeWUJ*z[7СCx&}CInrZgB!Zm6]7AUA̞wڋQ@$0C?ur-c~Pj҃8rѲ`i^J+5s,Z7%5~z^JK+)8Zl7sN{HZZF0 ]N>bDQV#l1p 'c !BСW'#a6/; ~Μ9lWZeGAxCL&*箫Cq<v?g5U^VEEy%JJ+q:WUŋܹa ?^RR} &Y4J+5c*bD4wHB!Dhx./] ^W>ck@1x-`r7=q޵8R2e*gܷSz3o< fr0*s# {c=^nNjtSYYrryp8N|>UױVXo~s.fsw3)bd`2W7d `2ռX19۷'6B!kh6د?t';nrPP `PU p8=\%cph S9RJ~ qq!+'h>>|>럍[%\pZ,=X4 7cڙ˔q ƣ*6Mz0j>f#Al4Ppr# KJʱZC`_ts?b^=v/8}ޚ]f JSYw8҇ӣGC B!vdGת/b)^Mqqq(r~&n&_qׅ N,ɽb vݣtµC2pM_&Ź.cYy@ccPUÍp{k~z,o.YF2mf8}d8Nv{1rvۯ Z1p\p~P!B}m6ɿ  5㬩ڐ[3Aʯ>EEv=I=MPX E{JEPR棨Ѕ * HZexjz}8.7`?4wݸTU}ÉlrXW{>Ga]4תRk 2$H!Bt6zgni`*.A@ǧ<RG>H5+~p0ut"6+lUAjDv\8R襰"/E^eeՔ*Esk e«z:L̘Zx-ȑ <Sπ'8V Ӎ Αƍ?c"33dL&8P˖=/2&gC%WPVֺ/B!]Sƣ7|Go; r&Jpc|<Ǥf$0aԚ7W+ἓRV ɇ;5npU\n KЎ8j'WI{=E#.΄ L&^/ h;xg_}ńϧWL^^1I ET{M9 Uc%+$ 6Ńgg͚!y@!Bt6O}H]~o2qE?6b6#UoL+ 1DyI!EqFT {xTR0zhlDuq9TW;TNj.^zv;;qq]lu?i 111: !Bna4_qପ lm~Ocb<7ahN ǀvpM8^<N یm帝 p\8.P5^/WxqD8g(NN;3O%%GGsaL0!z !BfT\PZrj}LTU`0`2FdvNJ|>/UUwjg }PTWVWcT4i_|5'|*IIqri?//ɎIJcSN9>z !Bf(Ň7zq=8.v˅Qqyαsƌ1w.C{kOi+ |th42q8- ΤI'^&+13wlL&/Bl<ŠlC o*GS5TPGfWT}T58!E={gw04>7>\L߾æ>Mfذ~_!Bm6-nQ"U9NW_biyϿx<6lE1B!]f=VK1q{1}۰$B!+2KБ !B!NB!BD/ݳ!B!Kagy&;wìX[o-, !Bt \s5Mvv6̢_ gG!~7Yr%ͦ߱ccС1e>.]ٳ ++?={9s۷/L>Ѽ,YIKKc?i&99!3MorF.ロlzddd0i$}Q\.W<µꪫ2dzbС\}|!esL^}XXN;L233;w.˗/oڪB!įm'|¹ˀ=z4o IO?1c 6lox7/˝w˹kۿ[:,<k׮e݌=+2$/?>}a֭,]ŋ7ZEQ"{-ZUW]Ů](..߱cK,!??{rWSOq}5#\_ye…70w\y䑐|Sy,_ .ĦMؼy3 /AߖuB!~snf_7">eh _xᅨ'Uʳ3V-;FvC(- &;'䦛nx/ ?B=\}s9Z{SO=ѼwhW^ͨQdeea4)**3`͚5|w1 b̝;uֱ|rƍg{1cFpq_'fV'2qDƎ\@AAA2͵Snn.-:F8?hN{#RCsW^y%k׮宻#)) G^4Aߘ7xGyիWSXXȖ-[زeKzKYڢB!1K/}[#Tn>]_7q9}>>|uwnr&H<sݎ]v3uT\7i$?̤&L+1c}຺F#>/;vtx9O?JRRRȺ8p :vl۶-cym],[n`ر秧B!`ɣspi V~GVq5R-~|*]Az`gU{fUUU]gKtI<|w(++_o a_ݻ#>=܃b{e֭x^:ĻiLxxW^yENN hr^{ ɶmZ|FyNII V=z0~,ߔ;ѣG)((`0pwK]B~07ҷoo:Hcт=v eX6!qyӎS<9<ҥK1biii7+VorWN8e˖1vX?лwo.RfϞq'Oΰa8SO嫯 eΜ9+1j(HUS$ƚ%Mv$`o1HI03 =wMOdp?ɗ>)B!DUٕW \:>̞1]Àғwm1ғͤ'),4ϧ' ?t޷\#B!~ݢ*"Hzک6X2Rd`15ZȀmFM3srP,\hG!B! \S֞\GIq{[17]8cơjjȾ^៫g_x<B!m'jTkJ K +vԎWjaBv3%sDa]~VmGؼloB!"D͝]y2T4B0qˆȿ)u$,fChXbnnw.B!Dg`A;$T9laژ-369S9ӁP,abQ }.B!hgeeeEQollXlO+֛N <}z0M5x!BEM?qHb ەV7] Vfs2B!DM751ټ S1FHlk88 i!;͍Һ~B!,Q+`<*ʊ8&+aƪ3(ޚ/J:ߓ_ C;B!"jEUI=x] [BM@r\qMI1Mnm C δp8 &B!ZQFxnW?Þ|+=y%<^(:N)-≍5c٢]!B!*Wc3y0wߏzᴙu|%0aF||<111Q7&u?y."cƌf5f8pJ$~1xfy%"BԊ``0pɽT~x72cL}V@UU57WbwzôΚ` !!X @Ӎ7tvQDy4ٳgwdD/ -B`_Qf3^W1>sKHLLl6G]͛p SYc!r%48pYfz;d"M6+W6y%Z"y%u>~殮2(#>)22/#URRj|JJv#v\.8) 5HLLbDeiO(D 9_B)*} f+yvlbQGwgZ<4bcw`_DJA+!">IHH3,{B{ټG,Ч>=M k%;MLL 6 FLL !}`_DN"hr^ !D`hfaXanǃ ! 5X,Iff3F[&gMn+))iv`]v1dȐ6-cwϫ9iN\HKKBH 6Gs9)hmɻa>c1 +Lw2tpA}8\ IDATV):WKKKcϞ= 8N,BDF>~Kt-{ݍnW_~"{pt<m/ͻ<$}uU'O*dbƟ,Wɬ_:|̹ wR?3N͐9믻" ,KSO`18Y!3FWw}$ދh^EE#''}QVV}׮]k׮e׮]yPU9tJj8كku+cNAwC}@W49|.>`;7߬b[yoO3m vG̚53E{&#qo&;;IϠA0aDnew_xg4xX.`"??;f,_7ֆgs 䶽ݷrOӝ6W*ׯ8Nrrr웒Bvv6999 O /䶛nMѕϫ@ټ^/O孮ѣݛT<999XV,K0 ѣG~~>FL1 QRRBzz:RYYIiiil6cوr҆eeeӫW/8rH2v8~ii)111(j=iERnÏ<O%%nNj=ìYs0 >/|0DJJOotK4^yG91L&ƎC=RT=mjٳ`žξk"y7@RQPaAĂ*z{)= OPOӳDG _bBچywgfgߝ}hvU<IKKCall . >:u(՛" <ǫ&8d>?"775@ ɤ^zW|>|>֭D G&&&EVV&M|>_)711wֆ!-*(ddd |>lHjr"*r?~8bӧgJ ɿw96o. ӧOʯ!ӷ.s ½{05}` ..]qLRuttнGOtukWſa﾿^s'5j$n``qz%w*>r3lmJjݔ|/\f!`Ugf͚%1CJ' #++KAŗ/_6F^^їuuu.ZV#чfKŋ/˃ %ǃ|>L&xrrrڵk#''ձ_\3Ʉ $ bO>2~lذ@zz:/_WbرtYÇ#$${Edd$嗄^YZZa_J"}ΜyXv5>}%2I"}u&<|44z M > ۷oAϞu87o"77?ܹ0f8ܯ3@ @TT$VӱSg_x1̟#WT Çn8sss(W^KK haդ+}}}fɍ'#o߾Iyj‡/LLLD HLLDff&LLL`0Dsʠ+)z&ƍ7nqa\R$d`׮]ԩGUIfժU(,,ƍannQo߾=!U {AӦMXx1T"ٹ-^-gѠBl SLѫwl۶!ؿtUjc'qq][5j .ߵk7xu}:u0sMs\z#3+PSNNJ>"UX ][[;t,\8O=t<Ȍ`˃LLL 3 DPAp8;LMM6 &T:::011Ao8444w|hiiՓxd``O>ACCVVVð5yJ9?gggC{{˗E{ƕ+Wp=t@EAWWW>:2l6999=сh`~Hl%'/(Z')1`hܸ1\]]ˮ<1|>6nܨz{c̘C py<\vӧI 7oބN$ՉڵkMKJJ6 MMMdj׮-_[[q=5B]fzUWm) %vc2n ]]]~'E!1%%EzFuBY"j:cH~q|fKu_KfE~yBwRދS$}U9~8|||pM$&&"** QQQ ãGJW%ofO8.5}f_#.=HnsXQ~%loe.lsRYG^PdlT'Ա_I;-66-JxSBBBm6hkk7oDhhRqȴmaaaxڷox]v"9Hnn.ttt[PQ/b̘1" z2V 2V'gMms3Bj}YPH_нp1h G(Z2p@ŋ`̙x޾}+zˡ///| Xx1444l2\۶m-Kx MVc655zJ".\@JJ tuuaddprr*Uyʨ9I~-!11QilbP1N{6@ Qξp ϨQd {wh׮ 6C_~:2rÕ+W$o0 OOOxWWW*< AUH!zR>G(5FP_@g'BխM!w܂CK 6ĭ[бc aÆrI"e@ HBjsܹUɖ # G+$B5aÆ ?(F$(WAWC;8)t`kkK.2+@(_|7@ P5 >@ PM!>@ PM!>@ PM!>@ PM!TCYf@ ʘ6mڠsδ剳_:Εm @ yv_:ls*kH -I?[;zyyaƍ5o679UivuaW_9hP[  R-/c0sfeA TIwrT Յ;I?Tv64\O8. @!4t s$whN0 455_XXl. \W?9G*ʩDK!dQoԱTW{g͗l:44e .dE ;W7>6GNnOBDS_19u2ɬVN?EQ(J P?'9RA]_275?/E?t낥_Se<4ЂKQxJkG&OXw"^ewtuuQ=v$@()ٯ\O.'&PQm} 469FuD2yy(0`lBѷݷl,a\+p8j1OQbJ G$HEC}BuᇓH:SQ-}F 3LuME[;3@@>tme@2ͩl p*߲s 6NR{_]jfիKf KBX'#8/yд=ƍ dꌢ ̔*燺o]]]Ԯ]1|(Ut(*ՠ;#ΎϩP֎ tުKg_.)opv2KР&h 2_gگqp 8XnƲa]|my屢4 ~wPT! +W.Iŧ$áUSGյ#lm3N8&fxӫs*:[ UG06 &Nζ!gt(2[X|9r$]akqt */+G"##:8ٹ#R]T9sF&ְoFW^ m y۠ M$t,ۊCEJz(oLՆ|:jZ9“h̔zJe:dʋ=&L܌DNN  —MCQ sGW044޽[Xl[ᅲIQOVչ0o/_TNnn_A޹/.zN>;i6x͛# `Ν=#!l b2`9r#G9j4Nұkg ||#*%=u#9 ~mF>GbmMȷ^R:nAQ;*edtGWq&461m gr g3x E{| >ҲCY[#-5Uf۱af L&Ͱu[ lC$v_g8p`v*,ZjM72L:uɄ5l N`hӦqɊSwmNm---`e2C춥'et 1Dq>'Z҂Ck;I)Ebhh,0> z􀞞>Ъw)J3>;Wt}G֭`8WB^ٸABeyi0QO?#??_BpttDZh ӱukT|h菶gN_rWT(.#k>͚oa ܜB)yrϩ D|#w\҅nl,(P(,^$[&M+}cR110}zk29, [퀑TٲlctxRR``` tI~elo.SNV<ݺn$1ǣ}lt))v }.@8qd'ߋM.] 4ib/o׮DvNxWuCw⤦Ktpq8z Vܱ1ol[wrko޼Vi T "'Q8rmnFtCC#nwFn"Fl%twnd#/t sN}LY;weetGWq}Va!(3쭑d9yS R"<򐗗W:+BFK*L/,,DTKһ }}}p\|f͚+#-[Ax 3=}rpt*~khh!+^SFlW6Yʌ/ * N3:&+]OwUUdՉ"q=}3pe8hp-S1cl YEu.W/=tU~S)>#\'ʕ˸xTZ~~V{%Wձ)kGqE('JzN-[j4u`b'o__.k_} zL2K7o111pr꠰o_c?p)dggcԉk p  ime:bhluzC`6,]d}x,8uuuQ\\\,;&tNNe-4yM[IV_MҧL࠿ѫ7~ ^=D..?~?@Ӧ*_ՍS99<lߊ_gx\͚5M@A~u,1v*koEcP֮1=@m IDATz7nZ$Bi4ܿĀÑW?33nZ$t+C^<>SV8Uꄢv,.CG8UV5 h/E*.$(RtKkhi#Gc*saՈ||><ôD2<sxbehhif[`3{rssEruEDD8 e%z@6m1fp EؽP=;[7wzbJ!//>~";v 55O>o Hԅ*ITf;r"~͇2[YA9B})Bq^(vޅ#GCCCr= _eҥD:u8z8lCtt$L&9;hcWފ@q5߾}Cz1mگ@"B!I'ra?cݺ53vu֦ƩzW,rN3z͡<-DlbqqNpvvF=ʤ`U >~F#?˸pY`gƉРA2+C|>6n܈Yf#l'O1fXdeekW?wÇXfx*TvVW_W 5a_&ZF۱B7`qL/n̾]}]D%!|} pwf }- @P”kJȇ@Hy1S2usO6뿺P@K-IMhG5ruܜ|05%7e~ >[srv0тUˇBMC,9ҢycԩS~עn]sq ՅN"iu&86{^ 44_D:_rzB^ i0jPYTT~72sO6']3 35Ўj7 F&Z2&n{I;~#][jI9 vubCuBI)el&tuu]sVeA TIZ9G* RVԭ۴nZ9 aO|;H[Chjʞ}_w2˒fAa2 0)C[[[m]]TBfw/6FCP zNUW+g444sWSb\wex豌6S֜\܌/7cq08l644d!@ s L&Ft &@S!Ql.|Johh0L'@ 5t"badhTWןeyBK/)( 55/i<5gaXg}p```E}@ ڣT{CY3Ն_q67W?8Cl40nM066at0i$XZZ?en1aÆ fff駟9r z•+WMӧOƨWƎO>i Au;ՍBر΢'VVV8q"TEڒP3Ǝ:u@[[8y<3f(O-H{ɷobp8p8߿?޾}[ra: >N:%=M9ϰ#twCaj@ SZ1kׁ6~ Tۥ;HNNɓ'ÇٳXn\JJ 777"66ݻwG߾}a֭۷o,ZvRh32=e˖aٲeG\\ƍS"##LE˕ ̙3׮]Î;.˗/]v7o^eG T)бcGԯ_111HJJ„ 0zhv튤$\p ɓ'秴dGG||<<<<r[qRUVP"61yYɸ8L@8;;G4|( ˃@ @AA讕`@SSL&, L&L&Uظq#f͚E;:u$[bV\)q߾}CNGQ/\.6l sѢEUy&VZׯCKKcthݺ5݋KEDDƍXt2 P4O`0T===$$$@__ԺH[;K.ϟqaCa„ YFWmV>>>֭[%͛#a(kE]'cH~qSga0҂. `jj sssXXXAhР,,,`nnSSS@WWZZZU/K|}}b!''G"ի>|TÇK,+k.,X@eG_2>~֭[Kɵi/_VXz!, =mBGG6l$Ο?GGGH߽{7lmmb`gg}Isol6zzzpwwdzgp5B__2d۴immmX[[S! : F:u믿*W&/l'''CSS...8{dK=$*SNWy/_`ѸtRU-*dqOPm۶aذaqqqqhڴl&M;>|>={kFqy-aÆ"dՋKKK#F@DD LӦM?ĺu됑+W`]AAAFpp0V^GJn:l޼iii37n 777xyyaHIIO`ffӧ]r'NĊ+3g`ڵ8w\WN9k.;Appy.#(bruӑǶmېx{{c˖-RكCظtL [[[DFF[n`0`02'i&1B\ll,6mr[qRU2HY-)NHHq9222/PPP###dff$g``kkklܸ]}+44χt8r֯_-[9,, >~t>z(̟?m۶Ǎ7dlڴ ] o˗/%.iiihР:uҥKѿ>}.]+WÇr?| 1==FFFx5k&oaa!* ,AD2=/"Wxv"##kܺu [FPPΆ@2Y>Z ={m۶|X[[ŋppp(%FCCѣGj*REQw e]:;v K.ťK:ָ\5*uB8N qkamm-nccׯ_Kſy666*]O/5nב\~:::prrRXz#޿O[>T{ROHHX=_vvvܾ}[^Ua0Xp!c| CPB9!|B^C)___ܼy7]f>}9/W,kE]7Nҡ\f6 r?k.\rEjV\Yfرc233]vԩSTY޸vrrrWbĉRh32 ;w!,,  @V&Æ ݻwr7n`ҤIX`|ꉷ7fΜ7o"//qqq?~(}ܹ9s&.7n#h߾=.^(:ݻ#FHZ?Ґ .(܁DU5 W^źu0},F 5/ƍ70w\|YYYC8k׮qg͛'N`۶m@FFs疛 UoݺEQzzz.յkW… 2Vu߿OM<(C9;;S퓐zIP:::u!,vIX,+%JϷoߨI&QkצX,H| }x)&OKРAp8ܚ5kٳM6hM o{gX077ѣqˤ@ U#GhذaeC %^~>>%%HMMŁ4"-?~ ,ͅ c-D [߶N;ѦM̛7_~UL:Pu( _~E߾}+@(ϟ@4/誐.u!k"Y*sq9uCTTmۆ\*@ { ,YuÇprr7(%3̅_rn߾wb7 33/^Ę1c3ˤɗh@#L uDERf1rHlذƍ!0j(deeIߑŋ~wQX,~7DGG#??8|o . %%022-.@ tg̘8tƍ=...I& #%> ӥKy޽;tuuѡC\|Y Fpp0I&a̘18veE @ 5eGB,_L0Aq̙X< u-.@ ,t ae$[]g2o|bagmzf>'Ľ-\~Cecaz+J[u,ЮO_>iѓՃBڳݜa\mf)'6OS\zۈ&-mo|~)NMyeUfAm[0O+P{ ;5/1aXԳ=cmtpqĩ'+w8qo102ȌA#6---i9&UĹB@HNN#'C"w.ņM$RRS0`h_tѱx n1`h_,kaέm^EǷ_p"޷Kt;(Z)6oaq9eR/B2RP=p߼;C2x2ڶiUy2) l8z O>Ƭ*R6Q|lپ k|V)B^X-7ٯW>"$3&_ 8)zcl<>ƣgw뎔-M8&)ak1n!b󐗕s 3zQ`}Yvrr$]˗xooڽ^~ź$t}Jr굫puhibn:{ضy~Z* zfE ӯDTϐ$4ni қ&%5U_Qmq._M[7[*HأH[O,]ü*ʥ3?,tƏQN]/_ll dyp8]W꼥)IZ߀1EVs$Ifk+}%Z`X͑v*~:\*CK,+{.̛@eG_2>}Zj]VXz!TLMp?ޣ c63ֆmskt@LG5ɛ=g3pttuB-3}hhJȈDޭ ]8+;9%u,A$l/i5KTwbߍ&-m6bi+;kԱr;L 1b0$%'I [ڈݿ=.ŐACߍ6bqKK2eQ<_`עeՁ62l8⊨F\/L*ѧ˿W/cp+$oiPeLJHL0F=:9Wp\¬ S򤦥ܲh/ IDAT6RR:窪gs~kck_qh_07!G%oܼ6 {&^=3fO=Ez6lYO˶OcNRl݈bz?=cC +ذy=u >pl(%䵩.\j̘ߤ-#ѽw7эOғjgU:ZgU?qqh^&M]Bt c88qxXl11xP7{ƠCd ՓgN(]dOĩPoToА,((@m #~TIVXf#t ocbwܪrlܼoAGc%Hx>zQchӺ-|ܺsKW,FMۻ2x~E͛׸}ZA0cpy``A|<4_AMKN}R_fq3+# ؃6>:8w"Ztk,,Z"v^]E6e~G$s%_;EbD&?4X7il@X틞=D2WC(]Q<'0t>w3\%ەWg7g.Ck7^-?ʄ]3k$|Qֻh 7#_L#aEh\\y nT 4.y3Fn#-M1Ilط×wE d2.ZH+ig7g Cs Yrhl6x]]6tu w?fdpC#`ՊXZX7i+; lشKQ˰2 gfi ]f,A=a/]#x4mbi3dD>O#K</dEսEUYp l>},Z)u4g4s3*-ڵq%R~MYi^եD>Wnx"F"RZFr,&]:I~ҥsWZvfegc /KX+YL4:w"W7̬LRWEQ6SU;N?NΝ CC4xzl=pyuqVݼ)7&%&%b)jlC-002 1)ТyK6Ɖ!<'Ϝmc4oBftUU!~ XgOTz#kyZ*m4QYΦ[cn0@\x}JB—\x::h ŊvQV/h?-OP/L&VXo %De"k2dPļ;slthjj;v㼌5,jvB6E>Ba)Ni -:&&-kdSx:۷s»?Wey [-M5&0z~!ȦKCaaHf֌9عM{=sr\%~ a]XO_L=$>8"(\%% ,K Ycuԋ##9%Y2C:lJ<ٯlܻ _gY8{4vفLdffb]8sfLTYnTO,[7!'799v*&Oy)nF ;!'0xuGneR/0b0޻ \~.n޾)'a ԃܵ=|\. QGH>Xt!DZĭ;7w0ixQzwXdGX{WcQwBotNF< n\ņM0utw*,,Ļq9{:_$k3bxE`^=C =tpl=zxb܅*N^Yfx1f(j{CAeׂŸu{ŗ/Ž?,z3}\v*NE dxé3's223Y ݼQcR!''/]i;ijjb4Ol܊[9}VޅR"êjϔ8*--Mf]F*\On(jD(>~}|?ճ7OS=zQ"%dT{5`bXT?J t;(jΉbX!N9EK*riKgJG[eSN*ٔ(޸OM?lhIiiiQ}əڳc _EuFQK$dN;KvhCX,Ҋڻs(-ԐC)>bXCTЁ#A<>Qʢ`0dnIX,*2u+444(yTzBJVMc. d2)Fԟ{hW<~ώ}5E4vnN_vq-KKKhs;IYZZl߾9bXe֦;t..S{T?pIIB Z"2D"( `(b C@dR(" D4m$?j+b}^e{YFn9s/h{Fjڶ˯K̷qΝmbmt'ego,u6ݍSǢmunswwۚ6ifd|%6flU/y~[-)>8W۽vlOvVB\ys\OG_ܑ;ovšh{rye9;@\!Ri_UUpqI9:ATl&cM`@.'$@B<^p)|Vy͍ OdٸriȧG0iԮʟ'O0gyJ鳧2 Uii21 J (&L`ko kVNjmп*J~!DRP=:-!5KP/ow"ǽXn׭᯿Rz ||Tg7ſmU1&pQTh|huh|,/vk)+;ȿbygC/ _?jBf.Hvyp=2!DW2&]54^<6&ur솻W˯'=sj癿"N1kD0:fI !BQQloUZ0cxXu4hOcucCACvn{|w/Xezw+pB*\!%t] yR}ykUtZYfy:YffֶEܼhf1B!(\gt}55WcVxUu1qyo:{d^+]~-J}fpTz~!B\g<) ٶB@|tV@XM> X"Z!B!DRIDAWZ%3RveYJũ,9J1g߾}9ZjC֭ =h DժUZ*=7`֭ۗ5jKϞ=ٺukvoN:K>|8ϟ/Y&\_6*5kPZ ׮[eZyi߾=ZMڵy'طo_UӅ >|8hZZn_]bGcccSNmFEEѧOz=z|NWZ[n$ ZMj8p ۷o*}ƥMU41ZVes j4O]iL&,_\M=HLL믿ʕ+Z;KJJw{DGGMnݻ7ɥN0g/^ɓ"&&_~e˖fgXz5ӦMcڴir{1~iRSS36l6VԾ`|]^`c4UVL0''!!5jpqx:tSow3f 3gtmtڕXbccѣ]v%))JkL2ѣGEff&7oFRѣG.vRc/}%D6PЄ۷w[lNtx.+ j:׫`;B?^2\ݜk#)-KI|Lywt0- tra?:͘13g:|Ӽx":tܹs}fh4pB2_~e>}zڵٳgcJ7=:7oG}D6m8p;wYz%\<< _GPT@ZTbX*\ѭ$>>//nx׹pVr4еk'uVM: /^„ z̙Stm6^~e_hl8|^}wwO'vN44MV{ -|78&gz6h D5b63}f͚U 8h4L&}۶mc~K.Epد}sɹU^,Y A9s H[~}Ξ=[t$;;ݻO@@ݺucƍ%:j֬IdddtE!(Na%_Z0 ԪU!CpR/\ۼyXd W^u׺ukڶmKrr2G%++W^y! Xt)iiiDGGc0xg<@LL ,[ 6؏8ƍ>̘14[|M9bٲe >Ν;3uTV\zE]k___ Y|9 ׷ޒ>׳`֬YCFF_~%-r(NWƑ#Gҥ}}aj ͍@ 8q"ƍ#44TeGGGӰa4h3gJ4~WҖtoq3vXϟOjj*[neǎn iKð괫XÊ;7^zՕAAA\(a<7Zn۾_דZ J`0ʢEػw//"SN-v쟳u|,X}4iΝ+qܾ3(⋴lْlvkoj*]ijL&S#8sС:>CZ+1hs0fM-@`t{(nlV_3fe˖fff:FI;={O?g7jc4cذaz|M"##Zhт)S0yd{p@|ZPjUy -[,ʕ+klݺ˗/7IGUVkǍojXa:^h4:w6]iTRKL[ҽřѣGڵMա[._M^êVQ'݌+W2uT6nXcurԩO>MݺuK.,,/Y 7зo_vABBIIIرwwwڶm[l^nݚGˋݻwf#''{:JT;an޼9s-6j%==7vRTq%QռܹӾϙk /d/fESo:s M4a޽lREi۶Й(5kV`iNg ɓ:uR+vO?9p]\&U;3t\θ=+(ke˖1olرN7vXL1LL&mO<0V2`~G233d߾}Ӈnݺqu4h?F,vȑ#8qbD״iS͛իW1LlڴVxؽ{7dddcǎ4͚5^zhdΝ.7ޣM6l޼ofȐ!ޝ*cDzxb/^̸qnjq'2f:lСCm섨^yvϗ.]Z =7ӧw[޶mC-hn&LYd tR֭[tѫW/zw͖-[HMM%++2dxJ{ʔ)3]vÙ3g1bD2ckMUךmǷ{wzrV ss71c@/^hODD*g];0>t>>>X)S0bhذ!3g,tY9[ǨQ9s&GEѪU+Ə wB IDATO^<̛7~ RI&M={6=Pm͚53իy+F͟?q5k+N:KnXhSLXVڴiS_~?fܸqšhԨG橧sZ57xRG}tKm2d)));!*2ϔ)Shժ4mڔļGf(J5kKffvŤI:u*sv" Jkܹ},]#F:tAܿ{ͻK/ĉ'^:ӦM+u]f5&<8Ytx 2/2wD uNMĸnjyK|/Mǽg`3ӾVk_Y!ĝGӇgRF Fŋ/XBT߿$sXdzb"omǮR/6t:Bq>|8Ç/f!Mqa<58{>w73zmNۍ|~ȴnfΞ`PG/<<7ćxg%HިT%>dY)|M̾cdgEOP^^^hZ]z&@2[yޗ'NRݥ}{cXY]<;_k3=^^_u<Zu122L'3+a]mDqKk3 !BQ\.W(jt ]<\~-mQ;%%ߢ8}>{{{c0P.۫/B!`yF.ԩp| .*Y̓FխcINNE%.gmaPG/Z 4B!8]CoSP ;'X?.j>w2 ߍ] yD]])_~Ǩ#۰>Ԛ3g2|CR=*=ę7`ێ ܗZjK~=ٶckv6~C fxuF<5 1l5Enz{Z?'ØQMҹsǟNځxjiש5q7S_ΣD>TSUOA}&ʩ68V(ζ[7Aj&N5:ޠ[vl׆zvgsA;:zЭ'!ZJJ5ԃ50wD ypG~~~+Н 11_~ſǫߦX|tII؛.˩hNEFӵK7 MR`~I&shbxŗYbl_[Ә4Gr?ώ}2.Rp [w_ocr6[7 &c_xU oIHLS׻^GF {Fu_gz{KW޻+sѱ{tݕbw6QoLgڬ)<;j4FFތJ=nIQ DrBB{oߞml6ٌl&''ٌb* T*jFZFVR*d_ 9moL}9^t{u̟9 7:ԗbKnxlݼ7ҍsVw5gѺet`:"pJRH`_ IkTiJ}B | |UsF {6/>a:S̚6]M= Y!ė'5mN9V(xuk?:oI{ŭwO'vv nnnt: LHH!!!?N[ Ҍ) Ferط}68@vvl/c K藦ѬI7m#r+uc:bH1@|4hzMŪ FZwhF|'^ Z6[_7C "!1 o<}k^Sz*2Z`߭^^}%D[S#.ߙ@?j2SfK>t_]-G|DlRl潕:KB}'j78wFuj;aB|姥nw E,` _g_AgKCΦWTOZxl,}\c# ;GdsSu):kZR.].x"KZŋ⿫H`'yc[y' /o֛l?r%o/%R'E73H^wT W/e|݆RSX,D̘kwceq{do#tE];2Չ}vk:糕2' t9M ~Ξ=Sl潕:rtxSiK;s?0q,f'b*;Jn\Gܚ}&vF?33ahC>233KjU.xsqwػo/^yBq_a'y{qWK&a2 /NQץ,WQ=Zf ӭ#m[CRgjǕ[m۴mv,}}9}0<>S>fM<3v}Р~@6C_8GahӺ-kVwT-~9ⰯwϠ+J-{vΟdu:baͺnjF<= cfou6Q|837voz|ɗX.U%ؿlv=`[v8H{yy91.M|0ֽ}=Oyn3`;cu 2 ^ς$x$6Z):u=]au8{]C6gzxXr{FX :9ީ=O9C1[?7>xgGݭ!ڶnK]RT?Øyv(߲'eOSVM;Q&al6͛};Xj=*nfMS=zcKﰿfJE]KL[}șY䱣@݌wͪV2mT[ڵ >ZQ 쏊>MкNWNXcݯ_2a+M}ze\>@|L[7]NmlprrrsʰZ\O/jEv!]Iޚ v(?l]ysRSxyzѿ>SZXY]7!Dq&پs@lپY.{|=`0k ,[6;aP~l&?Ap4 gǮl&a|||||35CͰ̞7Sf2Ŷ:||ͤfx 7 cy~x2̮˭!\GIo}1owC {fsx~X&0#b`) x.X0wfMjM?jƛyvRy̳3o!Ԭ[mSVG ^V3oF>=A%Ko;?{w'=#vwZMVU}U|3|"}.vN`jul߲bv6Q932k>Xŧb5æNE/SMO>ܩK|_?}_5o6GARѱcG{=ï ?;w.{!)) 2uT~a{۷3{l{ҲeKON=]bo&qqqԫWsrA>Sh֬}͛;7߻w/gиqc^y;wW^y^vѣq^IZB [, BN.R 'ٶmÇ_h۶-`Æ dddfmW^qYo4 ?۶m+ݻwsQKٳg9y$WСC<yC׮]1͜8q7o/̺u裏09r|SB!X j;61x~}LWn]*oV{ZZ7ofذa6[ gB!(?ҥKoΛ7wwwƌïl&**ܞf(J&O̥KW^AT2mZ-8g4 &M"22\bccYj*;=z`ӦM$%%,!Bo~v8pZxxx0p@=z ""Bݺu l6QӀqwo>5jDntk׎ SLaʕ4lNȑ#6lk֬)!B>E/lӦMYvmuéٶվ֭[;,YΝ;ӹs"B!V{B!7O}!B!*) B!$B!`_!BJJ}!B!*) B!$B!`_!BJJ}!B!*) B!$B!r+ *6ӱ&Ys,'_RDPk{B!]*MqU6O3FXA{^kG$7EURR)9B!DootP4h:B i @F;5” DD_!ѯnnn !BJå2keL/jhymMP/ w'iO*s8tNM<^4fFҗE!B}{҂[ү @{C | z w;{<È|2},+JoB!e%}{AHpULdmt<ֶf>c}1ǰ0 B!Ks`t}55WcVxeqHwBY,l6:z=︫<Eɾ J]CoYG!B4 g,`h“0xx}'UՓ:AU +)$jRaӽ`{ ħ9W~&zB!.˥5:%ȯ zӒxr@XH%3dN|-NŜUN}!B\jMU41zmzX c6SAfWd& RbB!BTD.ӳFװ$r-g]=Ϡ^-J,#lq̹6rV˜˥YB!.eCQy?h|7a4-wI ?O||6f~j%& iV@\khL`LY#MjtB!(k.GŚm¼ҙr,t/7T T rldtWY՞Yhusɹ}'%B!m2LP!teY~ko5Jz8^~u )Jjbs1evB!B\&@A1;/Iu\N.кa - -fs qf˔ B!eLM .er*GZ%%_6[qoB!r`kWM)pwO oOd ,M%R؃\# !B2Ё%l-2Sddj3Z>gJ,;:dMP`7yB!pY.`4mQٷ-SӅX:܄Ֆwj'b߹b6fP@7eJ*B!_2xZRymퟩux:4513E;{1;o|9I4qGVI!B e` xwj?nu;AY|B _yFl:U|r-) 9h4gB!ra&or8r2LҌM4IKIjҳ/B!\ h)"\3Fts_I1~U^_y7]?Ѭ[5׌)"aAhaCI/B!\ PTPQDs|w7 @r\b2|Cޘ{OmJ:kiڼ41ۆ^ f 5:N& !B2=׻ߴ' ";hT4B7 6 =opӨr9x"l3úij V+Ko !BR=7v{X,.ҵ//ϛ*/#Ȯt2rEOVJz=(.]H!B.+ j5C`.R6TΝŒoY>N~`@VKB!pi.C^hxKui+:¹JjVQu+ިTk-3ɩLV‚4 EPzF@_!B< Z߮7Mj4vEq:&Lt;\L9ih_ߝZP兇 !BJe}6G3wyr*.ȳF͖O`7hNx`ZNvmM B!De>* www^ IDATJ% 3 FFF&S6UVij57xxxhd2B!t\>ϧT*qww__nB!NB!$B!`_!BJJ}!B!*2  S[E~zj֬RB!Yel6 /@LL ǏB!Y2/_QF!B!FCz0aT*5kӸS~}MFvvv26l@txyyѳgOΝ;ǐ!CZ*nnnTVCw^n,z{{ iݺ5ׯwiB!e\{/_s=G||<žĉlٲ xx7x饗 pB>RRR>}:۶mcfݺu|GF9ƒ>ԩSi voϞ=t̉'HHHy cԨQ$$$`(tfڵ<#ѣGYd /U[SRR ,߮Ω B!DiTx<+B*U݌uW_Ojj*_~%ǎs*۶m駟ʭ B!B܌ i>ıcxꩧn=zi&tׂ̙3FäI$77XVZEN6!Bq3*\vZ 3UkLʕ+iذ!:#G2l0֬YTロ}ѨQ#uN]vDDD:AvA!Bv .-Q|MCuwܙΝ;ԺukۛlB!(Kg_!BQ6$B!`_!BJJ}!B!*) B!$B!`_!BJJ}!B!*) B!$B!`_!BJJ}!B!*J'y{Ac6˻9B!Bk*} HMMbwB!WD?ANN6|]۠W:Dիһ/B!.۰1e{*1HJrBV?5-soZh5*CJfff0!Bʻ__S,1X(zW5GբP( ٽ] Va}w Fz=jGX/ oSFAt?B!B%"zlЬQ f=.rr999GLJXml6ZmԩYKW  ˙ >u#b1L/B!* ٯ⩡k-+CI`Le7Sα{͆flҸ?qWi=fs A̓IHdO V%B!+s}JEPΤzX5skRGP TàbٰZ6J0?22zS'OŽjDiii2W!BT.2LO/-8eL&RIL΢ej@?iUTv'1ل՚皲iAz%a2_B!pe.컹q_7~;oMAjz61եEl\?.wлKz? ȹHD1NnnnyB!ee}RIF^D3bs1^]4$շbV+ռ`$;'w _ WҶ:sx%:M!B!ʌ!' 3Aɛ{7Lx/ҰZ&Zs--x/dffʛvB!s`_R??O?We䐝cQ=NNݹ֛eei0s)XP=FEZeu73eB!\*W(t7JKD]֍\NNRsĆZ"ØR !ޘ32i$~< oB!.ϥ}ț۫;Qz?s> w?*a.LSF'RDTcrQO\eHSUP'OQ!B>q QBKZfgeV 77+R>ޏvS :+Oϼ OO>=!B!nJ!/4AOjYWйaZP(|M%غ/}-=ʋFuJUާ&B!M4>߿IuN/O1sB,%6 3ȏGvEN52uV ~^^|///t:jҥ. !BQ}F_.lV+VF`ݧhZP(} B!BJ+ t:&5gxRRRt  :N!BJ7~oonB!F !BQII/B!D%%BoΣf$=$}& " X+Zj?=m嶥9ؖ(JjV  Yg~Ča2 8g'3v^w> Ek_zʔ&át >\y~gٺmc=\i-ZJ{-[SN]۶mӷ:֛?$I˗/WZZ$iܸq7ny:ML@<[eJtwޑƍxbedd(%%E3gڵk۽{. 4H.K%%%]uM}׫\SߋNs9ztPw}6n ToK^{5-^X>|.]{gjԩsυmݺUfҖ-[n:h͚5zW^$kWZ~X555 B=9zofo+g}Vھ}.]~};~ O=֯_s+Ǐך5kpB=3]AWСC~wޮ7kr4a]'a4.\ۛl:۷Kr4h }ڰaC8_ƳtRjnn֦M@ْ'~۶m$M2%,&77WtСpM6I͛oc8qbHz 0@ӦM?~)&n'K/$I:}t~'L >H /;Sjkkӎ;_RzkLj-X@4bĈcf͒$[VV&Ip( ۽{7b}˨QK/FgϞի%I;woaʔ) 6VPH.Iz'}r'Pyy /hܹ~?яGyD7oV Pee/L>]rJ|>߿_=P˓$۷~}˒%K~zv7u^,Qn:vm***ҨQokڵW{>ФIpBn7RmٲE3fЭުT-[L7tSիd=S}ݧo~Qߕ'f޾'? &v=ܣ5kD=V'ObfΜ٧cL_~Ϗ3FoV.3{znZ|ye.{}E"E,*7W=q=iƸGkc5gm K\cǕ+WLxZۋ%Zb}>uZhQ Gx|åO+=OUUȗ/i{Hp}BEEe Et;@z% kө3>UO&Ð\I TX ed{^ "Wbok󫢲V'=FֵkBq \JK4UЁS^m)?: whxG%XBWMt)[7.N?^XxUw+ȧ`)#R~SS릩m^ڠw6kƔAtAeJ~[OFN{ BqAUЁ$S r˙Tm_;vi7t[Z_q^MMK&M¨ Z Yo?v;u}|V6-y j+R!mRYqjZ mwZ[\]U|VzW>U3gun Z O{K>զ{E-+[Oxpn*SN#3Zn.%'')+-;Y~ӦSʊݺxZ٪ؾ-n<VBo6}xHKoMsǦ{us`qf%e H7dSan\N6RST&VHڐrZ}hOx:z ns*$Wܭ7əڴNvS9Y)98CMݼA= eg&k Y;P}@ /-n z S6T{.݇ju} rRd69 L)5ծkwk@KR}}n-5v[Soqg'*VTTR)3-IV0$7SiOoa9P/?S9.M-mVYgЉց6e}D/!*F($/SG競E &a?`&uكA C6ۧ?/m\. ͛Cu^[OeJ~cIO)CIJ+aӤar]&R;+x,9Y:yYj(:ԛ*O*:d^LP@_sVţijդji (+%]r::¼&ٜR(@J9}X.Ћw>4f|^oHd6e&Ԅ*`;%_RaܖP@RVn>reҒ$Mr3%ߌRZr0wj!*7Dm!aRSJO)eӀdFLi3cښ=}}D/!*96]v8mrmrlr:{\IRKV»)nm%]JvH)\)5IJsٕ 3pHjki zHGm Ræfl2Ucw,om 3gqe!itu9m͔ ÐdtSP)IvO+%ueĚ}D/!vNW*edHj:yv>8|)%] 9fI@HVBTStRΚ.msFސ[r:8NTt{0%OOO*23SubN ,(}D+!*4lxI3 'T.y;M%Uй}0i,m9Ԧ@r~{O#D>}I6RM6CEUS^C} 9R[^e9گu!dhǻ?0Yɩ1Q Z SٗqGko9*?+U~Vj<>Bo袱lXVN5lWCfkFὧT/>aQ@/IruzoevG9tCjl )A㗤`n]:4h<5yg4DI< Z Uٗ⫦ zwNVC?|inՠdy[ 5{Myj y x 5i52Z%'/&MƠ֭Fg*`h\(Q@?9ř37PMc6W].)SJI2ەLTY6N!O2gi5Z>,SGM$tg?qUU=}TuU_w)PFKNCMAS^&P,[jLiܔ4" ^ i)l~+}qne̙tC!\6) i_G-e1wn\w }D+a+R35}B5՟֫<~TA*=Fr%'+dTiRձc>~TZ W)-37S}D++-B~xut*#d{@N.wzΤxWTt)3o2;=,RIDAT{(Qh%>%/ Ѣ Ѣ ъn<&ib P.0Vo@M>ōfIÿXp/yb1>v@b)uϢ)} fj<͞4Yn<VL*Kf$mqD@HTآm(?)? Z1g pKq68c5?8/]/CNds3GiLC']:3(G7l9vk[[v{YtqpLcz۸.٠kpYzktէUXGyll`|գ7l>RNWn~ءz:xA KM҃Kg(M6ﭒ$MY8]OiŚ$???ǹ~"Go Z1ٍMzuAsݚ9H_ٺnp[$C/mlP0dtC~w{.C68"IV~d.??Wtcp-ISSO>w>ӌP h讅U<([]is" Ce$ !ݦNo1';vY6o2Re&t{5M-aWAݻ Z1Y_iӴ1`ZR\Nm6:Q{VmTSK1րN7/*#V7hŚtc}Kv%ͧUT:\߿n=N"՝mӛ[jм.7>֝O׌WUmZ:_ Z1Y?o5k] gj<}:.m{3zz拞7q\k˺f}ǚ}D+&k=.-*W(.-*W(.-*W(.Kƶ ъxͯϟ|t3mL[ TW$>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}E"E,Xa(>`Q}Er{ ǣ[>Ty-),It, JJ&s7,5l0ZZ~n322⒱JJ&tnwDFouzq=v\rʴhѢKb =}> */ߥG?yW>kIc_eees[KZ̯UR2Y k>\~\[u{ޥoUV[{ C!F #ï@DKk6^km_ҟ֭ՂGta T(OK8KL@"~%"ZZ?k?c{|$f oU}c>͛;GOKE+!ZYu:]joai*~8lh$\oD+٤U_oDBe6U4x;R} 3 U`{B'&e<HƾYU6@G8}tcf?9{F} ;Q3"|ǫs3W@"7wk>(:_ ֪Uyh *8_OUք#%]|=ɚ}$GSvH$TiicJX*\>ww{@&L@"a>-mΟXd={\0{QG7sWE<ӛO+]*IR!rH$Tiicvƺq죛K +7w*+} QP٧}v3}tcfNq#,PE~$*od,vA%%5*+_c8"r%"ZZX7S%%#>6%}Coʕ+UVVEE|\ϧ+VG1_3gjU^+v~#]ʱ*)%n0 ZZ~n=O\2VIdΒ5.}z\yjڭ=?m4m޼Ys΍xp4+Vдi":ܯӂku/ @ !v㚱"͇}s ǴiŸ`]Èϙ3'ˏ$ >`Q}E"eMWz>?^cWz^?U9̶_j{ wogDpIENDB`eqonomize-0.6/doc/en/securities-view.png0000644000175000017500000017170611106571520017337 0ustar hannahannaPNG  IHDR}h IDATxwlǁDYAP,=Qb%1[bݯ|kIlE RD8ٝw{mv^c;|{g?Y%}޳(N!B!D{%ńFu]&!B!D/?RE[L_trW]&!B!D/طm+4P},B!I/B!bħp$^MSڶy>?)fx %Jھ(Kly5/57Ti_,և a<SOW}[oh,30+1sOĂn?k \, \|Y<.Gw( s~/x$tj0&51G$O **nxOC 8f ױ=0]cMr7nNگ;<Fɏq+8q 卵36[ODS]ʯ͖uU5<>WNYr,&E\:Ό( ?=O@?w"Ԣd/$dg'w($1:#tT5Q[Y̲,&z(icx]O ( /o纳g2TsshѷQbOF @QxӃٴ 2eOBwL}hW>9|>¿b]q94lV>O)޷u[zs~ Y+Zkb=m Oߧ/i ]QҪ,A $9gWJPӹwP%VۻӶ¤ϽOyU-mALE'dEul+\$yж6ime--xk~F g>fߢLM[ttҵٲ].\*5nPL,ʢ`>XƻߤۍZ.~jG׆@o4262ص>!10 @-qQ<_!bHG6jD 3P{ݫ25y͉;m[.{9ΌxՄ^'_$ǧHjv$FLi4^j&p{g_M4a*=#n6)htg<~Of\ 7&KuJֽ/M߭] Z=__p;;ݧfj`1jjݕlj?E BĚzz>L+( #s F K$nX&-EQ<ںz l~z(J4]da_g6t5haơXυ=h؜,:EQS̝gFkY1ۜ^s:J[mk6]4tHYձ7hN*l>L갼}A77\ֶCP1X|GNt=h8?ss;Ǜ.. @1Y Iuo4&jn0ϻK)]߆gktEǥh|ou`A7r1!QL-t-PYǷ//S~q|]^gx߉wxm #)w S:Reioa#Fo% pROo Io;y228@tB~(5_<|E' tԵm*{ km:*k:iXJ%.9ze5n[4 ҵ9ޕעOs0o[hÔNFk\ qv3w9IZ/p]0A?^0s&Juww[Hk[r^OH 0\&[Wt|sHHOrvѠw#'cLJ)DZ"IF24]on+WBoضFhv{mK܈Y'MѲv5E.zlb7-ۻ 3q_Ge m3h{-U/qiymw7hf}EQ݆)?CSo(r"\AԚ8pŋ  ob(Ra?GKbjwM˿v○rIU![]δ#s XрjηX+מ{<[Ux~8݉HQm9":?b/Kw{MӉԟFjx~sm61rw纄צ1Kaߗ#ΧA,H[L_tr+Z{>ie{P4 <.輓=NZEVoùꧤ\aBĚ[^D]Kۀ1YlXXؓcv&S3 $dOH@ 5A[0ƄfqWE9Lq|5>oehƑ3&Tl[>Uh6'yM6'aGE~iYkݶx+wՠܡVL,iXI(k:Tq#I{G*a "ۓuFq1U}L4vb>܇ ضt hY]!]#kB*6'$0$E3aKmc!bG܈1jdi|7c2[Ccj{Ja,vLf fA\0Y1-.,DrY-1}G"f{|}uM阝(f+b,L{}ֹcH .c Vw*X-[.֓8q51 bH@E`v&`5uWe,MA~~ %4sh?nKugw9Ǎsg"&uaN#0]jǓYqXJN(D0ٜ:b=%+zGznuŊ#5Ak|nkUQn:wvL#I;EZH;ʿwuÏ>󞶭ّّ, JW2RHڗ<җF 0]iKړ:bs1hu2 W#06Ͼ"ʿW5qf-וcKуw|yϟX==edgh"GU#`0[B' g8ǽov;a1$BĶX-{rn olz0!B3,ΤN=vkzt__oB!Bҵ}.o !B~y[!B!( B!$B!b`_!B!J}!B!( B!$B!bRqi&P__Ϙ1c3f zXQvCQ,Q4~i.\ȨQ>|8GuW_}5ׯi٦c Kv.Tw!DOZuuu_W|{Cu|M..R[[=N ׿| &`2طoWofʕ]v{mӞԣ7`0cos0_!. K/w܁s=1KK/Daa!ut,YkFt@io`hXoC!z}~g)椓N"##S/q e̙3j #a޼ydff2uT^z.m>}:#F`ƌ wTÛ^uN>d233/UHhvCrss`ܹ]hKMM^{999|r痿%np-q>]~tGZZ֭359o|t^l樂=ZyM;t~nmvOyQ=ȵ /pG{nмֶԕ{ƍILLRUWW&\p/f۶m8pz~ﮇz￟}QYY^?o][2ϽQx駟ν+޽{ۥ3rE;n٦ٹi :<`?/;Ckg'|?OZ?O<SOcxW&._ݖc*[>>ӹk8i+-[g}֣JAOʕ+w+++?>_}fEq7xD>o,W@m[#8YqagH?}_@ n}YYYFhs٦ȹi #ZF;FwyQ=a4Gyd/Gr@vڵk=?#{XBo7m|>nO>?Gkr)$%%ۖŋ_\|97x#~)~={pWG~W|r6l؀lذo*fܹ~TVV*_~%_~y땝g}Ϛ5kx<\.V^ѣo][2ϽQzꩧ?>|nǺu˸+\sګ疌w۴z97A#ZtiF\},_M6*6m⦛njf0vM7ƍQU7|r~,by;r'sws=qF4Mc,[GKwp^-ҥKYp!<v}^mя~fҥ3j(n;pG}˗sG?~dݦȹi HtH?wTO#7sΡK.Rrssꪫ[ikmwo^{\q8p/_gяB 6]G!6oW\(&0,ӕrbgkߊ|ZZg,Y,W^y%7tGnh D_0N0J g+H髡eg,c'?a޽deeqEqW1c ! "y3!fB!B/ B!$B!b`_!B!J}!B!( B!$B!b`_!B!J}!B!Noo"B!EQq;>z IDATO4(B!Y:@Õ_t)ɳgauZ7!==48T"!B1ТF. $8֩*x?>aq[W/ed3av냚:TUՠ: @ B!D;Moj]MM-._0֮㦓gVF֩!*k,0ܣ()&b1oA3@?@ $AT59''Q9t]o.5@PCQt=أc!Bb8ﭱ6[cA1D͛u+9i$0Ȇٺ) bxB~v^n,)戂Bnvw>uuYo.i=*G0hEtjB!Pԥx\.Wp{cL<NdM-WcRXz񑤧IOc6;ٺGy*n_`Y n/5un4/ @s 6u B!ڢН8w -[I:f Q98k4 AP|Av<9u8tX3'h wx# ٽ<~5Ӓ?66:vKƌ5 M z~!B;d6#L&p:>vt]JA \x^xOs;9g(OCUo3r~>$Y|G$y5Mښ:/--%P; ^Evp8fB!\l6C@C}ܕhS+Ŵbj_r9?AhKt,Habt/W  Foqy@ @uu=ep{^i&vABB I-}W%T(ªUQ^~ȑ#|l!Bu6jvrh^G,"{;X2k$WmE;TYYQj~~%y:;ݯ!co]GUyRˢBCqT5c潨`h杠X#Cx=>jq ;ޥ(8m,ހi j?+aڼiy׾P'ʊ׸4Nm' fg3vTy3㣛UW ~5įP^맾ۋSx^AбVZ~p6VkoU2ckbbaB@ɝzeeXV;'oOlB!ivNWU (k:Tx?&|!#꘬ s$L8N8ٔ3>cgiAjAA -&uUwhlS(4 lŲ SmƣiqN[hM1AV3& Ij6QWUp- 2oTwA@c> z7ÓXc2&G%B!gX,ҴȘXA-lk##~?`n o3iT\Nr??.'/8GXH[u<~p{uܪ ?/gPTy\_UKr ]iLJϧ '󯭠k5mf4Fbf 5</T,&\*9нWQ6揙^F&T!BĞ>b -C[I9c#@W[maYCGBx2vx$e*(z(: P჊2 RQ]meRmri̞}&jԛ@LJGUAW4c=/V@ fOKgC27khHBG jHB!:l6ؿ~3ʶW9/ >N i)Ks$tuM;bUW9\"ƃEMi5_g0 -1VrOů *9tU j5<'׏ ϑoĦMنʈX,"-_aN">AC**+먩 !BfQBsČ,LE|~6*|Ɯ 2x?zqOWqΉi482S}D͸:~?x>קQQFuASr]i(:~PUXt,0u0tTUGQt@o|̾f!(.EQӬD| \ 5^JήrBnBTTlA7kng!Bfi)7|?PNg^DWL&\Cm0Ԩsokx9|] Tk((Tu*Ԫ:F1947W'u^>JM0KM;|>t'?߯Za<]٬X:}nt)KVRR5kv(]f{>!B#l6( ͐~jIJ_OarHsd!?*}/9d5@, U~4-@%1)f4#Sp3Lץ<~\.4-H0~ B5- ]l˺u'??_~%qq̝:Tg!Bl6# q)顂LoCGVGs7 uVWgg0Ajh׫&|>_߄o ^'~kj{O@ 躆``鱎vqQ x:},ii)w&NILt&JJ0cƌ.[!B ~}6OW猧;Gr+cZ7b1i& D0zl6+X,&϶ys.᪩' Pqy_U`8ۅY3>f~֬Y|ǜtHNOexYK@#ؾ}ɡ76{8c\o!B1l=%z~`Po͏ܘ6~ۋ l63s4V7nYN2A,3/Wc[9EX,2f_!b(xIa*]4@CfF  B_ AquN?>[_h0#Fp?JFʎ)Cm2qb>&1rd}B!Dx~n/JJʰ>y:]}  -qF?)B!}2ϢXˆ3'v{#Ջ%B!)ZB!tK/B!D2<B!"D#B!M !B1DI/B!%B!CB!B Q !B1DI/B!u>s6mWemL6OB![dkpBIOOgȑL2eпYKMM%555 !B {K;vpAVZ_?EB!K_+ ..|Yd@->I+BHA%%%,]իWS[[i/>QFɼyx뭷ڥ۾};K,a1ٳgJgtMs7L~~>OW~.2 6lǏ//贝B!bC 7{gM^^SLaɒ%|駭~gqʺuصkSLK/_ꫯ?>7n;<쳼Sp9{9.2vIeee4-WWWwz7h].RcQRR§~)½kB!`%~omZrC;XҸ~XSFa@O׿_l6P\\̛oəgO?N{}ONN u]qjjjxG?izϽ{Z^`.Gy$_5gqNqq'l2zLB!)< 7r[7{yn8'3OHjp0sLfΜGyGYYYtEEE$%%`ۺ)@WD˳>˽˚5k(//g˖-lٲ׳r>)B!@`/BOFS0҂ć %m7lg*WJY. t͙33fgvZN95k~)k׮eӘf >_e̘1<3pWm۶*B!D٨6: ҕ=i#CMz_lo xNZӎ}s c8$jsKMCCC̏?yϩ  RSSßgp[nƭ֭[ ꫯrꩧvmv/_Ά PU]vqUWL:'|Gaaa4SΝ;;Mg.s>UUU8RRR>}z*B1d-qgT8f^6v3ulSıiZăX{TX(,Uc:3f o6]t&MbĈL6UVs饗wqL03<,Gqm͜9+VpGl.B-ZNO2|>F͕W^u]7!%%c=_5ZoW^yc=,~B!xW_|9X`ArXB!Dw`KF}V*;w \6KROoq0<9۬&e)*KpѼ$2n7 `MB!虘 .pfsb}VKyJ^T+fs]yDFT+j:ď^^yB! 01, qyvKfa6lUw˰4E7)Gׂbe7ux`}]!B3n0;Huih%#ܩ)3nt(VT0!Bb& p4f9=2+ m~,._B!1+f 0]z{`bnv[ϫ :8L)B!bT|AKǁ _Kaf~2'K]?͏Մ\znw-]t B!ؓO>i(]9NUNN@`C)DoݭE[L]e8%W_}u B!XMMt1;pyX틭ph 32݂l`h !B/fs+1mWz8tr%F9Z=X!B3vMXaXpZTgi5ASθ,#l=G!B3(vL )#rZ7f&RuƦֵY[OK\7> .wB!D̊`yw}[e<-f|Ay_mڥ-e\ӧ8N B!D̊`l6sBv0X͡^R:y<~Eqb`_ *.*t:c B!B4`_Q/7 MKl}?TH N[i3[i |Ogs1F'!!sSo[%|e!KM:=4vbT"!ZeܸqsT $#FT`2I5{0ofDZM\7&r a2 5^s@Ez0o -Zԟ"?0sT h]s(XV~4w8:ǷjƏ֙aH)(4/}SLRRV5&*Xp믽a~.\H  2w\V^a %hQ!"}6L;{jWj"73ii{*UUl+51.y'&0cNbb"IIIl 躎 B! 9?vb2SF[y:V~Sǎ pP+jxZL3.q>M'.JBBqqq1{G% @sO vrNQћb6؇!=t绒vﰟ3r,L0a~v;NӉnd2|싁eܓsT vr !!fN'6q*S~TU% _ZVldV+V<$&.1r);9GCEMEb`Xp:]wsGexϽ;vHvvvǏߧethLm ڽ:ߏX,HNN_p8e#εsT -C&kbqY~-:x{f3EElͧym^4,cujj*UUUο HKK ?_nw\tYsN "nvk}vaF"11ł磦r Y_DRVV%334f3uuu8pUU[ýe4P;ׄKA}ygs IKOXګ/afw#qݒ}E2X.yyyl۶<4M)HZZZu7oSWWǑGj1n8l6uuu\.n7&Lnvo*F;}HJJbh+]{%j rHKKkqm7GG~i.$hfx,mO/,Yrq;nVO;u!6}aRRRٰKCuL-PW_o1ߖFggƤ;fd4yCCQFg]9S˻GM_'G_ZQVV6.SXX޽{ oUzMسgO7;w.\;wA(,,dϞ=j˖ڵ]vQZZ.理]vQXXHQQ8j"v޽{gSy׭[Ν;[Νݍ֧ kٌri IDAT4O" z"222աjz PUUڮײַsqk5n'w :g}.o{ri|',_~=!ΝϮ]\sIIIaŜri<44믿JMu5*^t %TVVpQS;߽|fs,c3=UheXr[̚u,%%<Üwm䨣bXZڳcFgoq}f˟eiSN#99y30RxSO}}=b6#rqa>|8RXXf@UUN A6 ]QU@ #AX[[Kvv6X,E" Fnn.fP]]MZZZ8𾺮s@4JKKIKK#??͆hq>| cϧJ tz%55Kaa!V՘h?kPDWo\322ؽ{7vݎfp܍my^RSSx<tR^^nSԟmhe\,CAٯn( <܀QeP_wns}<*pbV+'N瑇9|G% ϣiZ.G`N8w||%Kb6Yc=L.觔.>Lʰl3shhh_5555Çcw\_IHHdVTYl VZ^*]gk݊Zgjj(**8@- r?&>q$yww.wPxY[[fWy6(((@VVy7d2b1푓PHH[[[*IRT <OrP^=pvvVqF333A!!HₜN܏&49rP |>EEEHII/PZZvˣrd2|>Rl6z-ajgMudu_u5 6P3Dqq1x<$ :>: 0%/ݽƍ ǚ׫\{>lJz6ݧ/Nv ĕ+prrA>ooDuGwۻ%%%X1kTlݶqܿmk-Oӵ7Q+W>NϿ۷bu3gNաc֍pttT)ϟ?U B+f=<< WWWdff*f8b1\]]rss~4"33O|_]'*蛺HRX,l6/^@ff& ]};fe2X,lsLmPuJ[3nE:{Z &Mž={o5Zp 9t]L&;!Π(}~gN!!5C޳͂hӶp͔i iWq)B[9ѣ6nXׯ_wQ5aD"D ֭VZ[[ٳgFNN kA"(T˗/ѰaCBrXo< ...ˌ ^r8`p8$HBÌ~E!(..V8HOOǙx 8Z_ع"yCա*mB1gmORRbbb 5µkc#F;x<qaeΟ?pBBtΝSѴbѣGѾ}{X[[gϞHLLTӔGrr2 WWWXXX fAH/)+Gҥ˱d"(]o4w՚'g.<|x}nw<|pQ{v!,Rua()ħN:5nׯ_x] ͛7JqIIJ^QO3Ldƍ{;=zVm >Ѫ]>)))JN!DFFJ swrrBQQB!b1rssΈ\Q[|QQ|||rL]},--ШQ#Ş7pV'ʔ.w&]a„ oUmBzz^RR6 .˸SW;;;Ce2`gg4,QZ^L}Ul6o̶f@jscƌQzX=z8p;̹sЫW/XXXx x<zgʊ+c`8wFn3tP:t[nX,F||^~w>/^@aa!R)b1ӕ4Ȥ^~>1b$>`^uر3˗-Eb# _)G.Z E(..>3L6Y,6mf̘ׯ_ )dl6>`(.Yͫ*qՁD"/ rXsHp$lllOOO:"ي1ՅKBrr?Cnn.^,{HG6# t 666˃#OUacc6/_B"NNNW^T*EVV^zxxx(屷5233KEFÆ 2 ;;O>L&ǃR[abgMudM֜Q8 R-+WW^G{xx{8{,^0@LL cǎc" R3uѴiS{}y&v8SN>}:<<<*]']2l696ص|yOO/ܹP% ܸ-ܼk2S׮kw^wpt?ۯBF}XϜlj6˟i\uOczz[XXVVV%%%(((Pp8*el6q5QS|b`iiҽ0S V( *_nƤlֵ~|JKKt" ptt@ Q!w&Ց):|ؠ^zre5%%%(,,Tj6,,, @ !11QqO ___x<Ų;;;%貳:2inkQ(5jqKu~wKf~u´#jsum21o<\piiiunݺWtngq٣Pwfn{_Ш;W**G"]ȿuKKKU@cgM-SkWXXBuWG}I*2^f'9L{m\&]F5ՑI[4v[S'4ΐRjwGlZYY!--M܂СCXn,--Ѷm[\pJKmDe˖z*ܹ;wZR([P@SNaȑzUT@q~n!E]UY4 /?.Գ܋NW_SSڨ!L;mB=|ɓ'<C(bƩSK.Ǘ_~ׯC*ѣG Leϟ6ӧ˗x5fΜ 6oV!ײeKeO`H$HHH~Z{vrrHDG8s JKK___HR9sF߀}G`kkѣGcU 7VZ4w\DEE!00cǎȑ#q* SR4@dhth/_^߿J#n֬<5=zh\#' gϞUX'MM] 0aN:SNZSPbJhۣP( POХpQLm{ B_CЩSSWRG|"4^ŋѮ];#֊ByKLL 5^mbjtQ E_hۦlM\J]%88H!0*F)FWP:mB:[_d m `x( BP(J̀: BP(J-: BP(J-: BP(J-: BP(J-S z*M] BP(iѢSg!w۶mkP( BP OZ/)5!TU݆8P=ӧcʕuO,ƍ|?1YK de"JJW7FP; séNL&CXbjP @ TPVuj@l7{g?y!V}6;<,"3_d?L/k1#\nr !  r{RۚڪnCovOdca7]0>4A |~f%θ̅D@\,lv8vXM տ@mU7T: Gc bT +BX}8O n~ׯ^|y-_ƦVjoVj[S@o>P[mճy`ξѷtBW@Tu'бF"{H/1os<~u\ѳgolݶKmo/W<{Tm({쇵ڴyh߮5.]βh[PE,L&CT.r0nnh. #FuH([ct჈څp8` S_|;wnǭͅ=Z?Bxx'cUlѥgo/W{ ԫa#_'Nǂ!#L1;g?yf}epTE#1uv U74li)WWhhkk5u> 1 0Hc:JDگ=z~ڴGF]aooƴ-(m9x%"/C@@Cp8<}+ay8yJ^ꁉ7wLĬYs?Xl ܾ-2x{WOKۓ2Lz \Lk7J6`dJ۩"UyM^RRYA*oK/柶)p}o7E]jQ τH(DDZp`Xg'}R1:4`t7nޅۉ??cGPV/lu'WWǎѪUйsj&?}ISt?8,?> j~܊`PV0qͱf:!&Oj:z Z(ʩjvģ1 -ShIJQ'+ў XE8r%ĬIY)pppĉ0YjΛFe3{:|u8vF"Q>C_0t{hƁ~LWѧFP<_N4Dmlቛ7QvߐJ elmTԬ2ƍXGѷOw4 M?VL߀8 |="11M"jc{S  T LٳSIot~^ԩWI|+S{kKOLڟy߹k5,-yj֗tv=W)?iii1&m_z ݖrOd[A\$S ɯ$j}j5p;(-U]d.7̔egN<͂#=v$ -[$1o|ܺ}W _1,]Ӧ#._D_̞H{%L6wM柶Mp*TmK ž{T݃v.S/?L+ >VZ_~9j&,X&hXY[cJrLlæ ?!nݾ>F.]q-o{"x`AܹmiL۶m{ܾuB^/6`uw?k֬dž c ')(S{kKOi?>.mtD.׆MMBC8(ɨǘ辢~˗Yu/ffH?%39R,3o%eOHaj Rpx˗/EvVƎyx #ߔo[gFNN֮ݨ"cŊ5޽'\.c~*w4ٖύ m[]e+Ԧ]"u)8.\Ę#Ǻ?eְ#WX-Z))n5 MM_c*77vvv)#&}`m\-[͛%رc+:'Z&܃vB$̃>u%m AVR"۷0}7%uݫ+w}157啽9I q24*ϲXMx+ _c1|U ԝRVc} c͚*333j2Du9lR +}O%@w|xU̿{k,z#29r]tHdm5/YХkڭ;Mi˖-̙Su.oEÀj )P7kQ`—bG~އKW(3T=kL_o6-}Vɇ-f|".]q>_~j:l,8cOj^4ҫ+OLE*'Յi4UWjppsw,z(/mdҗj^+dL|TkZ@8._mIKa/(F~YkLi< /*[s63}|?~ Z Q~?زu,--ׯ_SCG||&A{.BCs[z(4Ql@Y `cc!p8hѲx D"ZRR1ijt?rw3[p8Ckzz:lm7ULmѸq4n_LԚ\e#?ĊKѹK7o q:5F>2 h`Xd*:3֡|]5j V^;+t^[~'~X6;L)u2Lu.=>S056"b%2EC|@-XXbta#d"?ně79(,,ą?Sd)bW&cň D1]O?6meÄ' O &ݖ?Á0lXu}mۮ]V,_,HR)LbOSm߻w7?/1p?D9ZgLl'cq5@,+2~e;#,,##hQP +ш  g>p,,[qJu+ Ø1od20Aq\;uҥ EQQn߾_OUSW_dI$D33lf&WXbr+ԚBYP۠.aJ| GxA_:uf͚ctŷmg߯ĝ;w@ MaO4,>6x@y |?U}HEV_.\ n(..)O$4#8r -ׯ_߿!Fo"bhlܰoǃU_ f͞ӿ¦M}=%<#֭6W0` Ę>}2^xz<駟o fb)x5!x1f֔>ס'O-[aݘ9c `gg-[bǎ= DH6;L̤Maږե OIiHL+Fq^NMzGƍѶm[ƭ:ë 'j\XYX V>H$\'2[]nq1r(Wc )Ʀ?Kmk"͇*6:N{o5֐RоjMC_Oa 8!/_dܻ`>3JJG%m,,n;l@Z H$4u^Rs%ŸPUhh||ŧaDUEJ5Bqz6/{ ߺ-Ϲ}aQ <p8R| 3Jmk ͇j!U@lߺa()gP h[ L](|Pgl}/gK7'ಜ`f}JtU\o/PfI)tR |¥AVBo>P[mճy`6>BP;/9P}X P_Tc6,q R}GKKK:OQЁմPVuj@l?(bp \}`oaMڒ>LRp,yw f~UTԶ|P皍8@c~I㧩\zX2Rg_Z¬!r!vnpp._hjPj[Bo>P[mճiѼ^fX,4k`)ݱK}/]Z؂Q?痘7]^SfiW!D"6hK`mm KKK=zs!==X,jWJ_+}z5/fP-9HRu_Cȷ@`X[_ï|1.CAQ FvVl\.,TKŰ Sx>AH[*--?EHxJH$2_UOP( B1;g(sy<wvF7Kl-  nB4'R) 6*D*;Y/ D"x}={|>:uӧO+ > O'4bt|肥#&#`cccKwY,+BZZߏ8L3W?cժUغu+Ұm6,_RJzj^^ݻwaccĉXbvڥg͚5IVΝ;+6o޼˽~:$ ! aee0;vLI.11*5j$xXXX BLLκL8CEll,$ $ bbb0d|WI3d6lR\U3eL8e#GyuNFyL9ecجN|D>tYD^'jCdd$9<"&$ X,&bPɓ'Or-Z ǎS|_~!ZR+..NI&55XYY)>'N(?~P),V-`,pH@@9}!wVȱlu+))!G)nʕ+Çooo믿jT*%zRi#%%%_S´#V~!ܹs$$$DIN]}1b@S~ϸSުcahf]? [xtYDZO9N|zN"tfRqf\ܾ}-[2<@xxRpܻwO)aÆJ߽{WiU~(BbOJ˖-RлwoBBŋ*'7 %lmm`߾}={ֺL6 yyyv QXXk׮!++ 3f0 p89sӰSVL8۶m*Ǵ=0͏Ecڝ&s}ƍjL {oUс10$ưY].~-Eۚ}lذ'O;ڸǡ6 DGG8v@nժ_g9:N޽{7>vځ]v8|0vءf̜;wbƌ8w4hr*yUx4?re9jwPWe0՘[Ut`2 1lV k:ƇR}`` ^tիhҤ^eڵk*POϞ=sNݻwW[}U; Gwؿѻwo[ ax,ZmdÆ Xp!.\oG|P'4?rU10iwPWu0Ř[Ut`2 Mu۬N|r>b fz\>>dΝRw^G._4TߚtR~}2i$3K֯_O\^mQ~Iə3gHAA)(( OV%9iii^zdڵ$''wwwg~ȅ H~~>),,$gϞ%d֭Z9qDҾ}{r5RTTDHLL i߾=8qAהhҥK?INN֚^0щ:i~UTxiʃI?gP)DCߛ>:X(nwk__/l6 'N$iiiJ֭# 4 \.7jtLJXXX???~z'/^cgggH֭ɑ#Gv <GZhA߯"Cҷo_bmmMI>}ȃT~7ҹsgP($ڵ#T[HRxbHx<x$00,YHRݯUOufI"i~Txe+´37LMޘʩ0m3s.7CKu*ƍ;wUVf!87Nq.<ݻwcHJJ,XQF)E!66hڴ)fΜ!Cȑ#Xz5p7" 3gҥK̄v/Bi+2U>`ccwwwDDDz$/C  xhՠP(J%g9-Ҟl۶ h۶-c/Í7͚5Sptt<~X%M*Q---Uv kkkh'OFjje2Й} BP(I(f9#DENY<Çu֭[A]>y >}WJ_kzlʖ̴kqBCCk׮u*y P6: ::ХK\t 'N@ԩS9r$x<$^e2KU٠^0lt) BZ| >R+VV\ T#F //O%Ka̙Yf)GFFaԩ}6JJJ{j=F=zɓ' @{{{eOJӷL&yQ( BP($t $%%C=z4 ""HJJ—_~رcѥKxzz"99QQQ۷zO{֭ڴi3gΨݠs"** ;v,F]&( BP(Cca̘,(DEE_ӌ3cƌњo֭qرJձb|NЩS'y1-i^ BP(!1]q:r04c=[4ŨF ZU=1G ,&5?5͕kpHE᧍~듖kR*􇽫 ]m0~HLzJ:Im2g*3n'%5Mm0xLԧo1lvi.vkN8s:u%#h]WO3phQ9 ls1HHGxvW˧p5]O"u>DcGdY2M+'*<ާ+uyɉ)HNLAn=нOWdfej ӴU)Jg5IVHeǍ|͗?geWxfLI}1l`|Y x,gŦonz7i<bx.\.?\/PIfTٜu›4[0ϟ?{ۍGj^7oD~DiMTD:dkR2E󐟟5+*O1666X/[iR1jnk̕ʎr=]{vgW9=kR0~V6y|-. ͫk4qiۏ9uZGsv4 Zi{w)ںXБ#nNp~ƽ 3'}\ゑc##3C)ѢM38y!8)P3cI((+s!wkOxazSgN䛙 =SgʐsЩ{x: UcYu/)9{wJ/ PXX̪U`PC#TblڪQ1}jHe fujU)Ě̱U6mހw7ڷS៱z*i+^Յ2hoH<%9 ǭ֫bkv+Wc zlD4jw$2M[2LtVt[[menTuܘ>k &|6>>*:S5[?3bIC,:v ʇީ_xvv:~ܲ ߯\6!m*kV[[}0X,`"횑 IDATwyOkVE!xh2uWyp"ߒw7wZ'NWٹeچǃ3,\ hnq-|II ڊ>޴_WC]`ɳ_qM$X,HrKk_oҝP ?ڏ_O%+ 8rޤN""ȏoo İnZA\}ӴU)Rg5IVHUƍ?.՗_WL5&֤>`n6‚5}^=t̞1fOA= 9s;u"[}SpܿO)QFiJ|Aٮ}څ{w31q .Vtt *}S*kӰqzW}4mzUSx=R B`)kBHXJs|`NrяF}rײbg>nBF iP,ӴU)Rg5IVHUƍIS&b˦mp8*S5[?3ͬVؽ- zP(P(D}w~,]XI\N:@V!s`U\+^~!qHNÛ412Rs *߁w^z ؼG|zcJ&i \: i>?WcwN̞7gNo i>PKHx??y1M[2jYMm]UM*Fb#lrl#4`TcbMόa3h#eVx,YٜN:?P$)R{}5Fq-ҵ1WѸq%5϶_k%@Yb0idlپ<XWYP0Ap5Į(եE{֙v 87T[qV|գ7~>_ECѫGoy1M[2jYMm]9PqCӱd!4cbMϪf}zE-PG٬st3eM [xdgg brيI<׏\2H!~L|2̓[SgRɫg@aꦒ:dxC  "sg~69EN=MSI|2|FzjFtR߻>$g$U.Yj=rZ-^5'IU}{#O_ 9I^F!9YK~ڸU!"9sG֬XK2^䐌9d͝HNSgi):I2PqC]nz<0UeL4e cbuLҡ}89u M/ /I>d5RðI5Iħ$B!7ibrc{ށXXXgҿS W#> % |v9-,,H}oqJwHN] ߒO|ҴIټqk7ibfZH'wߤ=I`W}1/'Y 2fXLx<iղ59/hM!=5`iOt L|> mvd*yދHK5ݳ7ڲ+uD.-%Wnk9TfPq ݶ yoUj˘X6K?VdKx<i܂D_cOU1Cj xhժW 1~ڴͨV7LE~ڈG Xzna BT+>TK̐bHǣ$DJvCZܱifxzz:YsZ@P(Jb~B> 7lwxY %Eg6 &7AaQ1 I'_ M7c`{Gp\W#\cB BP(5vOdca7]0>4A |!Rf6:F2S,;rCODR BP(cξX" ao)*V~ "qF6@t_;HY[N BP(FD?yV8BxyâYKD)L۝iP$%HeJ!+GYs3!`aR rP( BPj f73\xs2 QPT"Bl1 sli)WWhhKS( BP_@) jqE -P !jBr2|Eo{PPPL BP(JǬ1x"0e -Q )*}VV#ڳxGB"< BP(Ŭ18puAVɴul-HʋxŅ۹(,,Di BP( 0g?5C|()YI)NfkD컢,F\^ @*N) BP(`6to<+{s(Bf^N*':`,4WgY,Ħz+ _c1|T7R( BP(5qle bMDδRڬ+2,(U;BP( b Ox^p#R,:}xAP( BPY`!,X"X"/'z~t!t.BP( l1}b)y%_ӳћ BP(sl}م|XW8%b BP(lx"H,2/mgakN`iP( BPj8f3 K弭v%o$~H->_弍+,*;GM* BP( c6~6eo3f3J#wu9NS hhO BP( &b6ξ%XtpYN2]AX)ge(L;.lVq BP( Db'KAnN<4+c6ž>T1@htfBP( b?(bp \}`oRi1mn<{ ~=8b=-Uac@T\.0x&u]-HM|sMSS3omh5us|\w|i\0uvSFEDDD$Y$l؇CSz|>3lz [K#lފU,myllYFrxx<\. Pan`&gzÌ! F^tbi8NN'v]!_DDDDN‡v6 ÁvsDDDDDz֖IR """""IJa_DDDD$I)싈$6M+݈싈$)}$+a}j /3xc.B~uODDDDz5?c17 u?%3f`&#Ggb?r}Ÿ;=܃ .\~l66oᘻH$C=DQQ>_z1>4kw=ɟհ?z㔔h|ի8쳏x>1c?0`'oРAeYvZƎ]ƍyHMMe„ z뭔"""""=WþnZu nw3uuuXaD"ן{9jrrrhiia<\z tZ3m4zgq'N춶L2{̳>KEE,Y uؿ{qtMao׾x;0ȁ?1apwt[[nLncÆ D"JJJx駙5kV… Y|9x<222CDDDDDN:O:5k0qD.R^/_~yk.\oA4e 8p8o… -guVbԨQ̟?ԩSy7:ܠ{SO1rH<_=]wK.t/#ͩlرcyz v)w-GjߤI:,ٙٳg3{cEDDDD#"""""rEDDDD¾HRIR """""IJa_DDDD$I)싈$)}$/""""EDDDD¾HRIRn@w+v[KZV+kC < -p3il0l^4aյ,_]G; ankexqR9J:0 Ca[q~u; LL" khjMo{Gh A {ٰ_P/Y8~I _Y]ϟ*n{LSJ3(İBn3H QJ"ʭ}XIy|56rp8"""""$p؏} X?VnѷPQ^(.RRRK"""""*!~<;594ְu#;6e!aX坍_10@_DDDDZ…mŁFPoJZXo^ۈq_d>i⃭ LzDDDD$%\(/{S0(?p`5u4zIq>bչ~*o_;ȘN|>FEDDD$a%Teu5KӗYB~V:-C# եe;.?'t`fZ?kx<HBJu&f?ء3G}n8l|=؜@ @4=9EDDDDNG 3_ZMcސj""}| +Ds-WKuR^sx8wG42 ڲ:~)XVn0a=7M_5ckš9WOa)VjnF[wxرU^!c%B"#̀ĕ0-@Mcgmc{Gi a|6 SjHJ9!Ƿ?XCĬ=N6o{s7-vpFm+f9S aLk{0dI c|}Cu;lsg7ٮ` (dHМvEDDDDNS 30 ΟV*2܁=/ظ'p4_J*?OC]Xa wr4/"""" +a¾fҙY%P_F,&fY~Î?XfZjydA.\!b02\0(싈HJi<v]V7]J9klnsj[I9xVGIs k_%_]IX 3mcoW `K=Ǵu,YtZʹG`K`8"55˥7EDDD$a%>D1xe8)'tfHKkxb YHDDDD 6 Us`\kjbP7v{׺FpG+8NꋈHBKm4MӇAy.~AcoAB t!&ӆ`$55׫}I ДǵL.v5"DqUj[0ۤ0AaEnp\x<,2 """",:C[n `da EZ {]ӉiDzqEDDD$$|ognMfffo7GDDDDi8[DDDD$I)싈$)}$/""""-l.me˖ѯ_? 8)""""U-k[nM6*MLyy9F喈t^ SzZ[[[n__tifq /0c <,Z;vݻ\yyy\{\ùx[r% ,v4i˖-r֫#>(7x#D-[Duu57x#s?;}Odԕ6t^ gĈ}ݜwy=c1b\.7|3֭0M|Z}."CQTTEtm98qSTTfŧTVVV)))J0n8͛Gjj*&L[oKm\v-cǎO`׮]]ɶADDDDDj7/UW?o~TVVbYHUr>?׿3=W_}5999~zx.jk]]a+ X}6n5>Ǥww"! IDAT̳>KEE,Y7v)S{ZDDDDDNi'O k7n o…,_j<,w}7irma"%%%<̚5딴ADDDDDva.㮻"##}k'jSO=ȑ#x<\\wu,]KǟuYZQF1|<SN7ݞhȉpԉ-G{_|^{mgfGk14i$^z>mNȾt}$/""""EDDDD¾HRIRǽ捿ZNl&bHTDDDDa߲Ys %ݲ0mv,:jw SӘ;?.хx 'P>0$e4 =8"Q{s2bCd& l*OEu)l.5FBm DDDDDDbh55Qƍnc7f>-'n2_Cd`YY ΰ~16= "'?=5^jj5/"""" 2v7 ''݋.[P\˛a 39w@,²,e>ck0_HeU 'ދ 1o3 zi<i>84H5>'a֤">emhChj fPQN*f*Z2hyNI ҭk)IIu6̟<a }9sL@ȹs1aP`\9w0a԰l6m$QCbl|FEDDD$%NطȢ {12ꂱ 1b1+>o?QʁfnNvZLKu@Kh$[6 \FA>m7[KN56";0CfXX$J3JFU."iWDDDD^B}fE-5QfBCQF f˶ԝC0Fa:b1'i&PEߴ+"""" />6YnulsQν5f`tija0(pS %蠼7튈HKOۍYTF;o:4X̢9Ĩa|˂3V0}J!ŕߴ+""""/l䘍Yiy[2 44( V4Yx>JfLGIVݨ+"""" ->ojVhS9aNODbx*Zb A,؈Zu$ ?6WYM}c`(J0ѹ[~AyU }2=X ,ZU9@naoF*-` ;H(.k4VTqh$Ak6/Mv#m7ꊈ$ ݨgֱvG#Y~\.[Wpl66 5G[v_nXS$/"""" *qþF~jU*>V5-ù2(h$uc6Z11zhV|ZOl~*fDqe M뤈IHذuĺ0f k>.%0(wSY)cs;Cۈe]`0BdgkoPDDDD%t7l3y=421.(o-{&""²:Wқxmɾ1Hs`{)""""rb:cbcxA~t+>wW8ol0l`ض31 M;jXv6|zƶPWN6ѴL*o1{"""""' 8YaPeǗ|l5/#';M/`GLחdZLg_esͣ<`oa52mD#NlNm,{U_Zac_i-쨤n`7lQn~|7@YI5Yׄ/t{{"""""'$>msy )T;N ˊrb1 ap؈Dc3)A+ ȩgܤӅNt0]=a7!<6~ybQlobwe7k?, Hp<>n/ %m """"+i>af@m /ʿ:i`- ͼq oDS]5,:ljNxqNfvwDDDDDNJR}n;?y +#a,ݍϮoӍlÉa/""""I">6vco,'hƊ^2 Nӕ`w M|a۫tDDDD䟚EDDDD¾HRIR """""I[oН2RǏnDin ϬKuEGw"""""n sOyDcdQEun ' {T6QQĻvezkD_DDDDETןw&˾:Z#RӇ10/ݠ|u:CVMIyu6׸쬑LYHwWXhҗ,ɰ,R<&MW,9OWDDDDu[ˇ;ppc<j.al_;([β~Q|‰8l'% K+gPkWQGv h笱xo>]վ|‰ KO$m2(Kf࿟q@DDDDkm5WWo瑗?`gi 1-Fg༩.=k$Ng]e5D1kueu=o_IyMq}@8_NPh4F}s+l-Uӭl]8v /u;Y4y @t'7SGf뽼j+Hka`~v 7#;!^gE=sa7Heq'ݟ@ԣj_w4%m+-;鶊tۦTֵ0ah>s' m:0l6ŕ~ ^wgi /]yS/Oc:il ?@-|v%Ow.LۤVoy⍏z.1KfkwrÅN?3F_ yU5;=~_Y4@>-ŕT;EDDDDo_﫨1 <#~_x_ G[BY7~Cv/K^R}:"""""ݩ싈HPIR """""IJa_DDDD$I)싈$)}$uKo.vH'`o7ADDDDFEDDDD¾HRIR """""Io=CRƪ>-i  /fL3RXQIlw/cR 3'לA^I l@+O|X̝Kcb^o\4svEDDDDzDBX,#OˣoU3mh~ 㠮VB X$JNŰ^eZ&5|>bˏ7aĈnaznw9Mi /%}5l->^ 3}8 5r=8*BXðpK,7povDDDDDMB]{s\>YɆc2"e[(LCEsm[d1zcoS^[nrowODDDD[$j<V{s ^}X4: G,VCIrY6ԵE6ÌѹI=3[p~~䋽EnPa?{_b-\4/2l6"dS]v;QyY)8Mv!hf?(QMܵ`fP_?@Q}ak@ i.uc)WeWua7z]0a߿syW%1b,r3X ;Q6 ^652w0-\:5͜5C`:{^Iԋ2l4"R(Ս!fyD!f,}qhp{ٳ/}~˲B uL8%h:,""""r"aCrib>86ZCQB68l3"l6ۡ}nl x{'_tLN$A9٣i UJ0k4۪봈IJS $k/ at6ק9\PV~_LfH"m7b'l%>܏eYji)!ꏶU䣩%Lza 6D3rlX|7aοd4CGd #lyZ#%/Ն'dg[SyDDDD$a%D߸,?`Le20l`㋛s!%̵qb,?ig1nn6T>.L{"""""'$!v ivp6< -o;N𚐚q5|˓OmEW .;?L;xbxM;R^Q9!n@W"Q"1pm6ŰaQ副c`Yfn?Ⱥ.}=g87 8l1L 㥾A틈HbJo7ږli s [d|>N;__|LmM iisSH77lj.`h(~g^;}&i^;.g 0l"""""(!~4NAuKјTr +ŗ٤ĀjHۺ v7ԑm;a7l8viX2}"""""*!BPPF]cI4t?p@ŏYmeb m߰lO,bEyCӍ3TMVVꦈHJtǏ( {jI8m_ek۾l}[V}%[1>wLfA0e7kRi#۷)쩈HI?uXJvR߷5 ak[ E0/FNlOUCҚVX㢹aS$!~VVc[&5JmS]lݧxa/,k u%y9m3f """""\}$>^gwpjY>)}=ݏ,(fW aPsM̘1;"""""r$L؟:u"xm1}x͝䥻9PJ$N,V2R|ZbsU\?[[eh $ ye̟9 #<^r]TiFn qÍNƏkq6Hˠ ~X̀!YE\pS%PaРA|ev/=| onc_3iDmt9"YymnDϤV0`X6U{{ |r|>/""""->eǸJ=_=1~f75lQբ5lQ.5FMsgr-QrhN3n zb#̄i<.NJpm86NpN0hl 2/ ɄStS%߃vݙ̙3'""""-t;o^ˠ7_ׯMfv^ݎf#hlvr2yZ*,z*p-1vHIذ`yX#MʴCDDDDHO~/̂ Ƞ\s5[~L25k /ҥKy饗;}Oc17 u:\7CQTTE/KCnn.yyy0Gv[ /ޣիWs=^>=zt ]cƧdeek׮x>1c}j;DDDDDzRܠyiӦ1m4&MĹKyy p5uuu5.'!""""r,KΝ MzL{wzgy&6mvvh4Jkkk|͛"""""=GرcλKee%hZn-^{vsM7پ};_׎w}7irma"%%%<̚5+^GTTTP^^Ώ~& m6nnkHOꑰ?x`^x 0Mol2oN:5k0qD.R^/_~9\pq_bժU5x:u*oFc/B~iOQQsŒ%KXp!wuiii|+_?aCDDDD'ȜΖ*Uݝt\UOb1"=S`\N_Fu~fcn"@#*UN = aqQ珗~b} 8oqg;4ӕFU읲2V\-;lF0OD}xjm :[$T;e_fkw? I싟:˰;}1O"gͤ۞R?[ ={1u6ӭ9bpdK"@#*UN =>ݺעٗ/:ҝ[>3OL񈈜4g_)z"cmdF0G[v㦭ǼyODNGe%-"@#*UNHǵȾDºVDul߾۞4Re:cid_cYq߹}⚳/>lݺ۞$T;%Njfb̝3u2NJȩ{ "T<Of￟ &t~9s&F2a„x $4szHr2z"""""3EDDDD¾HRIR """""IJa_DDDD$I)싈$)}9e222yO]ʩ^Wp 70tPrss;w.ӟz+ŋ4h999L2xh4zb1~af̘A^^yyy̜9GyX,֡nW''~:lܸ 0G ׭[7MFENNyyy;ǮٝS~ܹB ꪫعs ̩FWt(((`…v{=z4~{${7+`qovڧDmaĉ{dB>並zjoӧODz#D1~N_RR¢EeѢEtxݲ,."}.唩kUUU,X}j*v5\÷rE2yVZwqk~k<۷}??+~{H;Ѷp dgg?=QoXp!---7rwc.~jwj.b̙'|'|¼y⋩9z98^?*^u 7ЭޝՔbHYSH|F! ?&` i,̐B!:0fd =H%[I##s=w\qt.9w}ί!yKff&ڷo Z[a…000N{ܐ,.uڤ:|a޽iӦHJJBݺukӧ4111hٲҶ}>u,&.^&R>Ν;~I&hҤ XNćNoܸ1:w˗apss)cǎ nnnS6,WbBƍѣG=z9{,ƍ'3]՝$PfE(r6Yy5Qڲab̘1Wgagg n'NիW1G?2=<<81UUMgsf̓-ͥk=7Xetۼy3ODuӸqc u>=em2g5;^: YebUC>bcccccܺu :t(g#o8PYIII8p}Z8Mڢk`ݺu]Gn߾ ]65jdQ}si.&guo+8y$dS3;wߗ/ &&VVV8wV^t#,, ?F޽^[*Ih۶tnⵌϟcڴippp@ `ff&=-Km[.B۷w^aРAOO7o(9`j #i*d;vX,̐$rss͚5Ü9sγpBs 77-FGGK. O0h lٲE3P5NZz_Vwi׮`D1oH4dGyf0 ̘1C&.  ,ݻwQXXObׯZ O .`ܹx ?'*2j(\r޽˲u&N9ۡ1n8\vMz1Z||<ƍ'8b\x`8qLƕY]ϱ|r3f ݻH/_ĉ4h4:2dxj֬)*ԱcGNnE둪NG"""yyy͛qxZqI9*cU|(߹)S 00gϞEAA b„ 5k'VC4jv*=E.mk׮ŦMpIgtKi 0 6l ~5g?661GϞ=9qX|9_={;wV$q|skEEEQ޽ JW7ÇW/Ӯ7o"$$W^E^^,,, OOOYue ,]3f` 9{,֭['FI&)Paa!BCC~ZhÇLJs3g`ݺuv Ѯ];L:,o\iիW CCCXXXޞӓg|2"##q%nnnXd 4i"S}'矒 nݺa尵U+NC]ڼ=ț!}ϣmڴ[N>lNѣѭ[7|{3iii|>NNN2C{]+dd$:'Oredd`„ HHH@RS_{O!Rmٲ)))XjUU7Q-B!Bx_e~HtspB!|믪nFgB!=E>!B!z}B!BB!)* !BSTB!'B!DOQO!BbB!=E>!B!z}B!BbDFFwްB ^^^u̬Z,C%  !!!(**r!̙3O>Epp0ڴiCCC7obccjd^m.C]HHH3 0w*i!B*޽)))055N&O(+Lj#RW !B>4#V~}U#"RvHKYYYYC&M`kkYf!??_eC5—_~Ç 8}4zƍwC[Ƌ/dv5#vy W_}KKKmTT:v숆 ;w '''iLTTʯB!*?bk֬?`ٲeطo=zĉ>JeHKKŋQPPEWC>}Ǐ#$$ǏWi111âECr޽{hԨg sAFFvڅkԩSBBB?#-- 9992ݷo֮]dffbӦMXz5<(9qBBB) U5B!AGwi`ll~-x-#11#GP(DƍrN:pvvUZիf| -[7n܀F%flذ P(DeX3ƍѹsgԨQC#""f|gԩBBB. Epp091B!И}=teܼySsޜkժH@طo_yg"++KzCCՎ!'L/| ѽ{w4kLeܹsݻwzP###4k F¬Y߼yG{Xa$r"11Qݻwѭ[7NL%*G!\\\xSg$~5j`ON0m۶of͚A(B$aÆ*\|9  .?D@@kfe#33s>"弟ޘ={6_Ή!BQ|bbbsN̞=Ϟ=C͚5ѦM?cƌ-YSLg C[n ???i`kkŋs TE5yd\Q>sm',wXr%.\{qƘ={6rssCPP.]ׯ;vJ>|81yddff 3g΄4fРAÄ X[[ck!B2hG>)Y,7/q§0tz~AppJh6!Bz}XM]La<B!+* !BSTB!'B!DOQO!BbB!=E>!B!z}B!B.! ܼyIIIU B=Rq;U Bc{tY1XG(oɫ.* CRjժBFRSS1qD捌jQKv.])8xORkް @aA(YG]>y5A>!rH ] z+(&9IDATaƍ`YVG{Vb_R軸TuSQۥq(..<p~`BxyMEޛw6VübBX,X,Vk>Bvb^Y])W]TB!Tu E>[UgC,WW}P[9yEGLիɕ])nff&wznnm#h}E}Y =س^ 2Bfe Hf S`IJ'2cz8w&; F{j%>;=ρAnnC_{O>Ńp}*|},"33HNNǏ^ 7޾}Ǐ#%%۷oo<)))wVv>]D x"F B(]v z7ߠN:Sk$''NB>}P~}ԬYnnn8uvqt5kք4o ann@{{{Z EEErHPq>,۷p|1Xܹ3eF^X,-Yņ5J5{ⷒBeDmĻ,?8ӣ,6GJ^uQOPTTΝD'3eE`Y'Oz?a *}!WPOmꫯ`ii ssssQQQر#6lgggܹS={D&MдiS 88w KKKXZZモ)5enn+++ԪU hڴ̎իWS`hhCCCN:o۷o+++055UmZj ޗA4ND;e븪͛?]tA5жm[޽6l/Qn]ԭ[>>>/rܙ3gpwwӧ+l3˗/Ǟ={Я_?ʕ+Ǐǘ1cЬY3QQQjS,`K|))b9 Ö˝oObq1 a`Be F^eJ_[IΟW,z^@ڷwte8@bTj!!!矑&eڷo֮]dffbӦMXz5<șwڵX|9p]oA`` ,XTܹs 6̙3fhР7o߾'|"'pEa``rDe +{n:]2]Ub B ;O>Qd53o1g~=Bǎe✝q TRI"E& r8"ї,"eKp 9|hw]_Rk^ Ôۥ7lgk55!p3{ʧbLQƍѹsgԨQC:-""k֬g}@N:!$$ymۆ?BǢEH鱱1<,B( Bp(qJݿGzz:޼y}|sh2r͔ߡx{{ˍ·: >3-%%2mڴT0/`bbSSSȑ#J7GqM7o*@ebS޿ݗ WbY2פJ-n<שA>e%%%Օ3i[]n]|^mVW^^?X[[s300|㊊FϟX7&*#>oooq.Ou\8z(8߾} SSSxSSSm|^z@ pyL6 o޼رco `ذa _Q鶍ogGhQ23`51|.-.=(aY0"n-_:]0e V >(-C"0 #wm䕐d=rU'/䌂C$}UJcdd3Eo޼Avv65k&z @bN;I&055oڴ)b{q2rS{5m4i*I݋ԩSW9EEnX_Uf<}tt4-[&*9ƍUV!((_>.]ŋsΘjCB,݃5|||dbٗ|Xn q1e)|Nwȷ#ߏY/-E1gVnN^X#܁3v_+wQ3LkaD`EĦ+ERw_TZKΪ3 vQO*Wu(L???C$!>>:uN*77/_Byyy2dzծ][:n,alMTFuw"j_~=,YX|CtthOƍ2q7n@-*l/bʕJ{5A麥g_W*ҡ,"?L g+1q7g(˾hVb_ɭ7% &OLXYYa̙i^Uװ633CZZt<ׯ-[ 1oMTF9]H:O?a۶mpB0c t-[>GBBqӧOa1^^^XhQm曣_~-;z꥕ /:ucccܹs~~~4_6%))TifbOA/T-eXf;W-1.S0s\,YP:F2pmeX"FTzlHTzsA<%&/]an*yV:vVVVʒSV-4oޜs>qFFFhڴ)bB4h@-/CJ/S9f*g_u\U鹹ұ 4@ll,|}}`%?˹.߸cǎ={6Fw+Vȑ#+l3SLA@@nܸt0`oSbɒ%z*Sݚv^ ]˲;oJƞ,g kHe^pm}'a媓)ð"+}e% isƯW]TA巊+ y_*P(TWըQP讌D3Hl2uJOJ\˖->9|9틾}G!\[VbT C.UZ'Dz<(!?YWt (7?bek3/Gl\m !Z\Rɫ.* !B*.%&[}򪋊}B䰷GRR]FAɓrk.ťBF222Ԛ/.J7ptlͭM…sظqc͝!B!z}B!BB!)* !BSTB!'B!DOQO!BZNNN_|2UQ''''[G"B!U%,,Lw%I% E!BHR>]%'|9B!B!'B!DOQO!BbB!=E>!B!z}B!B֛:zj !B!D:e_>B!ao2Ve;!B!ZfТA!B.&] y*g%eIENDB`eqonomize-0.6/doc/en/security-buy.png0000644000175000017500000007107311106571520016650 0ustar hannahannaPNG  IHDR\o IDATxy\TϙM\\-Q-+wJM3\%ͲVWrˍ B\IMABeXf~Ќ 3#ܘyÌpV_1{ !Bq|2ZQ\a\sB!Doڽ|>h]5:'!BJʙRw173]B!}K .!B8M~܌;6Of| 9YwlB!2F ؘGhnܱ !6c6jؐģzYp)Rp !R:uyܲ>1/8c:O?!:|=O淞B!=rKupbHޑHNLRАP|񥜩Ʌ3Ԉ B{BidoS=o+:|3:|4ML4G%nlcvBPg5o7뇻[AݚTVDQmZf7r:ѥ+mjh̜<Χfh*^"xo>pwg^, (CٗY͟U[R_S4Gixt =z,(!N =>Jkwo^5Xo\'75q|僛$7G~M=zL$#K%\yʜ=zBi\Y.R!۴=3^yV.˜=jOliC^.tTXƄ `WC#[Rdw/ѐJ~s{M>;qҀ*5_{hĘg@J~O~M}j X=ͪ?zGus/Uサʝ lOqSqkTD{c_Yvy [pJߞp]4H@nn.9UbCn.MբKWܿfxw#&n:ûHapVBVqr&\bױ7hTc1c$]zn'k^hi<迦k;_$dp2 Ҹ2_֛u$?Z=x} C)lJ^{5Y+n~xFtF(!CkI{mi'q8n@*;̳C}_S/gEnT:O0ZNp-SPuqJYn+0CU|t$_fÁKX Kf-kgUW%zȏYbSz`4os$_vjc<.J:_]hPՓ^apL~u ^):~%?08$ibϻzŏ ]yYv;0e[FղiFy}:kWo긱;nBQY,qe&~:ɮiLJyl]ybĤӼ޻],x:Π&սh*8_=tS?%64)-dLSf=YVZ끢(װקaUO&E!+1m1\Oiǿfݪ<ҧ \JyPy-m]Hgv{>;t* ׯXխqE>ǵ3J=7 jϧ1s+ۛe?krjL\OtVy+B><]\S?ۄdOҢfO5U3!˩ ٸBRoMUoo|͔wS'/#cvM߂{ѳ l+yF9<˺:~W,u=2ݽb_uR7vr}7fw*n9o^3{Vpno3)^~g7 + cf( 9yI¥ UTjU䐢X9ZԮHtV0o961#V)ZSxTi<GU}y%խgGh7x: VhܽѣvY}9(OxU >:|tti/oBS T 7M\WN<3?;Mv%0O4@^& ϱ8ڽ^*60BUh8oc,Yx{ѶF8cN&*m-zWZf6mω/2r/ﹶ]5Wod_wwAzU-y x*Z5W^ӿ&+v]dM okєd3cwS{|y<@(k6gU`IӫTҶ`6o(Tb2Ah5?nq -@+{ ֫]WffzM_%Ⱥfκ,=CYn*ާ/i;3~U߼nǷB^TH<[ h ҲӸ64 nA95W4flMgsWߗ+pЙM4[Xڅ<khERk(=% ލEs:ǹ)γmyn+Vw8F cT/d]Qa͵SHqjUи{Ov 7/L zFT :6DVyLwH-Pkͣ~ێ>0G Vzew$Mʽ ;Q')xE_jغ+xEř k/?K<6@^&&Ju! l WԘ5skpbRU 'Lj@GB \ؒ#MRL=;Tgٰx{#5o=N|j_~B63 x{h$PkQ[:j_78z2URk)_D ܵT y3_,.1s9ύG)W1̨ݖ*dq^SҽX V˷a{p:WTxը4nWbύ&W$l/륺|QIs ߏ V/v_9l8'͂ Nr?:)AQt)@YEew/ߛmZu_'=f3ϼM<dGqRۣ9p)>[m,qF]ҩ}sWyj sxn~HOeEHQŎ+O)~?-WnqGɴg$YrfdCѡF[ʨ= egLF|ÏS?`RSF8Ob1c! gy|QyҺ;ѐE敳fgED㏻_Unyk@Q@BGf9mR6,j^?O΍4Tjl DL:~Jؽr RåW A@zN>ΰ{A퓗A柧ɸѐZk'[ޣzRNl}=;h*q/{+xN[qŲM<>+gh԰71<*();?i6ʪ]+=Mꘫ(\\uC< kS󮈇 Tw˹!y_aRL&Tjm%q+jw]ZZ#9(=\_T(BEƽNyP}@R.\#1 J*nCQ"aQ3Pt((n󮄧NE/e$/TZ?E37zF>()wѸ3&Z q£rMZ75P~{+xEymm6qXT .pվE?F'&[^U9ϣR * ',P<48nTT)rno{ۆixY#ou{ǜ?GC*[Gˡ0Gvq3=ʣ.JGjr%+jvqv)e}|;Q2H Е%Wk߸-NnBJ-rlr{j(j- jo-=E Q4I.z衇K!(e}HQ}+[D šPVNC!-K0zHW Jtr)Kpy)|Y .!(z)drq&$;BM .!_el+h4f6oʢJ*oߞӺuN!~~~ʸiZݻ7Ѹe:K};B )Sp͛GQT9sݻw3uTvY)8N_!))^{h,Yrǖs2`YV@=+xyyfz)+kƍ8qKnݺԭ[CV{t4nܘ+V҂sΞ@^^gϜaΜYL:ŋZ"\BQ+T@llC۶m#22ذaݘN:HXX7n+|^1]tZjTX*@=g3vjj*5kּMV;{i,d28STԬUo/8_۟B]^p-XaÆѫW/fϞ͛9}M܎;9r$SLܹslذ uVKۉfƌ={O>ݻw;SLL ogΜ!55jpIKKL,_f>" GeԨQ1N\6noCP'4ZyD=ڝuBh߮}e^*vs(^# } =փ jSfbɫFH>SzJ:!4nT_ 55])RWnHHH`ԨQh4oNݻ7/_-Xe˖ѫW/hҤ VbΜ9`:v숛Z霖/_N˖-jҥ z_~ҖիK<4Zpo?ڵرc̚5,$~ٛԩyʼnoig.1vD$bj/{ۿӦM)/ko|~}_lqW`w>}?r/ݑV^M‘$vއWrL}iù;)S={䥗^b$&&Rn]ƌc_~VI.]8v%&!!',,M0en_LƍWpoYJJ qqq4k̩v_p9e_f5jլF`t~_gi|;vVA,Z Yb.[ߤmhZjԨ…K.ޞf͚VKlw$/,yD 4 *T嗧[T%rBKåjyW]h4|ǯxEU)gDEEos%Yr%Çwj ZMڵYp!,]¹߉c4*go^^:}Kߧ$$ʰamT*;C-(j^ ٍH^jնz]|yzù;gI%e[\/"sA^˗; ]vEմiSKn ==K[RR9+d*>f{=8w@Kxmƫ<Μ9,۴mܷի cℱV9OQȘ%rBORlٲ%-[t(}V=={gϞv~z>}X~.~U{M޽!--_kq+̑oe?UI\z!C0n|~CmyqT.ϯdI Oۜ&-L5Æڞ/;#$,=\er,]%Vi-' :4c'D:%eKn QVwYGO84GBmRp 2/w$e\B !D&/2@~GBQI%xzz: Q )lFff&}GڿB!n\zL#{عBѬYb):uSNNC!'͛7ඊ.)DO B!DѠ*JB!:)B!J\B!L .!BR&B!D)K!I%BQʤB!(eRp !B2)B!J\B!L .!BR&B!D)sYe4yڵ+իWr4mڔ#G?*-~~~Ng5Ӽysx jB!沂kʔ)ڵyq lBxx8SNuUZŒ/ۓfY~=DGG:5!Ti\7r ,mu֥nݺ :UiHKKsu %NGƍYb,Y) !e{*T@llC۶m#22ذaݘN:HXX7n+jTv???>ctBjըXUL'=zfTj֬i)dXjkҼys`Vزe :t 00`OJJUܦMh֬ekז!Z`Æ W^̞=͛7si;v0rHL¹sذa .d֭۷͌38{,| wv:z-Μ9Cjj **J " =ʨQѣ},\+Vʕ+?>[lh"~mΝ;ǡCf_}111q/^|O!(eWnHHH`ԨQh4oNݻ7/_-Xe˖ѫW/hҤ VbΜ9`:v숛Z霖/_N˖-jҥ z_~ҖիʡIlNo׮ǎc֬Y+V`ZjNEZfZnNr̞=]vY/^ya5B .-={䥗^b$&&Rn]ƌc_~V_]tرc"##o;[7a-[fy_Lƍo;I)))ѬY3رcoު_ILLjSk___z#Gh۶ULB!rO݇KꫯgKh$99:--搟L&M[sѣGt+WNjj׮… WEQJ!+!tz͵i|yOŎմiS[|ӭڒ8K^( cƌ#>> 4`V8@Fq8pf!\VpZΝ;7ߠ&66A1dKԩS6m?zC߾}-1L4N:-;vIMM`0? /8sժUٷoݢwڵE1p@4;n֌F#Nb„ >|p`0ǤI1bS=ɓ's!qBWp}oK!$F[g,lJ&' !1EN Rp !1L5BP#[+v'ڱcO=T\zsϱk.W&B{hh̳j ]+&5gfϞ… |ᇨjx;??;6BQΝ;dz>?nnnhт-[OQSaIIIDEE퍷7>(IIIgOi/#ͩNhݸ:!VqyZsNmƶm֭hZ5kƺu1cRB!\ʕ+iӆjժ+W߿?} dذa\x{{[-\8gXƭ>Kn>Onr!šC2o<7,נAo54jȪ-,,cDzfvMLLe(6Wi!'OҤI݋dr*JVυr1Ǐt=wc\ү非/Y츥eW.]ڵ+?ov:tA1sLNtt4qqq 4i#Fշo_Kff&޽Z*[tUB!%ݻwgڵ6|-wa-{Ml6mD=n,]҇WO66mڰrJεkרPZ>੧B3tP^:&LO>qܹsCҦM̜9ÇsEL&(/5eZhq㈎חu1iҤTbĉj Zy-1Ǐ'<<5k2`֯_G}/tI*eVC#}9s~.K .GyGyؘ2p[w<)BK*UyW ==Mľ#F`֬YƢR 㭷ޢo߾ʕ+sN&Mī @dd$;wrNǥ-˰,EO%<^0%B[UTa͚5Nٳ'={,1^z|Ww$nƍׯTaY8y?'Ny#Bo 4/Npv?BQvǻdg)c~~bQ\A .!B9'B!CnRpRXX폥]vNE!}ҥKoϞ]5ٔL .Qj oǔ)B8Vt7I%JC[-B+B!L .!BR&B!D)K!I%BQ*EQIˮNC!}=JHn !Kb+>'W">&XQ#oez%(UbS\B___7bEqO>K!$erҼB!ëM Rp !1L5BP#[+v'2tڕիSre6mȑ#,q~~~Jkyk!h4a4YMkYԮd2e vb޼y8q?-[ԩS]M2!7)bw*h޽hܸ1K.d29$ۛG}{&=\7:!vꄆX=hƍyNGݺu:t(;wtUZB!=d2LEFFrKnܸG}Ė-[xK;%%Ν;#Lrr2ݺusΤ<Ξn:zdb u(v˖-tЁ@߿?)))V1/_&::*UPN&N^?K.TV+Zm۶H cÆ Vc'%%OL@@;vO?-1k?͚5cӦMvc7o?_j~Q{ _p8k׮)n;c,#y!7L:o֭[jiذ!7ndٲe%]h}aܸqرcӧ-ry=C ,`ذaՋٳgyfN>m7vѢEۜ;wCb:uDDDgΜa޽dee1c z-Μ9cwȑ#2e ΝcÆ ,\[Z=tޝDΟ?OLL _|EdV\Irr2Vb޼y|W7of…XdV\ٲe?gŬ^d{=,YvLKK< !(;̙csQӑYbm۶3ش?3V߇K\eWnHHH`ԨQh4oNݻ7/[?f͚5nNGʕ={6vILL駟͍@͛gS-_-[j-m ,`ٲe 7774iªU3g%ܹsooot:[u?>-Z@ѢE ϟŋ-WX hժ%&&&w}יMɲe˘?>ϟov,`BZh4?KSO=Ub܉'hРM{9ytzUKo|AϞ=ٳ'ӧ3f6olSU?___ÅW\a֬Yر˗/[nRYדaaa69ӯ_?}Lǎ"""Hlֶm[G>v۷i߾=%]PBBmڴj+JގB!M=/"-Z ++o,Y{nM6;tNFF^^^6^^^ddd<Ξ={ap4jyW]U{] < _8Zmh4lnoзo_w}+ѣ4ikw8zIa%mG!ӧ 6n/sN|}}K\x{{[.\gϭ>Kn>Onr!_|\˗/;}vll,3gΤvڸo>?رcYf w&&&>yݸqc ~FY^{xxnSrƍ )rŜBUVv]_|۷SV- رc6Ǐ'44qrsIwzJg\Vs|7zeРA 2ĩ5jDLL YYY|׌1¡SNeڴiOdggٳg}ۗ{IFFw&$> T ?#/rFItt4 },1-"::prrrWƍ*Jx 0`.\ 88#F+8fΜùx"&INB{DTT'NUVj{/ly7Yf {)q@#Ǐ'<<5k2` vC})|š>9{f?݇K}sќC[K.e]r*_!CX=&~|!e֭[7oT*?~јMKK˕FڵzUoƤIسg#՘ WǙ%Tndܸa]~戮^gd`֯6t퉋#66ѣG;w~C]GHIyo4/nÙݻw[ر#G2eΝ;dž Xp.͢,Y+W̪U7o_}cf>,ݻw'11_|ah"~mΝ;ǡCfV1:u"""3gΰw^1cF9ζBqo2dM{wi7ona]hϒ%K2e Mw3gXt:233_X DÇ9r.˗ӲeKZݾgt777BCC l2zꅛM4aժU̙3ļϟO-thт[U]:;w={N#""uYŬY֭[\2gf׮]V1<Ӹȼyl 7{99>rHW!ʆPر#(  !>>ަ=>>bƒ?'^^^k׎>SOw%zӓ .|hJV3<ĉbŠ#!!"ӯ_?vZm۶69%ر#QQQDDDIPuԱzkuʕ+̚5;vpeUt;J!ĽɓT*rssW__~,[~1cX}sUOŋСwfԨQ\~nM6~{*1^҂ˑ=%ja4INNƹ]7x}g;^yFͤI,1w6x`6lȗ_~IPPnnn K̩4B/44d7Yf>|ء|̚5xF#k6ѺukK[Ϟ=ٴi[p}ᇼܹ__g))Me~EӦMٻۻ( /J^) EPAP^Kl,vDThLDMA\TDQ$ޫ"PUÏe]g̙sLrE ׯ_ר(۷o_*mE$aڴiؾ};hӦ tuu*m+$vZz*oUp܊l '<==[չUX )< ҘT9VKqE,X666HKKç~w;///,XW^EڵѩS'x{{]^JJ™c׮]Ñ ,_#F՛?>(zkߥχI //X3\DDD$&M`jmӿ:Eٷo;[n]TyOQߥXɽTWQŴm67-.G;w)]_N)wKQ$}6%.mgp|,EDDD$0.""""1p w)$.#66N ""c!r[v U$:eFn eHPaO'"yA*k^4U.|-[bȑ D"cǴ=,={/>Gbɒ%r?")) IIIի\\\v=XhV^HNNƂ qY>vލ9s /^ OOO3Ǯ]0p@"33'N@xx8bqǞȟdцr ܹsgOB,I&011Y 얁l)prrBF w^~9CVv͛ann}!88X޺u0x`L>Ǵi0x`[NzgϞř3gp8;;COOzzzիN>1DzepkFڵ@_T8y$F͛>)v؁;vt*g)Ţ#.Nݻw l,^S/BBB0yd̙3ػw/֮])$ˡ#WVF deeɕ>}#GT~ȑrTqF̙3|#X[[+Գ/R*}(SzuTV.w&"T HyŰU"8U1bqXjNLRZχIru||,DJJ e?{  ӧOekPـc8~8$\yFF!##Cz/^E~z8;;0e|cƌ)rpBxxx 88]v?|xIWp‚JB T><=3mZ}_Nh/R㡧7RRRS!))ItcJJԤq)ԫWOn]QAp0Qޞ={ڿ?.]*#رcrJ?Fd]'X>IRywA˖-1m4:DDUt}|,2 ѣeehӦ tuur(=/keeׯ ;hȎ;0{l9sFFF 덍qm;wXz&&&E^_U fQ0`"##,DFFVZ{Zj033î]?*CDTrޣ"Ukrsscy5*i5jxo"ʤby]ȩY&5j| O߶mb1ڶm L\XM>_|ϟ/w ɓewt,nnnŲ٬,^zk;v|8bL0U&ohjvѼ:w)=]2|p׃  AnGGR@RJJZO>… }hjhh(>6֫_>v >YYY1bĈY>`\zkFN wwb}L4 x"w1zzzbԩADTY?K]Ur&uΟ*unGUu߿?QѧOG>*.E."""pRh4åtK[a""" Gk8EDDD"bH$D =""D5N"HdY|RE \Qe"DiHd)l*K \$8;Z&""*/ū}*3.""""1p H` \DDDD]$8ɥˈ0X)=""$6oseSf(EɓZC!"J %5ۗP.A \ThQ""߅ȗW F Y~hk.""*-f4 OUn@iyJJJ쯐<޵G{wƍ<ݻqDطoZUٯU= ggg4n-[رce_@҇ )30˗ʕ-O ́I+XYc\1_xZ ۼxVvxZh$+o٢~(6-`_OϞm8t{k޽3zQsuʼn?/Cjj*lm`gg)/}z~n=aܦwġZw.tu=r KQ-Zh$[TɅ .%Y ߥɢ :p@PPVX$'':kCRRn݊իWѣrۮ]˖-CBBn޼ ccc-… CšaÆ9sfc޽;llldggcŲgΜX,ŋ_رc SyuaʕHLLDLL ԩ3fxw*7%%E_!yrҥ+0} 2W}FB#zRi>7D"+\S"';+]} Vf߾]ջ/ޖ͛7!,<}Ilٲ 7mn&l,ǡK\\AXlNE .G ꄄ<̙3q7b<FpY[c ظa?&wOc(oeKqυ .%^W3lդE p&5ZOs9~fƛ6mX kkk:ݻwǂ *+;{,VXٶ/^D۶meu`hhD333rsssjCFFq]@^޽{+_zUKY@*Xn``K.T>55},k~ _ş,\<[\VRdpɥk{pttՉǗc=d혷kshܸ͛7p'~A}@J |;BEz?Ui;ŭfsP_*;RǪv? /=ogK U3::SNUy6E:eM<-͋D"۷oQreC\//|jgϞ! !!!x)޼yV$a\\j*LLL侯W^(*fM]p=_Ɗobod^χgr]*̓) /'3Zn Y722n:̔ݾ} 66tkgh}Sif=`eՓS^=XYuЭo^1SewVn}ζ{\YQ۫sdpA0nRux|ׄZ3~xF͡W^aÆ(d<{?ժUnjbv ?}dŞѤIS0oFVgO|5}ر}&M*g]_N^TΛ ;0nLMw!iIu_ӻ+: cɱ""*+p)w/½)]_% v… ѣ,** )Hp"##|駈@^QzUVZHKK{H2 fR%3\KcE ٳ7}Cvܥ4kcz"pŻv=FF?66~Cpmx]P p2xxFW'',X+hذ&M"۶ ēAӦ0a?X"cIDAT\icq'`,l̙㍧{[(ODTZå}tJQkw)Rհm1 iJܾ} sf{ϧ="*˗?QH%K?WRAӧky4o܇/\޾ N'aF8p0DDDD EDDD$0."""".Eei{DDD|,UNaNC!""B yb"A-m\T恋p H` \DDDDz a`llO>fff=z4Ν; ˗cҥ?~>>ra3fȾޱcѰaC`ru pI&hڴ)x;wh֬5kQF祲->}NNNhԨD"ݫ0G7F˖-1vXY;[%߽{0dl5Bn?*ODDDWtt4tRlCaڵ[b8z\kbٲeHHH͛7all~aѢEXp!>|84l3g,mCBB0yd̙3ػw/֮]SNɵn:\A:ud2%%EooԨQݻ7cɓh""":4ԫWz}֬YΝ;Fر#ez۷o=tuuQ~},^)))PZ*ۮYpww.,--?` ڢFOtRn HLLԩ5j;wS0Qk ۷(Wx2333T<33Tv<<<\|511^z cPf֭899ynGDDDflllUjU^!))It`JJ 2˖-Ñ#GЪU+ڵ+4jGkkĉXjrrrϿK]vpܺ(XXX>XYY%nGGGRT:HiӦa c"""z聞={O>8{,ӑ7///bDGGիW7&M̛7r rrrp :Tv6mH5tPDDD ++  CV.E""Okp/uVxyy!==GΝO? LL8IIIhѢfΜksggg`ɒ%A^^1m4C+<?.puu{xzzӳEݩJyI^_~u4h PGcû?Kc""""EDDD$0.Hd m2"eBPfgp"""m,eMeggY+?DDDO) H` \DDDDc""""EDDD$0.""""1p H` \DDDDc""""EDDD$0.""""1p H` \DDDDc""""EDDD$0.""""1p H` \DDDDc""""EDDD$0.""""1p H` \DDDDc""""EDDD$0.""""1p H` \DDDDc""""EDDD$0.""""1p H`d:`ժU++:t(Q% \UF:teM(poCWIADDDT.""""1p H` \DDDDc""""VpUdHKK0J>4h:KWF#D"Kv.Q \DDTe凭񷐐ᔈaK0"CW~ؚ:erYJ*fΜڵ-̋ \q2y^UCG1pi*!!ӧOGڿJ ၃f"J!JhTCi/.""*CQua_Q) !K8 \DDD2W4EDDU^~t9zsS#a@w;rXa e/ѯo/lX(}J ر} U{LχJhިT))pQWUsqZ f]}2VXk XW>y#aАcb1jP|3m&FԮUR=pi׮^Eζ*Y_|*µ`ŊercnK0 ] Gaٲ:!w>fϙqwk>DFX<ӦDͻn9x#Μ.R$"*O՗WOm !==]nx5ڵ+|.Dzz:֭.˾nذ!{W-߰`|_8:t)x,].]vFrho¼>pu%%EDDT @uŋ"_E ֭+Ѩ^:ƍ.H*S4\uEZZ 꿷^rr2VZ3yPZ5侯[.233eeoήK㍋P^.""r@Yt1 }?S",E"!FNעG^JWGYpp%O Sػ 4i ]]]~ڶQ[X ƛPºx Uy^3toڀ)dff x z"7~Xvfg*5\FŦM둝t֭!J}>>sѪ!jԨT $Jn:- D9+ձ}.""4 :Xca dffBdF[;{8w^䇿sؼ?X-y]:ٹ;P#;;1}^T e&"++ !!`\E`פ)[/^@nn.3S~ڴXR\dff **,wʓJ6/`)~6 {5z,>@w ?l2=_MZ}P^IČް=1/_;`=JXf}h h٘;G,wQ/wr #prܿ 6)u9vjܸ 4b**.""RPŀb@w~[Z"ۨtꌮ]lE˖ضmº? ?p+\\\\ߩ-vU:.""RIL7U_]B.v*ջumw \DDD@{}IXo/qT$ \DDD.֦KH` \DDDDc""""EDDD$0.""""1p H` \DDDD{O: w5"""JFWxb DDDDT226ADDDTiܸr~/@*K'IENDB`eqonomize-0.6/doc/en/split-transaction.png0000644000175000017500000010003211106571520017646 0ustar hannahannaPNG  IHDRT7e IDATxw|M]YH "#1~j ZTVRQ)U[!AX!Q%bE{Y|}Wyγι~sιr2ӳ0" ˀB!vys _R\3#OB!7+Ѝ8~HH->B!*Os|qBQA^uB!֢B!2r3PB[7QTF !R{e8' έtVg̃XF !R{ùU+ܪbB`h^뗧,P@E!/+~9B`c ܛt!%!1F'BHp4 X[CK~y/ak1= JLyyx6bB"pPˣ%?lkcGC#G߆szG>aw JK$6E'+44d %ƨ]ߕy}(MY]}heuQ kjuSMH%j%q[B֣fAo}Q$ d VE."g3c_9H%ou=3בLvsFhٵը𵢴<@ڣ+18_%SVY=Esj.m&Vkj~@*Kfi-6r}*_^ݬR~yu(˓_gYIx< >-I3mPTR &\p P0`@g>LC:v"0qB* qV ATR._OEE&K^s dTL+Ȫ)ud͛vPIߚ6օN|2.mYAzkܬ ]\%wΣQ^Z_ǥ~yCUڰx/[BqQQh L(*.F2/PUK?f@ľ8o SpJJ@`,)?c H,Ķ/q6:Ua?v]慕{]J|( *k=Ƅ лuᵤ^uME% ^gƒ4{FC`[Bgc$gl,0GC7Ÿ4 GnBOl 103Yr>v4~ɛҼ ٠MĽW$SfTUo|[o[X!1Ə4 z|l+_aDWk3|v%lߥ,x&A'!Mnu**?V;fV !q$)⒙τ5_u Ш}ouW$nK,_H]8Kj[Yr7߯_/^)X|n΍%%@(.]_{٠[3|&_dz%#7]A^KO 55/3D7-9(-6(v 3 bqB- Wlz4peᅪ'>/LYcGbdkBqCqɹ1jI^oTiF4GJV!6_OР&s7gV՜SS32wKCYP_&Ŋ!^rlƪk3]1&7S\=\)S>h]'CCjA$_, }KΠC#=O>V} L->H$I׹M苒dMj=#-53uXx ėk~DRTY%qޝ=R^?Tԣ8]˨-CeTZa؄T 9yEEH+HC7[kޮ=nfv+̌ 0  n#IdZ5O3xVM|{dg<S {/[׿/Ra|{8\3`|w5n&zq0;M$iah qRZXa/*II6uY@`l =9{oah<}cGqSY9䑥endi 7GJv1r PW9?$FTԯQ\_㔮%֗RӀst5Aw~ f5-8= !0Q9qX?,} ku#F>J rlO~'o=À8-164S5]>)1/0] d0L }pwj:fFp.]0~g<|})zpKݙ)q0%061~#rei` 0HDR3U8W[,C?V/ɩ_|(τ5vm+mSo'O7TAYcR%%x]7O` Tz~6Lq!墙eAoLIL2q$A 8KQ=5Au+#}  N|2&pmW䂂ǽCSi_$I$UQ;}j[/SodžڿX'3.Ni8a`1.\0e Whog p+\n J//_ : -"13_m}^oϦc$YjcI1 ǣ[~?8.EKqj*4ArԷ3!2gB_NZeǘiv& `an :"1ߧ YpW hj[>-^&<^.0jvyKd=+3욂o"c[@QRmnE%U8Y!qaWs>j$5EsVΫI1Lv2` D *Nƪh[Y6BfQg_F b5`BJEӴS֜|L5|}ceaI(*ᇡh*@ѿSclZ:FRgw|Cj?Ru ؖ{Y_jի~ێ1rMʂ?mzX?6A |U"?_Q\xz p&dnc>H/ҋX7\.9%x&vF{0o38r9z2 1gkGpg.upb(wOd&oDLt1ó}?&|fF|dXx`JJXe>FQ◑01@Bj!_z`Ҩul i3<q0qY\~crm'Esqq6ljY2A{;Ic_5OJ*LxN0fen ߸Hi%4O=DƓh7}BQNawFr'xzD:lUX:U֥];}meNcɌ@<|!Ul%*x|[3#;e >\ *@ P?{ORZ/y?]#*px| 725xR_7PR\O}5M-K2!YLʼQ FTz^[?VWPA`l**Wq(DI~&"'Og96EE{ y(#*Oz0ڂot* 0'ҫSXXo\|3pcՖ>E()Aޛ'(I<=C Ƕ>EsiyIQ>Cq}))76/S8rR]PM1baXq7H}ccӿ7`ѬT:i!H.+O!AcFMݬ[a70yR.x^qޕ/5G浸Y=p E)SrrbWw%EQ_mX2KKryzŲM!07 Sz׻ڸ<=sVo|coQ:㽻 8'۱jKV70Ur˾TP^em}4MټHDFMPSn.OPz6,[CGpP}Uc佥_Fi0ئ7_lɫM/P@:STGtɍJmxwFFi}L^y&2dtMS <%t=>6)ZW43^Yv#K~[뗃s W<;ʥ~H*w[~[!.)@!GLC}HB߬>8N_.RLR]pA3'/]#B _)iO)¬*kB!6 r'f%dF!B2}$Tc !BD!B("BTB!ZB!DKPB!h*B!-Q@E!% !BD!B*~"'Uw7!ZjUT8yB!r@ZJL]?B!j?y *B!-Q@E!% !B{B߆+={  HKK1B!FAA޼yp̜9ݺuʕ+uLB!l>0tP"""u3UpDA!Bʫ{1sLROݻwK/н{w>|XX[[{ B|8ϟ#88Ǐ;w?>={C!44T`,[ O>EJJܾ[7oFbb"lق_~'OPv*--Mȳ~Z 6mBbb"6oތ+V $$Dի|r$$$ ** :u*$BHUP(Dffʕ+ahӦ lقKJ$$$_~055ܰcI+rJtppp-[ݸq#:v@o+V@:`ŊXfZ۴iV\N:I Ư*Un۶mpwwׯ~ /^*C !کҟsss۷ocذa2ܲn̘1޽;>c =4::^^^JuqqQٷ.]ȼʋT'bbb^[XX 77W!R3Uk׮M6"RҤ.-Y=t jt6]p8B!TJ rss#FHڵk;w\'Oƶm*PmaaaZի2[n-yp0:pz!BjTx9ۇݻ$֬Y;w.n޼ҥK4h̠A< 44@(,,ē'Ov_O(!** $WT#00(**Bdd$0aC#Bj'C% `ee7772OJƢExbDEEA$'O?~< @Ν;K=w ܹsCX[[cjoŸqs4hO$ .?^za4_"77ǏGbb"5jT?B8&3#T¬dܢT%jSۑ7qt !R|5 _?\YG3H@?L!- !BTr!Bj6"B !BT?=C*% !R~sUsPRK0j !R9XJ>W5EU-ٺ;!BGPB!h*B!-Q@E!% !BD!B[~X{7A!j..mI:(gW !R¯DI5ZwUPEU-%vZ]!B]D"^wA8r*B!a P1 uPB!0F&AXEPB!0G5 P(VVVpuuСCѳgO]4A!gsҐǎCϞ=1sLL6Mh0 6 G֭~z;W\\>c}4.Nԩx{{ԩS*ͦ #w100`57oƤI  p !I|ڋPСC:tH9[8q8pBBBxbrѣzD$&&=z@JJ`޼yXbfϞϟ#%%sum:/>3Vs3|pԯ_ZBH$ﳂJ}R1fΜ?C*=)) #M\egBd)򂕕\\\{nv?3\fٳg@VZaϞ=ذaTիWc2e annɓ'cXzo;wΝ7all ___>}Ziٶ!1n8Vs ٹRB!i|&]SsΈ~S!??PzP"vyL83f@BBvލUV!Xt,===I>}CYСRsɶܺu0c ߒǶ=z7oޠGjB`dilop)_ƟJeffJ`Ȑ!ׇ5~?~\e]+WĆ пM6زe .]*U|DثS IDAT Ɨ_~)'''-[Ǐ.t FFF066F׮]qcFE۷o_~(uiB!5C'r$Q.nJ&\۷XhΟ?$\ձ۷1l0t6~݋G"""B*=''2卍vT̛7k֬7 44&MBVVFl({4 !fvR+7Wt5iFz̘1066Ɖ' !))KHDˁiiitðٳq)XXXH) *?зo_޽{O?IU:mwk2y`KB9*/qqר&ȓ 1B Yfo^q83۵k;wTf ۷o?sΡiӦ2I!.WWWr}m7vXy|kCB9*CU~y¼yUaa!?}{pww.wvvFpp0ӑ3g`„ Ru"<<\ffܹsqM 77.] A}Jo_p!.\͛-ӷo_ݻW&}޽۷[nɔu7nlKIIATTﯴ^MB!53T*t,100?<)}֭ D˖-X`TPpBիW`Fr7-Zŋ#** "… _dԩ;wb|FeUJ("--3T+V…֬cccB -ecvc{tڟ4D|R! qrr +)))+.\uRRRУGܺu <닀ɭGU̙^zIo,[ ϟާBׯ_G%pvvƋ/SSlm+F<掍1x8rFDY#ys L-/X?VX6== W#2J9f㉴XXU*9nވg7oDy9(ݟҥǏKlY,FOR[UJGq)9V׀o}ӧo݉%?-Ÿ۶Hر cc<StǏcն#‚sq-X`.FZRs ZT!** ӦHFD5Zh͖g^j%={`ɒ% G9s`ݻ70w\<|֘>}/?~<ѨQ#|8pիvڡ-Z)S0n8ƵpBիW`Fޠ. L: nؽg'f̘,XXѾ+n)YGYwNիV޽`[cItœ9P5)z$!!* >\..mp>xxtB!5BBBFED\Kڦpt' B柉..m$p@!i3B!: !BD!B("BTB!ZB!DKPB!h*B!-i`OPLZZhB#!B:H<6B!h.YBȇ*PgϞhР֭+KJJB`` llliӦ!77Wjݐx{{vvv5j%e_VVV޽;>,Uӧkkk`Ϟ=>/^۷pssî]dBasB!JPcٲex)RRR$>>>pssӧO|̟?_jիWcHHH@TTLMM1uTI燘<8~T9w1|<{ Bhh(PiiiEcժUشiyfX!!!:!BjNcɌ@'0+''ЪBE B?*Ɂ+=z$Yh޼Lzz: 5nݺ[[[}؎/>>>3gz%￱l2?RC!G3HMpqqI{--Z#)) %%%.W䙣k ucƌA ^^^hذZDGGK1S*111:!Bj*dƌccc8q/^@ZZ q8u/Y=t jSU!Bj*=C%ODD<}}}IZxxFuH΂={ ;wF@@vڶm0ʭa\={JҮ^ gggB!5G?6HOOG~~>Μ9 &]ϠA< 44j\|x %0 @DFFP{Lз!Pmݺhٲ%{,Xv2~x!22;wz\vz ̝;>5O._p!+0 #/?~<ѨQ#|8pNC!C#ByU__#B("BTB!ZB!DKPB!h*B!-Q@E!% !BD!B+Wۺ !BTh߾=vL{7zT{'*SZuB!DDD JL};ibUvV[a#hTiPE︸f .~=CŴӧ_~QPݽI' +;O.~P~%BJ"27lf .~=C*{n0VFs D"s tU]:6 @hvnUJ=5*WAh.m iPwP@U6 @hJ7A‡T$4ՅڏGsXU̍5F-oWTPIo`ǏŐë:lc|/ `ZXz=q .uڭy/h̜"|}`*hߧaEThKu/Z_ vDuUb :S)>,Y>O A8pN<8vpa<}J'cV}2t8 UWxO:}a\ϝc 333x|i݂3ftk+W{U9Ú|w=hUCeslF{@ E`M}}=mO$۷o0Ǚh٢ \۷Yӑͪ]6}F7OwٳK}>ReG$%%I)Cǿ#GB}вE8l! 66aC1S3rjF˼WTmm/]!h~RG²%9d{uz<ܹWnI2x .]u>¯^z=f;hzŋ&C6l)UUq+snج3YzUm?HKMqZ,_{A ɩVYU+Wa4l͛? a ;صkD`ϡW/_r'u:T%?//o~=IZqqvޅ#hRχK;,\mz#Vl.噛#3,jg3&h7l߰Z.]ڵǢKmkn[|ԩSgϕ T|@Iڀ_(..f=wَWỦ>} }̄yr>| `ii i }-hRm"w-Z>Sqfs\{w1`oС,,,0YHOOe 6AKWsXqxXfRu\adhV~byroƠYF}G2}ǩNa^=Kիw?E~j Rs >IyUFw7HC'[p)4l-Z8IʻuZ׭C'>7bE\.WetIs) E驩033SkLC'_~piֶlwQ:NNr[+8=>>;yH=JkҤkSS3ގPk ss$\v\qR(w@ܩg;^6 9WOll eV|333g@(#]X a/!9-JJJȾ[| IDATfߍ}WR뻺vۇWa^nִ| g3lٴTHmҴLzqQK>Ul)UՊіq]bClj?гgo|HHI2}5];c`G]֥bccY?~G{?~5+bu͛װ®0rRe+]>*J7❻7bU ܼyNNӬsɧõkWpE,]_=&~'UVp\̿q[XUbٳqqbk;ưs"/ԩ$g\\ƍ0uD4o[룸l*#ofs\Q{9.u!~s<丨JU嵥>j ʰm1>*ֳti|= nn[Att4:urWXW ];w٫A^t"kvqD\S\U=T1_v :.^x__?7oHsul$y\_UP49Xv5~cjcƌǪqIlڴAW5&?Ñ\VTcsܼq][mAZZ*^ GdT4=ZnFÕ+anXV=wٌRe?UshϞ9?Ridžk/^ț>aqUl-Z"*TZTM3ʎ+GlI6sNlmʚCMlUl)Q~\a*v;7Ct"ɓb?֭( 77WcRWACN\. ڵ4ܧjF<6G << 7/Lx ݻwPTTz…s$e<A~ qO.w>yyx"G]]ѯGjiш\ʕp4hH? k׮Ϟ>ӿWlׯ_9gXGܹ} EEEs6,FV?lǎǧ'LLLdLMMѽ{O8~ܩg3ΝbynE"`dW5FyCskvtxXfRu\ac'?̘U+WSpwÆk1d0uŠrA30bЗ044g7/_󪌎/):|.Kc޼2Fxlll?azIyxtfaժ_p=0۴Ř1TIw>l```zM۶5GxzzIfLCukpmu舵k7H򽼼1g|-xXZZaoQ? pf0 o޼0}L=|)rss0}T| 0~?QF68t fΜeK0ls*x-^ Wn(,,D3G;WkN'GSNމ?LCVV,,hmvaDXj .n4i0sff۷2330eD~ 4ĨQ}N72l˪c3ln5ٿب!XfRu\і؇ʭ`QI[b;cNK~4lʤ׭[7#ʤW]i7Bf%W^~=<<<u. l;yF, Z;A(UȈ EW{unuQEvXn% jݫ :ZeHray^=+H>=wQX@µn8%)4)K(6zU+¥kIEm3q)Ja}8Kއew}`uaʔ)nߺG 6I@vٲUIJN31qxU!mD+I\'vމFq'Um=4/ĠCt6~8GRYŲcLJs7LƾWn@օ  ի('Ye鹔נP5҇/׀t#U+@wԳH@+]5Uq_< |I}ZQWW>VVV*QI2%ʕ+5j`ll ԫW}Kzx*ӧO1b͚5áC Rsa5joo|/׶HP%%%廼m}޽[]v{VZ1`1btHLLċ/b ܺu %=D"Hj .nݺH=Æ S~r/i׮"##o!11C|rAT>Tl޽;ݾuVx{{>AAApE[ZZb0`ϟ_#T?6l@ǎfS*umXb.gggI&XxqKE#<<O>-avvvd6MLTt*\Y*bcc^/_.|}}ERR|8eرbРAJ,ƎƍXppp[nUwѸqcahh(j׮-;1m߾] ###QJѿ\zUtUTRE 777?kOΒ۠Aą D^ϟWXw1& }ATXQd2e˖!zo{˗Kkkk1qDP˖-B&+ GGG}v64Bܽ{WC CCCѤIw^箭~]ؽ{h޼055*To۲e(TرciӦHۋ~Ii{ACUmRqwwZ>"""BTRH ͥ˗l|8|HHHraqe2PW'G}iDU\\hӦX~|݆ D6mD\\B[" @Ɗ +/s1QjUo>#BBBؿB;5gΜɓ'bȑO>2u_}x򥈍b_:~5j#G 6\%w[d2(L&O] nZT 7oİa`hh~ nnn MMMdɯFrrR*T@BBDع:o<۷Gfо}{ԪUK^V~rTTIܹsQF ̘1׮]Ν;Ƣ, bbb|~:;'""ǩSKyuPZ5yWg<| |||0h h:uRm۰QY& }}}2RRRy9}}뿴W*2 >?vwwիW%'Ν;j߷o͛???8::I4[SLwt"]@B`` :uvðJ5$<;~%{˗/J*gϴj#;;^R0o)ʶիWѣӧၵkjO~ƌm۶o۶ 'NTz JWhBJ;~!*W $&&Btdggk4MW_ĉppp'+Vhg^8{Fu]Q)Ұ_hΝBr-Z <<\۷oǜ9spiÔ}PEJ,Pݹs˖-î]sNL:=R*wϟk׮dLnnn1cv܉cݺu:~077G`` 6m(iڴ)\R`;7}N;Pc͚5SJΝ;8((xI&={6ߏ+W`ʕQ״i#&&FR; 6DPPº /$Uw4W*:ݺuەرC^oK.֭[$}PUH HJJJˆ#vZd2c…>|8RSSΜ9'222b̙>}|… gŋHKKCRR0p@4p@!99GڵuϘ1cuVlݺU,]fBHHgϢW^2| ɓ5nJ7n+W"66)))0zhN<.]BFF.]ɓ'c֬Y>ouӫW/3g~UGΝ1zh4m۶mǏtcƍj3}txyy!44x"r`򂟟QFi?Q+sٳ>}:={|?~|u$%%!55Oưa0w\ryگZ 7nD```}WS7K#В>l01rH5jB[|ptt>[|8޽[l}QQgRzΝ)C)yZZZ"&&FRE%;;AAAewR:inԨQ Cff&nܸ'bر%=,""z Ǐ0xqI:8ǯ)cv>}Çxw1n8̜9EDDk9h Skii:u ,,  mDGGl%Tx1#F(a["444uw߅% BoTBTn:PQ{4)hIIIy[FFF5<(52y IA&oADD00-I:_Q9SsWc宫W,,,cddd@TDDD,o``|EꮓԜ#""Iդ;ꛚBOO/a``+++z*zVVVGzzB;9U(֕$21-t)-ru:d WFvv6WJCX/tVLQ-3opoԨm aXC ?_Q)O=#PFh *Nspy捰y}?@!}`NXSVI9*YBH`'''xxxTVM^2 ͚5CӦMagg $rʐdhѢR;iNʢ : T#UJK`O>E>pBº7A}\eϡCji|.qpG&ءЯ}DFE³S+Ԭ.]Ĩ1r̰uQ8z7ĽJľ]pCXzy}FEGKNxcg< {'a彮ҳc5.GeÇC\rKMMELL "##TDFFʷ9-- шTXS~?hѪi߮#QםEe8 w&N]3ׄ{4~WDifط ~GG Ю#V-_#_7㩨RŬzsgWȿA}g-4 q0zS&MãǏqXhFd" 899ںr 6eYLJ71ŁCѱ[;԰E*mtLT1c4$'')=x>QoF]'T0Du[W=}Ъ} T}2^Eԙaf] 5m5cMWzWĤD8ԫĤDZjK|)|:O1u 04BM>y= r$Ǝ~bJyahhBjRj#HUF/j [{7P No?/Xv|EܫDanXV[ kAXg{x6Cf-,\GZj*/ 0"!}gcg|gOZծ.] 6*[ؘ{g}M__Vh׃ \d~ATVnZa2B˅~Wk\,Eҳ6Mt9 aHOiԮ pmvs|'ۘT7-Dl^ zug\\ſO\N-+\x5kݼcٯ&O^{]vSfzBE]R%&}zbP={~܂{`Їx/ty+؃ l^^be=yxsn+֕__pqpW q!j۩>_]o)ߓ=B!ЬiTuv1}L }hܬ!/X_&&oIDAT|[WBOOzzzΚ2Z Q)00 w1Uf{7`my= cXR_gBi=_Zj^FfHP3++ FH}Q9*7LKKúu0eʔ|cǎȐ0KVVBBBЩS'xU!mD+#T⊌Ĕ,k5Q:]RN]UVU8-8vx̙}y'W_ŰQ(\ر[;n.L~g|ѭsw@ΝR9!0WxlQB4[7жBϕ#"2¾- P,ީ12x)ճgP2}TzQRռ*^ZN1M7 -6Ŕ^عg<}T^sA#3}Tm_c}X3?Ga L+")Y}J#z۔XWZ7f(V_N'xqV(w@^+}GQ=|ϞFNXamuDv6yJļwa{v7t&Pu]8+ΟDaC]=?|3?^%"#Q 96]5<`N9ĤDl-&M 4q26m_ QvuE8w>rippw'ЬV]Ў^z;ݿF ]{_ոc98i888UI<Iq9*9vvvGVV5I*Ћ!8_8U[G~-=c9*˻ڍkJGrt#î֛)))]deef*ӃB.pNᔟ:·#$\B{{4M}no~~cOy7:wꂊ+jԮxMG=˱5\D~4ɓpm,(۩knyviVaNNLߴ[l%|{o.5xsڰ{s̐IaggtQM@йz&O #c#cƬ3d@LfM!;;]`.%apm솬L\rm=G}JrmZk+^W,[u(<4U3}3'cO>o2K.c>e&q MT*7x,^.d``e+`{jWu оK[,Y [nݾ #0j^d,h"g3lPjU3f@f*lΞ DB~坣8m 4k{?=;q\ q9*Y2Lr@ ͔۾m.y \`__^%Zd؏zJԮc.N8~7ھ:=;Wb%[ kcU?Kѡ]Gٷt_C[| ƌ%WAc0̺F93ջnώ}x)veϗ/Šem<`*Tt1QɤV]]Y ,]z^#'XTEFfN&NKaSvN5qQs8.Vͪ !1-6Eujصg&y-\> ^6++:к5|?_ױ}[= ?`]ZrDo"m*?""*?**?"""򂁊H"*""""JU~DDD$]xx8>U06̚J0յk  )TQ9St^EuuPI@EDDDo5!D S~DDD.BG#TDDD$w}zzz0001ajܿv%(_RB ;;鈏Nj/jժiܞbbb*ԭ[W>JO!99dHIIAZZZmiiY}PQ KKK$DGG#-- ʶ *@hh|U.#"""%B!!FFFx%$z 5kք5222ccc*WX:u ,,L~1GttF}#"""TP00xs<&665kD͚54T^MGGGm*nƍZ}JDD@î4QTTt>ϟ ݋k{-w؁B;v޽{GO?Ell,̙V_DDDe@E͛%KM0UTI>>>X`AfΜEɏFիW=ڷoo"""*u?z5jF޽;>caat*ȑ#իWGͱb =ǎSX1XXX}oܪև`UW;ѣjٳg1zhCU UvZvJ*V ""*M-Pa000q bȐ! *iX@ /_2T""bgm:r"ґiXAsw/k׮SN'j'lXYYnnnHKK?.\kעGz DDD:{}VuǯPݸq!ׯ_W/_bhذ!aaa+++P /177G߾}ۇ,Ot՟*׮]iF~4cyԩҤI!`eet09cPuٳpqq*L9r˖-ÁW˖-add333=.]q_DDDŭL݇j̘1سgFpʃBrNݻWܧt_VVm<4,W'N@ll,ծw y(u`8rծפI`IDDTZ[ruuܹsG777ڸz*`ƌ94զM8::޽{駟_A&u֒GVV{)kڴ)… {O>,Ш\~]vը޶m۰f믐dսy&lmm5CDDT-P͙3*Tŋ+DDD`ɒ%PfϞP6Z9s~Ν;2eVÈ#}K/'cL:UN<_~Q{=jtb^VVVEbb":t'''۷?mٳG~u-[GqJ^~PvرXv-իW?#QqU~DDDDoʏb""""H"*""""$b""""H"*""""$b""""@J &jDDDD%j۶mZו8 :Qu]IJJDDDDPI@EDDD$D TDDDD1PI$*?"".::_.a脹9 ,znܸUL#*\]]Ѳ6 Sœ'OKz8ۡQCgPrԔ^92{ffΜQÑdÆ: T7ndIHHL)Ρy|C3PSL>Kz(|8t8RE!D1|b""r< u_kqc"""RCy TEH !dt&_{9JЁߧ':¹#(.&:}ztƯ!c)>ߗ_Y|l|7LM+ݻn7?W붋@@EDDmCƙӧrGLM=۵GӦпOO=NuV <~#b>C_J:ӧ066wqimwKxʏ=!DvƋ:}&LLL`ʴٵCDv6޹ G㣱[i)S~S̀Q?4Ysdd-͟$v5quأQzxDGG){uѶMK8Oi{]PGVm۴{NՕS~ TDDTi!{ hr{KVq‡+b1uL?R?Pi|]-ZUOhk?N#-- WP6aɒu>re̟7G^,Z̝Ž>o Y30mLܺ}[͛'K])?""*LGժ*ZXTE||wn###4u!>>fffj?g,Y:zbɒl Lg-B6-{oڈ_Dmذ[͛6bگйKW@o̟7;wUxR0P![Z|hVb8_ 333 }}}|4zݼ۴zܹ ^9hkXXXX.::׭FPP "PBߎ ̐,_wxxV9[nbıJ@EDDT =jC.GnWW! E%SSL4ko{][_q .^Dn ,7}֫>PFM!33 ;)X/UƍwQҶ8=mռPlވ?{INN&p|7lĜY3_#F}B?/cy]B 4Wswvn *Ӱ nݺU>)}[*""*}sW7a|9$''!99 aңwý}ؼ,_{.@}о}G|`!>>q:O@z:.)))8{ TUcɽI 9t Eqonomize!"> ]> La documentation d'&eqonomize; Hanna K.
hanna_k@fmgirl.com
1999 2006 Hanna K. &FDLNotice; 2006-07-12 0.1 &eqonomize; est une application pour garder une trace de vos finances personnelles. Ce manuel est loin d'être fini. KDE Eqonomize Argent Finances Comptabilité Budget
Introduction En construction. Comptabilité avec &eqonomize; Synthèse Le principe de base dernière la comptabilité dans &eqonomize; est l'idée de l'argent passant à travers des transactions entre des comptes qui sont des réservoirs. Une transaction représente un gain (vous recevez de l'argent), une perte (vous achetez quelque chose), ou une transformation ( vous retirez depuis un dépôt dans un compte banquaire) de l'argent. Une transaction signifie toujours que de l'argent est transféré d'un compte à l'autre. Une dépense (quelque chose est acheté) peut par exemple vouloir dire que vous payer en liquide depuis votre compte de liquidité. Ce compte représente les produits et services que vous payez. Cela représente l'argent que vous n'avez plus après des dépenses. et c'est pourquoi qu'il est utile pour conserver l'enregistrement. Les entrées sont généralement placées sur un compte banquaire et retirées d'un compte d'entrée. Cela veut dire que les comptes d'entrée auront une valeur négative, mais pour éviter la confusion, la valeur des comptes d'entrée est affichée comme des valeurs positives. Différent compte d'entrée et de dépense sont utilisés pour catégoriser, et ainsi plus naturellement référencés comme catégories. D'autres comptes, lesquels représentent l'argent actuellement disponible sont souvent les vrais comptes banquaires dans la réalité, sont simplement référencés comme comptes. Comptes et Catégories Transactions &eqonomize; a trois types différents de transactions basiques - dépenses, entrées, et transferts. Actions utilise des transactions spéciales décrites dans . Les dépenses représentent une perte d'argent, une transaction où vous donnez de l'argent, la plupart du temps vous recevez quelque chose en retour. Cela peut être une facture pour des produits ou des services, ou un cadeau (ou vous prêtez de l'argent à quelqu'un). Les entrées représentent un gain d'argent; quand vous recevez de l'argent. Vous êtes à l'opposé d'une dépense, quand vous recevez un paiement pour des produits et des services produits (souvent un salaire pour un travail régulier), ou quand quelqu'un vous donne de l'argent comme un cadeau ou un emprunt. Le troisième type de transaction, le transfert, représente ni une perte ni un gain, mais un transfert d'argent depuis un compte vers un autre. Cela peut être par exemple quand vous retirez de l'argent liquide depuis un compte, ou quand vous transférez de l'argent vers un compte de sauvegardes. Chaque transaction a un nombre d'obligation ou de propriétés optionnelles. Toutes ces transactions basiques ont quatre propriétés obligatoires - valeur, date, et depuis/vers les comptes/les catégories. Valeur représente le compte où l'argent de la transaction est affecté, date quand la transaction a eut lieu, depuis le compte où l'argent et pris et vers le compte où l'argent arrive. Ce sont des noms de propriétés génériques, lesquelles montrent que tout type de transaction sont généralement les mêmes. Pour les dépenses la valeur est un coût, une valeur positive représentant une perte d'argent et le compte/la catégorie vers... ou le compte/la catégorie depuis... est le compte où la dépense est payée. La catégorie est toujours une catégorie de dépense et le depuis le compte/la catégorie un compte. Pour les entrées la valeur est une entrée, une valeur positive représentant un gain d'argent et le compte/la catégorie depuis... est appelé catégorie et le compte/la catégorie vers... est un compte où l'entrée est déposée. La catégorie est toujours une catégorie entrée et le compte depuis/vers un compte. Pour les transferts la valeur est appelée un compte, et le vers/depuis les comptes/catégories sont tous les deux des comptes. Propriétés obligatoires Générique Dépense Entrée Transfert Valeur Coût Entrée Montant Date Date Date Date Depuis le compte/la catégorie Compte (compte) Catégorie (catégorie entrée) Depuis (compte) Vers le compte/la catégorie Catégorie (catégorie dépense) Compte (compte) Vers (compte)
Toutes les transactions ont en plus deux propriétés optionnelles. La propriété de description contient l'information sur la nature de la transaction. Pour les dépenses et entrées cela peut être considéré comme une sous-catégorie flexible. La propriété commentaire est utilisée pour une information additionnelle. Par exemple si vous achetez une paire de chaussures, vous pouvez créer une dépense dans la catégorie habillement, avec la description Chaussures et des commentaires Pradas rouge lumineux. Dépenses et entrées ont également deux propriétés non activées par défaut dans le programme. La propriété quantité dénote combien d'entités sont impliqués dans la transaction. Cela peut être un nombre entier, comme deux CD, ou une fraction, comme 0.56 kg de pommes (les unités ne sont pas incluses). Cette propriété est par défaut de 1 et n'affecte pas la valeur (la valeur par unité est égale à la valeur divisé par la quantité). Les dépenses ont également une propriété bénéficiaire pour la personne ou une entité, par exemple le magasin où l'on achète reçoit de l'argent, et les entrées ont une catégorie payeur pour celui qui vous donne de l'argent, par exemple votre employeur.
Transactions programmées Une transaction programmées est une transaction prévue pour quelque chose qui n'a pas eut lieu. C'est simplement une transaction, de n'importe quel type, dont la date future est définie. Quand une transaction a eut lieu, elle doit une transaction régulière. Les transactions programmées permettent de garder une trace de toutes les transactions futures. &eqonomize; aura besoin d'une confirmation quand la transaction est certifiée d'avoir eut lieu. Une transaction programmée peut être récurrent, régulièrement à une certaine date ou avec un certain intervalle. C'est pratique pour les factures et les salaires, qui n'ont alors plus besoin d'être saisies manuellement chaque fois et vous pouvez utiliser &eqonomize; pour les paiements à venir. Quand une transaction récurrente programmée est vérifiée, une transaction régulière est créée, cette date d'occurrence est enlevée de la récurrence, et la date de la transaction programmée est déplacée vers la prochaine occurrence. Une transaction programmée sans occurrences suivantes est enlevée. Actions
Utiliser &eqonomize; Cette fenêtre principale consiste en six vue différentes. Quand &eqonomize; est démarré, la vue compte est montrée. Pour changer la vue cliquer sur l'icône correspondant dans la liste verticale sur le côté droit de la fenêtre. La vue Compte Cette vue de compte affiche une liste de tous les comptes et catégories. Les catégories sont généralement aussi référencé comme des comptes, mais dans ce contexte spécifique elles se rapportent à une division de dépenses ou d'entrées, pendant que le compte désigne un réservoir ou un capital de ressource (généralement un compte banquaire ou du liquide; pour plus d'information voir ) Ils sont sortis alphabétiquement sous chaque type propre - comptes, entrées, et dépenses. La liste a quatre colonnes. La première affiche simplement le nom du compte ou de la catégorie. La seconde est pour les catégories affichant le budget pour une période sélectionnée et ce qui ne va pas dans le budget. A moins que l'option Montrer le budget partiel est cochée, le budget (et le budget prévisionnel) est affiché pour tous les mois, vous pouvez ainsi voir dans le mode par défaut ce qui arrive dans le budget mensuel courant. La troisième colonne affiche le changement de valeur du compte ou de la catégorie pendant la période sélectionnée, alors que la dernière colonne affiche la valeur totale à la fin de la période (aujourd'hui par défaut). Les lignes pour les principaux types affichent la somme de tous les comptes/catégories suivantes. Référence de commande La fenêtre principale d'&eqonomize; Le menu Fichier &Ctrl;N Fichier Nouveau Créer un nouveau document &Ctrl;S Fichier Sauver Sauver le document &Ctrl;Q Fichier Quitter Quitte &eqonomize; Le menu <guimenu >Aide</guimenu > &help.menu.documentation; Questions et Réponses Champ question Champs réponse. Crédits et License &eqonomize; Program copyright 2006 Hanna K. hanna_k@fmgirl.com Contribution: Hanna K. hanna_k@fmgirl.com Documentation copyright 2006 Hanna K. hanna_k@fmgirl.com Jérôme Rapinatgnupower@hotmail.fr &underFDL; &underGPL; &documentation.index;
eqonomize-0.6/po/0000755000175000017500000000000011107050302012724 5ustar hannahannaeqonomize-0.6/po/CMakeLists.txt0000644000175000017500000000160411106506506015500 0ustar hannahanna# Search KDE installation FIND_PACKAGE(KDE4 REQUIRED) FIND_PACKAGE(Gettext REQUIRED) IF(NOT GETTEXT_MSGFMT_EXECUTABLE) MESSAGE(FATAL_ERROR "Please install the msgfmt binary") ENDIF (NOT GETTEXT_MSGFMT_EXECUTABLE) FILE(GLOB _po_files *.po) SET(_gmoFiles) FOREACH(_current_PO_FILE ${_po_files}) GET_FILENAME_COMPONENT(_lang ${_current_PO_FILE} NAME_WE) SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo) add_custom_command(OUTPUT ${_gmoFile} COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_current_PO_FILE} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" DEPENDS ${_current_PO_FILE} ) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo DESTINATION ${LOCALE_INSTALL_DIR}/${_lang}/LC_MESSAGES/ RENAME eqonomize.mo) LIST(APPEND _gmoFiles ${_gmoFile}) ENDFOREACH(_current_PO_FILE) ADD_CUSTOM_TARGET(pofiles ALL DEPENDS ${_gmoFiles}) eqonomize-0.6/po/cs.po0000644000175000017500000023502311107053373013711 0ustar hannahanna# Czech translation for eqonomize # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the eqonomize package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: eqonomize\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?" "group_id=173799&atid=866832\n" "POT-Creation-Date: 2008-11-13 14:35+0100\n" "PO-Revision-Date: 2008-04-10 18:52+0000\n" "Last-Translator: Jan Štemberk \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2008-11-13 13:21+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: budget.cpp:51 editsplitdialog.cpp:118 ledgerdialog.cpp:652 #, kde-format msgid "Balancing" msgstr "Rozvaha" #: budget.cpp:84 #, kde-format msgid "Couldn't open %1 for reading" msgstr "%1 nelze přečíst" #: budget.cpp:95 #, kde-format msgid "" "Not a valid Eqonomize! file (XML parse error: \"%2\" at line %3, col %4)" msgstr "Neplatný Eqonomize! soubor (chyba XML: \"%2\" na řádku %3, sloupec %4)" #: budget.cpp:98 #, kde-format msgid "Invalid root element %1 in XML document" msgstr "Neplatný kořenový prvek %1 v dokumentu XML" #: budget.cpp:363 #, kde-format msgid "Unable to load 1 account." msgid_plural "Unable to load %n accounts." msgstr[0] "" msgstr[1] "" #: budget.cpp:368 #, kde-format msgid "Unable to load 1 category." msgid_plural "Unable to load %n categories." msgstr[0] "" msgstr[1] "" #: budget.cpp:373 #, kde-format msgid "Unable to load 1 security." msgid_plural "Unable to load %n securities." msgstr[0] "" msgstr[1] "" #: budget.cpp:378 #, kde-format msgid "Unable to load 1 transaction." msgid_plural "Unable to load %n transactions." msgstr[0] "" msgstr[1] "" #: budget.cpp:389 #, kde-format msgid "File is a directory" msgstr "Soubor je adresář" #: budget.cpp:397 #, kde-format msgid "Couldn't open file for writing" msgstr "Soubor nelze otevřít pro zápis" #: budget.cpp:547 budget.cpp:551 #, kde-format msgid "Error while writing file; file was not saved" msgstr "Během zápisu došlo k chybě; soubor nebyl uložen" #: categoriescomparisonchart.cpp:123 categoriescomparisonreport.cpp:164 #: eqonomize.cpp:1797 eqonomize.cpp:1957 eqonomize.cpp:2036 #: transactionlistwidget.cpp:138 #, kde-format msgid "From" msgstr "Od" #: categoriescomparisonchart.cpp:130 categoriescomparisonreport.cpp:171 #: eqonomize.cpp:1808 eqonomize.cpp:1969 eqonomize.cpp:2037 #: transactionlistwidget.cpp:139 #, kde-format msgid "To" msgstr "Do" #: categoriescomparisonchart.cpp:147 categoriescomparisonreport.cpp:114 #: overtimechart.cpp:112 overtimechart.cpp.bak:106 overtimereport.cpp:97 #, kde-format msgid "Source:" msgstr "Zdroj:" #: categoriescomparisonchart.cpp:150 categoriescomparisonchart.cpp:858 #, kde-format msgid "All Expenses" msgstr "Všechny výdaje" #: categoriescomparisonchart.cpp:151 categoriescomparisonchart.cpp:859 #, kde-format msgid "All Incomes" msgstr "Všechny příjmy" #: categoriescomparisonchart.cpp:152 categoriescomparisonchart.cpp:860 #, kde-format msgid "All Accounts" msgstr "Všechny účty" #: categoriescomparisonchart.cpp:155 categoriescomparisonchart.cpp:864 #: categoriescomparisonreport.cpp:122 categoriescomparisonreport.cpp:752 #: categoriescomparisonreport.cpp:1016 overtimereport.cpp:375 #, kde-format msgid "Expenses: %1" msgstr "Výdaje: %1" #: categoriescomparisonchart.cpp:160 categoriescomparisonchart.cpp:871 #: categoriescomparisonreport.cpp:127 categoriescomparisonreport.cpp:756 #: categoriescomparisonreport.cpp:1023 overtimereport.cpp:366 #, kde-format msgid "Incomes: %1" msgstr "Příjmy: %1" #: categoriescomparisonchart.cpp:199 categoriescomparisonchart.cpp:225 #: categoriescomparisonreport.cpp:334 categoriescomparisonreport.cpp:360 #: editsplitdialog.cpp:411 eqonomize.cpp:482 eqonomize.cpp:571 #: eqonomize.cpp:741 eqonomize.cpp:848 eqonomize.cpp:870 eqonomize.cpp:2483 #: eqonomize.cpp:3180 eqonomize.cpp:3206 eqonomize.cpp:3326 eqonomize.cpp:3352 #: importcsvdialog.cpp:780 importcsvdialog.cpp:1196 overtimechart.cpp:462 #: overtimechart.cpp:500 overtimechart.cpp:528 overtimechart.cpp:566 #: overtimechart.cpp.bak:455 overtimechart.cpp.bak:493 #: overtimechart.cpp.bak:521 overtimechart.cpp.bak:559 #: recurrenceeditwidget.cpp:156 recurrenceeditwidget.cpp:171 #: recurrenceeditwidget.cpp:293 transactioneditwidget.cpp:707 #: transactioneditwidget.cpp:1281 transactionfilterwidget.cpp:564 #: transactionfilterwidget.cpp:590 #, kde-format msgid "Invalid date." msgstr "Neplatné datum." #: categoriescomparisonchart.cpp:204 categoriescomparisonreport.cpp:339 #: eqonomize.cpp:3185 eqonomize.cpp:3331 transactionfilterwidget.cpp:569 #, kde-format msgid "To date is before from date." msgstr "Datum do je před datumem od." #: categoriescomparisonchart.cpp:229 categoriescomparisonreport.cpp:364 #: eqonomize.cpp:3210 eqonomize.cpp:3356 transactionfilterwidget.cpp:594 #, kde-format msgid "From date is after to date." msgstr "Datum od je před datumem do." #: categoriescomparisonchart.cpp:340 categoriescomparisonreport.cpp:463 #: eqonomize.cpp:3610 eqonomize.cpp:4252 ledgerdialog.cpp:251 #: overtimechart.cpp:624 overtimechart.cpp.bak:617 overtimereport.cpp:278 #: qifimportexport.cpp:604 #, kde-format msgid "" "The selected file already exists. Would you like to overwrite the old copy?" msgstr "Vybraný soubor již existuje. Chcete ho přepsat?" #: categoriescomparisonchart.cpp:344 categoriescomparisonreport.cpp:467 #: eqonomize.cpp:4257 ledgerdialog.cpp:255 overtimechart.cpp:628 #: overtimechart.cpp.bak:621 overtimereport.cpp:282 qifimportexport.cpp:608 #, kde-format msgid "You selected a directory!" msgstr "Vybrali jste adresář!" #: categoriescomparisonchart.cpp:352 categoriescomparisonreport.cpp:475 #: eqonomize.cpp:4264 ledgerdialog.cpp:263 overtimechart.cpp:636 #: overtimechart.cpp.bak:629 overtimereport.cpp:290 qifimportexport.cpp:616 #, kde-format msgid "Couldn't open file for writing." msgstr "Soubor nelze otevřít pro zápis." #: categoriescomparisonchart.cpp:372 categoriescomparisonreport.cpp:482 #: eqonomize.cpp:4270 ledgerdialog.cpp:269 overtimechart.cpp:656 #: overtimechart.cpp.bak:644 overtimereport.cpp:297 qifimportexport.cpp:622 #, kde-format msgid "Error while writing file; file was not saved." msgstr "Chyba během zápisu souboru; soubor nebyl uložen." #: categoriescomparisonchart.cpp:728 categoriescomparisonreport.cpp:303 #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:754 #: categoriescomparisonreport.cpp:839 categoriescomparisonreport.cpp:930 #: categoriescomparisonreport.cpp:977 overtimechart.cpp:373 #: overtimechart.cpp:1740 overtimechart.cpp:1746 overtimechart.cpp:1774 #: overtimechart.cpp:1776 overtimechart.cpp:1783 overtimechart.cpp:1785 #: overtimechart.cpp:1821 overtimechart.cpp:1891 overtimechart.cpp.bak:366 #: overtimechart.cpp.bak:1721 overtimechart.cpp.bak:1727 #: overtimechart.cpp.bak:1755 overtimechart.cpp.bak:1757 #: overtimechart.cpp.bak:1764 overtimechart.cpp.bak:1766 #: overtimechart.cpp.bak:1811 overtimechart.cpp.bak:1892 #: overtimereport.cpp:213 overtimereport.cpp:384 overtimereport.cpp:393 #: overtimereport.cpp:732 #, kde-format msgid "No description" msgstr "Bez popisu" #: categoriescomparisonreport.cpp:119 categoriescomparisonreport.cpp:1012 #, kde-format msgid "All Categories" msgstr "Všechny kategorie" #: categoriescomparisonreport.cpp:138 #, kde-format msgid "Descriptions for" msgstr "Popis pro" #: categoriescomparisonreport.cpp:145 #, kde-format msgid "Payees/payers for" msgstr "Příjemci/plátci pro" #: categoriescomparisonreport.cpp:161 #, kde-format msgid "Period:" msgstr "Období:" #: categoriescomparisonreport.cpp:186 overtimereport.cpp:120 #, kde-format msgid "Columns:" msgstr "Sloupce:" #: categoriescomparisonreport.cpp:189 categoriescomparisonreport.cpp:782 #: eqonomize.cpp:1062 eqonomize.cpp:1935 eqonomize.cpp:4142 #: importcsvdialog.cpp:139 importcsvdialog.cpp:157 importcsvdialog.cpp:180 #: importcsvdialog.cpp:197 importcsvdialog.cpp:216 importcsvdialog.cpp:235 #: importcsvdialog.cpp:253 overtimereport.cpp:123 #, kde-format msgid "Value" msgstr "Hodnota" #: categoriescomparisonreport.cpp:192 overtimereport.cpp:126 #: recurrenceeditwidget.cpp:320 #, kde-format msgid "Daily" msgstr "Denně" #: categoriescomparisonreport.cpp:195 overtimereport.cpp:129 #: recurrenceeditwidget.cpp:322 #, kde-format msgid "Monthly" msgstr "Měsíčně" #: categoriescomparisonreport.cpp:198 overtimereport.cpp:132 #: recurrenceeditwidget.cpp:323 #, kde-format msgid "Yearly" msgstr "Ročně" #: categoriescomparisonreport.cpp:201 categoriescomparisonreport.cpp:787 #: overtimechart.cpp:205 overtimechart.cpp:1534 overtimechart.cpp.bak:198 #: overtimechart.cpp.bak:1515 overtimereport.cpp:135 overtimereport.cpp:549 #: transactionlistwidget.cpp:276 transactionlistwidget.cpp:340 #, kde-format msgid "Quantity" msgstr "Počet" #: categoriescomparisonreport.cpp:204 overtimechart.cpp:209 #: overtimechart.cpp.bak:202 overtimereport.cpp:138 #, kde-format msgid "Average value" msgstr "Průměrná hodnota" #: categoriescomparisonreport.cpp:278 categoriescomparisonreport.cpp:947 #, kde-format msgid "All descriptions" msgstr "Všechny popisy" #: categoriescomparisonreport.cpp:279 categoriescomparisonreport.cpp:948 #, kde-format msgid "All payees" msgstr "Všichni příjemci" #: categoriescomparisonreport.cpp:280 categoriescomparisonreport.cpp:949 #, kde-format msgid "All payers" msgstr "Všichni plátci" #: categoriescomparisonreport.cpp:309 categoriescomparisonreport.cpp:751 #: categoriescomparisonreport.cpp:837 categoriescomparisonreport.cpp:932 #: categoriescomparisonreport.cpp:994 overtimechart.cpp:382 #: overtimechart.cpp:1758 overtimechart.cpp:1768 overtimechart.cpp:1823 #: overtimechart.cpp:1908 overtimechart.cpp.bak:375 overtimechart.cpp.bak:1739 #: overtimechart.cpp.bak:1749 overtimechart.cpp.bak:1813 #: overtimechart.cpp.bak:1909 #, kde-format msgid "No payee" msgstr "Žádný příjemce" #: categoriescomparisonreport.cpp:310 categoriescomparisonreport.cpp:755 #: categoriescomparisonreport.cpp:838 categoriescomparisonreport.cpp:933 #: categoriescomparisonreport.cpp:995 overtimechart.cpp:381 #: overtimechart.cpp:1752 overtimechart.cpp:1763 overtimechart.cpp:1825 #: overtimechart.cpp:1907 overtimechart.cpp.bak:374 overtimechart.cpp.bak:1733 #: overtimechart.cpp.bak:1744 overtimechart.cpp.bak:1815 #: overtimechart.cpp.bak:1908 #, kde-format msgid "No payer" msgstr "Žádný plátce" #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:751 #: overtimereport.cpp:393 #, kde-format msgid "Expenses: %2, %1" msgstr "Výdaje: %2, %1" #: categoriescomparisonreport.cpp:754 categoriescomparisonreport.cpp:755 #: overtimereport.cpp:384 #, kde-format msgid "Incomes: %2, %1" msgstr "Příjmy: %2, %1" #: categoriescomparisonreport.cpp:758 #, kde-format msgid "Incomes & Expenses" msgstr "Příjmy & výdaje" #: categoriescomparisonreport.cpp:771 #, kde-format msgctxt "html format; %1: title; %2: from date; %3: to date" msgid "%1 (%2–%3)" msgstr "%1 (%2–%3)" #: categoriescomparisonreport.cpp:772 #, kde-format msgctxt "html format; %1: title; %2: to date" msgid "%1 (to %2)" msgstr "%1 (do %2)" #: categoriescomparisonreport.cpp:776 eqonomize.cpp:4046 eqonomize.cpp:4094 #: qifimportexport.cpp:131 transactionlistwidget.cpp:116 #: transactionlistwidget.cpp:127 #, kde-format msgid "Category" msgstr "Kategorie" #: categoriescomparisonreport.cpp:778 eqonomize.cpp:1938 #: transactionlistwidget.cpp:115 #, kde-format msgid "Cost" msgstr "Cena" #: categoriescomparisonreport.cpp:780 editscheduledtransactiondialog.cpp:46 #: editsplitdialog.cpp:108 eqonomize.cpp:285 eqonomize.cpp:329 #: ledgerdialog.cpp:647 transactionlistwidget.cpp:126 #, kde-format msgid "Income" msgstr "Příjem" #: categoriescomparisonreport.cpp:784 overtimereport.cpp:545 #, kde-format msgid "Daily Average" msgstr "Denní průměr" #: categoriescomparisonreport.cpp:785 overtimereport.cpp:546 #, kde-format msgid "Monthly Average" msgstr "Měsíční průměr" #: categoriescomparisonreport.cpp:786 overtimereport.cpp:547 #, kde-format msgid "Yearly Average" msgstr "Roční průměr" #: categoriescomparisonreport.cpp:789 overtimereport.cpp:358 #: overtimereport.cpp:376 overtimereport.cpp:394 #, kde-format msgid "Average Cost" msgstr "Průměrná cena" #: categoriescomparisonreport.cpp:791 overtimereport.cpp:350 #: overtimereport.cpp:367 overtimereport.cpp:385 #, kde-format msgid "Average Income" msgstr "Průměrný příjem" #: categoriescomparisonreport.cpp:793 #, kde-format msgid "Average Value" msgstr "Průměrná hodnota" #: categoriescomparisonreport.cpp:853 eqonomize.cpp:3932 eqonomize.cpp:4030 #: eqonomize.cpp:4075 eqonomize.cpp:4123 overtimereport.cpp:686 #, kde-format msgid "Total" msgstr "Celkem" #: categoriescomparisonreport.cpp:878 #, kde-format msgid "Total incomes" msgstr "Příjmy celkem" #: categoriescomparisonreport.cpp:902 #, kde-format msgid "Total expenses" msgstr "Výdaje celkem" #: categoriescomparisonreport.cpp:912 #, kde-format msgid "Total (Profits)" msgstr "Celkem (zisky)" #: editscheduledtransactiondialog.cpp:45 editsplitdialog.cpp:111 #: eqonomize.cpp:288 eqonomize.cpp:332 ledgerdialog.cpp:650 #, kde-format msgid "Expense" msgstr "Výdaj" #: editscheduledtransactiondialog.cpp:47 editsplitdialog.cpp:120 #: eqonomize.cpp:282 eqonomize.cpp:326 ledgerdialog.cpp:653 #, kde-format msgid "Transfer" msgstr "Převod" #: editscheduledtransactiondialog.cpp:48 editsplitdialog.cpp:114 #: eqonomize.cpp:289 eqonomize.cpp:333 #, kde-format msgid "Security Buy" msgstr "Nákup cenných papírů" #: editscheduledtransactiondialog.cpp:49 editsplitdialog.cpp:116 #: eqonomize.cpp:290 eqonomize.cpp:334 #, kde-format msgid "Security Sell" msgstr "Prodej cenných papírů" #: editscheduledtransactiondialog.cpp:56 editscheduledtransactiondialog.cpp:57 #, kde-format msgid "Recurrence" msgstr "Opakování" #: editscheduledtransactiondialog.cpp:104 #, kde-format msgid "New Expense" msgstr "Nový výdaj" #: editscheduledtransactiondialog.cpp:106 #, kde-format msgid "New Dividend" msgstr "Nová dividenda" #: editscheduledtransactiondialog.cpp:107 #, kde-format msgid "New Income" msgstr "Nový příjem" #: editscheduledtransactiondialog.cpp:110 #, kde-format msgid "New Transfer" msgstr "Nový převod" #: editscheduledtransactiondialog.cpp:111 #, kde-format msgid "New Security Buy" msgstr "Nový nákup cenných papírů" #: editscheduledtransactiondialog.cpp:113 #, kde-format msgid "New Security Sell" msgstr "Nový prodej cenných papírů" #: editscheduledtransactiondialog.cpp:128 #: editscheduledtransactiondialog.cpp:149 transactioneditwidget.cpp:1064 #, kde-format msgid "Edit Expense" msgstr "Upravit výdaj" #: editscheduledtransactiondialog.cpp:130 #: editscheduledtransactiondialog.cpp:151 transactioneditwidget.cpp:1066 #, kde-format msgid "Edit Dividend" msgstr "Upravit dividendu" #: editscheduledtransactiondialog.cpp:131 #: editscheduledtransactiondialog.cpp:152 transactioneditwidget.cpp:1067 #, kde-format msgid "Edit Income" msgstr "Upravit příjem" #: editscheduledtransactiondialog.cpp:134 #: editscheduledtransactiondialog.cpp:155 transactioneditwidget.cpp:1070 #, kde-format msgid "Edit Transfer" msgstr "Upravit převod" #: editscheduledtransactiondialog.cpp:135 #: editscheduledtransactiondialog.cpp:156 transactioneditwidget.cpp:1071 #, kde-format msgid "Edit Securities Bought" msgstr "Upravit nákup cenných papírů" #: editscheduledtransactiondialog.cpp:136 #: editscheduledtransactiondialog.cpp:157 transactioneditwidget.cpp:1072 #, kde-format msgid "Edit Securities Sold" msgstr "Upravit prodej cenných papírů" #: editsplitdialog.cpp:107 eqonomize.cpp:284 eqonomize.cpp:328 #: eqonomize.cpp:1167 #, kde-format msgid "Dividend" msgstr "Dividenda" #: editsplitdialog.cpp:109 eqonomize.cpp:403 eqonomize.cpp:445 #: ledgerdialog.cpp:648 #, kde-format msgid "Repayment" msgstr "Splátka" #: editsplitdialog.cpp:112 eqonomize.cpp:404 eqonomize.cpp:446 #: ledgerdialog.cpp:651 #, kde-format msgid "Refund" msgstr "Úhrada" #: editsplitdialog.cpp:126 ledgerdialog.cpp:638 #, kde-format msgid "Split Transaction" msgstr "Rozdělená transakce" #: editsplitdialog.cpp:138 eqonomize.cpp:1279 eqonomize.cpp:1379 #: eqonomize.cpp:1473 eqonomize.cpp:1538 importcsvdialog.cpp:129 #: transactioneditwidget.cpp:175 transactioneditwidget.cpp:1099 #: transactionfilterwidget.cpp:135 #, kde-format msgid "Description:" msgstr "Popis:" #: editsplitdialog.cpp:143 eqonomize.cpp:413 eqonomize.cpp:523 #: eqonomize.cpp:639 eqonomize.cpp:1274 eqonomize.cpp:2476 #: importcsvdialog.cpp:187 transactioneditwidget.cpp:149 #: transactioneditwidget.cpp:199 transactioneditwidget.cpp:1119 #, kde-format msgid "Date:" msgstr "Datum:" #: editsplitdialog.cpp:148 eqonomize.cpp:424 eqonomize.cpp:1252 #: importcsvdialog.cpp:388 importcsvdialog.cpp:399 ledgerdialog.cpp:107 #: qifimportexport.cpp:503 #, kde-format msgid "Account:" msgstr "Účet:" #: editsplitdialog.cpp:163 #, kde-format msgid "Transactions:" msgstr "Transakce:" #: editsplitdialog.cpp:172 eqonomize.cpp:914 eqonomize.cpp:1061 #: eqonomize.cpp:1941 eqonomize.cpp:2033 eqonomize.cpp:3988 #: ledgerdialog.cpp:135 #, kde-format msgid "Type" msgstr "Typ" #: editsplitdialog.cpp:173 eqonomize.cpp:915 eqonomize.cpp:2034 #: ledgerdialog.cpp:136 qifimportexport.cpp:127 qifimportexport.cpp:139 #: qifimportexport.cpp:149 transactionlistwidget.cpp:111 #, kde-format msgid "Description" msgstr "Popis" #: editsplitdialog.cpp:174 eqonomize.cpp:4142 ledgerdialog.cpp:137 #, kde-format msgid "Account/Category" msgstr "Účet/Kategorie" #: editsplitdialog.cpp:175 #, kde-format msgid "Payment" msgstr "Platba" #: editsplitdialog.cpp:176 ledgerdialog.cpp:138 #, kde-format msgid "Deposit" msgstr "Vklad" #: editsplitdialog.cpp:181 ledgerdialog.cpp:151 #, kde-format msgid "New" msgstr "Nový" #: editsplitdialog.cpp:184 eqonomize.cpp:4333 #, kde-format msgid "New Expense..." msgstr "Nový výdaj..." #: editsplitdialog.cpp:185 eqonomize.cpp:4334 #, kde-format msgid "New Income..." msgstr "Nový příjem..." #: editsplitdialog.cpp:186 #, kde-format msgid "New Deposit..." msgstr "Nový vklad..." #: editsplitdialog.cpp:187 #, kde-format msgid "New Withdrawal..." msgstr "Nový výběr..." #: editsplitdialog.cpp:188 #, kde-format msgid "New Security Shares Bought..." msgstr "" #: editsplitdialog.cpp:189 #, kde-format msgid "Security Shares Sold..." msgstr "Cenné papíry prodané.." #: editsplitdialog.cpp:190 #, kde-format msgid "New Dividend..." msgstr "Nová dividenda" #: editsplitdialog.cpp:191 eqonomize.cpp:924 eqonomize.cpp:1071 #: eqonomize.cpp:4328 ledgerdialog.cpp:158 transactionlistwidget.cpp:1051 #, kde-format msgid "Edit..." msgstr "Upravit..." #: editsplitdialog.cpp:221 eqonomize.cpp:2325 #, kde-format msgid "Total value:" msgstr "Celková hodnota:" #: editsplitdialog.cpp:403 transactioneditwidget.cpp:653 #: transactioneditwidget.cpp:657 transactioneditwidget.cpp:668 #: transactioneditwidget.cpp:682 transactioneditwidget.cpp:693 #, kde-format msgid "No suitable account available." msgstr "Vhodný účet není k dispozici." #: editsplitdialog.cpp:415 #, kde-format msgid "Future dates is not allowed." msgstr "Budoucí datumy nejsou povoleny." #: editsplitdialog.cpp:419 #, kde-format msgid "A split must contain at least two transactions." msgstr "Pro rozdělení potřebujete nejméně dvě transakce." #: editsplitdialog.cpp:428 transactioneditwidget.cpp:714 #, kde-format msgid "Cannot transfer money to and from the same account." msgstr "Peníze nelze převést na stejný účet." #: eqonomize.cpp:419 eqonomize.cpp:2325 importcsvdialog.cpp:146 #: importcsvdialog.cpp:169 importcsvdialog.cpp:355 #: transactioneditwidget.cpp:117 transactioneditwidget.cpp:186 #: transactioneditwidget.cpp:1111 #, kde-format msgid "Cost:" msgstr "Cena:" #: eqonomize.cpp:420 importcsvdialog.cpp:364 importcsvdialog.cpp:397 #: transactioneditwidget.cpp:118 transactioneditwidget.cpp:184 #: transactioneditwidget.cpp:1110 #, kde-format msgid "Income:" msgstr "Příjem:" #: eqonomize.cpp:439 transactioneditwidget.cpp:193 #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:310 #, kde-format msgid "Quantity:" msgstr "Počet:" #: eqonomize.cpp:443 importcsvdialog.cpp:243 transactioneditwidget.cpp:288 #, kde-format msgid "Comments:" msgstr "Poznámky:" #: eqonomize.cpp:491 eqonomize.cpp:1176 #, kde-format msgid "Reinvested Dividend" msgstr "Reinvestované dividendy" #: eqonomize.cpp:501 transactioneditwidget.cpp:97 #: transactioneditwidget.cpp:157 #, kde-format msgid "Security:" msgstr "Cenný papír:" #: eqonomize.cpp:518 #, kde-format msgid "Shares added:" msgstr "Podíly přidané:" #: eqonomize.cpp:579 #, kde-format msgid "Security Trade" msgstr "Obchod cenným papírem" #: eqonomize.cpp:587 #, kde-format msgid "From security:" msgstr "Z cenného papíru:" #: eqonomize.cpp:603 #, kde-format msgid "Shares moved:" msgstr "Přesunuté podíly:" #: eqonomize.cpp:608 transactioneditwidget.cpp:135 #: transactionfilterwidget.cpp:167 transactionfilterwidget.cpp:168 #: transactionfilterwidget.cpp:343 transactionfilterwidget.cpp:380 #, kde-format msgid "All" msgstr "Vše" #: eqonomize.cpp:614 #, kde-format msgid "To security:" msgstr "K cennému papíru:" #: eqonomize.cpp:631 #, kde-format msgid "Shares received:" msgstr "Podíly přijaté:" #: eqonomize.cpp:635 importcsvdialog.cpp:386 importcsvdialog.cpp:412 #: overtimechart.cpp:193 overtimechart.cpp.bak:186 #, kde-format msgid "Value:" msgstr "Hodnota:" #: eqonomize.cpp:725 #, kde-format msgid "No other security available for trade in the account." msgstr "Na účtu už není žádný cenný papír pro obchodování." #: eqonomize.cpp:737 #, kde-format msgid "Selected to and from securities are the same." msgstr "Pro a od jsou stejné." #: eqonomize.cpp:745 transactioneditwidget.cpp:735 #, kde-format msgid "Zero shares not allowed." msgstr "Nulové podíly nejsou povoleny." #: eqonomize.cpp:749 transactioneditwidget.cpp:739 #, kde-format msgid "Zero value not allowed." msgstr "Nulová hodnota není povolena." #: eqonomize.cpp:757 eqonomize.cpp:766 #, kde-format msgid "Quotations" msgstr "Kurzy" #: eqonomize.cpp:777 eqonomize.cpp:913 eqonomize.cpp:962 eqonomize.cpp:1060 #: ledgerdialog.cpp:134 transactionlistwidget.cpp:110 #, kde-format msgid "Date" msgstr "Datum" #: eqonomize.cpp:778 #, kde-format msgid "Price per Share" msgstr "Cena za podíl" #: eqonomize.cpp:820 #, kde-format msgid "Quotations for %1" msgstr "Kurz pro %1" #: eqonomize.cpp:904 #, kde-format msgid "" "The following transactions was scheduled to occur today or before today.\n" "Confirm that they have indeed occurred (or will occur today)." msgstr "" "Následující transakce byly naplánovány na dnešní nebo dřívější datum.\n" "Potvrďte, že opravdu proběhly (nebo dnes proběhnou)." #: eqonomize.cpp:916 eqonomize.cpp:2035 transactionlistwidget.cpp:137 #, kde-format msgid "Amount" msgstr "Množství" #: eqonomize.cpp:926 #, kde-format msgid "Postpone..." msgstr "Odložit..." #: eqonomize.cpp:973 #, kde-format msgid "Can only postpone to future dates." msgstr "Odložit lze pouze na budoucí datum." #: eqonomize.cpp:1052 ledgerdialog.cpp:299 #, kde-format msgid "Transactions for %1" msgstr "Transakce pro %1" #: eqonomize.cpp:1063 eqonomize.cpp:1936 #, kde-format msgid "Shares" msgstr "Podíly" #: eqonomize.cpp:1160 #, kde-format msgid "Shares Bought" msgstr "Podíly koupené" #: eqonomize.cpp:1161 #, kde-format msgid "Shares Sold" msgstr "Podíly prodané" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Sold (Traded)" msgstr "Prodej podílů (obchodní)" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Bought (Traded)" msgstr "Koupené podíly (obchodované)" #: eqonomize.cpp:1204 #, kde-format msgid "Shares Bought (Recurring)" msgstr "Koupené podíly (opakované)" #: eqonomize.cpp:1205 #, kde-format msgid "Shares Sold (Recurring)" msgstr "Prodané podíly (opakované)" #: eqonomize.cpp:1207 #, kde-format msgid "Shares Bought (Scheduled)" msgstr "Koupené podíly (plánované)" #: eqonomize.cpp:1208 #, kde-format msgid "Shares Sold (Scheduled)" msgstr "Prodané podíly (plánované)" #: eqonomize.cpp:1220 #, kde-format msgid "Recurring Dividend" msgstr "Opakované dividendy" #: eqonomize.cpp:1222 #, kde-format msgid "Scheduled Dividend" msgstr "Plánované dividendy" #: eqonomize.cpp:1240 eqonomize.cpp:1360 #, kde-format msgid "Type:" msgstr "Typ:" #: eqonomize.cpp:1243 eqonomize.cpp:2600 eqonomize.cpp:2660 #, kde-format msgid "Mutual Fund" msgstr "Vzájemný fond" #: eqonomize.cpp:1244 eqonomize.cpp:2598 eqonomize.cpp:2658 #, kde-format msgid "Bond" msgstr "Dluhopis" #: eqonomize.cpp:1245 eqonomize.cpp:2599 eqonomize.cpp:2659 #, kde-format msgid "Stock" msgstr "Akcie" #: eqonomize.cpp:1246 eqonomize.cpp:2601 eqonomize.cpp:2661 eqonomize.cpp:3492 #: eqonomize.cpp:3497 importcsvdialog.cpp:117 qifimportexport.cpp:332 #, kde-format msgid "Other" msgstr "Jiný" #: eqonomize.cpp:1249 eqonomize.cpp:1370 eqonomize.cpp:1464 eqonomize.cpp:1529 #, kde-format msgid "Name:" msgstr "Název:" #: eqonomize.cpp:1264 #, kde-format msgid "Decimals in Shares:" msgstr "Desetiny v podílech:" #: eqonomize.cpp:1267 #, kde-format msgid "Initial Shares:" msgstr "Počáteční podíly:" #: eqonomize.cpp:1270 #, kde-format msgid "Initial quotation:" msgstr "Počáteční kurz:" #: eqonomize.cpp:1289 transactioneditwidget.cpp:675 #, kde-format msgid "No suitable account or income category available." msgstr "Neexistuje vhodná kategorie účtů nebo příjmů." #: eqonomize.cpp:1363 eqonomize.cpp:3488 eqonomize.cpp:4021 #: qifimportexport.cpp:325 #, kde-format msgid "Cash" msgstr "Hotovost" #: eqonomize.cpp:1364 eqonomize.cpp:4016 #, kde-format msgid "Current Account" msgstr "Běžný účet" #: eqonomize.cpp:1365 eqonomize.cpp:3490 eqonomize.cpp:4017 #, kde-format msgid "Savings Account" msgstr "Spořící účet" #: eqonomize.cpp:1366 eqonomize.cpp:4018 #, kde-format msgid "Credit Card" msgstr "Platební karta" #: eqonomize.cpp:1367 eqonomize.cpp:4019 #, kde-format msgid "Liabilities" msgstr "Dluhy" #: eqonomize.cpp:1368 eqonomize.cpp:1731 eqonomize.cpp:1732 eqonomize.cpp:3891 #: eqonomize.cpp:3897 eqonomize.cpp:4020 #, kde-format msgid "Securities" msgstr "Cenné papíry" #: eqonomize.cpp:1373 #, kde-format msgid "Initial balance:" msgstr "Počáteční bilance:" #: eqonomize.cpp:1376 #, kde-format msgid "Default account for budgeted transactions" msgstr "Výchozí účet pro rozpočtové transakce" #: eqonomize.cpp:1441 eqonomize.cpp:1507 eqonomize.cpp:1572 #, kde-format msgid "Empty name." msgstr "Prázdný název." #: eqonomize.cpp:1447 #, kde-format msgid "The entered name is used by another account." msgstr "Tento název už používá jiný účet." #: eqonomize.cpp:1467 eqonomize.cpp:1532 #, kde-format msgid "Monthly budget:" msgstr "Měsíční rozpočet:" #: eqonomize.cpp:1513 #, kde-format msgid "The entered name is used by another income category." msgstr "Tento název už používá jiná kategorie příjmů." #: eqonomize.cpp:1578 #, kde-format msgid "The entered name is used by another expense category." msgstr "Tento název už používá jiná kategorie výdajů." #: eqonomize.cpp:1711 eqonomize.cpp:1778 eqonomize.cpp:3984 eqonomize.cpp:5970 #: eqonomize.cpp:5976 #, kde-format msgid "Accounts" msgstr "Účty" #: eqonomize.cpp:1712 #, kde-format msgid "Accounts & Categories" msgstr "Účty & Kategorie" #: eqonomize.cpp:1716 eqonomize.cpp:1717 eqonomize.cpp:1780 #: importcsvdialog.cpp:70 overtimechart.cpp:126 overtimechart.cpp:1727 #: overtimechart.cpp:1731 overtimechart.cpp.bak:119 overtimechart.cpp.bak:1708 #: overtimechart.cpp.bak:1712 overtimereport.cpp:103 overtimereport.cpp:357 #: overtimereport.cpp:377 overtimereport.cpp:395 transactionlistwidget.cpp:251 #: transactionlistwidget.cpp:263 #, kde-format msgid "Expenses" msgstr "Výdaje" #: eqonomize.cpp:1721 eqonomize.cpp:1722 eqonomize.cpp:1779 eqonomize.cpp:4043 #: importcsvdialog.cpp:75 overtimechart.cpp:127 overtimechart.cpp:1726 #: overtimechart.cpp:1730 overtimechart.cpp.bak:120 overtimechart.cpp.bak:1707 #: overtimechart.cpp.bak:1711 overtimereport.cpp:104 overtimereport.cpp:349 #: overtimereport.cpp:368 overtimereport.cpp:386 transactionlistwidget.cpp:252 #: transactionlistwidget.cpp:264 #, kde-format msgid "Incomes" msgstr "Příjmy" #: eqonomize.cpp:1726 eqonomize.cpp:1727 importcsvdialog.cpp:78 #: transactionlistwidget.cpp:253 transactionlistwidget.cpp:265 #, kde-format msgid "Transfers" msgstr "Převody" #: eqonomize.cpp:1736 #, kde-format msgid "Schedule" msgstr "Plán" #: eqonomize.cpp:1737 #, kde-format msgid "Scheduled Transactions" msgstr "Plánované transakce" #: eqonomize.cpp:1753 eqonomize.cpp:1775 #, kde-format msgid "Account / Category" msgstr "Účet / Skupina" #: eqonomize.cpp:1754 #, kde-format msgid "Remaining Budget (%1)" msgstr "Zbývající rozpočet (%1)" #: eqonomize.cpp:1755 #, kde-format msgid "Change (%1)" msgstr "Změna (%1)" #: eqonomize.cpp:1756 #, kde-format msgid "Total (%1)" msgstr "Celkem (%1)" #: eqonomize.cpp:1769 #, kde-format msgctxt "%2 remains of %1 budget" msgid "%2 of %1" msgstr "%1 ze %2" #: eqonomize.cpp:1785 eqonomize.cpp:4002 #, kde-format msgid "Includes budgeted transactions" msgstr "Zahrnuje rozpočtové transakce" #: eqonomize.cpp:1793 #, kde-format msgid "Period" msgstr "Období" #: eqonomize.cpp:1825 #, kde-format msgid "Select Period" msgstr "Vybrat období" #: eqonomize.cpp:1827 eqonomize.cpp:4312 #, kde-format msgid "Current Month" msgstr "Tento měsíc" #: eqonomize.cpp:1828 eqonomize.cpp:4313 #, kde-format msgid "Current Year" msgstr "Tento rok" #: eqonomize.cpp:1829 eqonomize.cpp:4314 #, kde-format msgid "Current Whole Month" msgstr "Celý tento měsíc" #: eqonomize.cpp:1830 eqonomize.cpp:4315 #, kde-format msgid "Current Whole Year" msgstr "Celý tento rok" #: eqonomize.cpp:1831 #, kde-format msgid "Whole Past Month" msgstr "Celý minulý měsíc" #: eqonomize.cpp:1832 #, kde-format msgid "Whole Past Year" msgstr "Celý minulý rok" #: eqonomize.cpp:1833 #, kde-format msgid "Previous Month" msgstr "Minulý měsíc" #: eqonomize.cpp:1834 #, kde-format msgid "Previous Year" msgstr "Minulý rok" #: eqonomize.cpp:1837 #, kde-format msgid "Show partial budget" msgstr "Ukázat částečný rozpočet" #: eqonomize.cpp:1842 #, kde-format msgid "Edit Budget" msgstr "Upravit rozpočet" #: eqonomize.cpp:1846 #, kde-format msgid "Budget:" msgstr "Rozpočet:" #: eqonomize.cpp:1856 #, kde-format msgid "Month:" msgstr "Měsíc:" #: eqonomize.cpp:1864 #, kde-format msgid "Result previous month:" msgstr "Výsledek minulého měsíce:" #: eqonomize.cpp:1917 eqonomize.cpp:4354 #, kde-format msgid "New Security..." msgstr "Nový cenný papír..." #: eqonomize.cpp:1919 #, kde-format msgid "New Transaction" msgstr "Nová transakce" #: eqonomize.cpp:1922 eqonomize.cpp:4362 #, kde-format msgid "Set Quotation..." msgstr "Nastavit kurz..." #: eqonomize.cpp:1934 eqonomize.cpp:3987 #, kde-format msgid "Name" msgstr "Název" #: eqonomize.cpp:1937 #, kde-format msgid "Quotation" msgstr "Kurz" #: eqonomize.cpp:1939 #, kde-format msgid "Profit" msgstr "Zisk" #: eqonomize.cpp:1940 #, kde-format msgid "Yearly Rate" msgstr "Roční sazba" #: eqonomize.cpp:1942 qifimportexport.cpp:323 #, kde-format msgid "Account" msgstr "Účet" #: eqonomize.cpp:1953 #, kde-format msgid "Statistics Period" msgstr "Doba statistiky" #: eqonomize.cpp:2015 #, kde-format msgid "New Schedule" msgstr "Nový plán" #: eqonomize.cpp:2018 #, kde-format msgid "Edit" msgstr "Upravit" #: eqonomize.cpp:2032 #, kde-format msgid "Next Occurrence" msgstr "Další výskyt" #: eqonomize.cpp:2038 qifimportexport.cpp:152 transactionlistwidget.cpp:144 #, kde-format msgid "Comments" msgstr "Komentáře" #: eqonomize.cpp:2291 #, kde-format msgid "New Security" msgstr "Nový cenný papír" #: eqonomize.cpp:2306 #, kde-format msgid "Edit Security" msgstr "Upravit cenný papír" #: eqonomize.cpp:2325 #, kde-format msgid "Profit:" msgstr "Zisk:" #: eqonomize.cpp:2325 #, kde-format msgid "Rate:" msgstr "Sazba:" #: eqonomize.cpp:2332 #, kde-format msgid "" "Are you sure you want to delete the security \"%1\" and all associated " "transactions?" msgstr "" "Opravdu chcete smazat cenný papír \"%1\" a všechny související transakce?" #: eqonomize.cpp:2394 transactioneditwidget.cpp:700 #, kde-format msgid "No security available." msgstr "Žádný cenný papír k dispozici." #: eqonomize.cpp:2466 #, kde-format msgid "Set Quotation (%1)" msgstr "Stanovit plán rozpočtu (%1)" #: eqonomize.cpp:2472 transactioneditwidget.cpp:143 #, kde-format msgid "Price per share:" msgstr "Cena za akcii:" #: eqonomize.cpp:2485 #, kde-format msgid "Future dates are not allowed." msgstr "Budoucí datumy nejsou povoleny." #: eqonomize.cpp:2513 #, kde-format msgid "Security Transactions" msgstr "Transakce s cennými papíry" #: eqonomize.cpp:3166 ledgerdialog.cpp:293 #, kde-format msgid "Ledger" msgstr "Účetní kniha" #: eqonomize.cpp:3475 #, kde-format msgid "Untitled" msgstr "" #: eqonomize.cpp:3489 #, kde-format msgid "Check Account" msgstr "Ověřit účet" #: eqonomize.cpp:3491 #, kde-format msgid "Salary" msgstr "Plat" #: eqonomize.cpp:3493 #, kde-format msgid "Bills" msgstr "Účty" #: eqonomize.cpp:3494 #, kde-format msgid "Clothing" msgstr "Oblečení" #: eqonomize.cpp:3495 #, kde-format msgid "Groceries" msgstr "Potraviny" #: eqonomize.cpp:3496 #, kde-format msgid "Leisure" msgstr "Volný čas" #: eqonomize.cpp:3561 importcsvdialog.cpp:795 qifimportexport.cpp:280 #: qifimportexport.cpp:444 #, kde-format msgid "Couldn't fetch %1." msgstr "Nelze přinést %1." #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Error loading %1: %2." msgstr "Chyba při spouštění %1: %2." #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Couldn't open file" msgstr "Soubor nelze otevřít" #: eqonomize.cpp:3627 eqonomize.cpp:3653 #, kde-format msgid "Error saving %1: %2." msgstr "Chyba při ukládání %1: %2." #: eqonomize.cpp:3627 eqonomize.cpp:3653 eqonomize.cpp:3673 #, kde-format msgid "Couldn't save file" msgstr "Soubor nelze uložit" #: eqonomize.cpp:3673 eqonomize.cpp:4282 ledgerdialog.cpp:281 #: qifimportexport.cpp:634 #, kde-format msgid "Failed to upload file to %1." msgstr "Nepodařilo se nahrát soubor do %1." #: eqonomize.cpp:3703 eqonomize.cpp:3728 #, kde-format msgid "Report" msgstr "Sestava" #: eqonomize.cpp:3758 eqonomize.cpp:3783 #, kde-format msgid "Chart" msgstr "Graf" #: eqonomize.cpp:3823 eqonomize.cpp:3829 #, kde-format msgid "Transaction Schedule" msgstr "Plán transakce" #: eqonomize.cpp:3976 #, kde-format msgctxt "html format" msgid "Accounts & Categories" msgstr "Účty & Kategorie" #: eqonomize.cpp:3981 #, kde-format msgctxt "html format" msgid "Accounts & Categories (%1–%2)" msgstr "Účty & Kategorie (%1–%2)" #: eqonomize.cpp:3982 #, kde-format msgctxt "html format" msgid "Accounts & Categories (to %1)" msgstr "Účty & Kategorie (do %1)" #: eqonomize.cpp:3989 eqonomize.cpp:4049 eqonomize.cpp:4097 eqonomize.cpp:4142 #, kde-format msgid "Change" msgstr "Změna" #: eqonomize.cpp:3993 ledgerdialog.cpp:140 #, kde-format msgid "Balance" msgstr "Bilance" #: eqonomize.cpp:4047 eqonomize.cpp:4095 #, kde-format msgid "Budget" msgstr "Rozpočet" #: eqonomize.cpp:4048 eqonomize.cpp:4096 #, kde-format msgid "Remaining Budget" msgstr "Zbývající rozpočet" #: eqonomize.cpp:4050 #, kde-format msgid "Total Incomes" msgstr "Celkové příjmy" #: eqonomize.cpp:4091 #, kde-format msgid "Costs" msgstr "Ceny" #: eqonomize.cpp:4098 #, kde-format msgid "Total Expenses" msgstr "Celkové výdaje" #: eqonomize.cpp:4167 eqonomize.cpp:4214 #, kde-format msgid "Empty expenses list." msgstr "Prázdný seznam výdajů." #: eqonomize.cpp:4172 eqonomize.cpp:4219 #, kde-format msgid "Empty incomes list." msgstr "Prázdný seznam příjmů." #: eqonomize.cpp:4177 eqonomize.cpp:4224 #, kde-format msgid "Empty transfers list." msgstr "Prázdný seznam převodů." #: eqonomize.cpp:4182 eqonomize.cpp:4229 #, kde-format msgid "Empty securities list." msgstr "Prázdný seznam cenných papírů." #: eqonomize.cpp:4187 eqonomize.cpp:4234 #, kde-format msgid "Empty schedule list." msgstr "Prázdný seznam plánů." #: eqonomize.cpp:4305 #, kde-format msgid "Export View..." msgstr "Exportovat ..." #: eqonomize.cpp:4307 #, kde-format msgid "Print View..." msgstr "Tisk..." #: eqonomize.cpp:4309 #, kde-format msgid "Initial Period" msgstr "Počáteční období" #: eqonomize.cpp:4316 #, kde-format msgid "Remember Last Dates" msgstr "Zapamatovat poslední datumy" #: eqonomize.cpp:4319 #, kde-format msgid "Import CSV File..." msgstr "Importovat soubor CSV..." #: eqonomize.cpp:4320 #, kde-format msgid "Import QIF File..." msgstr "Importovat soubor QIF..." #: eqonomize.cpp:4321 #, kde-format msgid "Export As QIF File..." msgstr "Exportovat jako soubor QIF..." #: eqonomize.cpp:4323 #, kde-format msgid "Add Account..." msgstr "Přidat účet..." #: eqonomize.cpp:4324 #, kde-format msgid "New Account..." msgstr "Nový účet..." #: eqonomize.cpp:4325 #, kde-format msgid "New Income Category..." msgstr "Nová kategorie příjmů..." #: eqonomize.cpp:4326 #, kde-format msgid "New Expense Category..." msgstr "Nová kategorie výdajů..." #: eqonomize.cpp:4327 #, kde-format msgid "Balance..." msgstr "Bilance..." #: eqonomize.cpp:4331 #, kde-format msgid "Show Transactions" msgstr "Ukázat transakce" #: eqonomize.cpp:4335 #, kde-format msgid "New Transfer..." msgstr "Nový převod..." #: eqonomize.cpp:4336 #, kde-format msgid "New Split Transaction..." msgstr "Nová rozdělená transakce..." #: eqonomize.cpp:4337 #, kde-format msgid "Edit Transaction(s) (Occurrence)..." msgstr "Upravit transakce (výskyt)" #: eqonomize.cpp:4338 #, kde-format msgid "Edit Occurrence..." msgstr "Upravit výskyt..." #: eqonomize.cpp:4339 #, kde-format msgid "Edit Schedule (Recurrence)..." msgstr "Upravit plán (opakování)..." #: eqonomize.cpp:4340 #, kde-format msgid "Edit Schedule..." msgstr "Upravit plán..." #: eqonomize.cpp:4341 #, kde-format msgid "Remove Transaction(s) (Occurrence)" msgstr "Odstranit transakce (výskyt)" #: eqonomize.cpp:4342 #, kde-format msgid "Remove Occurrence" msgstr "Odstranit výskyt" #: eqonomize.cpp:4343 #, kde-format msgid "Delete Schedule (Recurrence)" msgstr "Odstranit plán (opakování)" #: eqonomize.cpp:4344 #, kde-format msgid "Delete Schedule" msgstr "Smazat plán" #: eqonomize.cpp:4345 #, kde-format msgid "Edit Split Transaction..." msgstr "Upravit rozdělenou transakci" #: eqonomize.cpp:4346 #, kde-format msgid "Remove Split Transaction" msgstr "Odstranit rozdělenou transakci" #: eqonomize.cpp:4347 #, kde-format msgid "Join Transactions..." msgstr "Spojit transakce..." #: eqonomize.cpp:4348 #, kde-format msgid "Split Up Transaction" msgstr "Rozdělit transakci" #: eqonomize.cpp:4350 #, kde-format msgid "Refund..." msgstr "Úhrada..." #: eqonomize.cpp:4351 #, kde-format msgid "Repayment..." msgstr "Splátka..." #: eqonomize.cpp:4352 #, kde-format msgid "New Refund/Repayment..." msgstr "Nová úhrada/splátka" #: eqonomize.cpp:4355 #, kde-format msgid "Edit Security..." msgstr "Upravit cenný papír..." #: eqonomize.cpp:4356 #, kde-format msgid "Remove Security" msgstr "Smazat cenný papír" #: eqonomize.cpp:4357 #, kde-format msgid "Shares Sold..." msgstr "Prodané podíly..." #: eqonomize.cpp:4358 #, kde-format msgid "Shares Bought..." msgstr "Nakoupené podíly..." #: eqonomize.cpp:4359 #, kde-format msgid "Dividend..." msgstr "Dividenda..." #: eqonomize.cpp:4360 #, kde-format msgid "Reinvested Dividend..." msgstr "Reinvestovaná dividenda..." #: eqonomize.cpp:4361 #, kde-format msgid "Shares Moved..." msgstr "Přesunuté podíly..." #: eqonomize.cpp:4363 #, kde-format msgid "Edit Quotations..." msgstr "Upravit kurz..." #: eqonomize.cpp:4364 #, kde-format msgid "Transactions..." msgstr "Transakce..." #: eqonomize.cpp:4366 #, kde-format msgid "Development Over Time Report..." msgstr "Výkaz časového vývoje..." #: eqonomize.cpp:4367 #, kde-format msgid "Categories Comparison Report..." msgstr "Výkaz porovnání kategorií..." #: eqonomize.cpp:4368 #, kde-format msgid "Categories Comparison Chart..." msgstr "Schéma vývoje kategorií..." #: eqonomize.cpp:4369 #, kde-format msgid "Development Over Time Chart..." msgstr "Schéma časového vývoje..." #: eqonomize.cpp:4371 #, kde-format msgid "Use Additional Transaction Properties" msgstr "Použít další vlastnosti transakcí" #: eqonomize.cpp:4413 #, kde-format msgid "" "Eqonomize! exited unexpectedly before the file was saved and data was lost.\n" "Do you want to load the last auto-saved version of the file?" msgstr "" "Eqonomize! byl nečekaně zavřen bez uložení a data byla ztracena.\n" "Přejete si spustit poslední automaticky uloženou verzi souboru?" #: eqonomize.cpp:4413 #, kde-format msgid "Crash Recovery" msgstr "Obnovení po pádu" #: eqonomize.cpp:4605 eqonomize.cpp:4606 #, kde-format msgid "The current file has been modified. Do you want to save it?" msgstr "Soubor byl změněn. Přejete si ho uložit?" #: eqonomize.cpp:4643 #, kde-format msgid "Confirm Schedule" msgstr "Potvrdit plán" #: eqonomize.cpp:4697 #, kde-format msgid "New Account" msgstr "Nový účet" #: eqonomize.cpp:4712 #, kde-format msgid "New Income Category" msgstr "Nová skupina příjmů" #: eqonomize.cpp:4725 #, kde-format msgid "New Expense Category" msgstr "Nová kategorie výdajů" #: eqonomize.cpp:4800 #, kde-format msgid "Balance Account" msgstr "Bilanční účet" #: eqonomize.cpp:4806 #, kde-format msgid "Book value:" msgstr "Účetní hodnota:" #: eqonomize.cpp:4813 #, kde-format msgid "Real value:" msgstr "Skutečná hodnota:" #: eqonomize.cpp:4836 #, kde-format msgid "Edit Account" msgstr "Upravit účet" #: eqonomize.cpp:4869 #, kde-format msgid "Edit Income Category" msgstr "Upravit kategorii příjmů" #: eqonomize.cpp:4887 #, kde-format msgid "Edit Expense Category" msgstr "Upravit kategorii výdajů" #: eqonomize.cpp:4948 #, kde-format msgid "Move transactions?" msgstr "Přesunout transakce?" #: eqonomize.cpp:4958 #, kde-format msgid "Move to:" msgstr "Přesunout do:" #: eqonomize.cpp:4965 #, kde-format msgid "" "The category contains some expenses.\n" "What do you want to do with them?" msgstr "" "Kategorie obsahuje výdaje.\n" "Co s nimi chcete udělat?" #: eqonomize.cpp:4977 #, kde-format msgid "" "The category contains some incomes.\n" "What do you want to do with them?" msgstr "" "Kategorie obsahuje příjmy.\n" "Co s nimi chcete udělat?" #: eqonomize.cpp:4989 #, kde-format msgid "" "The account contains some transactions.\n" "What do you want to do with them?" msgstr "" "Účet obsahuje transakce.\n" "Co s nimi chcete udělat?" #: eqonomize.cpp:5011 #, kde-format msgid "" "The category contains some expenses that will be removed. Do you still want " "to remove the category?" msgstr "" "Kategorie obsahuje výdaje, které budou odstraněny. Opravdu chcete kategorii " "odstranit?" #: eqonomize.cpp:5011 eqonomize.cpp:5012 #, kde-format msgid "Remove Category?" msgstr "Odstranit kategorii?" #: eqonomize.cpp:5012 #, kde-format msgid "" "The category contains some incomes that will be removed. Do you still want " "to remove the category?" msgstr "" "Kategorie obsahuje příjmy, které budou odstraněny. Opravdu chcete kategorii " "odstranit?" #: eqonomize.cpp:5013 #, kde-format msgid "" "The account contains some transactions that will be removed. Do you still " "want to remove the account?" msgstr "" "Účet obsahuje transakce, které budou odstraněny. Opravdu chcete účet " "odstranit?" #: eqonomize.cpp:5013 #, kde-format msgid "Remove Account?" msgstr "Odstranit účet?" #: eqonomize.cpp:5531 eqonomize.cpp:5555 eqonomize.cpp:5730 #, kde-format msgctxt "%1: budget; %2: remaining budget" msgid "%2 of %1" msgstr "%2 ze %1" #: eqonomize.cpp:5810 eqonomize.cpp:5835 #, kde-format msgid "%1 (with no budget)" msgstr "%1 (se žádným rozpočtem)" #: eqonomize.cpp:5811 eqonomize.cpp:5836 #, kde-format msgid "%1 (with budget %2)" msgstr "%1 (s rozpočtem %2)" #: importcsvdialog.cpp:60 #, kde-format msgid "Import CSV file" msgstr "Imporovat soubor CSV" #: importcsvdialog.cpp:64 #, kde-format msgid "Transaction Type Selection" msgstr "Výběr typu transakce" #: importcsvdialog.cpp:81 #, kde-format msgid "Expenses and incomes (negative cost)" msgstr "Výdaje a příjmy (záporná cena)" #: importcsvdialog.cpp:84 #, kde-format msgid "Expenses and incomes (separate columns)" msgstr "Výdaje a příjmy (oddělené sloupce)" #: importcsvdialog.cpp:87 #, kde-format msgid "All types" msgstr "Všechny typy" #: importcsvdialog.cpp:95 qifimportexport.cpp:62 #, kde-format msgid "File Selection" msgstr "Výběr souboru" #: importcsvdialog.cpp:99 qifimportexport.cpp:66 qifimportexport.cpp:548 #, kde-format msgid "File:" msgstr "Soubor:" #: importcsvdialog.cpp:104 #, kde-format msgid "First data row:" msgstr "První řádek údajů:" #: importcsvdialog.cpp:107 #, kde-format msgid "Auto" msgstr "Auto" #: importcsvdialog.cpp:110 #, kde-format msgid "Column delimiter:" msgstr "Oddělovač sloupců:" #: importcsvdialog.cpp:113 #, kde-format msgid "Comma" msgstr "Čárka" #: importcsvdialog.cpp:114 #, kde-format msgid "Tabulator" msgstr "Tabulátor" #: importcsvdialog.cpp:115 #, kde-format msgid "Semicolon" msgstr "Středník" #: importcsvdialog.cpp:116 #, kde-format msgid "Space" msgstr "Mezera" #: importcsvdialog.cpp:125 #, kde-format msgid "Columns Specification" msgstr "Popis sloupce" #: importcsvdialog.cpp:131 importcsvdialog.cpp:149 importcsvdialog.cpp:172 #: importcsvdialog.cpp:189 importcsvdialog.cpp:208 importcsvdialog.cpp:227 #: importcsvdialog.cpp:245 #, kde-format msgid "Column" msgstr "Sloupec" #: importcsvdialog.cpp:205 importcsvdialog.cpp:356 importcsvdialog.cpp:365 #: importcsvdialog.cpp:387 importcsvdialog.cpp:398 #: transactioneditwidget.cpp:225 transactioneditwidget.cpp:267 #: transactioneditwidget.cpp:1130 transactionfilterwidget.cpp:102 #: transactionfilterwidget.cpp:113 #, kde-format msgid "Category:" msgstr "Kategorie:" #: importcsvdialog.cpp:224 importcsvdialog.cpp:357 importcsvdialog.cpp:374 #: transactioneditwidget.cpp:248 transactioneditwidget.cpp:273 #: transactionfilterwidget.cpp:117 #, kde-format msgid "From account:" msgstr "Z účtu:" #: importcsvdialog.cpp:262 #, kde-format msgid "Create missing categories and accounts" msgstr "Vytvořit chybějící kategorie a účty" #: importcsvdialog.cpp:354 #, kde-format msgid "" "Imports data as expenses. Costs have positive value. Value is the only " "required column." msgstr "" "Importovat údaje jako výdaje. Ceny jsou kladné. Vyžadován pouze sloupec " "hodnota." #: importcsvdialog.cpp:363 #, kde-format msgid "Imports data as incomes. Value is the only required column." msgstr "Importovat údaje jako příjmy. Vyžadován pouze sloupec hodnota." #: importcsvdialog.cpp:366 importcsvdialog.cpp:375 #: transactioneditwidget.cpp:231 transactioneditwidget.cpp:258 #: transactionfilterwidget.cpp:106 #, kde-format msgid "To account:" msgstr "Na účet:" #: importcsvdialog.cpp:372 #, kde-format msgid "Imports data as transfers. Value is the only required column." msgstr "Importovat údaje jako převody. Vyžadován pouze sloupec hodnota." #: importcsvdialog.cpp:373 transactioneditwidget.cpp:182 #: transactioneditwidget.cpp:1109 #, kde-format msgid "Amount:" msgstr "Množství:" #: importcsvdialog.cpp:381 #, kde-format msgid "" "Imports data as expenses and incomes. Costs have negative value. Value and " "category are both required columns." msgstr "" "Importovat údaje jako výdaje a příjmy. Ceny jsou kladné. Vyžadován sloupec " "hodnota i kategorie." #: importcsvdialog.cpp:392 #, kde-format msgid "" "Imports data as expenses and incomes. Costs and incomes have separate " "columns. Income, cost, and category are all required columns." msgstr "" "Importovat údaje jako výdaje a příjmy. Ceny a příjmy jsou v oddělených " "sloupcích. Vyžadovány sloupce příjem, cena a kategorie." #: importcsvdialog.cpp:403 #, kde-format msgid "" "Imports data as expenses, incomes, and transfers. Costs have negative or " "positive value. Value, to, and from are all required columns. Accounts and " "categories must be existing." msgstr "" "Importovat údaje jako výdaje, příjmy a převody. Ceny jsou kladné nebo " "záporné. Vyžadovány sloupce pro a od. Účty a kategorie musí existovat." #: importcsvdialog.cpp:413 transactioneditwidget.cpp:209 #: transactionfilterwidget.cpp:74 transactionfilterwidget.cpp:91 #, kde-format msgid "From:" msgstr "Od:" #: importcsvdialog.cpp:414 transactioneditwidget.cpp:216 #: transactionfilterwidget.cpp:81 transactionfilterwidget.cpp:95 #, kde-format msgid "To:" msgstr "Do:" #: importcsvdialog.cpp:440 qifimportexport.cpp:258 #, kde-format msgid "A file must be selected." msgstr "Vyberte soubor." #: importcsvdialog.cpp:446 importcsvdialog.cpp:458 qifimportexport.cpp:265 #: qifimportexport.cpp:595 #, kde-format msgid "Selected file is a directory." msgstr "Vybraný soubor je adresář." #: importcsvdialog.cpp:450 importcsvdialog.cpp:462 qifimportexport.cpp:269 #, kde-format msgid "Selected file does not exist." msgstr "Vybraný soubor neexistuje." #: importcsvdialog.cpp:468 #, kde-format msgid "Empty delimiter." msgstr "Prázdný oddělovač." #: importcsvdialog.cpp:712 #, kde-format msgid "The same column number is selected multiple times." msgstr "Stejné číslo sloupce je vybráno vícekrát." #: importcsvdialog.cpp:772 #, kde-format msgid "Selected from account is the same as the to account." msgstr "Vybrané z účtu je stejné jako na účet." #: importcsvdialog.cpp:803 qifimportexport.cpp:288 qifimportexport.cpp:452 #, kde-format msgid "Couldn't open %1 for reading." msgstr "Nelze otevřít %1 ke čtení." #: importcsvdialog.cpp:806 qifimportexport.cpp:291 qifimportexport.cpp:455 #, kde-format msgid "Error reading %1." msgstr "Chyba při čtení %1." #: importcsvdialog.cpp:1187 qifimportexport.cpp:462 #, kde-format msgid "Successfully imported 1 transaction." msgid_plural "Successfully imported %n transactions." msgstr[0] "" msgstr[1] "" #: importcsvdialog.cpp:1189 #, kde-format msgid "Unable to import any transactions imported." msgstr "Nelze importovat." #: importcsvdialog.cpp:1193 #, kde-format msgid "Failed to import 1 data row." msgid_plural "Failed to import %n data rows." msgstr[0] "" msgstr[1] "" #: importcsvdialog.cpp:1194 #, kde-format msgid "Required columns missing." msgstr "Požadované sloupce chybí." #: importcsvdialog.cpp:1195 #, kde-format msgid "Invalid value." msgstr "Neplatná hodnota." #: importcsvdialog.cpp:1197 #, kde-format msgid "Empty category name." msgstr "Prázdný název kategorie." #: importcsvdialog.cpp:1197 importcsvdialog.cpp:1198 #, kde-format msgid "Empty account name." msgstr "Prázdný název účtu." #: importcsvdialog.cpp:1199 #, kde-format msgid "Unknown category found." msgstr "Nalezena neznámá kategorie." #: importcsvdialog.cpp:1199 importcsvdialog.cpp:1200 #, kde-format msgid "Unknown account found." msgstr "Nalezen neznámý účet." #: importcsvdialog.cpp:1201 #, kde-format msgid "Cannot import security transactions (to/from security accounts)." msgstr "" "Nelze imporotvat transakci s cennými papíry (z/na účet cenných papírů)." #: importcsvdialog.cpp:1202 #, kde-format msgid "Balancing account wrongly used." msgstr "Bilanční účet použit špatně." #: importcsvdialog.cpp:1203 #, kde-format msgid "Same to and from account/category." msgstr "Stejné do a z účet/kategorie." #: importcsvdialog.cpp:1205 #, kde-format msgid "No data found." msgstr "Žádná data nenalezena." #: importcsvdialog.cpp:1219 qifimportexport.cpp:345 #, kde-format msgid "Unrecognized date format." msgstr "Neznámý formát datumu." #: importcsvdialog.cpp:1224 #, kde-format msgid "Specify Format" msgstr "Upřesněte formát" #: importcsvdialog.cpp:1230 #, kde-format msgid "" "The format of dates and/or numbers in the CSV file is ambiguous. Please " "select the correct format." msgstr "" "Formát datumů a/nebo čísel v souboru CSV je nejednoznačný. Prosím vyberte " "správný formát." #: importcsvdialog.cpp:1235 qifimportexport.cpp:94 qifimportexport.cpp:533 #, kde-format msgid "Date format:" msgstr "Formát data:" #: importcsvdialog.cpp:1278 qifimportexport.cpp:541 #, kde-format msgid "Value format:" msgstr "Formát hodnoty:" #: kdateedit.cpp:366 #, kde-format msgctxt "the day after today" msgid "tomorrow" msgstr "" #: kdateedit.cpp:367 #, kde-format msgctxt "this day" msgid "today" msgstr "" #: kdateedit.cpp:368 #, kde-format msgctxt "the day before today" msgid "yesterday" msgstr "" #: kdatepickerpopup.cpp:94 #, kde-format msgctxt "@option today" msgid "&Today" msgstr "" #: kdatepickerpopup.cpp:95 #, kde-format msgctxt "@option tomorrow" msgid "To&morrow" msgstr "" #: kdatepickerpopup.cpp:96 #, kde-format msgctxt "@option next week" msgid "Next &Week" msgstr "" #: kdatepickerpopup.cpp:97 #, kde-format msgctxt "@option next month" msgid "Next M&onth" msgstr "" #: kdatepickerpopup.cpp:105 #, kde-format msgctxt "@option do not specify a date" msgid "No Date" msgstr "" #: ledgerdialog.cpp:122 #, kde-format msgid "Export..." msgstr "Exportovat..." #: ledgerdialog.cpp:123 #, kde-format msgid "Print..." msgstr "Tisk..." #: ledgerdialog.cpp:139 #, kde-format msgid "Withdrawal" msgstr "Výběr" #: ledgerdialog.cpp:162 #, kde-format msgid "Join..." msgstr "Připojit..." #: ledgerdialog.cpp:164 #, kde-format msgid "Split Up" msgstr "Rozdělit" #: ledgerdialog.cpp:234 ledgerdialog.cpp:354 #, kde-format msgid "Empty transaction list." msgstr "Vyprázdnit seznam transakcí." #: ledgerdialog.cpp:443 transactionlistwidget.cpp:717 #, kde-format msgid "Are you sure you want to delete all (%1) selected transactions?" msgstr "Opravdu chcete smazat všechny (%1) vybrané transakce?" #: ledgerdialog.cpp:547 transactionlistwidget.cpp:489 #, kde-format msgid "" "Cannot set the value of security transactions using the dialog for modifying " "multiple transactions." msgstr "" "Nelze zadat hodnotu transakce s cenným papírem použitím dialogu pro změnu " "více transakcí." #: ledgerdialog.cpp:553 transactionlistwidget.cpp:495 #, kde-format msgid "Cannot change description of dividends and security transactions." msgstr "Nelze změnit popis dividend a transakcí s cennými papíry." #: ledgerdialog.cpp:559 transactionlistwidget.cpp:501 #, kde-format msgid "Cannot change payer of dividends and security transactions." msgstr "Nelze změnit plátce dividend a transakce s cennými papíry." #: ledgerdialog.cpp:565 transactionlistwidget.cpp:507 #, kde-format msgid "" "Cannot change date of transactions that are part of a split transaction." msgstr "Nelze změnit datum transakcí, které jsou součástí rozdělené transakce." #: main.cpp:39 msgid "Eqonomize!" msgstr "Eqonomize!" #: main.cpp:39 msgid "A personal accounting program" msgstr "Osobní účetní program" #: main.cpp:39 msgid "(C) 2008 Hanna K." msgstr "" #: main.cpp:40 msgid "Hanna K." msgstr "" #: main.cpp:44 msgid "Start with expenses list displayed" msgstr "Začněte se zobrazeným seznamem výdajů" #: main.cpp:46 msgid "Start with incomes list displayed" msgstr "Začněte se zobrazeným seznamem příjmů" #: main.cpp:48 msgid "Start with transfers list displayed" msgstr "Začněte se zobrazeným seznamem převodů" #: main.cpp:49 msgid "Document to open" msgstr "Dokument k otevření" #: overtimechart.cpp:124 overtimechart.cpp.bak:117 #, kde-format msgid "Incomes and Expenses" msgstr "Příjmy a výdaje" #: overtimechart.cpp:125 overtimechart.cpp:1722 overtimechart.cpp.bak:118 #: overtimechart.cpp.bak:1703 overtimereport.cpp:102 overtimereport.cpp:343 #, kde-format msgid "Profits" msgstr "Zisky" #: overtimechart.cpp:132 overtimechart.cpp:411 overtimechart.cpp:1949 #: overtimechart.cpp.bak:125 overtimechart.cpp.bak:404 #: overtimechart.cpp.bak:1950 overtimereport.cpp:108 overtimereport.cpp:228 #: overtimereport.cpp:753 #, kde-format msgid "All Categories Combined" msgstr "Všechny kategorie kombinované" #: overtimechart.cpp:138 overtimechart.cpp:296 overtimechart.cpp:400 #: overtimechart.cpp:1852 overtimechart.cpp:1973 overtimechart.cpp.bak:131 #: overtimechart.cpp.bak:289 overtimechart.cpp.bak:393 #: overtimechart.cpp.bak:1853 overtimechart.cpp.bak:1974 #: overtimereport.cpp:113 overtimereport.cpp:176 overtimereport.cpp:225 #: overtimereport.cpp:710 overtimereport.cpp:776 #, kde-format msgid "All Descriptions Combined" msgstr "Všechny popisy kombinované" #: overtimechart.cpp:146 overtimechart.cpp:406 overtimechart.cpp.bak:139 #: overtimechart.cpp.bak:399 #, kde-format msgid "All Payees/Payers Combined" msgstr "Všichni plátci/příjemci kombinovaní" #: overtimechart.cpp:155 overtimechart.cpp.bak:148 #, kde-format msgid "Start date:" msgstr "Datum zahájení:" #: overtimechart.cpp:178 overtimechart.cpp.bak:171 #, kde-format msgid "End date:" msgstr "Datum ukončení:" #: overtimechart.cpp:197 overtimechart.cpp.bak:190 #, kde-format msgid "Monthly total" msgstr "Celkem měsíčne" #: overtimechart.cpp:201 overtimechart.cpp.bak:194 #, kde-format msgid "Daily average" msgstr "Denní průměr" #: overtimechart.cpp:304 overtimechart.cpp:404 overtimechart.cpp:1855 #: overtimechart.cpp:1978 overtimechart.cpp.bak:297 overtimechart.cpp.bak:397 #: overtimechart.cpp.bak:1856 overtimechart.cpp.bak:1979 #, kde-format msgid "All Payers Combined" msgstr "Všichni plátce kombinovaní" #: overtimechart.cpp:305 overtimechart.cpp:405 overtimechart.cpp:1856 #: overtimechart.cpp:1977 overtimechart.cpp.bak:298 overtimechart.cpp.bak:398 #: overtimechart.cpp.bak:1857 overtimechart.cpp.bak:1978 #, kde-format msgid "All Payees Combined" msgstr "Všichni příjemci kombinovaní" #: overtimechart.cpp:325 overtimechart.cpp:1853 overtimechart.cpp.bak:318 #: overtimechart.cpp.bak:1854 #, kde-format msgid "All Descriptions Split" msgstr "Rozdělení všech popisů" #: overtimechart.cpp:328 overtimechart.cpp:1857 overtimechart.cpp.bak:321 #: overtimechart.cpp.bak:1858 #, kde-format msgid "All Payers Split" msgstr "Rozdělení všech plátců" #: overtimechart.cpp:329 overtimechart.cpp:1858 overtimechart.cpp.bak:322 #: overtimechart.cpp.bak:1859 #, kde-format msgid "All Payees Split" msgstr "Rozdělení všech příjemců" #: overtimechart.cpp:413 overtimechart.cpp:423 overtimechart.cpp:1950 #: overtimechart.cpp.bak:406 overtimechart.cpp.bak:416 #: overtimechart.cpp.bak:1951 #, kde-format msgid "All Categories Split" msgstr "Rozdělení všech kategorií" #: overtimechart.cpp:1535 overtimechart.cpp.bak:1516 #, kde-format msgid "Value (%1)" msgstr "Hodnota (%1)" #: overtimechart.cpp:1536 overtimechart.cpp.bak:1517 #, kde-format msgid "Profit (%1)" msgstr "Zisk (%1)" #: overtimechart.cpp:1537 overtimechart.cpp.bak:1518 #, kde-format msgid "Income (%1)" msgstr "Příjem (%1)" #: overtimechart.cpp:1538 overtimechart.cpp.bak:1519 #, kde-format msgid "Cost (%1)" msgstr "Cena (%1)" #: overtimechart.cpp:1579 overtimechart.cpp.bak:1560 #, kde-format msgid "Time" msgstr "Čas" #: overtimechart.cpp:1774 overtimechart.cpp:1775 overtimechart.cpp.bak:1755 #: overtimechart.cpp.bak:1756 #, kde-format msgid "no payer" msgstr "Žádný plátce" #: overtimechart.cpp:1778 overtimechart.cpp.bak:1759 #, kde-format msgctxt "%1: Description; %2: Payer" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp:1783 overtimechart.cpp:1784 overtimechart.cpp.bak:1764 #: overtimechart.cpp.bak:1765 #, kde-format msgid "no payee" msgstr "Žádný příjemce" #: overtimechart.cpp:1787 overtimechart.cpp.bak:1768 #, kde-format msgctxt "%1: Description; %2: Payee" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp.bak:649 #, kde-format msgid "Error after saving file; data may not have been saved." msgstr "Chyba po uložení souboru; údaje možná nebyly uloženy." #: overtimereport.cpp:344 #, kde-format msgid "Average Profit" msgstr "Průměrný zisk" #: overtimereport.cpp:537 #, kde-format msgid "Year" msgstr "Rok" #: overtimereport.cpp:538 #, kde-format msgid "Month" msgstr "Měsíc" #: overtimereport.cpp:566 #, kde-format msgid "Includes scheduled transactions" msgstr "Včetně plánovaných transakcí" #: overtimereport.cpp:570 #, kde-format msgid "Adjusted for the average month / year (%1 / %2 days)" msgstr "Nastaveno na průměrný měsíc / rok (%1 / %2 dnů)" #: overtimereport.cpp:603 overtimereport.cpp:671 #, kde-format msgid "Subtotal" msgstr "Mezisoučet" #: qifimport.cpp:307 qifimport.cpp:367 qifimportexport.cpp:1259 #: qifimportexport.cpp:1350 qifimportexport.cpp:1470 #, kde-format msgid "Unnamed" msgstr "Bez názvu" #: qifimport.cpp:337 qifimportexport.cpp:1299 qifimportexport.cpp:1413 #, kde-format msgid "Uncategorized" msgstr "Neroztříděno" #: qifimportexport.cpp:56 #, kde-format msgid "Import QIF file" msgstr "Importovat soubor QIF" #: qifimportexport.cpp:63 #, kde-format msgid "" "Select a QIF file to import. When you click next, the file be analysed and " "you might need to answer some questions about the format of the file." msgstr "" "Vyberte soubor QIF. Po kliknutí na další, bude soubor analyzován a " "pravděpodobně budete muset odpovědět na otázky týkající se formátu souboru." #: qifimportexport.cpp:73 #, kde-format msgid "Local Definitions" msgstr "Místní definice" #: qifimportexport.cpp:74 #, kde-format msgid "" "Unknown elements where found in the QIF file. It is possible that this is " "because of localized type names. Please map them to the correct standard " "names." msgstr "" "Byly nalezeny neznámé prvky v souboru QIF. Možná je to způsobeno místními " "názvy. Prosím opravte je na běžné názvy." #: qifimportexport.cpp:80 #, kde-format msgid "Local Text" msgstr "Místní text" #: qifimportexport.cpp:81 #, kde-format msgid "Standard Text" msgstr "Běžný text" #: qifimportexport.cpp:84 #, kde-format msgid "Select standard text:" msgstr "Vyberte běžný název:" #: qifimportexport.cpp:90 #, kde-format msgid "Date Format" msgstr "Formát datumu" #: qifimportexport.cpp:91 #, kde-format msgid "" "The date format in the QIF file is ambiguous. Please select the correct " "format." msgstr "" "Formát datumu v souboru QIF není správný. Prosím vyberte správný formát." #: qifimportexport.cpp:100 #, kde-format msgid "Default Account" msgstr "Výchozí účet" #: qifimportexport.cpp:101 #, kde-format msgid "" "Could not find any account definitions in the QIF file. Please select a " "default account. It is also possible that this is caused by a localized " "opening balance text." msgstr "" "V souboru QIF nelze najít žádný účet. Prosím vyberte výchozí účet. Problém " "může také spočívat v lokalizaci textu otevírané bilance." #: qifimportexport.cpp:104 #, kde-format msgid "Default account:" msgstr "Výchozí účet:" #: qifimportexport.cpp:115 #, kde-format msgid "Opening balance text:" msgstr "Text otevírané bilance:" #: qifimportexport.cpp:121 #, kde-format msgid "Descriptions" msgstr "Popisy" #: qifimportexport.cpp:122 #, kde-format msgid "" "Transactions in QIF files does not have any specific description property. " "You are therefore given the option to choose how the description of imported " "transactions will be set." msgstr "" "Popis transakcí v souboru QIF nemá typické vlastnosti. Proto máte možnost " "vybrat, jak bude popis importovaných transakcí nastaven." #: qifimportexport.cpp:125 #, kde-format msgid "Subcategories as:" msgstr "Podkategorie jako:" #: qifimportexport.cpp:134 #, kde-format msgid "Ignore" msgstr "Ignorovat" #: qifimportexport.cpp:137 #, kde-format msgid "Payee as:" msgstr "Příjemce jako:" #: qifimportexport.cpp:142 qifimportexport.cpp:520 #: transactionlistwidget.cpp:119 #, kde-format msgid "Payee" msgstr "Příjemce" #: qifimportexport.cpp:147 #, kde-format msgid "Memo as:" msgstr "Poznámka jako:" #: qifimportexport.cpp:156 #, kde-format msgid "Priority:" msgstr "Priorita:" #: qifimportexport.cpp:159 #, kde-format msgid "Subcategory/Payee/Comments" msgstr "Podkategorie/Příjemce/Komentáře" #: qifimportexport.cpp:160 #, kde-format msgid "Payee/Subcategory/Comments" msgstr "Příjemce/Podkategorie/Komentáře" #: qifimportexport.cpp:161 #, kde-format msgid "Subcategory/Comments/Payee" msgstr "Podkategorie/Komentáře/Příjemce" #: qifimportexport.cpp:162 #, kde-format msgid "Payee/Comments/Subcategory" msgstr "Příjemce/Komentáře/Podkategorie" #: qifimportexport.cpp:163 #, kde-format msgid "Comments/Subcategory/Payee" msgstr "Komentáře/Podkategorie/Příjemce" #: qifimportexport.cpp:164 #, kde-format msgid "Comments/Payee/Subcategory" msgstr "Komentáře/Příjemce/Podkategorie" #: qifimportexport.cpp:314 qifimportexport.cpp:322 qifimportexport.cpp:338 #, kde-format msgid "Unknown" msgstr "Neznámý" #: qifimportexport.cpp:324 #, kde-format msgid "Bank" msgstr "Banka" #: qifimportexport.cpp:326 #, kde-format msgid "Cat (Category)" msgstr "Kat (Kategorie)" #: qifimportexport.cpp:327 #, kde-format msgid "CCard (Credit Card)" msgstr "PKarta (Platební karta)" #: qifimportexport.cpp:328 #, kde-format msgid "Invst (Investment)" msgstr "Invst (Investice)" #: qifimportexport.cpp:329 #, kde-format msgid "Oth A (Other Assets)" msgstr "Ost A (Ostatní aktiva)" #: qifimportexport.cpp:330 #, kde-format msgid "Oth L (Other Liabilities)" msgstr "Ost P (Ostatní pasiva)" #: qifimportexport.cpp:331 #, kde-format msgid "Security" msgstr "Akcie" #: qifimportexport.cpp:465 #, kde-format msgid "Successfully imported 1 account." msgid_plural "Successfully imported %n accounts." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:469 #, kde-format msgid "Successfully imported 1 category." msgid_plural "Successfully imported %n categories." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:473 #, kde-format msgid "1 duplicate transaction was ignored." msgid_plural "%n duplicate transactions was ignored." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:477 #, kde-format msgid "Failed to import 1 transaction." msgid_plural "Failed to import %n transactions." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:481 #, kde-format msgid "1 security was not imported." msgid_plural "%n securities were not imported." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:485 #, kde-format msgid "1 security transaction was not imported." msgid_plural "%n security transactions were not imported." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:494 #, kde-format msgid "Export QIF File" msgstr "Exportovat soubor QIF" #: qifimportexport.cpp:506 #, kde-format msgctxt "All accounts" msgid "All" msgstr "Vše" #: qifimportexport.cpp:517 #, kde-format msgid "Export transaction description as:" msgstr "Exportovat popis transakce jako:" #: qifimportexport.cpp:524 #, kde-format msgid "Memo" msgstr "Poznámka" #: qifimportexport.cpp:528 #, kde-format msgid "Subcategory" msgstr "Podkategorie" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 5 #: rc.cpp:3 #, kde-format msgid "&Import" msgstr "&Importovat" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 12 #: rc.cpp:6 #, kde-format msgid "&Accounts" msgstr "&Účty" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 24 #: rc.cpp:9 #, kde-format msgid "&Transactions" msgstr "&Transakce" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 41 #: rc.cpp:12 #, kde-format msgid "&Securities" msgstr "&Cenné papíry" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 56 #: rc.cpp:15 #, kde-format msgid "Stat&istics" msgstr "Stat&istiky" #: rc.cpp:16 #, kde-format msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr ",Launchpad Contributions:,Jan Štemberk" #: rc.cpp:17 #, kde-format msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr ",,stemberkj@seznam.cz" #: recurrenceeditwidget.cpp:69 #, kde-format msgid "Edit Exceptions" msgstr "Upravit výjimky" #: recurrenceeditwidget.cpp:186 #, kde-format msgid "Edit Recurrence Range" msgstr "Upravit rozsah opakování" #: recurrenceeditwidget.cpp:194 recurrenceeditwidget.cpp:229 #, kde-format msgid "Begins on: %1" msgstr "Začíná: %1" #: recurrenceeditwidget.cpp:199 #, kde-format msgid "No ending date" msgstr "Chybí datum ukončení" #: recurrenceeditwidget.cpp:203 #, kde-format msgid "End after" msgstr "Ukončit po" #: recurrenceeditwidget.cpp:209 #, kde-format msgid "occurrence(s)" msgstr "výskyt(y)" #: recurrenceeditwidget.cpp:211 #, kde-format msgid "End on" msgstr "Ukončit" #: recurrenceeditwidget.cpp:298 #, kde-format msgid "End date before start date." msgstr "Datum ukončení předchází datumu zahájení." #: recurrenceeditwidget.cpp:312 #, kde-format msgid "Enable recurrance" msgstr "Zapnout opakování" #: recurrenceeditwidget.cpp:315 #, kde-format msgid "Recurrence Rule" msgstr "Pravidlo opakování" #: recurrenceeditwidget.cpp:321 #, kde-format msgid "Weekly" msgstr "Týdně" #: recurrenceeditwidget.cpp:341 recurrenceeditwidget.cpp:352 #: recurrenceeditwidget.cpp:376 recurrenceeditwidget.cpp:462 #, kde-format msgid "Recur every" msgstr "Opakovat každých" #: recurrenceeditwidget.cpp:345 #, kde-format msgid "day(s)" msgstr "den (dní)" #: recurrenceeditwidget.cpp:356 #, kde-format msgid "week(s) on:" msgstr "týden v:" #: recurrenceeditwidget.cpp:380 #, kde-format msgid "month(s), after the start month" msgstr "měsíc(e) po zahajovacím měsíci" #: recurrenceeditwidget.cpp:385 recurrenceeditwidget.cpp:437 #, kde-format msgid "Recur on the" msgstr "Opakovat v" #: recurrenceeditwidget.cpp:391 recurrenceeditwidget.cpp:442 #: recurrenceeditwidget.cpp:494 #, kde-format msgid "1st" msgstr "1." #: recurrenceeditwidget.cpp:392 recurrenceeditwidget.cpp:443 #: recurrenceeditwidget.cpp:495 #, kde-format msgid "2nd" msgstr "2." #: recurrenceeditwidget.cpp:393 recurrenceeditwidget.cpp:444 #: recurrenceeditwidget.cpp:496 #, kde-format msgid "3rd" msgstr "3." #: recurrenceeditwidget.cpp:394 recurrenceeditwidget.cpp:445 #: recurrenceeditwidget.cpp:497 #, kde-format msgid "4th" msgstr "4." #: recurrenceeditwidget.cpp:395 recurrenceeditwidget.cpp:446 #: recurrenceeditwidget.cpp:498 #, kde-format msgid "5th" msgstr "5." #: recurrenceeditwidget.cpp:396 #, kde-format msgid "6th" msgstr "6." #: recurrenceeditwidget.cpp:397 #, kde-format msgid "7th" msgstr "7." #: recurrenceeditwidget.cpp:398 #, kde-format msgid "8th" msgstr "8." #: recurrenceeditwidget.cpp:399 #, kde-format msgid "9th" msgstr "9." #: recurrenceeditwidget.cpp:400 #, kde-format msgid "10th" msgstr "10." #: recurrenceeditwidget.cpp:401 #, kde-format msgid "11th" msgstr "11." #: recurrenceeditwidget.cpp:402 #, kde-format msgid "12th" msgstr "12." #: recurrenceeditwidget.cpp:403 #, kde-format msgid "13th" msgstr "13." #: recurrenceeditwidget.cpp:404 #, kde-format msgid "14th" msgstr "14." #: recurrenceeditwidget.cpp:405 #, kde-format msgid "15th" msgstr "15." #: recurrenceeditwidget.cpp:406 #, kde-format msgid "16th" msgstr "16." #: recurrenceeditwidget.cpp:407 #, kde-format msgid "17th" msgstr "17." #: recurrenceeditwidget.cpp:408 #, kde-format msgid "18th" msgstr "18." #: recurrenceeditwidget.cpp:409 #, kde-format msgid "19th" msgstr "19." #: recurrenceeditwidget.cpp:410 #, kde-format msgid "20th" msgstr "20." #: recurrenceeditwidget.cpp:411 #, kde-format msgid "21st" msgstr "21." #: recurrenceeditwidget.cpp:412 #, kde-format msgid "22nd" msgstr "22." #: recurrenceeditwidget.cpp:413 #, kde-format msgid "23rd" msgstr "23." #: recurrenceeditwidget.cpp:414 #, kde-format msgid "24th" msgstr "24." #: recurrenceeditwidget.cpp:415 #, kde-format msgid "25th" msgstr "25." #: recurrenceeditwidget.cpp:416 #, kde-format msgid "26th" msgstr "26." #: recurrenceeditwidget.cpp:417 #, kde-format msgid "27th" msgstr "27." #: recurrenceeditwidget.cpp:418 #, kde-format msgid "28th" msgstr "28." #: recurrenceeditwidget.cpp:419 #, kde-format msgid "29th" msgstr "29." #: recurrenceeditwidget.cpp:420 #, kde-format msgid "30th" msgstr "30." #: recurrenceeditwidget.cpp:421 #, kde-format msgid "31st" msgstr "31." #: recurrenceeditwidget.cpp:422 recurrenceeditwidget.cpp:447 #: recurrenceeditwidget.cpp:499 #, kde-format msgid "Last" msgstr "Poslední" #: recurrenceeditwidget.cpp:423 recurrenceeditwidget.cpp:448 #: recurrenceeditwidget.cpp:500 #, kde-format msgid "2nd Last" msgstr "2. poslední" #: recurrenceeditwidget.cpp:424 recurrenceeditwidget.cpp:449 #: recurrenceeditwidget.cpp:501 #, kde-format msgid "3rd Last" msgstr "3. poslední" #: recurrenceeditwidget.cpp:425 recurrenceeditwidget.cpp:450 #: recurrenceeditwidget.cpp:502 #, kde-format msgid "4th Last" msgstr "4. poslední" #: recurrenceeditwidget.cpp:426 recurrenceeditwidget.cpp:451 #: recurrenceeditwidget.cpp:503 #, kde-format msgid "5th Last" msgstr "5. poslední" #: recurrenceeditwidget.cpp:429 #, kde-format msgid "day" msgstr "den" #: recurrenceeditwidget.cpp:431 recurrenceeditwidget.cpp:483 #: recurrenceeditwidget.cpp:521 #, kde-format msgid "possibly on weekend" msgstr "pravděpodobně o víkendu" #: recurrenceeditwidget.cpp:432 recurrenceeditwidget.cpp:484 #: recurrenceeditwidget.cpp:522 #, kde-format msgid "but before weekend" msgstr "ale před víkendem" #: recurrenceeditwidget.cpp:433 recurrenceeditwidget.cpp:485 #: recurrenceeditwidget.cpp:523 #, kde-format msgid "but after weekend" msgstr "ale po víkendu" #: recurrenceeditwidget.cpp:466 #, kde-format msgid "year(s), after the start year" msgstr "rok(ů) po zahajovacím roce" #: recurrenceeditwidget.cpp:471 #, kde-format msgctxt "part before XXX of 'Recur on day XXX of month YYY'" msgid "Recur on day" msgstr "Opakovat dne" #: recurrenceeditwidget.cpp:479 #, kde-format msgctxt "part between XXX and YYY of 'Recur on day XXX of month YYY'" msgid "of" msgstr "z" #: recurrenceeditwidget.cpp:489 #, kde-format msgctxt "Part before NNN in 'Recur on the NNN. WEEKDAY of MONTH'" msgid "On the" msgstr "v" #: recurrenceeditwidget.cpp:507 #, kde-format msgctxt "part between WEEKDAY and MONTH in 'Recur on NNN. WEEKDAY of MONTH'" msgid "of" msgstr "" #: recurrenceeditwidget.cpp:512 #, kde-format msgid "Recur on day #" msgstr "Opakovat dne #" #: recurrenceeditwidget.cpp:519 #, kde-format msgctxt "part after NNN of 'Recur on day #NNN of the year'" msgid " of the year" msgstr " roku" #: recurrenceeditwidget.cpp:533 #, kde-format msgid "Range..." msgstr "Rozsah..." #: recurrenceeditwidget.cpp:535 #, kde-format msgid "Exceptions..." msgstr "Výjimky..." #: recurrenceeditwidget.cpp:731 #, kde-format msgid "No day of week selected for weekly recurrence." msgstr "Není vybrán den pro týdenní opakovaní." #: recurrenceeditwidget.cpp:745 recurrenceeditwidget.cpp:774 #: recurrenceeditwidget.cpp:791 #, kde-format msgid "Selected day will never occur with selected frequency and start date." msgstr "" "Vybraný den se nikdy nevyskytne s vybranou frekvencí a datumem zahájení." #: recurrenceeditwidget.cpp:761 #, kde-format msgid "Selected day does not exist in selected month." msgstr "Vybraný den není součástí tohoto měsíce" #: transaction.cpp:155 transaction.cpp:186 #, kde-format msgid "Dividend: %1" msgstr "Dividenda: %1" #: transaction.cpp:253 transaction.cpp:256 transaction.cpp:284 #, kde-format msgid "Account balancing" msgstr "Zůstatek účtu" #: transaction.cpp:337 transaction.cpp:352 #, kde-format msgid "Security: %1 (bought)" msgstr "Akcie: %1 (nakoupená)" #: transaction.cpp:375 transaction.cpp:390 #, kde-format msgid "Security: %1 (sold)" msgstr "Akcie: %1 (prodaná)" #: transactioneditwidget.cpp:125 #, kde-format msgid "Shares bought:" msgstr "Nakoupené cenné papíry:" #: transactioneditwidget.cpp:130 #, kde-format msgid "Shares sold:" msgstr "Prodané cenné papíry:" #: transactioneditwidget.cpp:238 transactioneditwidget.cpp:1144 #: transactionfilterwidget.cpp:140 #, kde-format msgid "Payer:" msgstr "Plátce:" #: transactioneditwidget.cpp:280 transactioneditwidget.cpp:1145 #: transactionfilterwidget.cpp:141 #, kde-format msgid "Payee:" msgstr "Příjemce:" #: transactioneditwidget.cpp:664 transactioneditwidget.cpp:1262 #, kde-format msgid "No income category available." msgstr "Žádná kategorie příjmů není k dispozici." #: transactioneditwidget.cpp:689 transactioneditwidget.cpp:1270 #, kde-format msgid "No expense category available." msgstr "Žádná kategorie výdajů není k dispozici." #: transactioneditwidget.cpp:720 #, kde-format msgid "Cannot create a regular transfer to/from a securities account." msgstr "Nelze uskutečnit pravidelný převod na/z účtu cenných papírů." #: transactioneditwidget.cpp:727 #, kde-format msgid "Cannot create a regular income to a securities account." msgstr "Nelze uskutečnit pravidelný příjem na účet cenných papírů." #: transactioneditwidget.cpp:743 #, kde-format msgid "Zero price per share not allowed." msgstr "Nulová cena není povolena" #: transactioneditwidget.cpp:755 #, kde-format msgid "Cannot create a regular expense from a securities account." msgstr "Nelze uskutečnit pravidelný výdaj z účtu cenných papírů." #: transactioneditwidget.cpp:1086 #, kde-format msgid "Modify Transactions" msgstr "Změnit transakce" #: transactionfilterwidget.cpp:99 #, kde-format msgid "Min amount:" msgstr "Min množství:" #: transactionfilterwidget.cpp:100 #, kde-format msgid "Max amount:" msgstr "Max množství:" #: transactionfilterwidget.cpp:110 #, kde-format msgid "Min income:" msgstr "Min příjem:" #: transactionfilterwidget.cpp:111 #, kde-format msgid "Max income:" msgstr "Max příjem:" #: transactionfilterwidget.cpp:121 #, kde-format msgid "Min cost:" msgstr "Min cena:" #: transactionfilterwidget.cpp:122 #, kde-format msgid "Max cost:" msgstr "Max cena:" #: transactionfilterwidget.cpp:148 #, kde-format msgid "Include" msgstr "Včetně" #: transactionfilterwidget.cpp:152 #, kde-format msgid "Exclude" msgstr "Kromě" #: transactionlistwidget.cpp:117 #, kde-format msgid "From Account" msgstr "Z účtu" #: transactionlistwidget.cpp:128 #, kde-format msgid "To Account" msgstr "Na účet" #: transactionlistwidget.cpp:130 #, kde-format msgid "Payer" msgstr "Plátce" #: transactionlistwidget.cpp:169 #, kde-format msgid "New/Edit Expense" msgstr "Nový/Upravit výdaj" #: transactionlistwidget.cpp:170 #, kde-format msgid "Filter" msgstr "Filtr" #: transactionlistwidget.cpp:209 #, kde-format msgid "Total:" msgstr "Celkem:" #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:328 #, kde-format msgid "Average:" msgstr "Průměr:" #: transactionlistwidget.cpp:209 #, kde-format msgid "Monthly:" msgstr "Měsíčně:" #: transactionlistwidget.cpp:314 #, kde-format msgid "Total cost:" msgstr "Celková cena:" #: transactionlistwidget.cpp:318 #, kde-format msgid "Total income:" msgstr "Celkový příjem:" #: transactionlistwidget.cpp:322 #, kde-format msgid "Total amount:" msgstr "Celkové množství" #: transactionlistwidget.cpp:330 #, kde-format msgid "Monthly average:" msgstr "Měsíční průměr:" #: transactionlistwidget.cpp:671 #, kde-format msgid "" "Are you sure you want to delete all (%1) transactions in the selected split " "transaction?" msgstr "" "Opravdu chcete vymazat všech (%1) transakcí ve vybrané rozdělené transakci?" #: transactionlistwidget.cpp:1028 #, kde-format msgid "* Part of split transaction" msgstr "* Část rozdělené transakce" #: transactionlistwidget.cpp:1029 #, kde-format msgid "* Part of split (%1)" msgstr "Část rozdělení (%1)" #: transactionlistwidget.cpp:1033 #, kde-format msgid "** Recurring (editing occurrance)" msgstr "**Opakování (upravující výskyt)" #: transactionlistwidget.cpp:1049 #, kde-format msgid "Modify..." msgstr "Změnit..." eqonomize-0.6/po/de.po0000644000175000017500000024224111107053373013674 0ustar hannahanna# translation of de.po_[ZeHf9a].po to # translation of de.po to # This file is put in the public domain. # # Elias Probst , 2006. # Martin Hohenberg , 2006. # Elias Probst , 2007. msgid "" msgstr "" "Project-Id-Version: de.po_[ZeHf9a]\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?" "group_id=173799&atid=866832\n" "POT-Creation-Date: 2008-11-13 14:35+0100\n" "PO-Revision-Date: 2008-11-13 13:12+0000\n" "Last-Translator: Elias Probst \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2008-11-13 16:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: budget.cpp:51 editsplitdialog.cpp:118 ledgerdialog.cpp:652 #, kde-format msgid "Balancing" msgstr "Bilanzieren" #: budget.cpp:84 #, kde-format msgid "Couldn't open %1 for reading" msgstr "Konnte %1 nicht zum Lesen öffnen" #: budget.cpp:95 #, kde-format msgid "" "Not a valid Eqonomize! file (XML parse error: \"%2\" at line %3, col %4)" msgstr "" "Keine gültige Eqonomize!-Datei (XML-Analysefehler: \"%2\" in Zeile %3, " "Position %4)" #: budget.cpp:98 #, kde-format msgid "Invalid root element %1 in XML document" msgstr "Ungültiges Wurzelelement %1 im XML-Dokument" #: budget.cpp:363 #, kde-format msgid "Unable to load 1 account." msgid_plural "Unable to load %n accounts." msgstr[0] "Konnte 1 Konto nicht laden." msgstr[1] "Konnte %n Konten nicht laden." #: budget.cpp:368 #, kde-format msgid "Unable to load 1 category." msgid_plural "Unable to load %n categories." msgstr[0] "Konnte 1 Kategorie nicht laden." msgstr[1] "Konnte %n Kategorien nicht laden." #: budget.cpp:373 #, kde-format msgid "Unable to load 1 security." msgid_plural "Unable to load %n securities." msgstr[0] "Konnte 1 Wertpapier nicht laden." msgstr[1] "Konnte %n Wertpapiere nicht laden." #: budget.cpp:378 #, kde-format msgid "Unable to load 1 transaction." msgid_plural "Unable to load %n transactions." msgstr[0] "Konnte 1 Transaktion nicht laden." msgstr[1] "Konnte %n Transaktionen nicht laden." #: budget.cpp:389 #, kde-format msgid "File is a directory" msgstr "Datei ist ein Verzeichnis" #: budget.cpp:397 #, kde-format msgid "Couldn't open file for writing" msgstr "Konnte Datei nicht zum Schreiben öffnen" #: budget.cpp:547 budget.cpp:551 #, kde-format msgid "Error while writing file; file was not saved" msgstr "Fehler beim Schreiben der Datei; Datei wurde nicht gesichert" #: categoriescomparisonchart.cpp:123 categoriescomparisonreport.cpp:164 #: eqonomize.cpp:1797 eqonomize.cpp:1957 eqonomize.cpp:2036 #: transactionlistwidget.cpp:138 #, kde-format msgid "From" msgstr "Von" #: categoriescomparisonchart.cpp:130 categoriescomparisonreport.cpp:171 #: eqonomize.cpp:1808 eqonomize.cpp:1969 eqonomize.cpp:2037 #: transactionlistwidget.cpp:139 #, kde-format msgid "To" msgstr "Nach" #: categoriescomparisonchart.cpp:147 categoriescomparisonreport.cpp:114 #: overtimechart.cpp:112 overtimechart.cpp.bak:106 overtimereport.cpp:97 #, kde-format msgid "Source:" msgstr "Quelle:" #: categoriescomparisonchart.cpp:150 categoriescomparisonchart.cpp:858 #, kde-format msgid "All Expenses" msgstr "Alle Ausgaben" #: categoriescomparisonchart.cpp:151 categoriescomparisonchart.cpp:859 #, kde-format msgid "All Incomes" msgstr "Alle Einnahmen" #: categoriescomparisonchart.cpp:152 categoriescomparisonchart.cpp:860 #, kde-format msgid "All Accounts" msgstr "Alle Konten" #: categoriescomparisonchart.cpp:155 categoriescomparisonchart.cpp:864 #: categoriescomparisonreport.cpp:122 categoriescomparisonreport.cpp:752 #: categoriescomparisonreport.cpp:1016 overtimereport.cpp:375 #, kde-format msgid "Expenses: %1" msgstr "Ausgaben: %1" #: categoriescomparisonchart.cpp:160 categoriescomparisonchart.cpp:871 #: categoriescomparisonreport.cpp:127 categoriescomparisonreport.cpp:756 #: categoriescomparisonreport.cpp:1023 overtimereport.cpp:366 #, kde-format msgid "Incomes: %1" msgstr "Einnahmen: %1" #: categoriescomparisonchart.cpp:199 categoriescomparisonchart.cpp:225 #: categoriescomparisonreport.cpp:334 categoriescomparisonreport.cpp:360 #: editsplitdialog.cpp:411 eqonomize.cpp:482 eqonomize.cpp:571 #: eqonomize.cpp:741 eqonomize.cpp:848 eqonomize.cpp:870 eqonomize.cpp:2483 #: eqonomize.cpp:3180 eqonomize.cpp:3206 eqonomize.cpp:3326 eqonomize.cpp:3352 #: importcsvdialog.cpp:780 importcsvdialog.cpp:1196 overtimechart.cpp:462 #: overtimechart.cpp:500 overtimechart.cpp:528 overtimechart.cpp:566 #: overtimechart.cpp.bak:455 overtimechart.cpp.bak:493 #: overtimechart.cpp.bak:521 overtimechart.cpp.bak:559 #: recurrenceeditwidget.cpp:156 recurrenceeditwidget.cpp:171 #: recurrenceeditwidget.cpp:293 transactioneditwidget.cpp:707 #: transactioneditwidget.cpp:1281 transactionfilterwidget.cpp:564 #: transactionfilterwidget.cpp:590 #, kde-format msgid "Invalid date." msgstr "Ungültiges Datum." #: categoriescomparisonchart.cpp:204 categoriescomparisonreport.cpp:339 #: eqonomize.cpp:3185 eqonomize.cpp:3331 transactionfilterwidget.cpp:569 #, kde-format msgid "To date is before from date." msgstr "\"Bis\"-Datum liegt vor dem \"Von\"-Datum" #: categoriescomparisonchart.cpp:229 categoriescomparisonreport.cpp:364 #: eqonomize.cpp:3210 eqonomize.cpp:3356 transactionfilterwidget.cpp:594 #, kde-format msgid "From date is after to date." msgstr "\"Von\"-Datum liegt hinter dem \"Bis\"-Datum" #: categoriescomparisonchart.cpp:340 categoriescomparisonreport.cpp:463 #: eqonomize.cpp:3610 eqonomize.cpp:4252 ledgerdialog.cpp:251 #: overtimechart.cpp:624 overtimechart.cpp.bak:617 overtimereport.cpp:278 #: qifimportexport.cpp:604 #, kde-format msgid "" "The selected file already exists. Would you like to overwrite the old copy?" msgstr "" "Diese Datei existiert bereits. Soll die alte Kopie überschrieben werden?" #: categoriescomparisonchart.cpp:344 categoriescomparisonreport.cpp:467 #: eqonomize.cpp:4257 ledgerdialog.cpp:255 overtimechart.cpp:628 #: overtimechart.cpp.bak:621 overtimereport.cpp:282 qifimportexport.cpp:608 #, kde-format msgid "You selected a directory!" msgstr "Es wurde ein Verzeichnis ausgewählt!" #: categoriescomparisonchart.cpp:352 categoriescomparisonreport.cpp:475 #: eqonomize.cpp:4264 ledgerdialog.cpp:263 overtimechart.cpp:636 #: overtimechart.cpp.bak:629 overtimereport.cpp:290 qifimportexport.cpp:616 #, kde-format msgid "Couldn't open file for writing." msgstr "Konnte Datei nicht zum Schreiben öffnen." #: categoriescomparisonchart.cpp:372 categoriescomparisonreport.cpp:482 #: eqonomize.cpp:4270 ledgerdialog.cpp:269 overtimechart.cpp:656 #: overtimechart.cpp.bak:644 overtimereport.cpp:297 qifimportexport.cpp:622 #, kde-format msgid "Error while writing file; file was not saved." msgstr "Fehler beim Schreiben der Datei; Datei wurde nicht gesichert" #: categoriescomparisonchart.cpp:728 categoriescomparisonreport.cpp:303 #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:754 #: categoriescomparisonreport.cpp:839 categoriescomparisonreport.cpp:930 #: categoriescomparisonreport.cpp:977 overtimechart.cpp:373 #: overtimechart.cpp:1740 overtimechart.cpp:1746 overtimechart.cpp:1774 #: overtimechart.cpp:1776 overtimechart.cpp:1783 overtimechart.cpp:1785 #: overtimechart.cpp:1821 overtimechart.cpp:1891 overtimechart.cpp.bak:366 #: overtimechart.cpp.bak:1721 overtimechart.cpp.bak:1727 #: overtimechart.cpp.bak:1755 overtimechart.cpp.bak:1757 #: overtimechart.cpp.bak:1764 overtimechart.cpp.bak:1766 #: overtimechart.cpp.bak:1811 overtimechart.cpp.bak:1892 #: overtimereport.cpp:213 overtimereport.cpp:384 overtimereport.cpp:393 #: overtimereport.cpp:732 #, kde-format msgid "No description" msgstr "Keine Beschreibung" #: categoriescomparisonreport.cpp:119 categoriescomparisonreport.cpp:1012 #, kde-format msgid "All Categories" msgstr "Alle Kategorien" #: categoriescomparisonreport.cpp:138 #, kde-format msgid "Descriptions for" msgstr "Beschreibungen für" #: categoriescomparisonreport.cpp:145 #, kde-format msgid "Payees/payers for" msgstr "Zahlungsempfänger/Zahlungspflichter für" #: categoriescomparisonreport.cpp:161 #, kde-format msgid "Period:" msgstr "Dauer:" #: categoriescomparisonreport.cpp:186 overtimereport.cpp:120 #, kde-format msgid "Columns:" msgstr "Spalten:" #: categoriescomparisonreport.cpp:189 categoriescomparisonreport.cpp:782 #: eqonomize.cpp:1062 eqonomize.cpp:1935 eqonomize.cpp:4142 #: importcsvdialog.cpp:139 importcsvdialog.cpp:157 importcsvdialog.cpp:180 #: importcsvdialog.cpp:197 importcsvdialog.cpp:216 importcsvdialog.cpp:235 #: importcsvdialog.cpp:253 overtimereport.cpp:123 #, kde-format msgid "Value" msgstr "Wert" #: categoriescomparisonreport.cpp:192 overtimereport.cpp:126 #: recurrenceeditwidget.cpp:320 #, kde-format msgid "Daily" msgstr "Täglich" #: categoriescomparisonreport.cpp:195 overtimereport.cpp:129 #: recurrenceeditwidget.cpp:322 #, kde-format msgid "Monthly" msgstr "Monatlich" #: categoriescomparisonreport.cpp:198 overtimereport.cpp:132 #: recurrenceeditwidget.cpp:323 #, kde-format msgid "Yearly" msgstr "Jährlich" #: categoriescomparisonreport.cpp:201 categoriescomparisonreport.cpp:787 #: overtimechart.cpp:205 overtimechart.cpp:1534 overtimechart.cpp.bak:198 #: overtimechart.cpp.bak:1515 overtimereport.cpp:135 overtimereport.cpp:549 #: transactionlistwidget.cpp:276 transactionlistwidget.cpp:340 #, kde-format msgid "Quantity" msgstr "Anzahl" #: categoriescomparisonreport.cpp:204 overtimechart.cpp:209 #: overtimechart.cpp.bak:202 overtimereport.cpp:138 #, kde-format msgid "Average value" msgstr "Durchschnittlicher Wert" #: categoriescomparisonreport.cpp:278 categoriescomparisonreport.cpp:947 #, kde-format msgid "All descriptions" msgstr "Alle Beschreibungen" #: categoriescomparisonreport.cpp:279 categoriescomparisonreport.cpp:948 #, kde-format msgid "All payees" msgstr "Alle Zahlungsempfänger" #: categoriescomparisonreport.cpp:280 categoriescomparisonreport.cpp:949 #, kde-format msgid "All payers" msgstr "Alle Zahlungspflichtigen" #: categoriescomparisonreport.cpp:309 categoriescomparisonreport.cpp:751 #: categoriescomparisonreport.cpp:837 categoriescomparisonreport.cpp:932 #: categoriescomparisonreport.cpp:994 overtimechart.cpp:382 #: overtimechart.cpp:1758 overtimechart.cpp:1768 overtimechart.cpp:1823 #: overtimechart.cpp:1908 overtimechart.cpp.bak:375 overtimechart.cpp.bak:1739 #: overtimechart.cpp.bak:1749 overtimechart.cpp.bak:1813 #: overtimechart.cpp.bak:1909 #, kde-format msgid "No payee" msgstr "Keine Zahlungsempfänger" #: categoriescomparisonreport.cpp:310 categoriescomparisonreport.cpp:755 #: categoriescomparisonreport.cpp:838 categoriescomparisonreport.cpp:933 #: categoriescomparisonreport.cpp:995 overtimechart.cpp:381 #: overtimechart.cpp:1752 overtimechart.cpp:1763 overtimechart.cpp:1825 #: overtimechart.cpp:1907 overtimechart.cpp.bak:374 overtimechart.cpp.bak:1733 #: overtimechart.cpp.bak:1744 overtimechart.cpp.bak:1815 #: overtimechart.cpp.bak:1908 #, kde-format msgid "No payer" msgstr "Keine Zahlungspflichtigen" #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:751 #: overtimereport.cpp:393 #, kde-format msgid "Expenses: %2, %1" msgstr "Ausgaben: %2, %1" #: categoriescomparisonreport.cpp:754 categoriescomparisonreport.cpp:755 #: overtimereport.cpp:384 #, kde-format msgid "Incomes: %2, %1" msgstr "Einnahmen: %2, %1" #: categoriescomparisonreport.cpp:758 #, kde-format msgid "Incomes & Expenses" msgstr "Einnahmen & Ausgaben" #: categoriescomparisonreport.cpp:771 #, kde-format msgctxt "html format; %1: title; %2: from date; %3: to date" msgid "%1 (%2–%3)" msgstr "%1 (%2–%3)" #: categoriescomparisonreport.cpp:772 #, kde-format msgctxt "html format; %1: title; %2: to date" msgid "%1 (to %2)" msgstr "%1 (bis %2)" #: categoriescomparisonreport.cpp:776 eqonomize.cpp:4046 eqonomize.cpp:4094 #: qifimportexport.cpp:131 transactionlistwidget.cpp:116 #: transactionlistwidget.cpp:127 #, kde-format msgid "Category" msgstr "Kategorie" #: categoriescomparisonreport.cpp:778 eqonomize.cpp:1938 #: transactionlistwidget.cpp:115 #, kde-format msgid "Cost" msgstr "Kosten" #: categoriescomparisonreport.cpp:780 editscheduledtransactiondialog.cpp:46 #: editsplitdialog.cpp:108 eqonomize.cpp:285 eqonomize.cpp:329 #: ledgerdialog.cpp:647 transactionlistwidget.cpp:126 #, kde-format msgid "Income" msgstr "Einnahmen" #: categoriescomparisonreport.cpp:784 overtimereport.cpp:545 #, kde-format msgid "Daily Average" msgstr "Täglicher Durchschnitt" #: categoriescomparisonreport.cpp:785 overtimereport.cpp:546 #, kde-format msgid "Monthly Average" msgstr "Monatlicher Durchschnitt" #: categoriescomparisonreport.cpp:786 overtimereport.cpp:547 #, kde-format msgid "Yearly Average" msgstr "Jährlicher Durchschnitt" #: categoriescomparisonreport.cpp:789 overtimereport.cpp:358 #: overtimereport.cpp:376 overtimereport.cpp:394 #, kde-format msgid "Average Cost" msgstr "Durchschnittliche Kosten" #: categoriescomparisonreport.cpp:791 overtimereport.cpp:350 #: overtimereport.cpp:367 overtimereport.cpp:385 #, kde-format msgid "Average Income" msgstr "Durchschnittliche Einnahmen" #: categoriescomparisonreport.cpp:793 #, kde-format msgid "Average Value" msgstr "Durchschnittlicher Wert" #: categoriescomparisonreport.cpp:853 eqonomize.cpp:3932 eqonomize.cpp:4030 #: eqonomize.cpp:4075 eqonomize.cpp:4123 overtimereport.cpp:686 #, kde-format msgid "Total" msgstr "Gesamt" #: categoriescomparisonreport.cpp:878 #, kde-format msgid "Total incomes" msgstr "Gesamte Einnahmen" #: categoriescomparisonreport.cpp:902 #, kde-format msgid "Total expenses" msgstr "Gesamte Ausgaben" #: categoriescomparisonreport.cpp:912 #, kde-format msgid "Total (Profits)" msgstr "Gesamt (Ertrag)" #: editscheduledtransactiondialog.cpp:45 editsplitdialog.cpp:111 #: eqonomize.cpp:288 eqonomize.cpp:332 ledgerdialog.cpp:650 #, kde-format msgid "Expense" msgstr "Ausgabe" #: editscheduledtransactiondialog.cpp:47 editsplitdialog.cpp:120 #: eqonomize.cpp:282 eqonomize.cpp:326 ledgerdialog.cpp:653 #, kde-format msgid "Transfer" msgstr "Überweisung" #: editscheduledtransactiondialog.cpp:48 editsplitdialog.cpp:114 #: eqonomize.cpp:289 eqonomize.cpp:333 #, kde-format msgid "Security Buy" msgstr "Wertpapierkauf" #: editscheduledtransactiondialog.cpp:49 editsplitdialog.cpp:116 #: eqonomize.cpp:290 eqonomize.cpp:334 #, kde-format msgid "Security Sell" msgstr "Wertpapierverkauf" #: editscheduledtransactiondialog.cpp:56 editscheduledtransactiondialog.cpp:57 #, kde-format msgid "Recurrence" msgstr "Wiederholung" #: editscheduledtransactiondialog.cpp:104 #, kde-format msgid "New Expense" msgstr "Neue Ausgabe" #: editscheduledtransactiondialog.cpp:106 #, kde-format msgid "New Dividend" msgstr "Neue Dividende" #: editscheduledtransactiondialog.cpp:107 #, kde-format msgid "New Income" msgstr "Neue Einnahme" #: editscheduledtransactiondialog.cpp:110 #, kde-format msgid "New Transfer" msgstr "Neue Überweisung" #: editscheduledtransactiondialog.cpp:111 #, kde-format msgid "New Security Buy" msgstr "Neuer Wertpapierkauf" #: editscheduledtransactiondialog.cpp:113 #, kde-format msgid "New Security Sell" msgstr "Neuer Wertpapierverkauf" #: editscheduledtransactiondialog.cpp:128 #: editscheduledtransactiondialog.cpp:149 transactioneditwidget.cpp:1064 #, kde-format msgid "Edit Expense" msgstr "Ausgabe bearbeiten" #: editscheduledtransactiondialog.cpp:130 #: editscheduledtransactiondialog.cpp:151 transactioneditwidget.cpp:1066 #, kde-format msgid "Edit Dividend" msgstr "Dividende bearbeiten" #: editscheduledtransactiondialog.cpp:131 #: editscheduledtransactiondialog.cpp:152 transactioneditwidget.cpp:1067 #, kde-format msgid "Edit Income" msgstr "Einnahme bearbeiten" #: editscheduledtransactiondialog.cpp:134 #: editscheduledtransactiondialog.cpp:155 transactioneditwidget.cpp:1070 #, kde-format msgid "Edit Transfer" msgstr "Überweisung bearbeiten" #: editscheduledtransactiondialog.cpp:135 #: editscheduledtransactiondialog.cpp:156 transactioneditwidget.cpp:1071 #, kde-format msgid "Edit Securities Bought" msgstr "Gekaufte Wertpapiere bearbeiten" #: editscheduledtransactiondialog.cpp:136 #: editscheduledtransactiondialog.cpp:157 transactioneditwidget.cpp:1072 #, kde-format msgid "Edit Securities Sold" msgstr "Verkaufte Wertpapiere bearbeiten" #: editsplitdialog.cpp:107 eqonomize.cpp:284 eqonomize.cpp:328 #: eqonomize.cpp:1167 #, kde-format msgid "Dividend" msgstr "Dividende" #: editsplitdialog.cpp:109 eqonomize.cpp:403 eqonomize.cpp:445 #: ledgerdialog.cpp:648 #, kde-format msgid "Repayment" msgstr "Rückzahlung" #: editsplitdialog.cpp:112 eqonomize.cpp:404 eqonomize.cpp:446 #: ledgerdialog.cpp:651 #, kde-format msgid "Refund" msgstr "Rückerstattung" #: editsplitdialog.cpp:126 ledgerdialog.cpp:638 #, kde-format msgid "Split Transaction" msgstr "Teiltransaktion" #: editsplitdialog.cpp:138 eqonomize.cpp:1279 eqonomize.cpp:1379 #: eqonomize.cpp:1473 eqonomize.cpp:1538 importcsvdialog.cpp:129 #: transactioneditwidget.cpp:175 transactioneditwidget.cpp:1099 #: transactionfilterwidget.cpp:135 #, kde-format msgid "Description:" msgstr "Beschreibung:" #: editsplitdialog.cpp:143 eqonomize.cpp:413 eqonomize.cpp:523 #: eqonomize.cpp:639 eqonomize.cpp:1274 eqonomize.cpp:2476 #: importcsvdialog.cpp:187 transactioneditwidget.cpp:149 #: transactioneditwidget.cpp:199 transactioneditwidget.cpp:1119 #, kde-format msgid "Date:" msgstr "Datum:" #: editsplitdialog.cpp:148 eqonomize.cpp:424 eqonomize.cpp:1252 #: importcsvdialog.cpp:388 importcsvdialog.cpp:399 ledgerdialog.cpp:107 #: qifimportexport.cpp:503 #, kde-format msgid "Account:" msgstr "Konto:" #: editsplitdialog.cpp:163 #, kde-format msgid "Transactions:" msgstr "Transaktionen:" #: editsplitdialog.cpp:172 eqonomize.cpp:914 eqonomize.cpp:1061 #: eqonomize.cpp:1941 eqonomize.cpp:2033 eqonomize.cpp:3988 #: ledgerdialog.cpp:135 #, kde-format msgid "Type" msgstr "Typ" #: editsplitdialog.cpp:173 eqonomize.cpp:915 eqonomize.cpp:2034 #: ledgerdialog.cpp:136 qifimportexport.cpp:127 qifimportexport.cpp:139 #: qifimportexport.cpp:149 transactionlistwidget.cpp:111 #, kde-format msgid "Description" msgstr "Beschreibung" #: editsplitdialog.cpp:174 eqonomize.cpp:4142 ledgerdialog.cpp:137 #, kde-format msgid "Account/Category" msgstr "Konto/Kategorie" #: editsplitdialog.cpp:175 #, kde-format msgid "Payment" msgstr "Zahlung" #: editsplitdialog.cpp:176 ledgerdialog.cpp:138 #, kde-format msgid "Deposit" msgstr "Einlage" #: editsplitdialog.cpp:181 ledgerdialog.cpp:151 #, kde-format msgid "New" msgstr "Neu" #: editsplitdialog.cpp:184 eqonomize.cpp:4333 #, kde-format msgid "New Expense..." msgstr "Neue Ausgabe..." #: editsplitdialog.cpp:185 eqonomize.cpp:4334 #, kde-format msgid "New Income..." msgstr "Neue Einnahme..." #: editsplitdialog.cpp:186 #, kde-format msgid "New Deposit..." msgstr "Neue Einlage..." #: editsplitdialog.cpp:187 #, kde-format msgid "New Withdrawal..." msgstr "Neue Abhebung..." #: editsplitdialog.cpp:188 #, kde-format msgid "New Security Shares Bought..." msgstr "" #: editsplitdialog.cpp:189 #, kde-format msgid "Security Shares Sold..." msgstr "Anteile verkaufter Wertpapiere..." #: editsplitdialog.cpp:190 #, kde-format msgid "New Dividend..." msgstr "Neue Dividende..." #: editsplitdialog.cpp:191 eqonomize.cpp:924 eqonomize.cpp:1071 #: eqonomize.cpp:4328 ledgerdialog.cpp:158 transactionlistwidget.cpp:1051 #, kde-format msgid "Edit..." msgstr "Bearbeiten..." #: editsplitdialog.cpp:221 eqonomize.cpp:2325 #, kde-format msgid "Total value:" msgstr "Gesamtwert:" #: editsplitdialog.cpp:403 transactioneditwidget.cpp:653 #: transactioneditwidget.cpp:657 transactioneditwidget.cpp:668 #: transactioneditwidget.cpp:682 transactioneditwidget.cpp:693 #, kde-format msgid "No suitable account available." msgstr "Kein geeignetes Konto verfügbar" #: editsplitdialog.cpp:415 #, kde-format msgid "Future dates is not allowed." msgstr "Ein Datum in der Zukunft ist nicht erlaubt." #: editsplitdialog.cpp:419 #, kde-format msgid "A split must contain at least two transactions." msgstr "Eine geteilte Transaktion besteht aus mindestens zwei Transaktionen." #: editsplitdialog.cpp:428 transactioneditwidget.cpp:714 #, kde-format msgid "Cannot transfer money to and from the same account." msgstr "Transfer zum selben Konto könenn nicht durchgeführt werden." #: eqonomize.cpp:419 eqonomize.cpp:2325 importcsvdialog.cpp:146 #: importcsvdialog.cpp:169 importcsvdialog.cpp:355 #: transactioneditwidget.cpp:117 transactioneditwidget.cpp:186 #: transactioneditwidget.cpp:1111 #, kde-format msgid "Cost:" msgstr "Kosten:" #: eqonomize.cpp:420 importcsvdialog.cpp:364 importcsvdialog.cpp:397 #: transactioneditwidget.cpp:118 transactioneditwidget.cpp:184 #: transactioneditwidget.cpp:1110 #, kde-format msgid "Income:" msgstr "Einnahmen:" #: eqonomize.cpp:439 transactioneditwidget.cpp:193 #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:310 #, kde-format msgid "Quantity:" msgstr "Menge:" #: eqonomize.cpp:443 importcsvdialog.cpp:243 transactioneditwidget.cpp:288 #, kde-format msgid "Comments:" msgstr "Kommentare:" #: eqonomize.cpp:491 eqonomize.cpp:1176 #, kde-format msgid "Reinvested Dividend" msgstr "Reinvestierte Dividende" #: eqonomize.cpp:501 transactioneditwidget.cpp:97 #: transactioneditwidget.cpp:157 #, kde-format msgid "Security:" msgstr "Wertpapier:" #: eqonomize.cpp:518 #, kde-format msgid "Shares added:" msgstr "Hinzugefügte Anteile:" #: eqonomize.cpp:579 #, kde-format msgid "Security Trade" msgstr "Wertpapierhandel" #: eqonomize.cpp:587 #, kde-format msgid "From security:" msgstr "Von Wertpapier:" #: eqonomize.cpp:603 #, kde-format msgid "Shares moved:" msgstr "Anteile verschoben:" #: eqonomize.cpp:608 transactioneditwidget.cpp:135 #: transactionfilterwidget.cpp:167 transactionfilterwidget.cpp:168 #: transactionfilterwidget.cpp:343 transactionfilterwidget.cpp:380 #, kde-format msgid "All" msgstr "Alle" #: eqonomize.cpp:614 #, kde-format msgid "To security:" msgstr "Zu Wertpapier" #: eqonomize.cpp:631 #, kde-format msgid "Shares received:" msgstr "Anteile erhalten:" #: eqonomize.cpp:635 importcsvdialog.cpp:386 importcsvdialog.cpp:412 #: overtimechart.cpp:193 overtimechart.cpp.bak:186 #, kde-format msgid "Value:" msgstr "Wert:" #: eqonomize.cpp:725 #, kde-format msgid "No other security available for trade in the account." msgstr "Keine weiteren Wertpapiere zum Handeln in diesem Account vorhanden:" #: eqonomize.cpp:737 #, kde-format msgid "Selected to and from securities are the same." msgstr "Ausgewählte \"von\" und \"nach\" Wertpapiere sind die selben" #: eqonomize.cpp:745 transactioneditwidget.cpp:735 #, kde-format msgid "Zero shares not allowed." msgstr "Keine Anteile sind nicht erlaubt" #: eqonomize.cpp:749 transactioneditwidget.cpp:739 #, kde-format msgid "Zero value not allowed." msgstr "Kein Wert ist nicht erlaubt." #: eqonomize.cpp:757 eqonomize.cpp:766 #, kde-format msgid "Quotations" msgstr "Kurse" #: eqonomize.cpp:777 eqonomize.cpp:913 eqonomize.cpp:962 eqonomize.cpp:1060 #: ledgerdialog.cpp:134 transactionlistwidget.cpp:110 #, kde-format msgid "Date" msgstr "Datum" #: eqonomize.cpp:778 #, kde-format msgid "Price per Share" msgstr "Preis pro Anteil" #: eqonomize.cpp:820 #, kde-format msgid "Quotations for %1" msgstr "Kurse für %1" #: eqonomize.cpp:904 #, kde-format msgid "" "The following transactions was scheduled to occur today or before today.\n" "Confirm that they have indeed occurred (or will occur today)." msgstr "" "Die folgenden Transaktionen sollen heute oder in der Vergangenheit " "durchgeführt werden.\n" "Bestätigen Sie, daß diese Transaktionen tatsächlich durchgeführt wurden " "(oder heute durchgeführt werden)." #: eqonomize.cpp:916 eqonomize.cpp:2035 transactionlistwidget.cpp:137 #, kde-format msgid "Amount" msgstr "Wert" #: eqonomize.cpp:926 #, kde-format msgid "Postpone..." msgstr "Verschieben..." #: eqonomize.cpp:973 #, kde-format msgid "Can only postpone to future dates." msgstr "Man kann nur auf zukünftige Termine verschieben." #: eqonomize.cpp:1052 ledgerdialog.cpp:299 #, kde-format msgid "Transactions for %1" msgstr "Transaktionen für %1" #: eqonomize.cpp:1063 eqonomize.cpp:1936 #, kde-format msgid "Shares" msgstr "Anteile" #: eqonomize.cpp:1160 #, kde-format msgid "Shares Bought" msgstr "Anteile gekauft" #: eqonomize.cpp:1161 #, kde-format msgid "Shares Sold" msgstr "Anteile verkauft" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Sold (Traded)" msgstr "Anteile verkauft (gehandelt)" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Bought (Traded)" msgstr "Anteile gekauft (gehandelt)" #: eqonomize.cpp:1204 #, kde-format msgid "Shares Bought (Recurring)" msgstr "Anteile gekauft (wiederkehrend)" #: eqonomize.cpp:1205 #, kde-format msgid "Shares Sold (Recurring)" msgstr "Anteile verkauft (wiederkehrend)" #: eqonomize.cpp:1207 #, kde-format msgid "Shares Bought (Scheduled)" msgstr "Anteile gekauft (geplant)" #: eqonomize.cpp:1208 #, kde-format msgid "Shares Sold (Scheduled)" msgstr "Anteile verkauft (geplant)" #: eqonomize.cpp:1220 #, kde-format msgid "Recurring Dividend" msgstr "Wiederkehrende Dividende" #: eqonomize.cpp:1222 #, kde-format msgid "Scheduled Dividend" msgstr "Geplante Dividende" #: eqonomize.cpp:1240 eqonomize.cpp:1360 #, kde-format msgid "Type:" msgstr "Typ:" #: eqonomize.cpp:1243 eqonomize.cpp:2600 eqonomize.cpp:2660 #, kde-format msgid "Mutual Fund" msgstr "Investmentfonds" #: eqonomize.cpp:1244 eqonomize.cpp:2598 eqonomize.cpp:2658 #, kde-format msgid "Bond" msgstr "Anleihe" #: eqonomize.cpp:1245 eqonomize.cpp:2599 eqonomize.cpp:2659 #, kde-format msgid "Stock" msgstr "Aktie" #: eqonomize.cpp:1246 eqonomize.cpp:2601 eqonomize.cpp:2661 eqonomize.cpp:3492 #: eqonomize.cpp:3497 importcsvdialog.cpp:117 qifimportexport.cpp:332 #, kde-format msgid "Other" msgstr "Anderes" #: eqonomize.cpp:1249 eqonomize.cpp:1370 eqonomize.cpp:1464 eqonomize.cpp:1529 #, kde-format msgid "Name:" msgstr "Name:" #: eqonomize.cpp:1264 #, kde-format msgid "Decimals in Shares:" msgstr "Dezimal in Anteilen:" #: eqonomize.cpp:1267 #, kde-format msgid "Initial Shares:" msgstr "Anteile zu Beginn:" #: eqonomize.cpp:1270 #, kde-format msgid "Initial quotation:" msgstr "Startkurs:" #: eqonomize.cpp:1289 transactioneditwidget.cpp:675 #, kde-format msgid "No suitable account or income category available." msgstr "Kein passendes Konto oder Einkommenskategorie vorhanden." #: eqonomize.cpp:1363 eqonomize.cpp:3488 eqonomize.cpp:4021 #: qifimportexport.cpp:325 #, kde-format msgid "Cash" msgstr "Bargeld" #: eqonomize.cpp:1364 eqonomize.cpp:4016 #, kde-format msgid "Current Account" msgstr "Girokonto" #: eqonomize.cpp:1365 eqonomize.cpp:3490 eqonomize.cpp:4017 #, kde-format msgid "Savings Account" msgstr "Rücklagekonto" #: eqonomize.cpp:1366 eqonomize.cpp:4018 #, kde-format msgid "Credit Card" msgstr "Kreditkarte" #: eqonomize.cpp:1367 eqonomize.cpp:4019 #, kde-format msgid "Liabilities" msgstr "Verpflichtungen" #: eqonomize.cpp:1368 eqonomize.cpp:1731 eqonomize.cpp:1732 eqonomize.cpp:3891 #: eqonomize.cpp:3897 eqonomize.cpp:4020 #, kde-format msgid "Securities" msgstr "Wertpapiere" #: eqonomize.cpp:1373 #, kde-format msgid "Initial balance:" msgstr "Wert zu Beginn" #: eqonomize.cpp:1376 #, kde-format msgid "Default account for budgeted transactions" msgstr "Standardkonto für geplante Transaktionen" #: eqonomize.cpp:1441 eqonomize.cpp:1507 eqonomize.cpp:1572 #, kde-format msgid "Empty name." msgstr "Leerer Name." #: eqonomize.cpp:1447 #, kde-format msgid "The entered name is used by another account." msgstr "Dieser Name wird bereits von einem anderen Konto verwendet." #: eqonomize.cpp:1467 eqonomize.cpp:1532 #, kde-format msgid "Monthly budget:" msgstr "Monatliches Budget" #: eqonomize.cpp:1513 #, kde-format msgid "The entered name is used by another income category." msgstr "" "Dieser Name wird bereits von einer anderen Einkommenskategorie verwendet." #: eqonomize.cpp:1578 #, kde-format msgid "The entered name is used by another expense category." msgstr "" "Dieser Name wird bereits von einer anderen Ausgabenkategorie verwendet." #: eqonomize.cpp:1711 eqonomize.cpp:1778 eqonomize.cpp:3984 eqonomize.cpp:5970 #: eqonomize.cpp:5976 #, kde-format msgid "Accounts" msgstr "Konten" #: eqonomize.cpp:1712 #, kde-format msgid "Accounts & Categories" msgstr "Konten & Kategorien" #: eqonomize.cpp:1716 eqonomize.cpp:1717 eqonomize.cpp:1780 #: importcsvdialog.cpp:70 overtimechart.cpp:126 overtimechart.cpp:1727 #: overtimechart.cpp:1731 overtimechart.cpp.bak:119 overtimechart.cpp.bak:1708 #: overtimechart.cpp.bak:1712 overtimereport.cpp:103 overtimereport.cpp:357 #: overtimereport.cpp:377 overtimereport.cpp:395 transactionlistwidget.cpp:251 #: transactionlistwidget.cpp:263 #, kde-format msgid "Expenses" msgstr "Ausgaben" #: eqonomize.cpp:1721 eqonomize.cpp:1722 eqonomize.cpp:1779 eqonomize.cpp:4043 #: importcsvdialog.cpp:75 overtimechart.cpp:127 overtimechart.cpp:1726 #: overtimechart.cpp:1730 overtimechart.cpp.bak:120 overtimechart.cpp.bak:1707 #: overtimechart.cpp.bak:1711 overtimereport.cpp:104 overtimereport.cpp:349 #: overtimereport.cpp:368 overtimereport.cpp:386 transactionlistwidget.cpp:252 #: transactionlistwidget.cpp:264 #, kde-format msgid "Incomes" msgstr "Einnahmen" #: eqonomize.cpp:1726 eqonomize.cpp:1727 importcsvdialog.cpp:78 #: transactionlistwidget.cpp:253 transactionlistwidget.cpp:265 #, kde-format msgid "Transfers" msgstr "Transfers" #: eqonomize.cpp:1736 #, kde-format msgid "Schedule" msgstr "Planer" #: eqonomize.cpp:1737 #, kde-format msgid "Scheduled Transactions" msgstr "Geplante Transaktionen" #: eqonomize.cpp:1753 eqonomize.cpp:1775 #, kde-format msgid "Account / Category" msgstr "Konto / Kategorie" #: eqonomize.cpp:1754 #, kde-format msgid "Remaining Budget (%1)" msgstr "Verbleibendes Budget (%1)" #: eqonomize.cpp:1755 #, kde-format msgid "Change (%1)" msgstr "Änderung (%1)" #: eqonomize.cpp:1756 #, kde-format msgid "Total (%1)" msgstr "Gesamt (%1)" #: eqonomize.cpp:1769 #, kde-format msgctxt "%2 remains of %1 budget" msgid "%2 of %1" msgstr "%2 von %1" #: eqonomize.cpp:1785 eqonomize.cpp:4002 #, kde-format msgid "Includes budgeted transactions" msgstr "beinhaltet geplante Transaktionen" #: eqonomize.cpp:1793 #, kde-format msgid "Period" msgstr "Zeitraum" #: eqonomize.cpp:1825 #, kde-format msgid "Select Period" msgstr "Zeitraum wählen" #: eqonomize.cpp:1827 eqonomize.cpp:4312 #, kde-format msgid "Current Month" msgstr "Dieser Monat" #: eqonomize.cpp:1828 eqonomize.cpp:4313 #, kde-format msgid "Current Year" msgstr "Dieses Jahr" #: eqonomize.cpp:1829 eqonomize.cpp:4314 #, kde-format msgid "Current Whole Month" msgstr "Dieser Kalendermonat" #: eqonomize.cpp:1830 eqonomize.cpp:4315 #, kde-format msgid "Current Whole Year" msgstr "Dieses Kalenderjahr" #: eqonomize.cpp:1831 #, kde-format msgid "Whole Past Month" msgstr "Der letzte Kalendermonat" #: eqonomize.cpp:1832 #, kde-format msgid "Whole Past Year" msgstr "Das letzte Kalenderjahr" #: eqonomize.cpp:1833 #, kde-format msgid "Previous Month" msgstr "Vorheriger Monat" #: eqonomize.cpp:1834 #, kde-format msgid "Previous Year" msgstr "Vorheriges Jahr" #: eqonomize.cpp:1837 #, kde-format msgid "Show partial budget" msgstr "Zeige Teilbudget" #: eqonomize.cpp:1842 #, kde-format msgid "Edit Budget" msgstr "Budget bearbeiten" #: eqonomize.cpp:1846 #, kde-format msgid "Budget:" msgstr "Budget:" #: eqonomize.cpp:1856 #, kde-format msgid "Month:" msgstr "Monat:" #: eqonomize.cpp:1864 #, kde-format msgid "Result previous month:" msgstr "Ergebnis des Vormonats" #: eqonomize.cpp:1917 eqonomize.cpp:4354 #, kde-format msgid "New Security..." msgstr "Neues Wertpapier..." #: eqonomize.cpp:1919 #, kde-format msgid "New Transaction" msgstr "Neue Transaktion" #: eqonomize.cpp:1922 eqonomize.cpp:4362 #, kde-format msgid "Set Quotation..." msgstr "Kurs setzen..." #: eqonomize.cpp:1934 eqonomize.cpp:3987 #, kde-format msgid "Name" msgstr "Name" #: eqonomize.cpp:1937 #, kde-format msgid "Quotation" msgstr "Kurs" #: eqonomize.cpp:1939 #, kde-format msgid "Profit" msgstr "Ertrag" #: eqonomize.cpp:1940 #, kde-format msgid "Yearly Rate" msgstr "Jährliche Gebühr" #: eqonomize.cpp:1942 qifimportexport.cpp:323 #, kde-format msgid "Account" msgstr "Konto" #: eqonomize.cpp:1953 #, kde-format msgid "Statistics Period" msgstr "Zeitraum der Statistik" #: eqonomize.cpp:2015 #, kde-format msgid "New Schedule" msgstr "Neuer Terminplan" #: eqonomize.cpp:2018 #, kde-format msgid "Edit" msgstr "Bearbeiten" #: eqonomize.cpp:2032 #, kde-format msgid "Next Occurrence" msgstr "Nächstes Vorkommen" #: eqonomize.cpp:2038 qifimportexport.cpp:152 transactionlistwidget.cpp:144 #, kde-format msgid "Comments" msgstr "Kommentare" #: eqonomize.cpp:2291 #, kde-format msgid "New Security" msgstr "Neue Sicherheit" #: eqonomize.cpp:2306 #, kde-format msgid "Edit Security" msgstr "Sicherheit bearbeiten" #: eqonomize.cpp:2325 #, kde-format msgid "Profit:" msgstr "Ertrag:" #: eqonomize.cpp:2325 #, kde-format msgid "Rate:" msgstr "Gebühren:" #: eqonomize.cpp:2332 #, kde-format msgid "" "Are you sure you want to delete the security \"%1\" and all associated " "transactions?" msgstr "" "Sind Sie sicher, daß Sie die Sicherheit \"%1\" und alle zugehörigen " "Transaktionen löschen wollen?" #: eqonomize.cpp:2394 transactioneditwidget.cpp:700 #, kde-format msgid "No security available." msgstr "Kein Wertpapier verfügbar" #: eqonomize.cpp:2466 #, kde-format msgid "Set Quotation (%1)" msgstr "Rate setzen (%1)" #: eqonomize.cpp:2472 transactioneditwidget.cpp:143 #, kde-format msgid "Price per share:" msgstr "Preis pro Anteil:" #: eqonomize.cpp:2485 #, kde-format msgid "Future dates are not allowed." msgstr "Termine in der Zukunft ist nicht erlaubt." #: eqonomize.cpp:2513 #, kde-format msgid "Security Transactions" msgstr "Sicherheitstransaktion" #: eqonomize.cpp:3166 ledgerdialog.cpp:293 #, kde-format msgid "Ledger" msgstr "Kontenblatt" #: eqonomize.cpp:3475 #, kde-format msgid "Untitled" msgstr "" #: eqonomize.cpp:3489 #, kde-format msgid "Check Account" msgstr "Konto überprüfen" #: eqonomize.cpp:3491 #, kde-format msgid "Salary" msgstr "Gehalt" #: eqonomize.cpp:3493 #, kde-format msgid "Bills" msgstr "Rechnungen" #: eqonomize.cpp:3494 #, kde-format msgid "Clothing" msgstr "Kleidung" #: eqonomize.cpp:3495 #, kde-format msgid "Groceries" msgstr "Lebensmittel" #: eqonomize.cpp:3496 #, kde-format msgid "Leisure" msgstr "Vergnügen" #: eqonomize.cpp:3561 importcsvdialog.cpp:795 qifimportexport.cpp:280 #: qifimportexport.cpp:444 #, kde-format msgid "Couldn't fetch %1." msgstr "Konnte %1 nicht abholen" #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Error loading %1: %2." msgstr "Fehler beim Laden von %1: %2" #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Couldn't open file" msgstr "Konnte Datei nicht löschen" #: eqonomize.cpp:3627 eqonomize.cpp:3653 #, kde-format msgid "Error saving %1: %2." msgstr "Fehler beim Speichern von %1: %2" #: eqonomize.cpp:3627 eqonomize.cpp:3653 eqonomize.cpp:3673 #, kde-format msgid "Couldn't save file" msgstr "Konnte Datei nicht speichern" #: eqonomize.cpp:3673 eqonomize.cpp:4282 ledgerdialog.cpp:281 #: qifimportexport.cpp:634 #, kde-format msgid "Failed to upload file to %1." msgstr "Konnte Datei nicht nach %1 hochladen" #: eqonomize.cpp:3703 eqonomize.cpp:3728 #, kde-format msgid "Report" msgstr "Bericht" #: eqonomize.cpp:3758 eqonomize.cpp:3783 #, kde-format msgid "Chart" msgstr "Diagramm" #: eqonomize.cpp:3823 eqonomize.cpp:3829 #, kde-format msgid "Transaction Schedule" msgstr "Transaktions-Plan" #: eqonomize.cpp:3976 #, kde-format msgctxt "html format" msgid "Accounts & Categories" msgstr "Konten & Kategorien" #: eqonomize.cpp:3981 #, kde-format msgctxt "html format" msgid "Accounts & Categories (%1–%2)" msgstr "Konten & Kategorien (%1–%2)" #: eqonomize.cpp:3982 #, kde-format msgctxt "html format" msgid "Accounts & Categories (to %1)" msgstr "Konten & Kategorien (bis %1)" #: eqonomize.cpp:3989 eqonomize.cpp:4049 eqonomize.cpp:4097 eqonomize.cpp:4142 #, kde-format msgid "Change" msgstr "Änderung" #: eqonomize.cpp:3993 ledgerdialog.cpp:140 #, kde-format msgid "Balance" msgstr "Bilanz" #: eqonomize.cpp:4047 eqonomize.cpp:4095 #, kde-format msgid "Budget" msgstr "Budget" #: eqonomize.cpp:4048 eqonomize.cpp:4096 #, kde-format msgid "Remaining Budget" msgstr "Verbleibendes Budget" #: eqonomize.cpp:4050 #, kde-format msgid "Total Incomes" msgstr "Gesamte Einnahmen" #: eqonomize.cpp:4091 #, kde-format msgid "Costs" msgstr "Kosten" #: eqonomize.cpp:4098 #, kde-format msgid "Total Expenses" msgstr "Gesamte Ausgaben" #: eqonomize.cpp:4167 eqonomize.cpp:4214 #, kde-format msgid "Empty expenses list." msgstr "Leere Ausgabenliste" #: eqonomize.cpp:4172 eqonomize.cpp:4219 #, kde-format msgid "Empty incomes list." msgstr "Leere Einnahmenliste" #: eqonomize.cpp:4177 eqonomize.cpp:4224 #, kde-format msgid "Empty transfers list." msgstr "Leere Transferliste" #: eqonomize.cpp:4182 eqonomize.cpp:4229 #, kde-format msgid "Empty securities list." msgstr "Leere Wertpapierliste" #: eqonomize.cpp:4187 eqonomize.cpp:4234 #, kde-format msgid "Empty schedule list." msgstr "Leerer Plan" #: eqonomize.cpp:4305 #, kde-format msgid "Export View..." msgstr "Exportiere Ansicht..." #: eqonomize.cpp:4307 #, kde-format msgid "Print View..." msgstr "Drucke Ansicht..." #: eqonomize.cpp:4309 #, kde-format msgid "Initial Period" msgstr "Zeitraum beim Start" #: eqonomize.cpp:4316 #, kde-format msgid "Remember Last Dates" msgstr "Definierten Zeitraum merken" #: eqonomize.cpp:4319 #, kde-format msgid "Import CSV File..." msgstr "Importiere CSV-Datei..." #: eqonomize.cpp:4320 #, kde-format msgid "Import QIF File..." msgstr "Importiere QIF-Datei..." #: eqonomize.cpp:4321 #, kde-format msgid "Export As QIF File..." msgstr "Exportiere QIF-Datei..." #: eqonomize.cpp:4323 #, kde-format msgid "Add Account..." msgstr "Konto hinzufügen" #: eqonomize.cpp:4324 #, kde-format msgid "New Account..." msgstr "Neues Konto..." #: eqonomize.cpp:4325 #, kde-format msgid "New Income Category..." msgstr "Neue Einkommenkategorie" #: eqonomize.cpp:4326 #, kde-format msgid "New Expense Category..." msgstr "Neue Ausgabenkategorie" #: eqonomize.cpp:4327 #, kde-format msgid "Balance..." msgstr "Bilanzieren..." #: eqonomize.cpp:4331 #, kde-format msgid "Show Transactions" msgstr "Transaktionen Zeigen" #: eqonomize.cpp:4335 #, kde-format msgid "New Transfer..." msgstr "Neuer Transfer..." #: eqonomize.cpp:4336 #, kde-format msgid "New Split Transaction..." msgstr "Neue geteilte Transaktion..." #: eqonomize.cpp:4337 #, kde-format msgid "Edit Transaction(s) (Occurrence)..." msgstr "Bearbeite Transaktion(en) (Vorkommnis)..." #: eqonomize.cpp:4338 #, kde-format msgid "Edit Occurrence..." msgstr "Vorkommnis bearbeiten..." #: eqonomize.cpp:4339 #, kde-format msgid "Edit Schedule (Recurrence)..." msgstr "Bearbeite Plan (Wiederholung)..." #: eqonomize.cpp:4340 #, kde-format msgid "Edit Schedule..." msgstr "Plan bearbeiten..." #: eqonomize.cpp:4341 #, kde-format msgid "Remove Transaction(s) (Occurrence)" msgstr "Transaktion(en) entfernen (Vorkommnis)" #: eqonomize.cpp:4342 #, kde-format msgid "Remove Occurrence" msgstr "Vorkommnis entfernen" #: eqonomize.cpp:4343 #, kde-format msgid "Delete Schedule (Recurrence)" msgstr "Terminplan löschen (Wiederholung)" #: eqonomize.cpp:4344 #, kde-format msgid "Delete Schedule" msgstr "Plan löschen" #: eqonomize.cpp:4345 #, kde-format msgid "Edit Split Transaction..." msgstr "Bearbeite geteilte Transaktionen" #: eqonomize.cpp:4346 #, kde-format msgid "Remove Split Transaction" msgstr "Entferne geteilte Transaktionen" #: eqonomize.cpp:4347 #, kde-format msgid "Join Transactions..." msgstr "Transaktionen zusammenfassen" #: eqonomize.cpp:4348 #, kde-format msgid "Split Up Transaction" msgstr "Transaktion teilen" #: eqonomize.cpp:4350 #, kde-format msgid "Refund..." msgstr "Erstattung..." #: eqonomize.cpp:4351 #, kde-format msgid "Repayment..." msgstr "Tilgung..." #: eqonomize.cpp:4352 #, kde-format msgid "New Refund/Repayment..." msgstr "Neue Erstattung/Tilgung..." #: eqonomize.cpp:4355 #, kde-format msgid "Edit Security..." msgstr "Wertpapier bearbeiten..." #: eqonomize.cpp:4356 #, kde-format msgid "Remove Security" msgstr "Wertpapier entfernen" #: eqonomize.cpp:4357 #, kde-format msgid "Shares Sold..." msgstr "Anteile verkauft..." #: eqonomize.cpp:4358 #, kde-format msgid "Shares Bought..." msgstr "Anteile gekauft..." #: eqonomize.cpp:4359 #, kde-format msgid "Dividend..." msgstr "Dividende..." #: eqonomize.cpp:4360 #, kde-format msgid "Reinvested Dividend..." msgstr "Reinvestierte Dividende..." #: eqonomize.cpp:4361 #, kde-format msgid "Shares Moved..." msgstr "Verschobene Anteile..." #: eqonomize.cpp:4363 #, kde-format msgid "Edit Quotations..." msgstr "Kurse bearbeiten..." #: eqonomize.cpp:4364 #, kde-format msgid "Transactions..." msgstr "Transaktionen..." #: eqonomize.cpp:4366 #, kde-format msgid "Development Over Time Report..." msgstr "Bericht \"Entwicklung über Zeit\"" #: eqonomize.cpp:4367 #, kde-format msgid "Categories Comparison Report..." msgstr "Bericht \"Kategorienvergleich\"" #: eqonomize.cpp:4368 #, kde-format msgid "Categories Comparison Chart..." msgstr "Diagramm \"Kategorienvergleich\"" #: eqonomize.cpp:4369 #, kde-format msgid "Development Over Time Chart..." msgstr "Diagramm \"Entwicklung über Zeit\"" #: eqonomize.cpp:4371 #, kde-format msgid "Use Additional Transaction Properties" msgstr "Zusätzliche Transaktionseinstellungen verwenden" #: eqonomize.cpp:4413 #, kde-format msgid "" "Eqonomize! exited unexpectedly before the file was saved and data was lost.\n" "Do you want to load the last auto-saved version of the file?" msgstr "" "Eqonomize! wurde unerwartet beendet, bevor die Datei gespeichert werden " "konnte. Es kann zu Datenverlust gekommen sein.\n" "Wollen Sie die letzte automatisch gespeicherte Version dieser Datei laden?" #: eqonomize.cpp:4413 #, kde-format msgid "Crash Recovery" msgstr "Absturz-Wiederherstellung" #: eqonomize.cpp:4605 eqonomize.cpp:4606 #, kde-format msgid "The current file has been modified. Do you want to save it?" msgstr "Die Datei wurde verändert. Möchten Sie sie speichern?" #: eqonomize.cpp:4643 #, kde-format msgid "Confirm Schedule" msgstr "Plan bestätigen" #: eqonomize.cpp:4697 #, kde-format msgid "New Account" msgstr "Neues Konto" #: eqonomize.cpp:4712 #, kde-format msgid "New Income Category" msgstr "Neue Einnahmenkategorie" #: eqonomize.cpp:4725 #, kde-format msgid "New Expense Category" msgstr "Neue Ausgabenkategorie" #: eqonomize.cpp:4800 #, kde-format msgid "Balance Account" msgstr "Konto bilanzieren" #: eqonomize.cpp:4806 #, kde-format msgid "Book value:" msgstr "Buchwert:" #: eqonomize.cpp:4813 #, kde-format msgid "Real value:" msgstr "Realwert:" #: eqonomize.cpp:4836 #, kde-format msgid "Edit Account" msgstr "Konto bearbeiten" #: eqonomize.cpp:4869 #, kde-format msgid "Edit Income Category" msgstr "Einnahmenkategorie bearbeiten" #: eqonomize.cpp:4887 #, kde-format msgid "Edit Expense Category" msgstr "Ausgabenkategorie bearbeiten" #: eqonomize.cpp:4948 #, kde-format msgid "Move transactions?" msgstr "Transaktionen verschieben?" #: eqonomize.cpp:4958 #, kde-format msgid "Move to:" msgstr "Verschieben nach:" #: eqonomize.cpp:4965 #, kde-format msgid "" "The category contains some expenses.\n" "What do you want to do with them?" msgstr "" "Die Kategorie enthält einige Ausgaben.\n" "Was wollen Sie mit diesen tun?" #: eqonomize.cpp:4977 #, kde-format msgid "" "The category contains some incomes.\n" "What do you want to do with them?" msgstr "" "Die Kategorie enthält einige Einnahmen.\n" "Was wollen Sie mit diesen tun?" #: eqonomize.cpp:4989 #, kde-format msgid "" "The account contains some transactions.\n" "What do you want to do with them?" msgstr "" "Dieses Konto enthält einige Tranaktionen.\n" "Was wollen Sie mit diesen tun?" #: eqonomize.cpp:5011 #, kde-format msgid "" "The category contains some expenses that will be removed. Do you still want " "to remove the category?" msgstr "" "Die Kategorie enthält einige Ausgaben, die entfernt werden würden. Wollen " "Sie die Kategorie tatsächlich entfernen?" #: eqonomize.cpp:5011 eqonomize.cpp:5012 #, kde-format msgid "Remove Category?" msgstr "Kategorie entfernen?" #: eqonomize.cpp:5012 #, kde-format msgid "" "The category contains some incomes that will be removed. Do you still want " "to remove the category?" msgstr "" "Die Kategorie enthält einige Einnahmen, die entfernt werden würden. Wollen " "Sie die Kategorie wirklich entfernen?" #: eqonomize.cpp:5013 #, kde-format msgid "" "The account contains some transactions that will be removed. Do you still " "want to remove the account?" msgstr "" "Das Konte enthält einige Transaktionen, die entfernt werden würden. Wollen " "Sie das Konto wirklich entfernen?" #: eqonomize.cpp:5013 #, kde-format msgid "Remove Account?" msgstr "Konto entfernen?" #: eqonomize.cpp:5531 eqonomize.cpp:5555 eqonomize.cpp:5730 #, kde-format msgctxt "%1: budget; %2: remaining budget" msgid "%2 of %1" msgstr "%2 von %1" #: eqonomize.cpp:5810 eqonomize.cpp:5835 #, kde-format msgid "%1 (with no budget)" msgstr "%1 (ohne Budget)" #: eqonomize.cpp:5811 eqonomize.cpp:5836 #, kde-format msgid "%1 (with budget %2)" msgstr "%1 (mit Budget %2)" #: importcsvdialog.cpp:60 #, kde-format msgid "Import CSV file" msgstr "CSV-Datei importieren" #: importcsvdialog.cpp:64 #, kde-format msgid "Transaction Type Selection" msgstr "Auswahl des Transaktionstyps" #: importcsvdialog.cpp:81 #, kde-format msgid "Expenses and incomes (negative cost)" msgstr "Ausgaben und Einnahmen (negative Kosten)" #: importcsvdialog.cpp:84 #, kde-format msgid "Expenses and incomes (separate columns)" msgstr "Ausgaben und Einnahmen (getrennte Spalten)" #: importcsvdialog.cpp:87 #, kde-format msgid "All types" msgstr "Alle Typen" #: importcsvdialog.cpp:95 qifimportexport.cpp:62 #, kde-format msgid "File Selection" msgstr "Dateiauswahl" #: importcsvdialog.cpp:99 qifimportexport.cpp:66 qifimportexport.cpp:548 #, kde-format msgid "File:" msgstr "Datei:" #: importcsvdialog.cpp:104 #, kde-format msgid "First data row:" msgstr "Erste Zeile mit Daten:" #: importcsvdialog.cpp:107 #, kde-format msgid "Auto" msgstr "Auto" #: importcsvdialog.cpp:110 #, kde-format msgid "Column delimiter:" msgstr "Zellentrenner:" #: importcsvdialog.cpp:113 #, kde-format msgid "Comma" msgstr "Komma" #: importcsvdialog.cpp:114 #, kde-format msgid "Tabulator" msgstr "Tabulator" #: importcsvdialog.cpp:115 #, kde-format msgid "Semicolon" msgstr "Semikolon" #: importcsvdialog.cpp:116 #, kde-format msgid "Space" msgstr "Leerzeichen" #: importcsvdialog.cpp:125 #, kde-format msgid "Columns Specification" msgstr "Spaltenbeschreibung" #: importcsvdialog.cpp:131 importcsvdialog.cpp:149 importcsvdialog.cpp:172 #: importcsvdialog.cpp:189 importcsvdialog.cpp:208 importcsvdialog.cpp:227 #: importcsvdialog.cpp:245 #, kde-format msgid "Column" msgstr "Spalte" #: importcsvdialog.cpp:205 importcsvdialog.cpp:356 importcsvdialog.cpp:365 #: importcsvdialog.cpp:387 importcsvdialog.cpp:398 #: transactioneditwidget.cpp:225 transactioneditwidget.cpp:267 #: transactioneditwidget.cpp:1130 transactionfilterwidget.cpp:102 #: transactionfilterwidget.cpp:113 #, kde-format msgid "Category:" msgstr "Kategorie" #: importcsvdialog.cpp:224 importcsvdialog.cpp:357 importcsvdialog.cpp:374 #: transactioneditwidget.cpp:248 transactioneditwidget.cpp:273 #: transactionfilterwidget.cpp:117 #, kde-format msgid "From account:" msgstr "Von Konto:" #: importcsvdialog.cpp:262 #, kde-format msgid "Create missing categories and accounts" msgstr "Lege fehlende Kategorien und Konten an" #: importcsvdialog.cpp:354 #, kde-format msgid "" "Imports data as expenses. Costs have positive value. Value is the only " "required column." msgstr "" "Importiere Daten als Ausgaben. Kosten haben einen positiven Wert. \"Wert\" " "ist die einzig benötigte Spalte." #: importcsvdialog.cpp:363 #, kde-format msgid "Imports data as incomes. Value is the only required column." msgstr "Importiert Daten als Einnahmen. Einzig benötigte Spalte ist \"Wert\"." #: importcsvdialog.cpp:366 importcsvdialog.cpp:375 #: transactioneditwidget.cpp:231 transactioneditwidget.cpp:258 #: transactionfilterwidget.cpp:106 #, kde-format msgid "To account:" msgstr "Zu Konto:" #: importcsvdialog.cpp:372 #, kde-format msgid "Imports data as transfers. Value is the only required column." msgstr "" "Importiert Daten als Transaktionen. Die einzige benötigte Spalte ist \"Wert\"" #: importcsvdialog.cpp:373 transactioneditwidget.cpp:182 #: transactioneditwidget.cpp:1109 #, kde-format msgid "Amount:" msgstr "Menge:" #: importcsvdialog.cpp:381 #, kde-format msgid "" "Imports data as expenses and incomes. Costs have negative value. Value and " "category are both required columns." msgstr "" "Importiert Daten als Ausgaben und Einnahmen. Kosten haben einen negativen " "Wert. Spalten für \"Wert\" und \"Kategorie\" werden benötigt." #: importcsvdialog.cpp:392 #, kde-format msgid "" "Imports data as expenses and incomes. Costs and incomes have separate " "columns. Income, cost, and category are all required columns." msgstr "" "Importiert Daten als Ausgaben und Einnahmen. Kosten haben einen negativen " "Wert. Spalten für \"Wert\" und \"Kategorie\" werden benötigt." #: importcsvdialog.cpp:403 #, kde-format msgid "" "Imports data as expenses, incomes, and transfers. Costs have negative or " "positive value. Value, to, and from are all required columns. Accounts and " "categories must be existing." msgstr "" "Importiert Daten als Ausgaben, Einnahmen und Transaktionen. Kosten müssen " "negative oder positive Werte haben. Benötigte Spalten sind \"Wert\", \"Von\" " "und \"Nach\". Alle Konten und Kategorien müssen bereits existieren." #: importcsvdialog.cpp:413 transactioneditwidget.cpp:209 #: transactionfilterwidget.cpp:74 transactionfilterwidget.cpp:91 #, kde-format msgid "From:" msgstr "Von:" #: importcsvdialog.cpp:414 transactioneditwidget.cpp:216 #: transactionfilterwidget.cpp:81 transactionfilterwidget.cpp:95 #, kde-format msgid "To:" msgstr "Nach:" #: importcsvdialog.cpp:440 qifimportexport.cpp:258 #, kde-format msgid "A file must be selected." msgstr "Es muss eine Datei ausgewählt werden." #: importcsvdialog.cpp:446 importcsvdialog.cpp:458 qifimportexport.cpp:265 #: qifimportexport.cpp:595 #, kde-format msgid "Selected file is a directory." msgstr "Die ausgewählte Datei ist ein Verzeichnis." #: importcsvdialog.cpp:450 importcsvdialog.cpp:462 qifimportexport.cpp:269 #, kde-format msgid "Selected file does not exist." msgstr "Die ausgewählte Datei existiert nicht." #: importcsvdialog.cpp:468 #, kde-format msgid "Empty delimiter." msgstr "Leerer Begrenzer." #: importcsvdialog.cpp:712 #, kde-format msgid "The same column number is selected multiple times." msgstr "Die selbe Spaltennummer ist mehrfach ausgewählt." #: importcsvdialog.cpp:772 #, kde-format msgid "Selected from account is the same as the to account." msgstr "Das gewählte Ausgangskonto ist identisch mit dem Eingangskonto." #: importcsvdialog.cpp:803 qifimportexport.cpp:288 qifimportexport.cpp:452 #, kde-format msgid "Couldn't open %1 for reading." msgstr "Konnte %1 nicht zum lesen öffnen." #: importcsvdialog.cpp:806 qifimportexport.cpp:291 qifimportexport.cpp:455 #, kde-format msgid "Error reading %1." msgstr "Fehler beim Lesen von %1." #: importcsvdialog.cpp:1187 qifimportexport.cpp:462 #, kde-format msgid "Successfully imported 1 transaction." msgid_plural "Successfully imported %n transactions." msgstr[0] "Eine Transaktion erfolgreich eingelesen." msgstr[1] "%n Transaktionen erfolgreich eingelesen." #: importcsvdialog.cpp:1189 #, kde-format msgid "Unable to import any transactions imported." msgstr "Es konnten keine Transaktionen importiert werden." #: importcsvdialog.cpp:1193 #, kde-format msgid "Failed to import 1 data row." msgid_plural "Failed to import %n data rows." msgstr[0] "Ein Datensatz konnte nicht eingelesen werden." msgstr[1] "%n Datensätze konnten nicht importiert werden." #: importcsvdialog.cpp:1194 #, kde-format msgid "Required columns missing." msgstr "Notwendige Spalten fehlen." #: importcsvdialog.cpp:1195 #, kde-format msgid "Invalid value." msgstr "Ungültiger Wert." #: importcsvdialog.cpp:1197 #, kde-format msgid "Empty category name." msgstr "Leerer Kategorienname." #: importcsvdialog.cpp:1197 importcsvdialog.cpp:1198 #, kde-format msgid "Empty account name." msgstr "Leerer Kontenname." #: importcsvdialog.cpp:1199 #, kde-format msgid "Unknown category found." msgstr "Unbekannte Kategorie gefunden." #: importcsvdialog.cpp:1199 importcsvdialog.cpp:1200 #, kde-format msgid "Unknown account found." msgstr "Unbekanntes Konto gefunden." #: importcsvdialog.cpp:1201 #, kde-format msgid "Cannot import security transactions (to/from security accounts)." msgstr "" "Kann Wertpapiertransaktionen nicht importieren (von/nach Wertpapierkonten)." #: importcsvdialog.cpp:1202 #, kde-format msgid "Balancing account wrongly used." msgstr "Bilanzierungskonto falsch verwendet." #: importcsvdialog.cpp:1203 #, kde-format msgid "Same to and from account/category." msgstr "Konto/Kategorie sind identisch." #: importcsvdialog.cpp:1205 #, kde-format msgid "No data found." msgstr "Keine Daten gefunden." #: importcsvdialog.cpp:1219 qifimportexport.cpp:345 #, kde-format msgid "Unrecognized date format." msgstr "Unbekanntes Datumsformat." #: importcsvdialog.cpp:1224 #, kde-format msgid "Specify Format" msgstr "Format bestimmen" #: importcsvdialog.cpp:1230 #, kde-format msgid "" "The format of dates and/or numbers in the CSV file is ambiguous. Please " "select the correct format." msgstr "" "Das Format von Terminen und/oder Zahlen in der CSV-Datei ist zweideutig. " "Bitte wählen Sie das korrekte Format." #: importcsvdialog.cpp:1235 qifimportexport.cpp:94 qifimportexport.cpp:533 #, kde-format msgid "Date format:" msgstr "Datumsformat:" #: importcsvdialog.cpp:1278 qifimportexport.cpp:541 #, kde-format msgid "Value format:" msgstr "Zahlenformat:" #: kdateedit.cpp:366 #, kde-format msgctxt "the day after today" msgid "tomorrow" msgstr "morgen" #: kdateedit.cpp:367 #, kde-format msgctxt "this day" msgid "today" msgstr "heute" #: kdateedit.cpp:368 #, kde-format msgctxt "the day before today" msgid "yesterday" msgstr "gestern" #: kdatepickerpopup.cpp:94 #, kde-format msgctxt "@option today" msgid "&Today" msgstr "Heute" #: kdatepickerpopup.cpp:95 #, kde-format msgctxt "@option tomorrow" msgid "To&morrow" msgstr "Morgen" #: kdatepickerpopup.cpp:96 #, kde-format msgctxt "@option next week" msgid "Next &Week" msgstr "" #: kdatepickerpopup.cpp:97 #, kde-format msgctxt "@option next month" msgid "Next M&onth" msgstr "" #: kdatepickerpopup.cpp:105 #, kde-format msgctxt "@option do not specify a date" msgid "No Date" msgstr "" #: ledgerdialog.cpp:122 #, kde-format msgid "Export..." msgstr "Exportiere..." #: ledgerdialog.cpp:123 #, kde-format msgid "Print..." msgstr "Drucke..." #: ledgerdialog.cpp:139 #, kde-format msgid "Withdrawal" msgstr "Abhebung" #: ledgerdialog.cpp:162 #, kde-format msgid "Join..." msgstr "Fasse zusammen..." #: ledgerdialog.cpp:164 #, kde-format msgid "Split Up" msgstr "Aufgeteilt" #: ledgerdialog.cpp:234 ledgerdialog.cpp:354 #, kde-format msgid "Empty transaction list." msgstr "Leere Transaktionsliste" #: ledgerdialog.cpp:443 transactionlistwidget.cpp:717 #, kde-format msgid "Are you sure you want to delete all (%1) selected transactions?" msgstr "" "Sind Sie sicher, daß Sie alle (%1) ausgewählten Transaktionen löschen wollen?" #: ledgerdialog.cpp:547 transactionlistwidget.cpp:489 #, kde-format msgid "" "Cannot set the value of security transactions using the dialog for modifying " "multiple transactions." msgstr "" "Der Wert von Wertpapiertransaktionen kann nicht über den Dialog zum Ändern " "mehrerer Transaktionen geändert werden." #: ledgerdialog.cpp:553 transactionlistwidget.cpp:495 #, kde-format msgid "Cannot change description of dividends and security transactions." msgstr "" "Die Beschreibung für Dividenden und Wertpapiertransaktionen kann nicht " "geändert werden." #: ledgerdialog.cpp:559 transactionlistwidget.cpp:501 #, kde-format msgid "Cannot change payer of dividends and security transactions." msgstr "" "Der Zahlungspflichtige von Dividenden und Wertpapiere kann nicht verändert " "werden." #: ledgerdialog.cpp:565 transactionlistwidget.cpp:507 #, kde-format msgid "" "Cannot change date of transactions that are part of a split transaction." msgstr "" "Das Datum von Teilen einer geteilten Transaktion kann nicht verändert werden." #: main.cpp:39 msgid "Eqonomize!" msgstr "Eqonomize!" #: main.cpp:39 msgid "A personal accounting program" msgstr "Ein Programm für die private Buchhaltung" #: main.cpp:39 msgid "(C) 2008 Hanna K." msgstr "" #: main.cpp:40 msgid "Hanna K." msgstr "" #: main.cpp:44 msgid "Start with expenses list displayed" msgstr "Mit Ausgabenansicht beginnen" #: main.cpp:46 msgid "Start with incomes list displayed" msgstr "Mit Einnahmenansicht beginenn" #: main.cpp:48 msgid "Start with transfers list displayed" msgstr "Mit Transaktionenansicht beginnen" #: main.cpp:49 msgid "Document to open" msgstr "Zu öffnendes Dokument" #: overtimechart.cpp:124 overtimechart.cpp.bak:117 #, kde-format msgid "Incomes and Expenses" msgstr "Einnahmen und Ausgaben" #: overtimechart.cpp:125 overtimechart.cpp:1722 overtimechart.cpp.bak:118 #: overtimechart.cpp.bak:1703 overtimereport.cpp:102 overtimereport.cpp:343 #, kde-format msgid "Profits" msgstr "Einkünfte" #: overtimechart.cpp:132 overtimechart.cpp:411 overtimechart.cpp:1949 #: overtimechart.cpp.bak:125 overtimechart.cpp.bak:404 #: overtimechart.cpp.bak:1950 overtimereport.cpp:108 overtimereport.cpp:228 #: overtimereport.cpp:753 #, kde-format msgid "All Categories Combined" msgstr "Alle Kategorien zusammen" #: overtimechart.cpp:138 overtimechart.cpp:296 overtimechart.cpp:400 #: overtimechart.cpp:1852 overtimechart.cpp:1973 overtimechart.cpp.bak:131 #: overtimechart.cpp.bak:289 overtimechart.cpp.bak:393 #: overtimechart.cpp.bak:1853 overtimechart.cpp.bak:1974 #: overtimereport.cpp:113 overtimereport.cpp:176 overtimereport.cpp:225 #: overtimereport.cpp:710 overtimereport.cpp:776 #, kde-format msgid "All Descriptions Combined" msgstr "Alle Beschreibungen zusammen" #: overtimechart.cpp:146 overtimechart.cpp:406 overtimechart.cpp.bak:139 #: overtimechart.cpp.bak:399 #, kde-format msgid "All Payees/Payers Combined" msgstr "Alle Empfänger/Zahlungspflichtigen zusammengefasst" #: overtimechart.cpp:155 overtimechart.cpp.bak:148 #, kde-format msgid "Start date:" msgstr "Startdatum:" #: overtimechart.cpp:178 overtimechart.cpp.bak:171 #, kde-format msgid "End date:" msgstr "Enddatum:" #: overtimechart.cpp:197 overtimechart.cpp.bak:190 #, kde-format msgid "Monthly total" msgstr "Monatlich gesamt" #: overtimechart.cpp:201 overtimechart.cpp.bak:194 #, kde-format msgid "Daily average" msgstr "Täglicher Durchschnitt" #: overtimechart.cpp:304 overtimechart.cpp:404 overtimechart.cpp:1855 #: overtimechart.cpp:1978 overtimechart.cpp.bak:297 overtimechart.cpp.bak:397 #: overtimechart.cpp.bak:1856 overtimechart.cpp.bak:1979 #, kde-format msgid "All Payers Combined" msgstr "Alle Zahlungspflichtigen zusammengefasst" #: overtimechart.cpp:305 overtimechart.cpp:405 overtimechart.cpp:1856 #: overtimechart.cpp:1977 overtimechart.cpp.bak:298 overtimechart.cpp.bak:398 #: overtimechart.cpp.bak:1857 overtimechart.cpp.bak:1978 #, kde-format msgid "All Payees Combined" msgstr "Alle Empfänger zusammengefasst" #: overtimechart.cpp:325 overtimechart.cpp:1853 overtimechart.cpp.bak:318 #: overtimechart.cpp.bak:1854 #, kde-format msgid "All Descriptions Split" msgstr "Alle Beschreibungen geteilt" #: overtimechart.cpp:328 overtimechart.cpp:1857 overtimechart.cpp.bak:321 #: overtimechart.cpp.bak:1858 #, kde-format msgid "All Payers Split" msgstr "Alle Zahlungspflichtigen geteilt" #: overtimechart.cpp:329 overtimechart.cpp:1858 overtimechart.cpp.bak:322 #: overtimechart.cpp.bak:1859 #, kde-format msgid "All Payees Split" msgstr "Alle Empfänger geteilt" #: overtimechart.cpp:413 overtimechart.cpp:423 overtimechart.cpp:1950 #: overtimechart.cpp.bak:406 overtimechart.cpp.bak:416 #: overtimechart.cpp.bak:1951 #, kde-format msgid "All Categories Split" msgstr "Alle Kategorien geteilt" #: overtimechart.cpp:1535 overtimechart.cpp.bak:1516 #, kde-format msgid "Value (%1)" msgstr "Wert (%1)" #: overtimechart.cpp:1536 overtimechart.cpp.bak:1517 #, kde-format msgid "Profit (%1)" msgstr "Ertrag (%1)" #: overtimechart.cpp:1537 overtimechart.cpp.bak:1518 #, kde-format msgid "Income (%1)" msgstr "Einnahmen (%1)" #: overtimechart.cpp:1538 overtimechart.cpp.bak:1519 #, kde-format msgid "Cost (%1)" msgstr "Kosten (%1)" #: overtimechart.cpp:1579 overtimechart.cpp.bak:1560 #, kde-format msgid "Time" msgstr "Zeit" #: overtimechart.cpp:1774 overtimechart.cpp:1775 overtimechart.cpp.bak:1755 #: overtimechart.cpp.bak:1756 #, kde-format msgid "no payer" msgstr "Kein Zahlungspflichtiger" #: overtimechart.cpp:1778 overtimechart.cpp.bak:1759 #, kde-format msgctxt "%1: Description; %2: Payer" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp:1783 overtimechart.cpp:1784 overtimechart.cpp.bak:1764 #: overtimechart.cpp.bak:1765 #, kde-format msgid "no payee" msgstr "Kein Zahlungsempfänger" #: overtimechart.cpp:1787 overtimechart.cpp.bak:1768 #, kde-format msgctxt "%1: Description; %2: Payee" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp.bak:649 #, kde-format msgid "Error after saving file; data may not have been saved." msgstr "" "Fehler nach dem Speichern der Datei; Daten wurden möglicherweise nicht " "gesichert" #: overtimereport.cpp:344 #, kde-format msgid "Average Profit" msgstr "Durchschnittliche Einkünfte" #: overtimereport.cpp:537 #, kde-format msgid "Year" msgstr "Jahr" #: overtimereport.cpp:538 #, kde-format msgid "Month" msgstr "Monat" #: overtimereport.cpp:566 #, kde-format msgid "Includes scheduled transactions" msgstr "Beinhaltet geplante Transaktionen" #: overtimereport.cpp:570 #, kde-format msgid "Adjusted for the average month / year (%1 / %2 days)" msgstr "" "An den durchschnittlichen Monat / das durchschnittliche Jahr angepasst (%1 / " "%2 Tage)" #: overtimereport.cpp:603 overtimereport.cpp:671 #, kde-format msgid "Subtotal" msgstr "Zwischensumme" #: qifimport.cpp:307 qifimport.cpp:367 qifimportexport.cpp:1259 #: qifimportexport.cpp:1350 qifimportexport.cpp:1470 #, kde-format msgid "Unnamed" msgstr "Unbenannt" #: qifimport.cpp:337 qifimportexport.cpp:1299 qifimportexport.cpp:1413 #, kde-format msgid "Uncategorized" msgstr "Nicht kategorisiert" #: qifimportexport.cpp:56 #, kde-format msgid "Import QIF file" msgstr "QIF-Datei importieren" #: qifimportexport.cpp:63 #, kde-format msgid "" "Select a QIF file to import. When you click next, the file be analysed and " "you might need to answer some questions about the format of the file." msgstr "" "Wählen Sie eine QIF-Datei zum Import. Wenn Sie \"Weiter\" klicken, wird die " "Datei analysiert, und Sie könnten einige weitere Fragen über das Dateiformat " "beantworten müssen." #: qifimportexport.cpp:73 #, kde-format msgid "Local Definitions" msgstr "Lokale Definitionen" #: qifimportexport.cpp:74 #, kde-format msgid "" "Unknown elements where found in the QIF file. It is possible that this is " "because of localized type names. Please map them to the correct standard " "names." msgstr "" "Es wurden unbekannte Elemente in dieser QIF-Datei gefunden. Dies kann durch " "lokal angepasste Typnamen verursacht worden sein. Bitte entschlüssln Sie " "diese zu den korrekten Standardnamen." #: qifimportexport.cpp:80 #, kde-format msgid "Local Text" msgstr "Lokaler Text" #: qifimportexport.cpp:81 #, kde-format msgid "Standard Text" msgstr "Standardtext" #: qifimportexport.cpp:84 #, kde-format msgid "Select standard text:" msgstr "Standardtext auswählen:" #: qifimportexport.cpp:90 #, kde-format msgid "Date Format" msgstr "Datumsformat" #: qifimportexport.cpp:91 #, kde-format msgid "" "The date format in the QIF file is ambiguous. Please select the correct " "format." msgstr "" "Das Datumsformat in diser QIF-Datei ist zweideutig. Bitte wählen Sie das " "korrekte Datumsformat." #: qifimportexport.cpp:100 #, kde-format msgid "Default Account" msgstr "Standardkonto" #: qifimportexport.cpp:101 #, kde-format msgid "" "Could not find any account definitions in the QIF file. Please select a " "default account. It is also possible that this is caused by a localized " "opening balance text." msgstr "" "Konnte keine Kontendefinitionen in der QIF-Datei finden. Bitte wählen Sie " "ein Standardkonto. Dies kann durch lokal veränderte Starteinlagen-Texte " "entstenen." #: qifimportexport.cpp:104 #, kde-format msgid "Default account:" msgstr "Standardkonto:" #: qifimportexport.cpp:115 #, kde-format msgid "Opening balance text:" msgstr "Starteinlagen-Text:" #: qifimportexport.cpp:121 #, kde-format msgid "Descriptions" msgstr "Beschreibungen" #: qifimportexport.cpp:122 #, kde-format msgid "" "Transactions in QIF files does not have any specific description property. " "You are therefore given the option to choose how the description of imported " "transactions will be set." msgstr "" "Transaktionen in QIF-Dateien haben keine eigene Beschreibungsfelder. Daher " "erhalten Sie die Möglichkeit zu wählen, wie die Beschreibungen der " "importierten Transaktionen gefüllt werden." #: qifimportexport.cpp:125 #, kde-format msgid "Subcategories as:" msgstr "Unterkategorien als:" #: qifimportexport.cpp:134 #, kde-format msgid "Ignore" msgstr "Ignorieren" #: qifimportexport.cpp:137 #, kde-format msgid "Payee as:" msgstr "Empfänger als:" #: qifimportexport.cpp:142 qifimportexport.cpp:520 #: transactionlistwidget.cpp:119 #, kde-format msgid "Payee" msgstr "Empfänger" #: qifimportexport.cpp:147 #, kde-format msgid "Memo as:" msgstr "Notiz als:" #: qifimportexport.cpp:156 #, kde-format msgid "Priority:" msgstr "Priorität:" #: qifimportexport.cpp:159 #, kde-format msgid "Subcategory/Payee/Comments" msgstr "Unterkategorie/Empfänger/Kommentare" #: qifimportexport.cpp:160 #, kde-format msgid "Payee/Subcategory/Comments" msgstr "Empfänger/Unterkategorie/Kommentare" #: qifimportexport.cpp:161 #, kde-format msgid "Subcategory/Comments/Payee" msgstr "Unterkategorie/Kommentare/Empfänger" #: qifimportexport.cpp:162 #, kde-format msgid "Payee/Comments/Subcategory" msgstr "Empfänger/Kommentare/Unterkategorie" #: qifimportexport.cpp:163 #, kde-format msgid "Comments/Subcategory/Payee" msgstr "Kommentare/Unterkategorie/Empfänger" #: qifimportexport.cpp:164 #, kde-format msgid "Comments/Payee/Subcategory" msgstr "Kommentare/Empfänger/Unterkategorie" #: qifimportexport.cpp:314 qifimportexport.cpp:322 qifimportexport.cpp:338 #, kde-format msgid "Unknown" msgstr "Unbekannt" #: qifimportexport.cpp:324 #, kde-format msgid "Bank" msgstr "Bank" #: qifimportexport.cpp:326 #, kde-format msgid "Cat (Category)" msgstr "Kat. (Kategorie)" #: qifimportexport.cpp:327 #, kde-format msgid "CCard (Credit Card)" msgstr "Kreditkarte" #: qifimportexport.cpp:328 #, kde-format msgid "Invst (Investment)" msgstr "Invst. (Investitionen)" #: qifimportexport.cpp:329 #, kde-format msgid "Oth A (Other Assets)" msgstr "Andere Akt. (Andere Aktiva)" #: qifimportexport.cpp:330 #, kde-format msgid "Oth L (Other Liabilities)" msgstr "Andere Verpf. (Verpflichtungen)" #: qifimportexport.cpp:331 #, kde-format msgid "Security" msgstr "Wertpapier" #: qifimportexport.cpp:465 #, kde-format msgid "Successfully imported 1 account." msgid_plural "Successfully imported %n accounts." msgstr[0] "Ein Konto wurde erfolgreich importiert." msgstr[1] "%n Konten wurden erfolgreich importiert." #: qifimportexport.cpp:469 #, kde-format msgid "Successfully imported 1 category." msgid_plural "Successfully imported %n categories." msgstr[0] "Eine Kategorie wurde erfolgreich importiert." msgstr[1] "%n Kategorien wurden erfolgreich importiert." #: qifimportexport.cpp:473 #, kde-format msgid "1 duplicate transaction was ignored." msgid_plural "%n duplicate transactions was ignored." msgstr[0] "Eine doppelte Transaktion wurde ignoriert." msgstr[1] "%n doppelte Transaktionen wurden ignoriert." #: qifimportexport.cpp:477 #, kde-format msgid "Failed to import 1 transaction." msgid_plural "Failed to import %n transactions." msgstr[0] "Fehler beim impotrieren von 1 Transaktion." msgstr[1] "Fehler beim Importieren von %n Transaktionen." #: qifimportexport.cpp:481 #, kde-format msgid "1 security was not imported." msgid_plural "%n securities were not imported." msgstr[0] "Eine Wertpapier wurde nicht importiert." msgstr[1] "%n Wertpapier wurden nicht importiert." #: qifimportexport.cpp:485 #, kde-format msgid "1 security transaction was not imported." msgid_plural "%n security transactions were not imported." msgstr[0] "Eine Wertpapiertransaktion wurde nicht importiert." msgstr[1] "%n Wertpapiertransaktionen wurden nicht importiert." #: qifimportexport.cpp:494 #, kde-format msgid "Export QIF File" msgstr "Exportiere als QIF-Datei" #: qifimportexport.cpp:506 #, kde-format msgctxt "All accounts" msgid "All" msgstr "Alle" #: qifimportexport.cpp:517 #, kde-format msgid "Export transaction description as:" msgstr "Beschreibung dieser Transaktion exportieren als:" #: qifimportexport.cpp:524 #, kde-format msgid "Memo" msgstr "Notiz" #: qifimportexport.cpp:528 #, kde-format msgid "Subcategory" msgstr "Unterkategorie" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 5 #: rc.cpp:3 #, kde-format msgid "&Import" msgstr "Importiere" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 12 #: rc.cpp:6 #, kde-format msgid "&Accounts" msgstr "&Konten" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 24 #: rc.cpp:9 #, kde-format msgid "&Transactions" msgstr "&Transaktionen" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 41 #: rc.cpp:12 #, kde-format msgid "&Securities" msgstr "&Wertpapiere" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 56 #: rc.cpp:15 #, kde-format msgid "Stat&istics" msgstr "Stat&istiken" #: rc.cpp:16 #, kde-format msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" "Martin F. Hohenberg, Elias Probst, Frank S. Thomas, Martin F. Hohenberg,," "Launchpad Contributions:,Elias Probst,Frank S. Thomas,Martin F. Hohenberg" #: rc.cpp:17 #, kde-format msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" "martin.hohenberg@gmail.com, mail@eliasprobst.eu, fst@debian.org, martin." "hohenberg@gmail.com,,,mail@eliasprobst.eu,fst@debian.org,martin." "hohenberg@gmail.com" #: recurrenceeditwidget.cpp:69 #, kde-format msgid "Edit Exceptions" msgstr "Ausnahmen bearbeiten" #: recurrenceeditwidget.cpp:186 #, kde-format msgid "Edit Recurrence Range" msgstr "Zeitraum für Wiederholungen bearbeiten." #: recurrenceeditwidget.cpp:194 recurrenceeditwidget.cpp:229 #, kde-format msgid "Begins on: %1" msgstr "Beginnt am: %1" #: recurrenceeditwidget.cpp:199 #, kde-format msgid "No ending date" msgstr "Kein Enddatum" #: recurrenceeditwidget.cpp:203 #, kde-format msgid "End after" msgstr "Ende nach" #: recurrenceeditwidget.cpp:209 #, kde-format msgid "occurrence(s)" msgstr "Vorkommnis(se)" #: recurrenceeditwidget.cpp:211 #, kde-format msgid "End on" msgstr "Endet am" #: recurrenceeditwidget.cpp:298 #, kde-format msgid "End date before start date." msgstr "Endzeitpunkt vor Startzeitpunkt." #: recurrenceeditwidget.cpp:312 #, kde-format msgid "Enable recurrance" msgstr "Wiederholung aktivieren" #: recurrenceeditwidget.cpp:315 #, kde-format msgid "Recurrence Rule" msgstr "Regel für Wiederholungen" #: recurrenceeditwidget.cpp:321 #, kde-format msgid "Weekly" msgstr "Wöchentlich" #: recurrenceeditwidget.cpp:341 recurrenceeditwidget.cpp:352 #: recurrenceeditwidget.cpp:376 recurrenceeditwidget.cpp:462 #, kde-format msgid "Recur every" msgstr "Wiederhole alle" #: recurrenceeditwidget.cpp:345 #, kde-format msgid "day(s)" msgstr "Tag(e)" #: recurrenceeditwidget.cpp:356 #, kde-format msgid "week(s) on:" msgstr "Woche(n) am:" #: recurrenceeditwidget.cpp:380 #, kde-format msgid "month(s), after the start month" msgstr "Monat(e), nach dem Startmonat" #: recurrenceeditwidget.cpp:385 recurrenceeditwidget.cpp:437 #, kde-format msgid "Recur on the" msgstr "Wiederholen am" #: recurrenceeditwidget.cpp:391 recurrenceeditwidget.cpp:442 #: recurrenceeditwidget.cpp:494 #, kde-format msgid "1st" msgstr "1." #: recurrenceeditwidget.cpp:392 recurrenceeditwidget.cpp:443 #: recurrenceeditwidget.cpp:495 #, kde-format msgid "2nd" msgstr "2." #: recurrenceeditwidget.cpp:393 recurrenceeditwidget.cpp:444 #: recurrenceeditwidget.cpp:496 #, kde-format msgid "3rd" msgstr "3." #: recurrenceeditwidget.cpp:394 recurrenceeditwidget.cpp:445 #: recurrenceeditwidget.cpp:497 #, kde-format msgid "4th" msgstr "4." #: recurrenceeditwidget.cpp:395 recurrenceeditwidget.cpp:446 #: recurrenceeditwidget.cpp:498 #, kde-format msgid "5th" msgstr "5." #: recurrenceeditwidget.cpp:396 #, kde-format msgid "6th" msgstr "6." #: recurrenceeditwidget.cpp:397 #, kde-format msgid "7th" msgstr "7." #: recurrenceeditwidget.cpp:398 #, kde-format msgid "8th" msgstr "8." #: recurrenceeditwidget.cpp:399 #, kde-format msgid "9th" msgstr "9." #: recurrenceeditwidget.cpp:400 #, kde-format msgid "10th" msgstr "10." #: recurrenceeditwidget.cpp:401 #, kde-format msgid "11th" msgstr "11." #: recurrenceeditwidget.cpp:402 #, kde-format msgid "12th" msgstr "12." #: recurrenceeditwidget.cpp:403 #, kde-format msgid "13th" msgstr "13." #: recurrenceeditwidget.cpp:404 #, kde-format msgid "14th" msgstr "14." #: recurrenceeditwidget.cpp:405 #, kde-format msgid "15th" msgstr "15." #: recurrenceeditwidget.cpp:406 #, kde-format msgid "16th" msgstr "16." #: recurrenceeditwidget.cpp:407 #, kde-format msgid "17th" msgstr "17." #: recurrenceeditwidget.cpp:408 #, kde-format msgid "18th" msgstr "18." #: recurrenceeditwidget.cpp:409 #, kde-format msgid "19th" msgstr "19." #: recurrenceeditwidget.cpp:410 #, kde-format msgid "20th" msgstr "20." #: recurrenceeditwidget.cpp:411 #, kde-format msgid "21st" msgstr "21." #: recurrenceeditwidget.cpp:412 #, kde-format msgid "22nd" msgstr "22." #: recurrenceeditwidget.cpp:413 #, kde-format msgid "23rd" msgstr "23." #: recurrenceeditwidget.cpp:414 #, kde-format msgid "24th" msgstr "24." #: recurrenceeditwidget.cpp:415 #, kde-format msgid "25th" msgstr "25." #: recurrenceeditwidget.cpp:416 #, kde-format msgid "26th" msgstr "26." #: recurrenceeditwidget.cpp:417 #, kde-format msgid "27th" msgstr "27." #: recurrenceeditwidget.cpp:418 #, kde-format msgid "28th" msgstr "28." #: recurrenceeditwidget.cpp:419 #, kde-format msgid "29th" msgstr "29." #: recurrenceeditwidget.cpp:420 #, kde-format msgid "30th" msgstr "30." #: recurrenceeditwidget.cpp:421 #, kde-format msgid "31st" msgstr "31." #: recurrenceeditwidget.cpp:422 recurrenceeditwidget.cpp:447 #: recurrenceeditwidget.cpp:499 #, kde-format msgid "Last" msgstr "Letzten" #: recurrenceeditwidget.cpp:423 recurrenceeditwidget.cpp:448 #: recurrenceeditwidget.cpp:500 #, kde-format msgid "2nd Last" msgstr "Vorletzten" #: recurrenceeditwidget.cpp:424 recurrenceeditwidget.cpp:449 #: recurrenceeditwidget.cpp:501 #, kde-format msgid "3rd Last" msgstr "Drittletzten" #: recurrenceeditwidget.cpp:425 recurrenceeditwidget.cpp:450 #: recurrenceeditwidget.cpp:502 #, kde-format msgid "4th Last" msgstr "Viertletzten" #: recurrenceeditwidget.cpp:426 recurrenceeditwidget.cpp:451 #: recurrenceeditwidget.cpp:503 #, kde-format msgid "5th Last" msgstr "Fünftletzten" #: recurrenceeditwidget.cpp:429 #, kde-format msgid "day" msgstr "Tag" #: recurrenceeditwidget.cpp:431 recurrenceeditwidget.cpp:483 #: recurrenceeditwidget.cpp:521 #, kde-format msgid "possibly on weekend" msgstr "auch am Wochenende" #: recurrenceeditwidget.cpp:432 recurrenceeditwidget.cpp:484 #: recurrenceeditwidget.cpp:522 #, kde-format msgid "but before weekend" msgstr "aber vor einem Wochenende" #: recurrenceeditwidget.cpp:433 recurrenceeditwidget.cpp:485 #: recurrenceeditwidget.cpp:523 #, kde-format msgid "but after weekend" msgstr "aber nach einem Wochenende" #: recurrenceeditwidget.cpp:466 #, kde-format msgid "year(s), after the start year" msgstr "Jahr(e) nach dem Startjahr" #: recurrenceeditwidget.cpp:471 #, kde-format msgctxt "part before XXX of 'Recur on day XXX of month YYY'" msgid "Recur on day" msgstr "Wiederhole am Tag" #: recurrenceeditwidget.cpp:479 #, kde-format msgctxt "part between XXX and YYY of 'Recur on day XXX of month YYY'" msgid "of" msgstr "aufhören" #: recurrenceeditwidget.cpp:489 #, kde-format msgctxt "Part before NNN in 'Recur on the NNN. WEEKDAY of MONTH'" msgid "On the" msgstr "Am" #: recurrenceeditwidget.cpp:507 #, kde-format msgctxt "part between WEEKDAY and MONTH in 'Recur on NNN. WEEKDAY of MONTH'" msgid "of" msgstr "aufhören" #: recurrenceeditwidget.cpp:512 #, kde-format msgid "Recur on day #" msgstr "Wiederhole am Tag #" #: recurrenceeditwidget.cpp:519 #, kde-format msgctxt "part after NNN of 'Recur on day #NNN of the year'" msgid " of the year" msgstr " aufhören" #: recurrenceeditwidget.cpp:533 #, kde-format msgid "Range..." msgstr "Bereich..." #: recurrenceeditwidget.cpp:535 #, kde-format msgid "Exceptions..." msgstr "Ausnahmen..." #: recurrenceeditwidget.cpp:731 #, kde-format msgid "No day of week selected for weekly recurrence." msgstr "Kein Wochentag für wöchentliche Wiederholung ausgewählt" #: recurrenceeditwidget.cpp:745 recurrenceeditwidget.cpp:774 #: recurrenceeditwidget.cpp:791 #, kde-format msgid "Selected day will never occur with selected frequency and start date." msgstr "Der gewählte Tag liegt nicht innerhalb des gewählten Zeitraumes." #: recurrenceeditwidget.cpp:761 #, kde-format msgid "Selected day does not exist in selected month." msgstr "Der gewählte Tag kommt im gewählten Monat nicht vor." #: transaction.cpp:155 transaction.cpp:186 #, kde-format msgid "Dividend: %1" msgstr "Dividende: %1" #: transaction.cpp:253 transaction.cpp:256 transaction.cpp:284 #, kde-format msgid "Account balancing" msgstr "Kontenbilanzierung" #: transaction.cpp:337 transaction.cpp:352 #, kde-format msgid "Security: %1 (bought)" msgstr "Wertpapier: %1 (gekauft)" #: transaction.cpp:375 transaction.cpp:390 #, kde-format msgid "Security: %1 (sold)" msgstr "Wertpapier: %1 (verkauft)" #: transactioneditwidget.cpp:125 #, kde-format msgid "Shares bought:" msgstr "Anteile gekauft:" #: transactioneditwidget.cpp:130 #, kde-format msgid "Shares sold:" msgstr "Anteile verkauft:" #: transactioneditwidget.cpp:238 transactioneditwidget.cpp:1144 #: transactionfilterwidget.cpp:140 #, kde-format msgid "Payer:" msgstr "Zahler:" #: transactioneditwidget.cpp:280 transactioneditwidget.cpp:1145 #: transactionfilterwidget.cpp:141 #, kde-format msgid "Payee:" msgstr "Empfänger:" #: transactioneditwidget.cpp:664 transactioneditwidget.cpp:1262 #, kde-format msgid "No income category available." msgstr "Keine Einkommenkategorie verfügbar" #: transactioneditwidget.cpp:689 transactioneditwidget.cpp:1270 #, kde-format msgid "No expense category available." msgstr "Keine Ausgabenkategorie verfügbar" #: transactioneditwidget.cpp:720 #, kde-format msgid "Cannot create a regular transfer to/from a securities account." msgstr "" "Normale Transfers von/zu einem Wertpapierkonto können nicht durchgeführt " "werden." #: transactioneditwidget.cpp:727 #, kde-format msgid "Cannot create a regular income to a securities account." msgstr "" "Normale Einkünfte können nicht zu einem Wertpapierkonto zugefügt werden." #: transactioneditwidget.cpp:743 #, kde-format msgid "Zero price per share not allowed." msgstr "Wertpapiere ohne Wert sind nicht erlaubt." #: transactioneditwidget.cpp:755 #, kde-format msgid "Cannot create a regular expense from a securities account." msgstr "Normale Ausgaben aus einem Wertpapierkonto sind nicht möglich." #: transactioneditwidget.cpp:1086 #, kde-format msgid "Modify Transactions" msgstr "Transaktionen bearbeiten." #: transactionfilterwidget.cpp:99 #, kde-format msgid "Min amount:" msgstr "Mindestmenge" #: transactionfilterwidget.cpp:100 #, kde-format msgid "Max amount:" msgstr "Höchstmenge" #: transactionfilterwidget.cpp:110 #, kde-format msgid "Min income:" msgstr "Mindesteinnahmen" #: transactionfilterwidget.cpp:111 #, kde-format msgid "Max income:" msgstr "Höchsteinnahmen" #: transactionfilterwidget.cpp:121 #, kde-format msgid "Min cost:" msgstr "Mindestkosten" #: transactionfilterwidget.cpp:122 #, kde-format msgid "Max cost:" msgstr "Höchstkosten" #: transactionfilterwidget.cpp:148 #, kde-format msgid "Include" msgstr "Inklusive" #: transactionfilterwidget.cpp:152 #, kde-format msgid "Exclude" msgstr "Exklusive" #: transactionlistwidget.cpp:117 #, kde-format msgid "From Account" msgstr "Von Konto" #: transactionlistwidget.cpp:128 #, kde-format msgid "To Account" msgstr "Zu Konto" #: transactionlistwidget.cpp:130 #, kde-format msgid "Payer" msgstr "Absender" #: transactionlistwidget.cpp:169 #, kde-format msgid "New/Edit Expense" msgstr "Ausgabe anlegen/bearbeiten" #: transactionlistwidget.cpp:170 #, kde-format msgid "Filter" msgstr "Filter" #: transactionlistwidget.cpp:209 #, kde-format msgid "Total:" msgstr "Gesamt:" #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:328 #, kde-format msgid "Average:" msgstr "Durchschnittlich:" #: transactionlistwidget.cpp:209 #, kde-format msgid "Monthly:" msgstr "Monatlich:" #: transactionlistwidget.cpp:314 #, kde-format msgid "Total cost:" msgstr "Gesamtkosten:" #: transactionlistwidget.cpp:318 #, kde-format msgid "Total income:" msgstr "Gesamte Einnahmen:" #: transactionlistwidget.cpp:322 #, kde-format msgid "Total amount:" msgstr "Gesamtwert:" #: transactionlistwidget.cpp:330 #, kde-format msgid "Monthly average:" msgstr "Monatlicher Durchschnitt:" #: transactionlistwidget.cpp:671 #, kde-format msgid "" "Are you sure you want to delete all (%1) transactions in the selected split " "transaction?" msgstr "" "Sind Sie sicher, daß Sie alle (%1) ausgewählten geteilten Transaktionen " "löschen wollen?" #: transactionlistwidget.cpp:1028 #, kde-format msgid "* Part of split transaction" msgstr "* Teil einer geteilten Transaktion" #: transactionlistwidget.cpp:1029 #, kde-format msgid "* Part of split (%1)" msgstr "* Teil (%1)" #: transactionlistwidget.cpp:1033 #, kde-format msgid "** Recurring (editing occurrance)" msgstr "** Wiederkehrend (bearbeite Vorkommen)" #: transactionlistwidget.cpp:1049 #, kde-format msgid "Modify..." msgstr "Verändere..." eqonomize-0.6/po/eqonomize.pot0000644000175000017500000020430011107026467015474 0ustar hannahanna# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR This_file_is_part_of_Eqonomize # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?" "group_id=173799&atid=866832\n" "POT-Creation-Date: 2008-11-13 14:35+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: budget.cpp:51 editsplitdialog.cpp:118 ledgerdialog.cpp:652 #, kde-format msgid "Balancing" msgstr "" #: budget.cpp:84 #, kde-format msgid "Couldn't open %1 for reading" msgstr "" #: budget.cpp:95 #, kde-format msgid "" "Not a valid Eqonomize! file (XML parse error: \"%2\" at line %3, col %4)" msgstr "" #: budget.cpp:98 #, kde-format msgid "Invalid root element %1 in XML document" msgstr "" #: budget.cpp:363 #, kde-format msgid "Unable to load 1 account." msgid_plural "Unable to load %n accounts." msgstr[0] "" msgstr[1] "" #: budget.cpp:368 #, kde-format msgid "Unable to load 1 category." msgid_plural "Unable to load %n categories." msgstr[0] "" msgstr[1] "" #: budget.cpp:373 #, kde-format msgid "Unable to load 1 security." msgid_plural "Unable to load %n securities." msgstr[0] "" msgstr[1] "" #: budget.cpp:378 #, kde-format msgid "Unable to load 1 transaction." msgid_plural "Unable to load %n transactions." msgstr[0] "" msgstr[1] "" #: budget.cpp:389 #, kde-format msgid "File is a directory" msgstr "" #: budget.cpp:397 #, kde-format msgid "Couldn't open file for writing" msgstr "" #: budget.cpp:547 budget.cpp:551 #, kde-format msgid "Error while writing file; file was not saved" msgstr "" #: categoriescomparisonchart.cpp:123 categoriescomparisonreport.cpp:164 #: eqonomize.cpp:1797 eqonomize.cpp:1957 eqonomize.cpp:2036 #: transactionlistwidget.cpp:138 #, kde-format msgid "From" msgstr "" #: categoriescomparisonchart.cpp:130 categoriescomparisonreport.cpp:171 #: eqonomize.cpp:1808 eqonomize.cpp:1969 eqonomize.cpp:2037 #: transactionlistwidget.cpp:139 #, kde-format msgid "To" msgstr "" #: categoriescomparisonchart.cpp:147 categoriescomparisonreport.cpp:114 #: overtimechart.cpp:112 overtimechart.cpp.bak:106 overtimereport.cpp:97 #, kde-format msgid "Source:" msgstr "" #: categoriescomparisonchart.cpp:150 categoriescomparisonchart.cpp:858 #, kde-format msgid "All Expenses" msgstr "" #: categoriescomparisonchart.cpp:151 categoriescomparisonchart.cpp:859 #, kde-format msgid "All Incomes" msgstr "" #: categoriescomparisonchart.cpp:152 categoriescomparisonchart.cpp:860 #, kde-format msgid "All Accounts" msgstr "" #: categoriescomparisonchart.cpp:155 categoriescomparisonchart.cpp:864 #: categoriescomparisonreport.cpp:122 categoriescomparisonreport.cpp:752 #: categoriescomparisonreport.cpp:1016 overtimereport.cpp:375 #, kde-format msgid "Expenses: %1" msgstr "" #: categoriescomparisonchart.cpp:160 categoriescomparisonchart.cpp:871 #: categoriescomparisonreport.cpp:127 categoriescomparisonreport.cpp:756 #: categoriescomparisonreport.cpp:1023 overtimereport.cpp:366 #, kde-format msgid "Incomes: %1" msgstr "" #: categoriescomparisonchart.cpp:199 categoriescomparisonchart.cpp:225 #: categoriescomparisonreport.cpp:334 categoriescomparisonreport.cpp:360 #: editsplitdialog.cpp:411 eqonomize.cpp:482 eqonomize.cpp:571 #: eqonomize.cpp:741 eqonomize.cpp:848 eqonomize.cpp:870 eqonomize.cpp:2483 #: eqonomize.cpp:3180 eqonomize.cpp:3206 eqonomize.cpp:3326 eqonomize.cpp:3352 #: importcsvdialog.cpp:780 importcsvdialog.cpp:1196 overtimechart.cpp:462 #: overtimechart.cpp:500 overtimechart.cpp:528 overtimechart.cpp:566 #: overtimechart.cpp.bak:455 overtimechart.cpp.bak:493 #: overtimechart.cpp.bak:521 overtimechart.cpp.bak:559 #: recurrenceeditwidget.cpp:156 recurrenceeditwidget.cpp:171 #: recurrenceeditwidget.cpp:293 transactioneditwidget.cpp:707 #: transactioneditwidget.cpp:1281 transactionfilterwidget.cpp:564 #: transactionfilterwidget.cpp:590 #, kde-format msgid "Invalid date." msgstr "" #: categoriescomparisonchart.cpp:204 categoriescomparisonreport.cpp:339 #: eqonomize.cpp:3185 eqonomize.cpp:3331 transactionfilterwidget.cpp:569 #, kde-format msgid "To date is before from date." msgstr "" #: categoriescomparisonchart.cpp:229 categoriescomparisonreport.cpp:364 #: eqonomize.cpp:3210 eqonomize.cpp:3356 transactionfilterwidget.cpp:594 #, kde-format msgid "From date is after to date." msgstr "" #: categoriescomparisonchart.cpp:340 categoriescomparisonreport.cpp:463 #: eqonomize.cpp:3610 eqonomize.cpp:4252 ledgerdialog.cpp:251 #: overtimechart.cpp:624 overtimechart.cpp.bak:617 overtimereport.cpp:278 #: qifimportexport.cpp:604 #, kde-format msgid "" "The selected file already exists. Would you like to overwrite the old copy?" msgstr "" #: categoriescomparisonchart.cpp:344 categoriescomparisonreport.cpp:467 #: eqonomize.cpp:4257 ledgerdialog.cpp:255 overtimechart.cpp:628 #: overtimechart.cpp.bak:621 overtimereport.cpp:282 qifimportexport.cpp:608 #, kde-format msgid "You selected a directory!" msgstr "" #: categoriescomparisonchart.cpp:352 categoriescomparisonreport.cpp:475 #: eqonomize.cpp:4264 ledgerdialog.cpp:263 overtimechart.cpp:636 #: overtimechart.cpp.bak:629 overtimereport.cpp:290 qifimportexport.cpp:616 #, kde-format msgid "Couldn't open file for writing." msgstr "" #: categoriescomparisonchart.cpp:372 categoriescomparisonreport.cpp:482 #: eqonomize.cpp:4270 ledgerdialog.cpp:269 overtimechart.cpp:656 #: overtimechart.cpp.bak:644 overtimereport.cpp:297 qifimportexport.cpp:622 #, kde-format msgid "Error while writing file; file was not saved." msgstr "" #: categoriescomparisonchart.cpp:728 categoriescomparisonreport.cpp:303 #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:754 #: categoriescomparisonreport.cpp:839 categoriescomparisonreport.cpp:930 #: categoriescomparisonreport.cpp:977 overtimechart.cpp:373 #: overtimechart.cpp:1740 overtimechart.cpp:1746 overtimechart.cpp:1774 #: overtimechart.cpp:1776 overtimechart.cpp:1783 overtimechart.cpp:1785 #: overtimechart.cpp:1821 overtimechart.cpp:1891 overtimechart.cpp.bak:366 #: overtimechart.cpp.bak:1721 overtimechart.cpp.bak:1727 #: overtimechart.cpp.bak:1755 overtimechart.cpp.bak:1757 #: overtimechart.cpp.bak:1764 overtimechart.cpp.bak:1766 #: overtimechart.cpp.bak:1811 overtimechart.cpp.bak:1892 #: overtimereport.cpp:213 overtimereport.cpp:384 overtimereport.cpp:393 #: overtimereport.cpp:732 #, kde-format msgid "No description" msgstr "" #: categoriescomparisonreport.cpp:119 categoriescomparisonreport.cpp:1012 #, kde-format msgid "All Categories" msgstr "" #: categoriescomparisonreport.cpp:138 #, kde-format msgid "Descriptions for" msgstr "" #: categoriescomparisonreport.cpp:145 #, kde-format msgid "Payees/payers for" msgstr "" #: categoriescomparisonreport.cpp:161 #, kde-format msgid "Period:" msgstr "" #: categoriescomparisonreport.cpp:186 overtimereport.cpp:120 #, kde-format msgid "Columns:" msgstr "" #: categoriescomparisonreport.cpp:189 categoriescomparisonreport.cpp:782 #: eqonomize.cpp:1062 eqonomize.cpp:1935 eqonomize.cpp:4142 #: importcsvdialog.cpp:139 importcsvdialog.cpp:157 importcsvdialog.cpp:180 #: importcsvdialog.cpp:197 importcsvdialog.cpp:216 importcsvdialog.cpp:235 #: importcsvdialog.cpp:253 overtimereport.cpp:123 #, kde-format msgid "Value" msgstr "" #: categoriescomparisonreport.cpp:192 overtimereport.cpp:126 #: recurrenceeditwidget.cpp:320 #, kde-format msgid "Daily" msgstr "" #: categoriescomparisonreport.cpp:195 overtimereport.cpp:129 #: recurrenceeditwidget.cpp:322 #, kde-format msgid "Monthly" msgstr "" #: categoriescomparisonreport.cpp:198 overtimereport.cpp:132 #: recurrenceeditwidget.cpp:323 #, kde-format msgid "Yearly" msgstr "" #: categoriescomparisonreport.cpp:201 categoriescomparisonreport.cpp:787 #: overtimechart.cpp:205 overtimechart.cpp:1534 overtimechart.cpp.bak:198 #: overtimechart.cpp.bak:1515 overtimereport.cpp:135 overtimereport.cpp:549 #: transactionlistwidget.cpp:276 transactionlistwidget.cpp:340 #, kde-format msgid "Quantity" msgstr "" #: categoriescomparisonreport.cpp:204 overtimechart.cpp:209 #: overtimechart.cpp.bak:202 overtimereport.cpp:138 #, kde-format msgid "Average value" msgstr "" #: categoriescomparisonreport.cpp:278 categoriescomparisonreport.cpp:947 #, kde-format msgid "All descriptions" msgstr "" #: categoriescomparisonreport.cpp:279 categoriescomparisonreport.cpp:948 #, kde-format msgid "All payees" msgstr "" #: categoriescomparisonreport.cpp:280 categoriescomparisonreport.cpp:949 #, kde-format msgid "All payers" msgstr "" #: categoriescomparisonreport.cpp:309 categoriescomparisonreport.cpp:751 #: categoriescomparisonreport.cpp:837 categoriescomparisonreport.cpp:932 #: categoriescomparisonreport.cpp:994 overtimechart.cpp:382 #: overtimechart.cpp:1758 overtimechart.cpp:1768 overtimechart.cpp:1823 #: overtimechart.cpp:1908 overtimechart.cpp.bak:375 overtimechart.cpp.bak:1739 #: overtimechart.cpp.bak:1749 overtimechart.cpp.bak:1813 #: overtimechart.cpp.bak:1909 #, kde-format msgid "No payee" msgstr "" #: categoriescomparisonreport.cpp:310 categoriescomparisonreport.cpp:755 #: categoriescomparisonreport.cpp:838 categoriescomparisonreport.cpp:933 #: categoriescomparisonreport.cpp:995 overtimechart.cpp:381 #: overtimechart.cpp:1752 overtimechart.cpp:1763 overtimechart.cpp:1825 #: overtimechart.cpp:1907 overtimechart.cpp.bak:374 overtimechart.cpp.bak:1733 #: overtimechart.cpp.bak:1744 overtimechart.cpp.bak:1815 #: overtimechart.cpp.bak:1908 #, kde-format msgid "No payer" msgstr "" #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:751 #: overtimereport.cpp:393 #, kde-format msgid "Expenses: %2, %1" msgstr "" #: categoriescomparisonreport.cpp:754 categoriescomparisonreport.cpp:755 #: overtimereport.cpp:384 #, kde-format msgid "Incomes: %2, %1" msgstr "" #: categoriescomparisonreport.cpp:758 #, kde-format msgid "Incomes & Expenses" msgstr "" #: categoriescomparisonreport.cpp:771 #, kde-format msgctxt "html format; %1: title; %2: from date; %3: to date" msgid "%1 (%2–%3)" msgstr "" #: categoriescomparisonreport.cpp:772 #, kde-format msgctxt "html format; %1: title; %2: to date" msgid "%1 (to %2)" msgstr "" #: categoriescomparisonreport.cpp:776 eqonomize.cpp:4046 eqonomize.cpp:4094 #: qifimportexport.cpp:131 transactionlistwidget.cpp:116 #: transactionlistwidget.cpp:127 #, kde-format msgid "Category" msgstr "" #: categoriescomparisonreport.cpp:778 eqonomize.cpp:1938 #: transactionlistwidget.cpp:115 #, kde-format msgid "Cost" msgstr "" #: categoriescomparisonreport.cpp:780 editscheduledtransactiondialog.cpp:46 #: editsplitdialog.cpp:108 eqonomize.cpp:285 eqonomize.cpp:329 #: ledgerdialog.cpp:647 transactionlistwidget.cpp:126 #, kde-format msgid "Income" msgstr "" #: categoriescomparisonreport.cpp:784 overtimereport.cpp:545 #, kde-format msgid "Daily Average" msgstr "" #: categoriescomparisonreport.cpp:785 overtimereport.cpp:546 #, kde-format msgid "Monthly Average" msgstr "" #: categoriescomparisonreport.cpp:786 overtimereport.cpp:547 #, kde-format msgid "Yearly Average" msgstr "" #: categoriescomparisonreport.cpp:789 overtimereport.cpp:358 #: overtimereport.cpp:376 overtimereport.cpp:394 #, kde-format msgid "Average Cost" msgstr "" #: categoriescomparisonreport.cpp:791 overtimereport.cpp:350 #: overtimereport.cpp:367 overtimereport.cpp:385 #, kde-format msgid "Average Income" msgstr "" #: categoriescomparisonreport.cpp:793 #, kde-format msgid "Average Value" msgstr "" #: categoriescomparisonreport.cpp:853 eqonomize.cpp:3932 eqonomize.cpp:4030 #: eqonomize.cpp:4075 eqonomize.cpp:4123 overtimereport.cpp:686 #, kde-format msgid "Total" msgstr "" #: categoriescomparisonreport.cpp:878 #, kde-format msgid "Total incomes" msgstr "" #: categoriescomparisonreport.cpp:902 #, kde-format msgid "Total expenses" msgstr "" #: categoriescomparisonreport.cpp:912 #, kde-format msgid "Total (Profits)" msgstr "" #: editscheduledtransactiondialog.cpp:45 editsplitdialog.cpp:111 #: eqonomize.cpp:288 eqonomize.cpp:332 ledgerdialog.cpp:650 #, kde-format msgid "Expense" msgstr "" #: editscheduledtransactiondialog.cpp:47 editsplitdialog.cpp:120 #: eqonomize.cpp:282 eqonomize.cpp:326 ledgerdialog.cpp:653 #, kde-format msgid "Transfer" msgstr "" #: editscheduledtransactiondialog.cpp:48 editsplitdialog.cpp:114 #: eqonomize.cpp:289 eqonomize.cpp:333 #, kde-format msgid "Security Buy" msgstr "" #: editscheduledtransactiondialog.cpp:49 editsplitdialog.cpp:116 #: eqonomize.cpp:290 eqonomize.cpp:334 #, kde-format msgid "Security Sell" msgstr "" #: editscheduledtransactiondialog.cpp:56 editscheduledtransactiondialog.cpp:57 #, kde-format msgid "Recurrence" msgstr "" #: editscheduledtransactiondialog.cpp:104 #, kde-format msgid "New Expense" msgstr "" #: editscheduledtransactiondialog.cpp:106 #, kde-format msgid "New Dividend" msgstr "" #: editscheduledtransactiondialog.cpp:107 #, kde-format msgid "New Income" msgstr "" #: editscheduledtransactiondialog.cpp:110 #, kde-format msgid "New Transfer" msgstr "" #: editscheduledtransactiondialog.cpp:111 #, kde-format msgid "New Security Buy" msgstr "" #: editscheduledtransactiondialog.cpp:113 #, kde-format msgid "New Security Sell" msgstr "" #: editscheduledtransactiondialog.cpp:128 #: editscheduledtransactiondialog.cpp:149 transactioneditwidget.cpp:1064 #, kde-format msgid "Edit Expense" msgstr "" #: editscheduledtransactiondialog.cpp:130 #: editscheduledtransactiondialog.cpp:151 transactioneditwidget.cpp:1066 #, kde-format msgid "Edit Dividend" msgstr "" #: editscheduledtransactiondialog.cpp:131 #: editscheduledtransactiondialog.cpp:152 transactioneditwidget.cpp:1067 #, kde-format msgid "Edit Income" msgstr "" #: editscheduledtransactiondialog.cpp:134 #: editscheduledtransactiondialog.cpp:155 transactioneditwidget.cpp:1070 #, kde-format msgid "Edit Transfer" msgstr "" #: editscheduledtransactiondialog.cpp:135 #: editscheduledtransactiondialog.cpp:156 transactioneditwidget.cpp:1071 #, kde-format msgid "Edit Securities Bought" msgstr "" #: editscheduledtransactiondialog.cpp:136 #: editscheduledtransactiondialog.cpp:157 transactioneditwidget.cpp:1072 #, kde-format msgid "Edit Securities Sold" msgstr "" #: editsplitdialog.cpp:107 eqonomize.cpp:284 eqonomize.cpp:328 #: eqonomize.cpp:1167 #, kde-format msgid "Dividend" msgstr "" #: editsplitdialog.cpp:109 eqonomize.cpp:403 eqonomize.cpp:445 #: ledgerdialog.cpp:648 #, kde-format msgid "Repayment" msgstr "" #: editsplitdialog.cpp:112 eqonomize.cpp:404 eqonomize.cpp:446 #: ledgerdialog.cpp:651 #, kde-format msgid "Refund" msgstr "" #: editsplitdialog.cpp:126 ledgerdialog.cpp:638 #, kde-format msgid "Split Transaction" msgstr "" #: editsplitdialog.cpp:138 eqonomize.cpp:1279 eqonomize.cpp:1379 #: eqonomize.cpp:1473 eqonomize.cpp:1538 importcsvdialog.cpp:129 #: transactioneditwidget.cpp:175 transactioneditwidget.cpp:1099 #: transactionfilterwidget.cpp:135 #, kde-format msgid "Description:" msgstr "" #: editsplitdialog.cpp:143 eqonomize.cpp:413 eqonomize.cpp:523 #: eqonomize.cpp:639 eqonomize.cpp:1274 eqonomize.cpp:2476 #: importcsvdialog.cpp:187 transactioneditwidget.cpp:149 #: transactioneditwidget.cpp:199 transactioneditwidget.cpp:1119 #, kde-format msgid "Date:" msgstr "" #: editsplitdialog.cpp:148 eqonomize.cpp:424 eqonomize.cpp:1252 #: importcsvdialog.cpp:388 importcsvdialog.cpp:399 ledgerdialog.cpp:107 #: qifimportexport.cpp:503 #, kde-format msgid "Account:" msgstr "" #: editsplitdialog.cpp:163 #, kde-format msgid "Transactions:" msgstr "" #: editsplitdialog.cpp:172 eqonomize.cpp:914 eqonomize.cpp:1061 #: eqonomize.cpp:1941 eqonomize.cpp:2033 eqonomize.cpp:3988 #: ledgerdialog.cpp:135 #, kde-format msgid "Type" msgstr "" #: editsplitdialog.cpp:173 eqonomize.cpp:915 eqonomize.cpp:2034 #: ledgerdialog.cpp:136 qifimportexport.cpp:127 qifimportexport.cpp:139 #: qifimportexport.cpp:149 transactionlistwidget.cpp:111 #, kde-format msgid "Description" msgstr "" #: editsplitdialog.cpp:174 eqonomize.cpp:4142 ledgerdialog.cpp:137 #, kde-format msgid "Account/Category" msgstr "" #: editsplitdialog.cpp:175 #, kde-format msgid "Payment" msgstr "" #: editsplitdialog.cpp:176 ledgerdialog.cpp:138 #, kde-format msgid "Deposit" msgstr "" #: editsplitdialog.cpp:181 ledgerdialog.cpp:151 #, kde-format msgid "New" msgstr "" #: editsplitdialog.cpp:184 eqonomize.cpp:4333 #, kde-format msgid "New Expense..." msgstr "" #: editsplitdialog.cpp:185 eqonomize.cpp:4334 #, kde-format msgid "New Income..." msgstr "" #: editsplitdialog.cpp:186 #, kde-format msgid "New Deposit..." msgstr "" #: editsplitdialog.cpp:187 #, kde-format msgid "New Withdrawal..." msgstr "" #: editsplitdialog.cpp:188 #, kde-format msgid "New Security Shares Bought..." msgstr "" #: editsplitdialog.cpp:189 #, kde-format msgid "Security Shares Sold..." msgstr "" #: editsplitdialog.cpp:190 #, kde-format msgid "New Dividend..." msgstr "" #: editsplitdialog.cpp:191 eqonomize.cpp:924 eqonomize.cpp:1071 #: eqonomize.cpp:4328 ledgerdialog.cpp:158 transactionlistwidget.cpp:1051 #, kde-format msgid "Edit..." msgstr "" #: editsplitdialog.cpp:221 eqonomize.cpp:2325 #, kde-format msgid "Total value:" msgstr "" #: editsplitdialog.cpp:403 transactioneditwidget.cpp:653 #: transactioneditwidget.cpp:657 transactioneditwidget.cpp:668 #: transactioneditwidget.cpp:682 transactioneditwidget.cpp:693 #, kde-format msgid "No suitable account available." msgstr "" #: editsplitdialog.cpp:415 #, kde-format msgid "Future dates is not allowed." msgstr "" #: editsplitdialog.cpp:419 #, kde-format msgid "A split must contain at least two transactions." msgstr "" #: editsplitdialog.cpp:428 transactioneditwidget.cpp:714 #, kde-format msgid "Cannot transfer money to and from the same account." msgstr "" #: eqonomize.cpp:419 eqonomize.cpp:2325 importcsvdialog.cpp:146 #: importcsvdialog.cpp:169 importcsvdialog.cpp:355 #: transactioneditwidget.cpp:117 transactioneditwidget.cpp:186 #: transactioneditwidget.cpp:1111 #, kde-format msgid "Cost:" msgstr "" #: eqonomize.cpp:420 importcsvdialog.cpp:364 importcsvdialog.cpp:397 #: transactioneditwidget.cpp:118 transactioneditwidget.cpp:184 #: transactioneditwidget.cpp:1110 #, kde-format msgid "Income:" msgstr "" #: eqonomize.cpp:439 transactioneditwidget.cpp:193 #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:310 #, kde-format msgid "Quantity:" msgstr "" #: eqonomize.cpp:443 importcsvdialog.cpp:243 transactioneditwidget.cpp:288 #, kde-format msgid "Comments:" msgstr "" #: eqonomize.cpp:491 eqonomize.cpp:1176 #, kde-format msgid "Reinvested Dividend" msgstr "" #: eqonomize.cpp:501 transactioneditwidget.cpp:97 #: transactioneditwidget.cpp:157 #, kde-format msgid "Security:" msgstr "" #: eqonomize.cpp:518 #, kde-format msgid "Shares added:" msgstr "" #: eqonomize.cpp:579 #, kde-format msgid "Security Trade" msgstr "" #: eqonomize.cpp:587 #, kde-format msgid "From security:" msgstr "" #: eqonomize.cpp:603 #, kde-format msgid "Shares moved:" msgstr "" #: eqonomize.cpp:608 transactioneditwidget.cpp:135 #: transactionfilterwidget.cpp:167 transactionfilterwidget.cpp:168 #: transactionfilterwidget.cpp:343 transactionfilterwidget.cpp:380 #, kde-format msgid "All" msgstr "" #: eqonomize.cpp:614 #, kde-format msgid "To security:" msgstr "" #: eqonomize.cpp:631 #, kde-format msgid "Shares received:" msgstr "" #: eqonomize.cpp:635 importcsvdialog.cpp:386 importcsvdialog.cpp:412 #: overtimechart.cpp:193 overtimechart.cpp.bak:186 #, kde-format msgid "Value:" msgstr "" #: eqonomize.cpp:725 #, kde-format msgid "No other security available for trade in the account." msgstr "" #: eqonomize.cpp:737 #, kde-format msgid "Selected to and from securities are the same." msgstr "" #: eqonomize.cpp:745 transactioneditwidget.cpp:735 #, kde-format msgid "Zero shares not allowed." msgstr "" #: eqonomize.cpp:749 transactioneditwidget.cpp:739 #, kde-format msgid "Zero value not allowed." msgstr "" #: eqonomize.cpp:757 eqonomize.cpp:766 #, kde-format msgid "Quotations" msgstr "" #: eqonomize.cpp:777 eqonomize.cpp:913 eqonomize.cpp:962 eqonomize.cpp:1060 #: ledgerdialog.cpp:134 transactionlistwidget.cpp:110 #, kde-format msgid "Date" msgstr "" #: eqonomize.cpp:778 #, kde-format msgid "Price per Share" msgstr "" #: eqonomize.cpp:820 #, kde-format msgid "Quotations for %1" msgstr "" #: eqonomize.cpp:904 #, kde-format msgid "" "The following transactions was scheduled to occur today or before today.\n" "Confirm that they have indeed occurred (or will occur today)." msgstr "" #: eqonomize.cpp:916 eqonomize.cpp:2035 transactionlistwidget.cpp:137 #, kde-format msgid "Amount" msgstr "" #: eqonomize.cpp:926 #, kde-format msgid "Postpone..." msgstr "" #: eqonomize.cpp:973 #, kde-format msgid "Can only postpone to future dates." msgstr "" #: eqonomize.cpp:1052 ledgerdialog.cpp:299 #, kde-format msgid "Transactions for %1" msgstr "" #: eqonomize.cpp:1063 eqonomize.cpp:1936 #, kde-format msgid "Shares" msgstr "" #: eqonomize.cpp:1160 #, kde-format msgid "Shares Bought" msgstr "" #: eqonomize.cpp:1161 #, kde-format msgid "Shares Sold" msgstr "" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Sold (Traded)" msgstr "" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Bought (Traded)" msgstr "" #: eqonomize.cpp:1204 #, kde-format msgid "Shares Bought (Recurring)" msgstr "" #: eqonomize.cpp:1205 #, kde-format msgid "Shares Sold (Recurring)" msgstr "" #: eqonomize.cpp:1207 #, kde-format msgid "Shares Bought (Scheduled)" msgstr "" #: eqonomize.cpp:1208 #, kde-format msgid "Shares Sold (Scheduled)" msgstr "" #: eqonomize.cpp:1220 #, kde-format msgid "Recurring Dividend" msgstr "" #: eqonomize.cpp:1222 #, kde-format msgid "Scheduled Dividend" msgstr "" #: eqonomize.cpp:1240 eqonomize.cpp:1360 #, kde-format msgid "Type:" msgstr "" #: eqonomize.cpp:1243 eqonomize.cpp:2600 eqonomize.cpp:2660 #, kde-format msgid "Mutual Fund" msgstr "" #: eqonomize.cpp:1244 eqonomize.cpp:2598 eqonomize.cpp:2658 #, kde-format msgid "Bond" msgstr "" #: eqonomize.cpp:1245 eqonomize.cpp:2599 eqonomize.cpp:2659 #, kde-format msgid "Stock" msgstr "" #: eqonomize.cpp:1246 eqonomize.cpp:2601 eqonomize.cpp:2661 eqonomize.cpp:3492 #: eqonomize.cpp:3497 importcsvdialog.cpp:117 qifimportexport.cpp:332 #, kde-format msgid "Other" msgstr "" #: eqonomize.cpp:1249 eqonomize.cpp:1370 eqonomize.cpp:1464 eqonomize.cpp:1529 #, kde-format msgid "Name:" msgstr "" #: eqonomize.cpp:1264 #, kde-format msgid "Decimals in Shares:" msgstr "" #: eqonomize.cpp:1267 #, kde-format msgid "Initial Shares:" msgstr "" #: eqonomize.cpp:1270 #, kde-format msgid "Initial quotation:" msgstr "" #: eqonomize.cpp:1289 transactioneditwidget.cpp:675 #, kde-format msgid "No suitable account or income category available." msgstr "" #: eqonomize.cpp:1363 eqonomize.cpp:3488 eqonomize.cpp:4021 #: qifimportexport.cpp:325 #, kde-format msgid "Cash" msgstr "" #: eqonomize.cpp:1364 eqonomize.cpp:4016 #, kde-format msgid "Current Account" msgstr "" #: eqonomize.cpp:1365 eqonomize.cpp:3490 eqonomize.cpp:4017 #, kde-format msgid "Savings Account" msgstr "" #: eqonomize.cpp:1366 eqonomize.cpp:4018 #, kde-format msgid "Credit Card" msgstr "" #: eqonomize.cpp:1367 eqonomize.cpp:4019 #, kde-format msgid "Liabilities" msgstr "" #: eqonomize.cpp:1368 eqonomize.cpp:1731 eqonomize.cpp:1732 eqonomize.cpp:3891 #: eqonomize.cpp:3897 eqonomize.cpp:4020 #, kde-format msgid "Securities" msgstr "" #: eqonomize.cpp:1373 #, kde-format msgid "Initial balance:" msgstr "" #: eqonomize.cpp:1376 #, kde-format msgid "Default account for budgeted transactions" msgstr "" #: eqonomize.cpp:1441 eqonomize.cpp:1507 eqonomize.cpp:1572 #, kde-format msgid "Empty name." msgstr "" #: eqonomize.cpp:1447 #, kde-format msgid "The entered name is used by another account." msgstr "" #: eqonomize.cpp:1467 eqonomize.cpp:1532 #, kde-format msgid "Monthly budget:" msgstr "" #: eqonomize.cpp:1513 #, kde-format msgid "The entered name is used by another income category." msgstr "" #: eqonomize.cpp:1578 #, kde-format msgid "The entered name is used by another expense category." msgstr "" #: eqonomize.cpp:1711 eqonomize.cpp:1778 eqonomize.cpp:3984 eqonomize.cpp:5970 #: eqonomize.cpp:5976 #, kde-format msgid "Accounts" msgstr "" #: eqonomize.cpp:1712 #, kde-format msgid "Accounts & Categories" msgstr "" #: eqonomize.cpp:1716 eqonomize.cpp:1717 eqonomize.cpp:1780 #: importcsvdialog.cpp:70 overtimechart.cpp:126 overtimechart.cpp:1727 #: overtimechart.cpp:1731 overtimechart.cpp.bak:119 overtimechart.cpp.bak:1708 #: overtimechart.cpp.bak:1712 overtimereport.cpp:103 overtimereport.cpp:357 #: overtimereport.cpp:377 overtimereport.cpp:395 transactionlistwidget.cpp:251 #: transactionlistwidget.cpp:263 #, kde-format msgid "Expenses" msgstr "" #: eqonomize.cpp:1721 eqonomize.cpp:1722 eqonomize.cpp:1779 eqonomize.cpp:4043 #: importcsvdialog.cpp:75 overtimechart.cpp:127 overtimechart.cpp:1726 #: overtimechart.cpp:1730 overtimechart.cpp.bak:120 overtimechart.cpp.bak:1707 #: overtimechart.cpp.bak:1711 overtimereport.cpp:104 overtimereport.cpp:349 #: overtimereport.cpp:368 overtimereport.cpp:386 transactionlistwidget.cpp:252 #: transactionlistwidget.cpp:264 #, kde-format msgid "Incomes" msgstr "" #: eqonomize.cpp:1726 eqonomize.cpp:1727 importcsvdialog.cpp:78 #: transactionlistwidget.cpp:253 transactionlistwidget.cpp:265 #, kde-format msgid "Transfers" msgstr "" #: eqonomize.cpp:1736 #, kde-format msgid "Schedule" msgstr "" #: eqonomize.cpp:1737 #, kde-format msgid "Scheduled Transactions" msgstr "" #: eqonomize.cpp:1753 eqonomize.cpp:1775 #, kde-format msgid "Account / Category" msgstr "" #: eqonomize.cpp:1754 #, kde-format msgid "Remaining Budget (%1)" msgstr "" #: eqonomize.cpp:1755 #, kde-format msgid "Change (%1)" msgstr "" #: eqonomize.cpp:1756 #, kde-format msgid "Total (%1)" msgstr "" #: eqonomize.cpp:1769 #, kde-format msgctxt "%2 remains of %1 budget" msgid "%2 of %1" msgstr "" #: eqonomize.cpp:1785 eqonomize.cpp:4002 #, kde-format msgid "Includes budgeted transactions" msgstr "" #: eqonomize.cpp:1793 #, kde-format msgid "Period" msgstr "" #: eqonomize.cpp:1825 #, kde-format msgid "Select Period" msgstr "" #: eqonomize.cpp:1827 eqonomize.cpp:4312 #, kde-format msgid "Current Month" msgstr "" #: eqonomize.cpp:1828 eqonomize.cpp:4313 #, kde-format msgid "Current Year" msgstr "" #: eqonomize.cpp:1829 eqonomize.cpp:4314 #, kde-format msgid "Current Whole Month" msgstr "" #: eqonomize.cpp:1830 eqonomize.cpp:4315 #, kde-format msgid "Current Whole Year" msgstr "" #: eqonomize.cpp:1831 #, kde-format msgid "Whole Past Month" msgstr "" #: eqonomize.cpp:1832 #, kde-format msgid "Whole Past Year" msgstr "" #: eqonomize.cpp:1833 #, kde-format msgid "Previous Month" msgstr "" #: eqonomize.cpp:1834 #, kde-format msgid "Previous Year" msgstr "" #: eqonomize.cpp:1837 #, kde-format msgid "Show partial budget" msgstr "" #: eqonomize.cpp:1842 #, kde-format msgid "Edit Budget" msgstr "" #: eqonomize.cpp:1846 #, kde-format msgid "Budget:" msgstr "" #: eqonomize.cpp:1856 #, kde-format msgid "Month:" msgstr "" #: eqonomize.cpp:1864 #, kde-format msgid "Result previous month:" msgstr "" #: eqonomize.cpp:1917 eqonomize.cpp:4354 #, kde-format msgid "New Security..." msgstr "" #: eqonomize.cpp:1919 #, kde-format msgid "New Transaction" msgstr "" #: eqonomize.cpp:1922 eqonomize.cpp:4362 #, kde-format msgid "Set Quotation..." msgstr "" #: eqonomize.cpp:1934 eqonomize.cpp:3987 #, kde-format msgid "Name" msgstr "" #: eqonomize.cpp:1937 #, kde-format msgid "Quotation" msgstr "" #: eqonomize.cpp:1939 #, kde-format msgid "Profit" msgstr "" #: eqonomize.cpp:1940 #, kde-format msgid "Yearly Rate" msgstr "" #: eqonomize.cpp:1942 qifimportexport.cpp:323 #, kde-format msgid "Account" msgstr "" #: eqonomize.cpp:1953 #, kde-format msgid "Statistics Period" msgstr "" #: eqonomize.cpp:2015 #, kde-format msgid "New Schedule" msgstr "" #: eqonomize.cpp:2018 #, kde-format msgid "Edit" msgstr "" #: eqonomize.cpp:2032 #, kde-format msgid "Next Occurrence" msgstr "" #: eqonomize.cpp:2038 qifimportexport.cpp:152 transactionlistwidget.cpp:144 #, kde-format msgid "Comments" msgstr "" #: eqonomize.cpp:2291 #, kde-format msgid "New Security" msgstr "" #: eqonomize.cpp:2306 #, kde-format msgid "Edit Security" msgstr "" #: eqonomize.cpp:2325 #, kde-format msgid "Profit:" msgstr "" #: eqonomize.cpp:2325 #, kde-format msgid "Rate:" msgstr "" #: eqonomize.cpp:2332 #, kde-format msgid "" "Are you sure you want to delete the security \"%1\" and all associated " "transactions?" msgstr "" #: eqonomize.cpp:2394 transactioneditwidget.cpp:700 #, kde-format msgid "No security available." msgstr "" #: eqonomize.cpp:2466 #, kde-format msgid "Set Quotation (%1)" msgstr "" #: eqonomize.cpp:2472 transactioneditwidget.cpp:143 #, kde-format msgid "Price per share:" msgstr "" #: eqonomize.cpp:2485 #, kde-format msgid "Future dates are not allowed." msgstr "" #: eqonomize.cpp:2513 #, kde-format msgid "Security Transactions" msgstr "" #: eqonomize.cpp:3166 ledgerdialog.cpp:293 #, kde-format msgid "Ledger" msgstr "" #: eqonomize.cpp:3475 #, kde-format msgid "Untitled" msgstr "" #: eqonomize.cpp:3489 #, kde-format msgid "Check Account" msgstr "" #: eqonomize.cpp:3491 #, kde-format msgid "Salary" msgstr "" #: eqonomize.cpp:3493 #, kde-format msgid "Bills" msgstr "" #: eqonomize.cpp:3494 #, kde-format msgid "Clothing" msgstr "" #: eqonomize.cpp:3495 #, kde-format msgid "Groceries" msgstr "" #: eqonomize.cpp:3496 #, kde-format msgid "Leisure" msgstr "" #: eqonomize.cpp:3561 importcsvdialog.cpp:795 qifimportexport.cpp:280 #: qifimportexport.cpp:444 #, kde-format msgid "Couldn't fetch %1." msgstr "" #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Error loading %1: %2." msgstr "" #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Couldn't open file" msgstr "" #: eqonomize.cpp:3627 eqonomize.cpp:3653 #, kde-format msgid "Error saving %1: %2." msgstr "" #: eqonomize.cpp:3627 eqonomize.cpp:3653 eqonomize.cpp:3673 #, kde-format msgid "Couldn't save file" msgstr "" #: eqonomize.cpp:3673 eqonomize.cpp:4282 ledgerdialog.cpp:281 #: qifimportexport.cpp:634 #, kde-format msgid "Failed to upload file to %1." msgstr "" #: eqonomize.cpp:3703 eqonomize.cpp:3728 #, kde-format msgid "Report" msgstr "" #: eqonomize.cpp:3758 eqonomize.cpp:3783 #, kde-format msgid "Chart" msgstr "" #: eqonomize.cpp:3823 eqonomize.cpp:3829 #, kde-format msgid "Transaction Schedule" msgstr "" #: eqonomize.cpp:3976 #, kde-format msgctxt "html format" msgid "Accounts & Categories" msgstr "" #: eqonomize.cpp:3981 #, kde-format msgctxt "html format" msgid "Accounts & Categories (%1–%2)" msgstr "" #: eqonomize.cpp:3982 #, kde-format msgctxt "html format" msgid "Accounts & Categories (to %1)" msgstr "" #: eqonomize.cpp:3989 eqonomize.cpp:4049 eqonomize.cpp:4097 eqonomize.cpp:4142 #, kde-format msgid "Change" msgstr "" #: eqonomize.cpp:3993 ledgerdialog.cpp:140 #, kde-format msgid "Balance" msgstr "" #: eqonomize.cpp:4047 eqonomize.cpp:4095 #, kde-format msgid "Budget" msgstr "" #: eqonomize.cpp:4048 eqonomize.cpp:4096 #, kde-format msgid "Remaining Budget" msgstr "" #: eqonomize.cpp:4050 #, kde-format msgid "Total Incomes" msgstr "" #: eqonomize.cpp:4091 #, kde-format msgid "Costs" msgstr "" #: eqonomize.cpp:4098 #, kde-format msgid "Total Expenses" msgstr "" #: eqonomize.cpp:4167 eqonomize.cpp:4214 #, kde-format msgid "Empty expenses list." msgstr "" #: eqonomize.cpp:4172 eqonomize.cpp:4219 #, kde-format msgid "Empty incomes list." msgstr "" #: eqonomize.cpp:4177 eqonomize.cpp:4224 #, kde-format msgid "Empty transfers list." msgstr "" #: eqonomize.cpp:4182 eqonomize.cpp:4229 #, kde-format msgid "Empty securities list." msgstr "" #: eqonomize.cpp:4187 eqonomize.cpp:4234 #, kde-format msgid "Empty schedule list." msgstr "" #: eqonomize.cpp:4305 #, kde-format msgid "Export View..." msgstr "" #: eqonomize.cpp:4307 #, kde-format msgid "Print View..." msgstr "" #: eqonomize.cpp:4309 #, kde-format msgid "Initial Period" msgstr "" #: eqonomize.cpp:4316 #, kde-format msgid "Remember Last Dates" msgstr "" #: eqonomize.cpp:4319 #, kde-format msgid "Import CSV File..." msgstr "" #: eqonomize.cpp:4320 #, kde-format msgid "Import QIF File..." msgstr "" #: eqonomize.cpp:4321 #, kde-format msgid "Export As QIF File..." msgstr "" #: eqonomize.cpp:4323 #, kde-format msgid "Add Account..." msgstr "" #: eqonomize.cpp:4324 #, kde-format msgid "New Account..." msgstr "" #: eqonomize.cpp:4325 #, kde-format msgid "New Income Category..." msgstr "" #: eqonomize.cpp:4326 #, kde-format msgid "New Expense Category..." msgstr "" #: eqonomize.cpp:4327 #, kde-format msgid "Balance..." msgstr "" #: eqonomize.cpp:4331 #, kde-format msgid "Show Transactions" msgstr "" #: eqonomize.cpp:4335 #, kde-format msgid "New Transfer..." msgstr "" #: eqonomize.cpp:4336 #, kde-format msgid "New Split Transaction..." msgstr "" #: eqonomize.cpp:4337 #, kde-format msgid "Edit Transaction(s) (Occurrence)..." msgstr "" #: eqonomize.cpp:4338 #, kde-format msgid "Edit Occurrence..." msgstr "" #: eqonomize.cpp:4339 #, kde-format msgid "Edit Schedule (Recurrence)..." msgstr "" #: eqonomize.cpp:4340 #, kde-format msgid "Edit Schedule..." msgstr "" #: eqonomize.cpp:4341 #, kde-format msgid "Remove Transaction(s) (Occurrence)" msgstr "" #: eqonomize.cpp:4342 #, kde-format msgid "Remove Occurrence" msgstr "" #: eqonomize.cpp:4343 #, kde-format msgid "Delete Schedule (Recurrence)" msgstr "" #: eqonomize.cpp:4344 #, kde-format msgid "Delete Schedule" msgstr "" #: eqonomize.cpp:4345 #, kde-format msgid "Edit Split Transaction..." msgstr "" #: eqonomize.cpp:4346 #, kde-format msgid "Remove Split Transaction" msgstr "" #: eqonomize.cpp:4347 #, kde-format msgid "Join Transactions..." msgstr "" #: eqonomize.cpp:4348 #, kde-format msgid "Split Up Transaction" msgstr "" #: eqonomize.cpp:4350 #, kde-format msgid "Refund..." msgstr "" #: eqonomize.cpp:4351 #, kde-format msgid "Repayment..." msgstr "" #: eqonomize.cpp:4352 #, kde-format msgid "New Refund/Repayment..." msgstr "" #: eqonomize.cpp:4355 #, kde-format msgid "Edit Security..." msgstr "" #: eqonomize.cpp:4356 #, kde-format msgid "Remove Security" msgstr "" #: eqonomize.cpp:4357 #, kde-format msgid "Shares Sold..." msgstr "" #: eqonomize.cpp:4358 #, kde-format msgid "Shares Bought..." msgstr "" #: eqonomize.cpp:4359 #, kde-format msgid "Dividend..." msgstr "" #: eqonomize.cpp:4360 #, kde-format msgid "Reinvested Dividend..." msgstr "" #: eqonomize.cpp:4361 #, kde-format msgid "Shares Moved..." msgstr "" #: eqonomize.cpp:4363 #, kde-format msgid "Edit Quotations..." msgstr "" #: eqonomize.cpp:4364 #, kde-format msgid "Transactions..." msgstr "" #: eqonomize.cpp:4366 #, kde-format msgid "Development Over Time Report..." msgstr "" #: eqonomize.cpp:4367 #, kde-format msgid "Categories Comparison Report..." msgstr "" #: eqonomize.cpp:4368 #, kde-format msgid "Categories Comparison Chart..." msgstr "" #: eqonomize.cpp:4369 #, kde-format msgid "Development Over Time Chart..." msgstr "" #: eqonomize.cpp:4371 #, kde-format msgid "Use Additional Transaction Properties" msgstr "" #: eqonomize.cpp:4413 #, kde-format msgid "" "Eqonomize! exited unexpectedly before the file was saved and data was lost.\n" "Do you want to load the last auto-saved version of the file?" msgstr "" #: eqonomize.cpp:4413 #, kde-format msgid "Crash Recovery" msgstr "" #: eqonomize.cpp:4605 eqonomize.cpp:4606 #, kde-format msgid "The current file has been modified. Do you want to save it?" msgstr "" #: eqonomize.cpp:4643 #, kde-format msgid "Confirm Schedule" msgstr "" #: eqonomize.cpp:4697 #, kde-format msgid "New Account" msgstr "" #: eqonomize.cpp:4712 #, kde-format msgid "New Income Category" msgstr "" #: eqonomize.cpp:4725 #, kde-format msgid "New Expense Category" msgstr "" #: eqonomize.cpp:4800 #, kde-format msgid "Balance Account" msgstr "" #: eqonomize.cpp:4806 #, kde-format msgid "Book value:" msgstr "" #: eqonomize.cpp:4813 #, kde-format msgid "Real value:" msgstr "" #: eqonomize.cpp:4836 #, kde-format msgid "Edit Account" msgstr "" #: eqonomize.cpp:4869 #, kde-format msgid "Edit Income Category" msgstr "" #: eqonomize.cpp:4887 #, kde-format msgid "Edit Expense Category" msgstr "" #: eqonomize.cpp:4948 #, kde-format msgid "Move transactions?" msgstr "" #: eqonomize.cpp:4958 #, kde-format msgid "Move to:" msgstr "" #: eqonomize.cpp:4965 #, kde-format msgid "" "The category contains some expenses.\n" "What do you want to do with them?" msgstr "" #: eqonomize.cpp:4977 #, kde-format msgid "" "The category contains some incomes.\n" "What do you want to do with them?" msgstr "" #: eqonomize.cpp:4989 #, kde-format msgid "" "The account contains some transactions.\n" "What do you want to do with them?" msgstr "" #: eqonomize.cpp:5011 #, kde-format msgid "" "The category contains some expenses that will be removed. Do you still want " "to remove the category?" msgstr "" #: eqonomize.cpp:5011 eqonomize.cpp:5012 #, kde-format msgid "Remove Category?" msgstr "" #: eqonomize.cpp:5012 #, kde-format msgid "" "The category contains some incomes that will be removed. Do you still want " "to remove the category?" msgstr "" #: eqonomize.cpp:5013 #, kde-format msgid "" "The account contains some transactions that will be removed. Do you still " "want to remove the account?" msgstr "" #: eqonomize.cpp:5013 #, kde-format msgid "Remove Account?" msgstr "" #: eqonomize.cpp:5531 eqonomize.cpp:5555 eqonomize.cpp:5730 #, kde-format msgctxt "%1: budget; %2: remaining budget" msgid "%2 of %1" msgstr "" #: eqonomize.cpp:5810 eqonomize.cpp:5835 #, kde-format msgid "%1 (with no budget)" msgstr "" #: eqonomize.cpp:5811 eqonomize.cpp:5836 #, kde-format msgid "%1 (with budget %2)" msgstr "" #: importcsvdialog.cpp:60 #, kde-format msgid "Import CSV file" msgstr "" #: importcsvdialog.cpp:64 #, kde-format msgid "Transaction Type Selection" msgstr "" #: importcsvdialog.cpp:81 #, kde-format msgid "Expenses and incomes (negative cost)" msgstr "" #: importcsvdialog.cpp:84 #, kde-format msgid "Expenses and incomes (separate columns)" msgstr "" #: importcsvdialog.cpp:87 #, kde-format msgid "All types" msgstr "" #: importcsvdialog.cpp:95 qifimportexport.cpp:62 #, kde-format msgid "File Selection" msgstr "" #: importcsvdialog.cpp:99 qifimportexport.cpp:66 qifimportexport.cpp:548 #, kde-format msgid "File:" msgstr "" #: importcsvdialog.cpp:104 #, kde-format msgid "First data row:" msgstr "" #: importcsvdialog.cpp:107 #, kde-format msgid "Auto" msgstr "" #: importcsvdialog.cpp:110 #, kde-format msgid "Column delimiter:" msgstr "" #: importcsvdialog.cpp:113 #, kde-format msgid "Comma" msgstr "" #: importcsvdialog.cpp:114 #, kde-format msgid "Tabulator" msgstr "" #: importcsvdialog.cpp:115 #, kde-format msgid "Semicolon" msgstr "" #: importcsvdialog.cpp:116 #, kde-format msgid "Space" msgstr "" #: importcsvdialog.cpp:125 #, kde-format msgid "Columns Specification" msgstr "" #: importcsvdialog.cpp:131 importcsvdialog.cpp:149 importcsvdialog.cpp:172 #: importcsvdialog.cpp:189 importcsvdialog.cpp:208 importcsvdialog.cpp:227 #: importcsvdialog.cpp:245 #, kde-format msgid "Column" msgstr "" #: importcsvdialog.cpp:205 importcsvdialog.cpp:356 importcsvdialog.cpp:365 #: importcsvdialog.cpp:387 importcsvdialog.cpp:398 #: transactioneditwidget.cpp:225 transactioneditwidget.cpp:267 #: transactioneditwidget.cpp:1130 transactionfilterwidget.cpp:102 #: transactionfilterwidget.cpp:113 #, kde-format msgid "Category:" msgstr "" #: importcsvdialog.cpp:224 importcsvdialog.cpp:357 importcsvdialog.cpp:374 #: transactioneditwidget.cpp:248 transactioneditwidget.cpp:273 #: transactionfilterwidget.cpp:117 #, kde-format msgid "From account:" msgstr "" #: importcsvdialog.cpp:262 #, kde-format msgid "Create missing categories and accounts" msgstr "" #: importcsvdialog.cpp:354 #, kde-format msgid "" "Imports data as expenses. Costs have positive value. Value is the only " "required column." msgstr "" #: importcsvdialog.cpp:363 #, kde-format msgid "Imports data as incomes. Value is the only required column." msgstr "" #: importcsvdialog.cpp:366 importcsvdialog.cpp:375 #: transactioneditwidget.cpp:231 transactioneditwidget.cpp:258 #: transactionfilterwidget.cpp:106 #, kde-format msgid "To account:" msgstr "" #: importcsvdialog.cpp:372 #, kde-format msgid "Imports data as transfers. Value is the only required column." msgstr "" #: importcsvdialog.cpp:373 transactioneditwidget.cpp:182 #: transactioneditwidget.cpp:1109 #, kde-format msgid "Amount:" msgstr "" #: importcsvdialog.cpp:381 #, kde-format msgid "" "Imports data as expenses and incomes. Costs have negative value. Value and " "category are both required columns." msgstr "" #: importcsvdialog.cpp:392 #, kde-format msgid "" "Imports data as expenses and incomes. Costs and incomes have separate " "columns. Income, cost, and category are all required columns." msgstr "" #: importcsvdialog.cpp:403 #, kde-format msgid "" "Imports data as expenses, incomes, and transfers. Costs have negative or " "positive value. Value, to, and from are all required columns. Accounts and " "categories must be existing." msgstr "" #: importcsvdialog.cpp:413 transactioneditwidget.cpp:209 #: transactionfilterwidget.cpp:74 transactionfilterwidget.cpp:91 #, kde-format msgid "From:" msgstr "" #: importcsvdialog.cpp:414 transactioneditwidget.cpp:216 #: transactionfilterwidget.cpp:81 transactionfilterwidget.cpp:95 #, kde-format msgid "To:" msgstr "" #: importcsvdialog.cpp:440 qifimportexport.cpp:258 #, kde-format msgid "A file must be selected." msgstr "" #: importcsvdialog.cpp:446 importcsvdialog.cpp:458 qifimportexport.cpp:265 #: qifimportexport.cpp:595 #, kde-format msgid "Selected file is a directory." msgstr "" #: importcsvdialog.cpp:450 importcsvdialog.cpp:462 qifimportexport.cpp:269 #, kde-format msgid "Selected file does not exist." msgstr "" #: importcsvdialog.cpp:468 #, kde-format msgid "Empty delimiter." msgstr "" #: importcsvdialog.cpp:712 #, kde-format msgid "The same column number is selected multiple times." msgstr "" #: importcsvdialog.cpp:772 #, kde-format msgid "Selected from account is the same as the to account." msgstr "" #: importcsvdialog.cpp:803 qifimportexport.cpp:288 qifimportexport.cpp:452 #, kde-format msgid "Couldn't open %1 for reading." msgstr "" #: importcsvdialog.cpp:806 qifimportexport.cpp:291 qifimportexport.cpp:455 #, kde-format msgid "Error reading %1." msgstr "" #: importcsvdialog.cpp:1187 qifimportexport.cpp:462 #, kde-format msgid "Successfully imported 1 transaction." msgid_plural "Successfully imported %n transactions." msgstr[0] "" msgstr[1] "" #: importcsvdialog.cpp:1189 #, kde-format msgid "Unable to import any transactions imported." msgstr "" #: importcsvdialog.cpp:1193 #, kde-format msgid "Failed to import 1 data row." msgid_plural "Failed to import %n data rows." msgstr[0] "" msgstr[1] "" #: importcsvdialog.cpp:1194 #, kde-format msgid "Required columns missing." msgstr "" #: importcsvdialog.cpp:1195 #, kde-format msgid "Invalid value." msgstr "" #: importcsvdialog.cpp:1197 #, kde-format msgid "Empty category name." msgstr "" #: importcsvdialog.cpp:1197 importcsvdialog.cpp:1198 #, kde-format msgid "Empty account name." msgstr "" #: importcsvdialog.cpp:1199 #, kde-format msgid "Unknown category found." msgstr "" #: importcsvdialog.cpp:1199 importcsvdialog.cpp:1200 #, kde-format msgid "Unknown account found." msgstr "" #: importcsvdialog.cpp:1201 #, kde-format msgid "Cannot import security transactions (to/from security accounts)." msgstr "" #: importcsvdialog.cpp:1202 #, kde-format msgid "Balancing account wrongly used." msgstr "" #: importcsvdialog.cpp:1203 #, kde-format msgid "Same to and from account/category." msgstr "" #: importcsvdialog.cpp:1205 #, kde-format msgid "No data found." msgstr "" #: importcsvdialog.cpp:1219 qifimportexport.cpp:345 #, kde-format msgid "Unrecognized date format." msgstr "" #: importcsvdialog.cpp:1224 #, kde-format msgid "Specify Format" msgstr "" #: importcsvdialog.cpp:1230 #, kde-format msgid "" "The format of dates and/or numbers in the CSV file is ambiguous. Please " "select the correct format." msgstr "" #: importcsvdialog.cpp:1235 qifimportexport.cpp:94 qifimportexport.cpp:533 #, kde-format msgid "Date format:" msgstr "" #: importcsvdialog.cpp:1278 qifimportexport.cpp:541 #, kde-format msgid "Value format:" msgstr "" #: kdateedit.cpp:366 #, kde-format msgctxt "the day after today" msgid "tomorrow" msgstr "" #: kdateedit.cpp:367 #, kde-format msgctxt "this day" msgid "today" msgstr "" #: kdateedit.cpp:368 #, kde-format msgctxt "the day before today" msgid "yesterday" msgstr "" #: kdatepickerpopup.cpp:94 #, kde-format msgctxt "@option today" msgid "&Today" msgstr "" #: kdatepickerpopup.cpp:95 #, kde-format msgctxt "@option tomorrow" msgid "To&morrow" msgstr "" #: kdatepickerpopup.cpp:96 #, kde-format msgctxt "@option next week" msgid "Next &Week" msgstr "" #: kdatepickerpopup.cpp:97 #, kde-format msgctxt "@option next month" msgid "Next M&onth" msgstr "" #: kdatepickerpopup.cpp:105 #, kde-format msgctxt "@option do not specify a date" msgid "No Date" msgstr "" #: ledgerdialog.cpp:122 #, kde-format msgid "Export..." msgstr "" #: ledgerdialog.cpp:123 #, kde-format msgid "Print..." msgstr "" #: ledgerdialog.cpp:139 #, kde-format msgid "Withdrawal" msgstr "" #: ledgerdialog.cpp:162 #, kde-format msgid "Join..." msgstr "" #: ledgerdialog.cpp:164 #, kde-format msgid "Split Up" msgstr "" #: ledgerdialog.cpp:234 ledgerdialog.cpp:354 #, kde-format msgid "Empty transaction list." msgstr "" #: ledgerdialog.cpp:443 transactionlistwidget.cpp:717 #, kde-format msgid "Are you sure you want to delete all (%1) selected transactions?" msgstr "" #: ledgerdialog.cpp:547 transactionlistwidget.cpp:489 #, kde-format msgid "" "Cannot set the value of security transactions using the dialog for modifying " "multiple transactions." msgstr "" #: ledgerdialog.cpp:553 transactionlistwidget.cpp:495 #, kde-format msgid "Cannot change description of dividends and security transactions." msgstr "" #: ledgerdialog.cpp:559 transactionlistwidget.cpp:501 #, kde-format msgid "Cannot change payer of dividends and security transactions." msgstr "" #: ledgerdialog.cpp:565 transactionlistwidget.cpp:507 #, kde-format msgid "" "Cannot change date of transactions that are part of a split transaction." msgstr "" #: main.cpp:39 msgid "Eqonomize!" msgstr "" #: main.cpp:39 msgid "A personal accounting program" msgstr "" #: main.cpp:39 msgid "(C) 2008 Hanna K." msgstr "" #: main.cpp:40 msgid "Hanna K." msgstr "" #: main.cpp:44 msgid "Start with expenses list displayed" msgstr "" #: main.cpp:46 msgid "Start with incomes list displayed" msgstr "" #: main.cpp:48 msgid "Start with transfers list displayed" msgstr "" #: main.cpp:49 msgid "Document to open" msgstr "" #: overtimechart.cpp:124 overtimechart.cpp.bak:117 #, kde-format msgid "Incomes and Expenses" msgstr "" #: overtimechart.cpp:125 overtimechart.cpp:1722 overtimechart.cpp.bak:118 #: overtimechart.cpp.bak:1703 overtimereport.cpp:102 overtimereport.cpp:343 #, kde-format msgid "Profits" msgstr "" #: overtimechart.cpp:132 overtimechart.cpp:411 overtimechart.cpp:1949 #: overtimechart.cpp.bak:125 overtimechart.cpp.bak:404 #: overtimechart.cpp.bak:1950 overtimereport.cpp:108 overtimereport.cpp:228 #: overtimereport.cpp:753 #, kde-format msgid "All Categories Combined" msgstr "" #: overtimechart.cpp:138 overtimechart.cpp:296 overtimechart.cpp:400 #: overtimechart.cpp:1852 overtimechart.cpp:1973 overtimechart.cpp.bak:131 #: overtimechart.cpp.bak:289 overtimechart.cpp.bak:393 #: overtimechart.cpp.bak:1853 overtimechart.cpp.bak:1974 #: overtimereport.cpp:113 overtimereport.cpp:176 overtimereport.cpp:225 #: overtimereport.cpp:710 overtimereport.cpp:776 #, kde-format msgid "All Descriptions Combined" msgstr "" #: overtimechart.cpp:146 overtimechart.cpp:406 overtimechart.cpp.bak:139 #: overtimechart.cpp.bak:399 #, kde-format msgid "All Payees/Payers Combined" msgstr "" #: overtimechart.cpp:155 overtimechart.cpp.bak:148 #, kde-format msgid "Start date:" msgstr "" #: overtimechart.cpp:178 overtimechart.cpp.bak:171 #, kde-format msgid "End date:" msgstr "" #: overtimechart.cpp:197 overtimechart.cpp.bak:190 #, kde-format msgid "Monthly total" msgstr "" #: overtimechart.cpp:201 overtimechart.cpp.bak:194 #, kde-format msgid "Daily average" msgstr "" #: overtimechart.cpp:304 overtimechart.cpp:404 overtimechart.cpp:1855 #: overtimechart.cpp:1978 overtimechart.cpp.bak:297 overtimechart.cpp.bak:397 #: overtimechart.cpp.bak:1856 overtimechart.cpp.bak:1979 #, kde-format msgid "All Payers Combined" msgstr "" #: overtimechart.cpp:305 overtimechart.cpp:405 overtimechart.cpp:1856 #: overtimechart.cpp:1977 overtimechart.cpp.bak:298 overtimechart.cpp.bak:398 #: overtimechart.cpp.bak:1857 overtimechart.cpp.bak:1978 #, kde-format msgid "All Payees Combined" msgstr "" #: overtimechart.cpp:325 overtimechart.cpp:1853 overtimechart.cpp.bak:318 #: overtimechart.cpp.bak:1854 #, kde-format msgid "All Descriptions Split" msgstr "" #: overtimechart.cpp:328 overtimechart.cpp:1857 overtimechart.cpp.bak:321 #: overtimechart.cpp.bak:1858 #, kde-format msgid "All Payers Split" msgstr "" #: overtimechart.cpp:329 overtimechart.cpp:1858 overtimechart.cpp.bak:322 #: overtimechart.cpp.bak:1859 #, kde-format msgid "All Payees Split" msgstr "" #: overtimechart.cpp:413 overtimechart.cpp:423 overtimechart.cpp:1950 #: overtimechart.cpp.bak:406 overtimechart.cpp.bak:416 #: overtimechart.cpp.bak:1951 #, kde-format msgid "All Categories Split" msgstr "" #: overtimechart.cpp:1535 overtimechart.cpp.bak:1516 #, kde-format msgid "Value (%1)" msgstr "" #: overtimechart.cpp:1536 overtimechart.cpp.bak:1517 #, kde-format msgid "Profit (%1)" msgstr "" #: overtimechart.cpp:1537 overtimechart.cpp.bak:1518 #, kde-format msgid "Income (%1)" msgstr "" #: overtimechart.cpp:1538 overtimechart.cpp.bak:1519 #, kde-format msgid "Cost (%1)" msgstr "" #: overtimechart.cpp:1579 overtimechart.cpp.bak:1560 #, kde-format msgid "Time" msgstr "" #: overtimechart.cpp:1774 overtimechart.cpp:1775 overtimechart.cpp.bak:1755 #: overtimechart.cpp.bak:1756 #, kde-format msgid "no payer" msgstr "" #: overtimechart.cpp:1778 overtimechart.cpp.bak:1759 #, kde-format msgctxt "%1: Description; %2: Payer" msgid "%1/%2" msgstr "" #: overtimechart.cpp:1783 overtimechart.cpp:1784 overtimechart.cpp.bak:1764 #: overtimechart.cpp.bak:1765 #, kde-format msgid "no payee" msgstr "" #: overtimechart.cpp:1787 overtimechart.cpp.bak:1768 #, kde-format msgctxt "%1: Description; %2: Payee" msgid "%1/%2" msgstr "" #: overtimechart.cpp.bak:649 #, kde-format msgid "Error after saving file; data may not have been saved." msgstr "" #: overtimereport.cpp:344 #, kde-format msgid "Average Profit" msgstr "" #: overtimereport.cpp:537 #, kde-format msgid "Year" msgstr "" #: overtimereport.cpp:538 #, kde-format msgid "Month" msgstr "" #: overtimereport.cpp:566 #, kde-format msgid "Includes scheduled transactions" msgstr "" #: overtimereport.cpp:570 #, kde-format msgid "Adjusted for the average month / year (%1 / %2 days)" msgstr "" #: overtimereport.cpp:603 overtimereport.cpp:671 #, kde-format msgid "Subtotal" msgstr "" #: qifimport.cpp:307 qifimport.cpp:367 qifimportexport.cpp:1259 #: qifimportexport.cpp:1350 qifimportexport.cpp:1470 #, kde-format msgid "Unnamed" msgstr "" #: qifimport.cpp:337 qifimportexport.cpp:1299 qifimportexport.cpp:1413 #, kde-format msgid "Uncategorized" msgstr "" #: qifimportexport.cpp:56 #, kde-format msgid "Import QIF file" msgstr "" #: qifimportexport.cpp:63 #, kde-format msgid "" "Select a QIF file to import. When you click next, the file be analysed and " "you might need to answer some questions about the format of the file." msgstr "" #: qifimportexport.cpp:73 #, kde-format msgid "Local Definitions" msgstr "" #: qifimportexport.cpp:74 #, kde-format msgid "" "Unknown elements where found in the QIF file. It is possible that this is " "because of localized type names. Please map them to the correct standard " "names." msgstr "" #: qifimportexport.cpp:80 #, kde-format msgid "Local Text" msgstr "" #: qifimportexport.cpp:81 #, kde-format msgid "Standard Text" msgstr "" #: qifimportexport.cpp:84 #, kde-format msgid "Select standard text:" msgstr "" #: qifimportexport.cpp:90 #, kde-format msgid "Date Format" msgstr "" #: qifimportexport.cpp:91 #, kde-format msgid "" "The date format in the QIF file is ambiguous. Please select the correct " "format." msgstr "" #: qifimportexport.cpp:100 #, kde-format msgid "Default Account" msgstr "" #: qifimportexport.cpp:101 #, kde-format msgid "" "Could not find any account definitions in the QIF file. Please select a " "default account. It is also possible that this is caused by a localized " "opening balance text." msgstr "" #: qifimportexport.cpp:104 #, kde-format msgid "Default account:" msgstr "" #: qifimportexport.cpp:115 #, kde-format msgid "Opening balance text:" msgstr "" #: qifimportexport.cpp:121 #, kde-format msgid "Descriptions" msgstr "" #: qifimportexport.cpp:122 #, kde-format msgid "" "Transactions in QIF files does not have any specific description property. " "You are therefore given the option to choose how the description of imported " "transactions will be set." msgstr "" #: qifimportexport.cpp:125 #, kde-format msgid "Subcategories as:" msgstr "" #: qifimportexport.cpp:134 #, kde-format msgid "Ignore" msgstr "" #: qifimportexport.cpp:137 #, kde-format msgid "Payee as:" msgstr "" #: qifimportexport.cpp:142 qifimportexport.cpp:520 #: transactionlistwidget.cpp:119 #, kde-format msgid "Payee" msgstr "" #: qifimportexport.cpp:147 #, kde-format msgid "Memo as:" msgstr "" #: qifimportexport.cpp:156 #, kde-format msgid "Priority:" msgstr "" #: qifimportexport.cpp:159 #, kde-format msgid "Subcategory/Payee/Comments" msgstr "" #: qifimportexport.cpp:160 #, kde-format msgid "Payee/Subcategory/Comments" msgstr "" #: qifimportexport.cpp:161 #, kde-format msgid "Subcategory/Comments/Payee" msgstr "" #: qifimportexport.cpp:162 #, kde-format msgid "Payee/Comments/Subcategory" msgstr "" #: qifimportexport.cpp:163 #, kde-format msgid "Comments/Subcategory/Payee" msgstr "" #: qifimportexport.cpp:164 #, kde-format msgid "Comments/Payee/Subcategory" msgstr "" #: qifimportexport.cpp:314 qifimportexport.cpp:322 qifimportexport.cpp:338 #, kde-format msgid "Unknown" msgstr "" #: qifimportexport.cpp:324 #, kde-format msgid "Bank" msgstr "" #: qifimportexport.cpp:326 #, kde-format msgid "Cat (Category)" msgstr "" #: qifimportexport.cpp:327 #, kde-format msgid "CCard (Credit Card)" msgstr "" #: qifimportexport.cpp:328 #, kde-format msgid "Invst (Investment)" msgstr "" #: qifimportexport.cpp:329 #, kde-format msgid "Oth A (Other Assets)" msgstr "" #: qifimportexport.cpp:330 #, kde-format msgid "Oth L (Other Liabilities)" msgstr "" #: qifimportexport.cpp:331 #, kde-format msgid "Security" msgstr "" #: qifimportexport.cpp:465 #, kde-format msgid "Successfully imported 1 account." msgid_plural "Successfully imported %n accounts." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:469 #, kde-format msgid "Successfully imported 1 category." msgid_plural "Successfully imported %n categories." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:473 #, kde-format msgid "1 duplicate transaction was ignored." msgid_plural "%n duplicate transactions was ignored." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:477 #, kde-format msgid "Failed to import 1 transaction." msgid_plural "Failed to import %n transactions." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:481 #, kde-format msgid "1 security was not imported." msgid_plural "%n securities were not imported." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:485 #, kde-format msgid "1 security transaction was not imported." msgid_plural "%n security transactions were not imported." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:494 #, kde-format msgid "Export QIF File" msgstr "" #: qifimportexport.cpp:506 #, kde-format msgctxt "All accounts" msgid "All" msgstr "" #: qifimportexport.cpp:517 #, kde-format msgid "Export transaction description as:" msgstr "" #: qifimportexport.cpp:524 #, kde-format msgid "Memo" msgstr "" #: qifimportexport.cpp:528 #, kde-format msgid "Subcategory" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 5 #: rc.cpp:3 #, kde-format msgid "&Import" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 12 #: rc.cpp:6 #, kde-format msgid "&Accounts" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 24 #: rc.cpp:9 #, kde-format msgid "&Transactions" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 41 #: rc.cpp:12 #, kde-format msgid "&Securities" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 56 #: rc.cpp:15 #, kde-format msgid "Stat&istics" msgstr "" #: rc.cpp:16 #, kde-format msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" #: rc.cpp:17 #, kde-format msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" #: recurrenceeditwidget.cpp:69 #, kde-format msgid "Edit Exceptions" msgstr "" #: recurrenceeditwidget.cpp:186 #, kde-format msgid "Edit Recurrence Range" msgstr "" #: recurrenceeditwidget.cpp:194 recurrenceeditwidget.cpp:229 #, kde-format msgid "Begins on: %1" msgstr "" #: recurrenceeditwidget.cpp:199 #, kde-format msgid "No ending date" msgstr "" #: recurrenceeditwidget.cpp:203 #, kde-format msgid "End after" msgstr "" #: recurrenceeditwidget.cpp:209 #, kde-format msgid "occurrence(s)" msgstr "" #: recurrenceeditwidget.cpp:211 #, kde-format msgid "End on" msgstr "" #: recurrenceeditwidget.cpp:298 #, kde-format msgid "End date before start date." msgstr "" #: recurrenceeditwidget.cpp:312 #, kde-format msgid "Enable recurrance" msgstr "" #: recurrenceeditwidget.cpp:315 #, kde-format msgid "Recurrence Rule" msgstr "" #: recurrenceeditwidget.cpp:321 #, kde-format msgid "Weekly" msgstr "" #: recurrenceeditwidget.cpp:341 recurrenceeditwidget.cpp:352 #: recurrenceeditwidget.cpp:376 recurrenceeditwidget.cpp:462 #, kde-format msgid "Recur every" msgstr "" #: recurrenceeditwidget.cpp:345 #, kde-format msgid "day(s)" msgstr "" #: recurrenceeditwidget.cpp:356 #, kde-format msgid "week(s) on:" msgstr "" #: recurrenceeditwidget.cpp:380 #, kde-format msgid "month(s), after the start month" msgstr "" #: recurrenceeditwidget.cpp:385 recurrenceeditwidget.cpp:437 #, kde-format msgid "Recur on the" msgstr "" #: recurrenceeditwidget.cpp:391 recurrenceeditwidget.cpp:442 #: recurrenceeditwidget.cpp:494 #, kde-format msgid "1st" msgstr "" #: recurrenceeditwidget.cpp:392 recurrenceeditwidget.cpp:443 #: recurrenceeditwidget.cpp:495 #, kde-format msgid "2nd" msgstr "" #: recurrenceeditwidget.cpp:393 recurrenceeditwidget.cpp:444 #: recurrenceeditwidget.cpp:496 #, kde-format msgid "3rd" msgstr "" #: recurrenceeditwidget.cpp:394 recurrenceeditwidget.cpp:445 #: recurrenceeditwidget.cpp:497 #, kde-format msgid "4th" msgstr "" #: recurrenceeditwidget.cpp:395 recurrenceeditwidget.cpp:446 #: recurrenceeditwidget.cpp:498 #, kde-format msgid "5th" msgstr "" #: recurrenceeditwidget.cpp:396 #, kde-format msgid "6th" msgstr "" #: recurrenceeditwidget.cpp:397 #, kde-format msgid "7th" msgstr "" #: recurrenceeditwidget.cpp:398 #, kde-format msgid "8th" msgstr "" #: recurrenceeditwidget.cpp:399 #, kde-format msgid "9th" msgstr "" #: recurrenceeditwidget.cpp:400 #, kde-format msgid "10th" msgstr "" #: recurrenceeditwidget.cpp:401 #, kde-format msgid "11th" msgstr "" #: recurrenceeditwidget.cpp:402 #, kde-format msgid "12th" msgstr "" #: recurrenceeditwidget.cpp:403 #, kde-format msgid "13th" msgstr "" #: recurrenceeditwidget.cpp:404 #, kde-format msgid "14th" msgstr "" #: recurrenceeditwidget.cpp:405 #, kde-format msgid "15th" msgstr "" #: recurrenceeditwidget.cpp:406 #, kde-format msgid "16th" msgstr "" #: recurrenceeditwidget.cpp:407 #, kde-format msgid "17th" msgstr "" #: recurrenceeditwidget.cpp:408 #, kde-format msgid "18th" msgstr "" #: recurrenceeditwidget.cpp:409 #, kde-format msgid "19th" msgstr "" #: recurrenceeditwidget.cpp:410 #, kde-format msgid "20th" msgstr "" #: recurrenceeditwidget.cpp:411 #, kde-format msgid "21st" msgstr "" #: recurrenceeditwidget.cpp:412 #, kde-format msgid "22nd" msgstr "" #: recurrenceeditwidget.cpp:413 #, kde-format msgid "23rd" msgstr "" #: recurrenceeditwidget.cpp:414 #, kde-format msgid "24th" msgstr "" #: recurrenceeditwidget.cpp:415 #, kde-format msgid "25th" msgstr "" #: recurrenceeditwidget.cpp:416 #, kde-format msgid "26th" msgstr "" #: recurrenceeditwidget.cpp:417 #, kde-format msgid "27th" msgstr "" #: recurrenceeditwidget.cpp:418 #, kde-format msgid "28th" msgstr "" #: recurrenceeditwidget.cpp:419 #, kde-format msgid "29th" msgstr "" #: recurrenceeditwidget.cpp:420 #, kde-format msgid "30th" msgstr "" #: recurrenceeditwidget.cpp:421 #, kde-format msgid "31st" msgstr "" #: recurrenceeditwidget.cpp:422 recurrenceeditwidget.cpp:447 #: recurrenceeditwidget.cpp:499 #, kde-format msgid "Last" msgstr "" #: recurrenceeditwidget.cpp:423 recurrenceeditwidget.cpp:448 #: recurrenceeditwidget.cpp:500 #, kde-format msgid "2nd Last" msgstr "" #: recurrenceeditwidget.cpp:424 recurrenceeditwidget.cpp:449 #: recurrenceeditwidget.cpp:501 #, kde-format msgid "3rd Last" msgstr "" #: recurrenceeditwidget.cpp:425 recurrenceeditwidget.cpp:450 #: recurrenceeditwidget.cpp:502 #, kde-format msgid "4th Last" msgstr "" #: recurrenceeditwidget.cpp:426 recurrenceeditwidget.cpp:451 #: recurrenceeditwidget.cpp:503 #, kde-format msgid "5th Last" msgstr "" #: recurrenceeditwidget.cpp:429 #, kde-format msgid "day" msgstr "" #: recurrenceeditwidget.cpp:431 recurrenceeditwidget.cpp:483 #: recurrenceeditwidget.cpp:521 #, kde-format msgid "possibly on weekend" msgstr "" #: recurrenceeditwidget.cpp:432 recurrenceeditwidget.cpp:484 #: recurrenceeditwidget.cpp:522 #, kde-format msgid "but before weekend" msgstr "" #: recurrenceeditwidget.cpp:433 recurrenceeditwidget.cpp:485 #: recurrenceeditwidget.cpp:523 #, kde-format msgid "but after weekend" msgstr "" #: recurrenceeditwidget.cpp:466 #, kde-format msgid "year(s), after the start year" msgstr "" #: recurrenceeditwidget.cpp:471 #, kde-format msgctxt "part before XXX of 'Recur on day XXX of month YYY'" msgid "Recur on day" msgstr "" #: recurrenceeditwidget.cpp:479 #, kde-format msgctxt "part between XXX and YYY of 'Recur on day XXX of month YYY'" msgid "of" msgstr "" #: recurrenceeditwidget.cpp:489 #, kde-format msgctxt "Part before NNN in 'Recur on the NNN. WEEKDAY of MONTH'" msgid "On the" msgstr "" #: recurrenceeditwidget.cpp:507 #, kde-format msgctxt "part between WEEKDAY and MONTH in 'Recur on NNN. WEEKDAY of MONTH'" msgid "of" msgstr "" #: recurrenceeditwidget.cpp:512 #, kde-format msgid "Recur on day #" msgstr "" #: recurrenceeditwidget.cpp:519 #, kde-format msgctxt "part after NNN of 'Recur on day #NNN of the year'" msgid " of the year" msgstr "" #: recurrenceeditwidget.cpp:533 #, kde-format msgid "Range..." msgstr "" #: recurrenceeditwidget.cpp:535 #, kde-format msgid "Exceptions..." msgstr "" #: recurrenceeditwidget.cpp:731 #, kde-format msgid "No day of week selected for weekly recurrence." msgstr "" #: recurrenceeditwidget.cpp:745 recurrenceeditwidget.cpp:774 #: recurrenceeditwidget.cpp:791 #, kde-format msgid "Selected day will never occur with selected frequency and start date." msgstr "" #: recurrenceeditwidget.cpp:761 #, kde-format msgid "Selected day does not exist in selected month." msgstr "" #: transaction.cpp:155 transaction.cpp:186 #, kde-format msgid "Dividend: %1" msgstr "" #: transaction.cpp:253 transaction.cpp:256 transaction.cpp:284 #, kde-format msgid "Account balancing" msgstr "" #: transaction.cpp:337 transaction.cpp:352 #, kde-format msgid "Security: %1 (bought)" msgstr "" #: transaction.cpp:375 transaction.cpp:390 #, kde-format msgid "Security: %1 (sold)" msgstr "" #: transactioneditwidget.cpp:125 #, kde-format msgid "Shares bought:" msgstr "" #: transactioneditwidget.cpp:130 #, kde-format msgid "Shares sold:" msgstr "" #: transactioneditwidget.cpp:238 transactioneditwidget.cpp:1144 #: transactionfilterwidget.cpp:140 #, kde-format msgid "Payer:" msgstr "" #: transactioneditwidget.cpp:280 transactioneditwidget.cpp:1145 #: transactionfilterwidget.cpp:141 #, kde-format msgid "Payee:" msgstr "" #: transactioneditwidget.cpp:664 transactioneditwidget.cpp:1262 #, kde-format msgid "No income category available." msgstr "" #: transactioneditwidget.cpp:689 transactioneditwidget.cpp:1270 #, kde-format msgid "No expense category available." msgstr "" #: transactioneditwidget.cpp:720 #, kde-format msgid "Cannot create a regular transfer to/from a securities account." msgstr "" #: transactioneditwidget.cpp:727 #, kde-format msgid "Cannot create a regular income to a securities account." msgstr "" #: transactioneditwidget.cpp:743 #, kde-format msgid "Zero price per share not allowed." msgstr "" #: transactioneditwidget.cpp:755 #, kde-format msgid "Cannot create a regular expense from a securities account." msgstr "" #: transactioneditwidget.cpp:1086 #, kde-format msgid "Modify Transactions" msgstr "" #: transactionfilterwidget.cpp:99 #, kde-format msgid "Min amount:" msgstr "" #: transactionfilterwidget.cpp:100 #, kde-format msgid "Max amount:" msgstr "" #: transactionfilterwidget.cpp:110 #, kde-format msgid "Min income:" msgstr "" #: transactionfilterwidget.cpp:111 #, kde-format msgid "Max income:" msgstr "" #: transactionfilterwidget.cpp:121 #, kde-format msgid "Min cost:" msgstr "" #: transactionfilterwidget.cpp:122 #, kde-format msgid "Max cost:" msgstr "" #: transactionfilterwidget.cpp:148 #, kde-format msgid "Include" msgstr "" #: transactionfilterwidget.cpp:152 #, kde-format msgid "Exclude" msgstr "" #: transactionlistwidget.cpp:117 #, kde-format msgid "From Account" msgstr "" #: transactionlistwidget.cpp:128 #, kde-format msgid "To Account" msgstr "" #: transactionlistwidget.cpp:130 #, kde-format msgid "Payer" msgstr "" #: transactionlistwidget.cpp:169 #, kde-format msgid "New/Edit Expense" msgstr "" #: transactionlistwidget.cpp:170 #, kde-format msgid "Filter" msgstr "" #: transactionlistwidget.cpp:209 #, kde-format msgid "Total:" msgstr "" #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:328 #, kde-format msgid "Average:" msgstr "" #: transactionlistwidget.cpp:209 #, kde-format msgid "Monthly:" msgstr "" #: transactionlistwidget.cpp:314 #, kde-format msgid "Total cost:" msgstr "" #: transactionlistwidget.cpp:318 #, kde-format msgid "Total income:" msgstr "" #: transactionlistwidget.cpp:322 #, kde-format msgid "Total amount:" msgstr "" #: transactionlistwidget.cpp:330 #, kde-format msgid "Monthly average:" msgstr "" #: transactionlistwidget.cpp:671 #, kde-format msgid "" "Are you sure you want to delete all (%1) transactions in the selected split " "transaction?" msgstr "" #: transactionlistwidget.cpp:1028 #, kde-format msgid "* Part of split transaction" msgstr "" #: transactionlistwidget.cpp:1029 #, kde-format msgid "* Part of split (%1)" msgstr "" #: transactionlistwidget.cpp:1033 #, kde-format msgid "** Recurring (editing occurrance)" msgstr "" #: transactionlistwidget.cpp:1049 #, kde-format msgid "Modify..." msgstr "" eqonomize-0.6/po/es.po0000644000175000017500000023246311107053373013720 0ustar hannahanna# Spanish translation for eqonomize # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the eqonomize package. # Mario César Señoranis Ayala , 2007. # msgid "" msgstr "" "Project-Id-Version: eqonomize\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?" "group_id=173799&atid=866832\n" "POT-Creation-Date: 2008-11-13 14:35+0100\n" "PO-Revision-Date: 2008-08-29 17:26+0000\n" "Last-Translator: Steven De Winter \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2008-11-12 16:02+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: budget.cpp:51 editsplitdialog.cpp:118 ledgerdialog.cpp:652 #, kde-format msgid "Balancing" msgstr "Balance" #: budget.cpp:84 #, kde-format msgid "Couldn't open %1 for reading" msgstr "No se pudo abrir %1 para la lectura" #: budget.cpp:95 #, kde-format msgid "" "Not a valid Eqonomize! file (XML parse error: \"%2\" at line %3, col %4)" msgstr "" "No es un archivo Eqonomize válido ! (Error de análisis XML: \"%2\" at line %" "3, col %4)" #: budget.cpp:98 #, kde-format msgid "Invalid root element %1 in XML document" msgstr "Elemento raiz inválido %1 en el documento XML" #: budget.cpp:363 #, kde-format msgid "Unable to load 1 account." msgid_plural "Unable to load %n accounts." msgstr[0] "Incapaz de cargar una cuenta." msgstr[1] "Incapaz de cargar %n cuentas." #: budget.cpp:368 #, kde-format msgid "Unable to load 1 category." msgid_plural "Unable to load %n categories." msgstr[0] "Incapaz de cargar una categoría." msgstr[1] "Incapaz de cargar %n categorías." #: budget.cpp:373 #, kde-format msgid "Unable to load 1 security." msgid_plural "Unable to load %n securities." msgstr[0] "Incapaz de cargar 1 acción." msgstr[1] "Incapaz de cargar %n acciones." #: budget.cpp:378 #, kde-format msgid "Unable to load 1 transaction." msgid_plural "Unable to load %n transactions." msgstr[0] "Incapaz de cargar 1 transacción." msgstr[1] "Incapaz de cargar %n transacciones." #: budget.cpp:389 #, kde-format msgid "File is a directory" msgstr "El archivo es un directorio" #: budget.cpp:397 #, kde-format msgid "Couldn't open file for writing" msgstr "No se pudo abrir fichero para escritura" #: budget.cpp:547 budget.cpp:551 #, kde-format msgid "Error while writing file; file was not saved" msgstr "Error mientras se escribía en el archivo; el archivo no fue guardado" #: categoriescomparisonchart.cpp:123 categoriescomparisonreport.cpp:164 #: eqonomize.cpp:1797 eqonomize.cpp:1957 eqonomize.cpp:2036 #: transactionlistwidget.cpp:138 #, kde-format msgid "From" msgstr "De" #: categoriescomparisonchart.cpp:130 categoriescomparisonreport.cpp:171 #: eqonomize.cpp:1808 eqonomize.cpp:1969 eqonomize.cpp:2037 #: transactionlistwidget.cpp:139 #, kde-format msgid "To" msgstr "Para" #: categoriescomparisonchart.cpp:147 categoriescomparisonreport.cpp:114 #: overtimechart.cpp:112 overtimechart.cpp.bak:106 overtimereport.cpp:97 #, kde-format msgid "Source:" msgstr "Fuente:" #: categoriescomparisonchart.cpp:150 categoriescomparisonchart.cpp:858 #, kde-format msgid "All Expenses" msgstr "Todos los Gastos" #: categoriescomparisonchart.cpp:151 categoriescomparisonchart.cpp:859 #, kde-format msgid "All Incomes" msgstr "Todos los ingresos" #: categoriescomparisonchart.cpp:152 categoriescomparisonchart.cpp:860 #, kde-format msgid "All Accounts" msgstr "Todas las cuentas" #: categoriescomparisonchart.cpp:155 categoriescomparisonchart.cpp:864 #: categoriescomparisonreport.cpp:122 categoriescomparisonreport.cpp:752 #: categoriescomparisonreport.cpp:1016 overtimereport.cpp:375 #, kde-format msgid "Expenses: %1" msgstr "Gastos: %1" #: categoriescomparisonchart.cpp:160 categoriescomparisonchart.cpp:871 #: categoriescomparisonreport.cpp:127 categoriescomparisonreport.cpp:756 #: categoriescomparisonreport.cpp:1023 overtimereport.cpp:366 #, kde-format msgid "Incomes: %1" msgstr "Ingresos: %1" #: categoriescomparisonchart.cpp:199 categoriescomparisonchart.cpp:225 #: categoriescomparisonreport.cpp:334 categoriescomparisonreport.cpp:360 #: editsplitdialog.cpp:411 eqonomize.cpp:482 eqonomize.cpp:571 #: eqonomize.cpp:741 eqonomize.cpp:848 eqonomize.cpp:870 eqonomize.cpp:2483 #: eqonomize.cpp:3180 eqonomize.cpp:3206 eqonomize.cpp:3326 eqonomize.cpp:3352 #: importcsvdialog.cpp:780 importcsvdialog.cpp:1196 overtimechart.cpp:462 #: overtimechart.cpp:500 overtimechart.cpp:528 overtimechart.cpp:566 #: overtimechart.cpp.bak:455 overtimechart.cpp.bak:493 #: overtimechart.cpp.bak:521 overtimechart.cpp.bak:559 #: recurrenceeditwidget.cpp:156 recurrenceeditwidget.cpp:171 #: recurrenceeditwidget.cpp:293 transactioneditwidget.cpp:707 #: transactioneditwidget.cpp:1281 transactionfilterwidget.cpp:564 #: transactionfilterwidget.cpp:590 #, kde-format msgid "Invalid date." msgstr "Fecha no válida." #: categoriescomparisonchart.cpp:204 categoriescomparisonreport.cpp:339 #: eqonomize.cpp:3185 eqonomize.cpp:3331 transactionfilterwidget.cpp:569 #, kde-format msgid "To date is before from date." msgstr "La fecha final esta antes de la fecha de inicio" #: categoriescomparisonchart.cpp:229 categoriescomparisonreport.cpp:364 #: eqonomize.cpp:3210 eqonomize.cpp:3356 transactionfilterwidget.cpp:594 #, kde-format msgid "From date is after to date." msgstr "La fecha de inicio esta despues de la fecha final" #: categoriescomparisonchart.cpp:340 categoriescomparisonreport.cpp:463 #: eqonomize.cpp:3610 eqonomize.cpp:4252 ledgerdialog.cpp:251 #: overtimechart.cpp:624 overtimechart.cpp.bak:617 overtimereport.cpp:278 #: qifimportexport.cpp:604 #, kde-format msgid "" "The selected file already exists. Would you like to overwrite the old copy?" msgstr "El archivo existe, ¿Quiere sobreescribirlo?" #: categoriescomparisonchart.cpp:344 categoriescomparisonreport.cpp:467 #: eqonomize.cpp:4257 ledgerdialog.cpp:255 overtimechart.cpp:628 #: overtimechart.cpp.bak:621 overtimereport.cpp:282 qifimportexport.cpp:608 #, kde-format msgid "You selected a directory!" msgstr "Usted selecciono un directorio." #: categoriescomparisonchart.cpp:352 categoriescomparisonreport.cpp:475 #: eqonomize.cpp:4264 ledgerdialog.cpp:263 overtimechart.cpp:636 #: overtimechart.cpp.bak:629 overtimereport.cpp:290 qifimportexport.cpp:616 #, kde-format msgid "Couldn't open file for writing." msgstr "No se pudo abrir el archivo para editarlo." #: categoriescomparisonchart.cpp:372 categoriescomparisonreport.cpp:482 #: eqonomize.cpp:4270 ledgerdialog.cpp:269 overtimechart.cpp:656 #: overtimechart.cpp.bak:644 overtimereport.cpp:297 qifimportexport.cpp:622 #, kde-format msgid "Error while writing file; file was not saved." msgstr "Error mientras se escribía en el archivo; el archivo no fue guardado." #: categoriescomparisonchart.cpp:728 categoriescomparisonreport.cpp:303 #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:754 #: categoriescomparisonreport.cpp:839 categoriescomparisonreport.cpp:930 #: categoriescomparisonreport.cpp:977 overtimechart.cpp:373 #: overtimechart.cpp:1740 overtimechart.cpp:1746 overtimechart.cpp:1774 #: overtimechart.cpp:1776 overtimechart.cpp:1783 overtimechart.cpp:1785 #: overtimechart.cpp:1821 overtimechart.cpp:1891 overtimechart.cpp.bak:366 #: overtimechart.cpp.bak:1721 overtimechart.cpp.bak:1727 #: overtimechart.cpp.bak:1755 overtimechart.cpp.bak:1757 #: overtimechart.cpp.bak:1764 overtimechart.cpp.bak:1766 #: overtimechart.cpp.bak:1811 overtimechart.cpp.bak:1892 #: overtimereport.cpp:213 overtimereport.cpp:384 overtimereport.cpp:393 #: overtimereport.cpp:732 #, kde-format msgid "No description" msgstr "Sin descripción" #: categoriescomparisonreport.cpp:119 categoriescomparisonreport.cpp:1012 #, kde-format msgid "All Categories" msgstr "Todas las categorías" #: categoriescomparisonreport.cpp:138 #, kde-format msgid "Descriptions for" msgstr "Descripción para" #: categoriescomparisonreport.cpp:145 #, kde-format msgid "Payees/payers for" msgstr "Acreedores/deudores para" #: categoriescomparisonreport.cpp:161 #, kde-format msgid "Period:" msgstr "Periodo:" #: categoriescomparisonreport.cpp:186 overtimereport.cpp:120 #, kde-format msgid "Columns:" msgstr "Columnas:" #: categoriescomparisonreport.cpp:189 categoriescomparisonreport.cpp:782 #: eqonomize.cpp:1062 eqonomize.cpp:1935 eqonomize.cpp:4142 #: importcsvdialog.cpp:139 importcsvdialog.cpp:157 importcsvdialog.cpp:180 #: importcsvdialog.cpp:197 importcsvdialog.cpp:216 importcsvdialog.cpp:235 #: importcsvdialog.cpp:253 overtimereport.cpp:123 #, kde-format msgid "Value" msgstr "Valor" #: categoriescomparisonreport.cpp:192 overtimereport.cpp:126 #: recurrenceeditwidget.cpp:320 #, kde-format msgid "Daily" msgstr "Diario" #: categoriescomparisonreport.cpp:195 overtimereport.cpp:129 #: recurrenceeditwidget.cpp:322 #, kde-format msgid "Monthly" msgstr "Mensualmente" #: categoriescomparisonreport.cpp:198 overtimereport.cpp:132 #: recurrenceeditwidget.cpp:323 #, kde-format msgid "Yearly" msgstr "Anualmente" #: categoriescomparisonreport.cpp:201 categoriescomparisonreport.cpp:787 #: overtimechart.cpp:205 overtimechart.cpp:1534 overtimechart.cpp.bak:198 #: overtimechart.cpp.bak:1515 overtimereport.cpp:135 overtimereport.cpp:549 #: transactionlistwidget.cpp:276 transactionlistwidget.cpp:340 #, kde-format msgid "Quantity" msgstr "Cantidad" #: categoriescomparisonreport.cpp:204 overtimechart.cpp:209 #: overtimechart.cpp.bak:202 overtimereport.cpp:138 #, kde-format msgid "Average value" msgstr "Valor promedio" #: categoriescomparisonreport.cpp:278 categoriescomparisonreport.cpp:947 #, kde-format msgid "All descriptions" msgstr "Todas las descripciones" #: categoriescomparisonreport.cpp:279 categoriescomparisonreport.cpp:948 #, kde-format msgid "All payees" msgstr "Todos los acreedores" #: categoriescomparisonreport.cpp:280 categoriescomparisonreport.cpp:949 #, kde-format msgid "All payers" msgstr "Todos los deudores" #: categoriescomparisonreport.cpp:309 categoriescomparisonreport.cpp:751 #: categoriescomparisonreport.cpp:837 categoriescomparisonreport.cpp:932 #: categoriescomparisonreport.cpp:994 overtimechart.cpp:382 #: overtimechart.cpp:1758 overtimechart.cpp:1768 overtimechart.cpp:1823 #: overtimechart.cpp:1908 overtimechart.cpp.bak:375 overtimechart.cpp.bak:1739 #: overtimechart.cpp.bak:1749 overtimechart.cpp.bak:1813 #: overtimechart.cpp.bak:1909 #, kde-format msgid "No payee" msgstr "Sin acreedor" #: categoriescomparisonreport.cpp:310 categoriescomparisonreport.cpp:755 #: categoriescomparisonreport.cpp:838 categoriescomparisonreport.cpp:933 #: categoriescomparisonreport.cpp:995 overtimechart.cpp:381 #: overtimechart.cpp:1752 overtimechart.cpp:1763 overtimechart.cpp:1825 #: overtimechart.cpp:1907 overtimechart.cpp.bak:374 overtimechart.cpp.bak:1733 #: overtimechart.cpp.bak:1744 overtimechart.cpp.bak:1815 #: overtimechart.cpp.bak:1908 #, kde-format msgid "No payer" msgstr "Sin deudor" #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:751 #: overtimereport.cpp:393 #, kde-format msgid "Expenses: %2, %1" msgstr "Gastos: %2, %1" #: categoriescomparisonreport.cpp:754 categoriescomparisonreport.cpp:755 #: overtimereport.cpp:384 #, kde-format msgid "Incomes: %2, %1" msgstr "Ingresos: %2, %1" #: categoriescomparisonreport.cpp:758 #, kde-format msgid "Incomes & Expenses" msgstr "Ingresos & Gastos" #: categoriescomparisonreport.cpp:771 #, kde-format msgctxt "html format; %1: title; %2: from date; %3: to date" msgid "%1 (%2–%3)" msgstr "%1 (%2–%3)" #: categoriescomparisonreport.cpp:772 #, fuzzy, kde-format msgctxt "html format; %1: title; %2: to date" msgid "%1 (to %2)" msgstr "%1 (con presupuesto %2)" #: categoriescomparisonreport.cpp:776 eqonomize.cpp:4046 eqonomize.cpp:4094 #: qifimportexport.cpp:131 transactionlistwidget.cpp:116 #: transactionlistwidget.cpp:127 #, kde-format msgid "Category" msgstr "Categoria" #: categoriescomparisonreport.cpp:778 eqonomize.cpp:1938 #: transactionlistwidget.cpp:115 #, kde-format msgid "Cost" msgstr "Gasto" #: categoriescomparisonreport.cpp:780 editscheduledtransactiondialog.cpp:46 #: editsplitdialog.cpp:108 eqonomize.cpp:285 eqonomize.cpp:329 #: ledgerdialog.cpp:647 transactionlistwidget.cpp:126 #, kde-format msgid "Income" msgstr "Ingreso" #: categoriescomparisonreport.cpp:784 overtimereport.cpp:545 #, kde-format msgid "Daily Average" msgstr "Promedio Diario" #: categoriescomparisonreport.cpp:785 overtimereport.cpp:546 #, kde-format msgid "Monthly Average" msgstr "Promedio Mensual" #: categoriescomparisonreport.cpp:786 overtimereport.cpp:547 #, kde-format msgid "Yearly Average" msgstr "Promedio Anual" #: categoriescomparisonreport.cpp:789 overtimereport.cpp:358 #: overtimereport.cpp:376 overtimereport.cpp:394 #, kde-format msgid "Average Cost" msgstr "Gasto Promedio" #: categoriescomparisonreport.cpp:791 overtimereport.cpp:350 #: overtimereport.cpp:367 overtimereport.cpp:385 #, kde-format msgid "Average Income" msgstr "Ingreso Promedio" #: categoriescomparisonreport.cpp:793 #, kde-format msgid "Average Value" msgstr "Valor Promedio" #: categoriescomparisonreport.cpp:853 eqonomize.cpp:3932 eqonomize.cpp:4030 #: eqonomize.cpp:4075 eqonomize.cpp:4123 overtimereport.cpp:686 #, kde-format msgid "Total" msgstr "Total" #: categoriescomparisonreport.cpp:878 #, kde-format msgid "Total incomes" msgstr "Ingreso Total" #: categoriescomparisonreport.cpp:902 #, kde-format msgid "Total expenses" msgstr "Gasto Total" #: categoriescomparisonreport.cpp:912 #, kde-format msgid "Total (Profits)" msgstr "Total (Ganancias)" #: editscheduledtransactiondialog.cpp:45 editsplitdialog.cpp:111 #: eqonomize.cpp:288 eqonomize.cpp:332 ledgerdialog.cpp:650 #, kde-format msgid "Expense" msgstr "Gastos" #: editscheduledtransactiondialog.cpp:47 editsplitdialog.cpp:120 #: eqonomize.cpp:282 eqonomize.cpp:326 ledgerdialog.cpp:653 #, kde-format msgid "Transfer" msgstr "Transferencias" #: editscheduledtransactiondialog.cpp:48 editsplitdialog.cpp:114 #: eqonomize.cpp:289 eqonomize.cpp:333 #, kde-format msgid "Security Buy" msgstr "Compra Segura" #: editscheduledtransactiondialog.cpp:49 editsplitdialog.cpp:116 #: eqonomize.cpp:290 eqonomize.cpp:334 #, kde-format msgid "Security Sell" msgstr "" #: editscheduledtransactiondialog.cpp:56 editscheduledtransactiondialog.cpp:57 #, kde-format msgid "Recurrence" msgstr "Repetición" #: editscheduledtransactiondialog.cpp:104 #, kde-format msgid "New Expense" msgstr "Nuevo Gasto" #: editscheduledtransactiondialog.cpp:106 #, kde-format msgid "New Dividend" msgstr "Nuevo Dividendo" #: editscheduledtransactiondialog.cpp:107 #, kde-format msgid "New Income" msgstr "Nuevo Ingreso" #: editscheduledtransactiondialog.cpp:110 #, kde-format msgid "New Transfer" msgstr "Nueva Transferencia" #: editscheduledtransactiondialog.cpp:111 #, kde-format msgid "New Security Buy" msgstr "" #: editscheduledtransactiondialog.cpp:113 #, kde-format msgid "New Security Sell" msgstr "Nueva Venta Segura" #: editscheduledtransactiondialog.cpp:128 #: editscheduledtransactiondialog.cpp:149 transactioneditwidget.cpp:1064 #, kde-format msgid "Edit Expense" msgstr "Editar Gastos" #: editscheduledtransactiondialog.cpp:130 #: editscheduledtransactiondialog.cpp:151 transactioneditwidget.cpp:1066 #, kde-format msgid "Edit Dividend" msgstr "Editar Divididendos" #: editscheduledtransactiondialog.cpp:131 #: editscheduledtransactiondialog.cpp:152 transactioneditwidget.cpp:1067 #, kde-format msgid "Edit Income" msgstr "Editar Ingresos" #: editscheduledtransactiondialog.cpp:134 #: editscheduledtransactiondialog.cpp:155 transactioneditwidget.cpp:1070 #, kde-format msgid "Edit Transfer" msgstr "Editar Transferencias" #: editscheduledtransactiondialog.cpp:135 #: editscheduledtransactiondialog.cpp:156 transactioneditwidget.cpp:1071 #, kde-format msgid "Edit Securities Bought" msgstr "Editar" #: editscheduledtransactiondialog.cpp:136 #: editscheduledtransactiondialog.cpp:157 transactioneditwidget.cpp:1072 #, kde-format msgid "Edit Securities Sold" msgstr "Editar Acciones Vendidas" #: editsplitdialog.cpp:107 eqonomize.cpp:284 eqonomize.cpp:328 #: eqonomize.cpp:1167 #, kde-format msgid "Dividend" msgstr "Dividendo" #: editsplitdialog.cpp:109 eqonomize.cpp:403 eqonomize.cpp:445 #: ledgerdialog.cpp:648 #, kde-format msgid "Repayment" msgstr "Refinanciamiento" #: editsplitdialog.cpp:112 eqonomize.cpp:404 eqonomize.cpp:446 #: ledgerdialog.cpp:651 #, kde-format msgid "Refund" msgstr "Reembolso" #: editsplitdialog.cpp:126 ledgerdialog.cpp:638 #, kde-format msgid "Split Transaction" msgstr "Dividir Transacciones" #: editsplitdialog.cpp:138 eqonomize.cpp:1279 eqonomize.cpp:1379 #: eqonomize.cpp:1473 eqonomize.cpp:1538 importcsvdialog.cpp:129 #: transactioneditwidget.cpp:175 transactioneditwidget.cpp:1099 #: transactionfilterwidget.cpp:135 #, kde-format msgid "Description:" msgstr "Descripción" #: editsplitdialog.cpp:143 eqonomize.cpp:413 eqonomize.cpp:523 #: eqonomize.cpp:639 eqonomize.cpp:1274 eqonomize.cpp:2476 #: importcsvdialog.cpp:187 transactioneditwidget.cpp:149 #: transactioneditwidget.cpp:199 transactioneditwidget.cpp:1119 #, kde-format msgid "Date:" msgstr "Fecha:" #: editsplitdialog.cpp:148 eqonomize.cpp:424 eqonomize.cpp:1252 #: importcsvdialog.cpp:388 importcsvdialog.cpp:399 ledgerdialog.cpp:107 #: qifimportexport.cpp:503 #, kde-format msgid "Account:" msgstr "Cuenta:" #: editsplitdialog.cpp:163 #, kde-format msgid "Transactions:" msgstr "Transacción" #: editsplitdialog.cpp:172 eqonomize.cpp:914 eqonomize.cpp:1061 #: eqonomize.cpp:1941 eqonomize.cpp:2033 eqonomize.cpp:3988 #: ledgerdialog.cpp:135 #, kde-format msgid "Type" msgstr "Tipo" #: editsplitdialog.cpp:173 eqonomize.cpp:915 eqonomize.cpp:2034 #: ledgerdialog.cpp:136 qifimportexport.cpp:127 qifimportexport.cpp:139 #: qifimportexport.cpp:149 transactionlistwidget.cpp:111 #, kde-format msgid "Description" msgstr "Descripción" #: editsplitdialog.cpp:174 eqonomize.cpp:4142 ledgerdialog.cpp:137 #, kde-format msgid "Account/Category" msgstr "Cuenta/Categoría" #: editsplitdialog.cpp:175 #, kde-format msgid "Payment" msgstr "Pago" #: editsplitdialog.cpp:176 ledgerdialog.cpp:138 #, kde-format msgid "Deposit" msgstr "Depósito" #: editsplitdialog.cpp:181 ledgerdialog.cpp:151 #, kde-format msgid "New" msgstr "Nuevo" #: editsplitdialog.cpp:184 eqonomize.cpp:4333 #, kde-format msgid "New Expense..." msgstr "Nuevo Gasto..." #: editsplitdialog.cpp:185 eqonomize.cpp:4334 #, kde-format msgid "New Income..." msgstr "Nuevo Ingreso..." #: editsplitdialog.cpp:186 #, kde-format msgid "New Deposit..." msgstr "Nuevo Deposito..." #: editsplitdialog.cpp:187 #, kde-format msgid "New Withdrawal..." msgstr "Nuevo Retiro..." #: editsplitdialog.cpp:188 #, fuzzy, kde-format msgid "New Security Shares Bought..." msgstr "Editar Unidades Compradas" #: editsplitdialog.cpp:189 #, kde-format msgid "Security Shares Sold..." msgstr "Acciones de Seguridad Vendidas.." #: editsplitdialog.cpp:190 #, kde-format msgid "New Dividend..." msgstr "Nuevo Dividendo..." #: editsplitdialog.cpp:191 eqonomize.cpp:924 eqonomize.cpp:1071 #: eqonomize.cpp:4328 ledgerdialog.cpp:158 transactionlistwidget.cpp:1051 #, kde-format msgid "Edit..." msgstr "Editar..." #: editsplitdialog.cpp:221 eqonomize.cpp:2325 #, kde-format msgid "Total value:" msgstr "Valor total:" #: editsplitdialog.cpp:403 transactioneditwidget.cpp:653 #: transactioneditwidget.cpp:657 transactioneditwidget.cpp:668 #: transactioneditwidget.cpp:682 transactioneditwidget.cpp:693 #, kde-format msgid "No suitable account available." msgstr "No se encuentra una cuenta adecuada disponible." #: editsplitdialog.cpp:415 #, kde-format msgid "Future dates is not allowed." msgstr "Fechas posteriores no son permitidas." #: editsplitdialog.cpp:419 #, kde-format msgid "A split must contain at least two transactions." msgstr "Una división debe al menos contener dos transacciones." #: editsplitdialog.cpp:428 transactioneditwidget.cpp:714 #, kde-format msgid "Cannot transfer money to and from the same account." msgstr "No se puede transferir dinero de y hacia la misma cuenta." #: eqonomize.cpp:419 eqonomize.cpp:2325 importcsvdialog.cpp:146 #: importcsvdialog.cpp:169 importcsvdialog.cpp:355 #: transactioneditwidget.cpp:117 transactioneditwidget.cpp:186 #: transactioneditwidget.cpp:1111 #, kde-format msgid "Cost:" msgstr "Gasto:" #: eqonomize.cpp:420 importcsvdialog.cpp:364 importcsvdialog.cpp:397 #: transactioneditwidget.cpp:118 transactioneditwidget.cpp:184 #: transactioneditwidget.cpp:1110 #, kde-format msgid "Income:" msgstr "Ingreso:" #: eqonomize.cpp:439 transactioneditwidget.cpp:193 #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:310 #, kde-format msgid "Quantity:" msgstr "Cantidad:" #: eqonomize.cpp:443 importcsvdialog.cpp:243 transactioneditwidget.cpp:288 #, kde-format msgid "Comments:" msgstr "Comentarios:" #: eqonomize.cpp:491 eqonomize.cpp:1176 #, kde-format msgid "Reinvested Dividend" msgstr "Dividendos Reinvertidos" #: eqonomize.cpp:501 transactioneditwidget.cpp:97 #: transactioneditwidget.cpp:157 #, kde-format msgid "Security:" msgstr "Seguridad:" #: eqonomize.cpp:518 #, kde-format msgid "Shares added:" msgstr "Unidades añadidas:" #: eqonomize.cpp:579 #, kde-format msgid "Security Trade" msgstr "Transacción de Acciones" #: eqonomize.cpp:587 #, kde-format msgid "From security:" msgstr "De la acción:" #: eqonomize.cpp:603 #, kde-format msgid "Shares moved:" msgstr "Unidades movidas:" #: eqonomize.cpp:608 transactioneditwidget.cpp:135 #: transactionfilterwidget.cpp:167 transactionfilterwidget.cpp:168 #: transactionfilterwidget.cpp:343 transactionfilterwidget.cpp:380 #, kde-format msgid "All" msgstr "Todo" #: eqonomize.cpp:614 #, kde-format msgid "To security:" msgstr "Para la acción:" #: eqonomize.cpp:631 #, kde-format msgid "Shares received:" msgstr "Dividendos recibidos:" #: eqonomize.cpp:635 importcsvdialog.cpp:386 importcsvdialog.cpp:412 #: overtimechart.cpp:193 overtimechart.cpp.bak:186 #, kde-format msgid "Value:" msgstr "Valor" #: eqonomize.cpp:725 #, kde-format msgid "No other security available for trade in the account." msgstr "No hay otra acción disponible para comerciar en esta cuenta." #: eqonomize.cpp:737 #, kde-format msgid "Selected to and from securities are the same." msgstr "El origen y el destino de las acciones es el mismo." #: eqonomize.cpp:745 transactioneditwidget.cpp:735 #, kde-format msgid "Zero shares not allowed." msgstr "Cero unidades no está permitido" #: eqonomize.cpp:749 transactioneditwidget.cpp:739 #, kde-format msgid "Zero value not allowed." msgstr "Valor Cero no esta permitido" #: eqonomize.cpp:757 eqonomize.cpp:766 #, kde-format msgid "Quotations" msgstr "Cita" #: eqonomize.cpp:777 eqonomize.cpp:913 eqonomize.cpp:962 eqonomize.cpp:1060 #: ledgerdialog.cpp:134 transactionlistwidget.cpp:110 #, kde-format msgid "Date" msgstr "Fecha" #: eqonomize.cpp:778 #, kde-format msgid "Price per Share" msgstr "Precio por unidad" #: eqonomize.cpp:820 #, kde-format msgid "Quotations for %1" msgstr "Citas para %1" #: eqonomize.cpp:904 #, kde-format msgid "" "The following transactions was scheduled to occur today or before today.\n" "Confirm that they have indeed occurred (or will occur today)." msgstr "" "La siguiente transacción fue planificada para ocurrir el día de hoy o " "después.\n" "Confirme que esta efectivamente ocurrió, (o lo hará el día de hoy)." #: eqonomize.cpp:916 eqonomize.cpp:2035 transactionlistwidget.cpp:137 #, kde-format msgid "Amount" msgstr "Monto" #: eqonomize.cpp:926 #, kde-format msgid "Postpone..." msgstr "Postponer..." #: eqonomize.cpp:973 #, kde-format msgid "Can only postpone to future dates." msgstr "Solo puede posponer a fechas posteriores." #: eqonomize.cpp:1052 ledgerdialog.cpp:299 #, kde-format msgid "Transactions for %1" msgstr "Transacciones para %1" #: eqonomize.cpp:1063 eqonomize.cpp:1936 #, kde-format msgid "Shares" msgstr "Unidades" #: eqonomize.cpp:1160 #, kde-format msgid "Shares Bought" msgstr "Unidades Compradas" #: eqonomize.cpp:1161 #, kde-format msgid "Shares Sold" msgstr "Unidades Vendidas" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Sold (Traded)" msgstr "Unidades Vendidas (Transacción)" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Bought (Traded)" msgstr "Unidades Compradas (Transacción)" #: eqonomize.cpp:1204 #, kde-format msgid "Shares Bought (Recurring)" msgstr "" #: eqonomize.cpp:1205 #, kde-format msgid "Shares Sold (Recurring)" msgstr "" #: eqonomize.cpp:1207 #, kde-format msgid "Shares Bought (Scheduled)" msgstr "" #: eqonomize.cpp:1208 #, kde-format msgid "Shares Sold (Scheduled)" msgstr "" #: eqonomize.cpp:1220 #, kde-format msgid "Recurring Dividend" msgstr "Dividendos Recurrentes" #: eqonomize.cpp:1222 #, kde-format msgid "Scheduled Dividend" msgstr "Dividendos Programados" #: eqonomize.cpp:1240 eqonomize.cpp:1360 #, kde-format msgid "Type:" msgstr "Tipo:" #: eqonomize.cpp:1243 eqonomize.cpp:2600 eqonomize.cpp:2660 #, kde-format msgid "Mutual Fund" msgstr "Fondos Mutuos" #: eqonomize.cpp:1244 eqonomize.cpp:2598 eqonomize.cpp:2658 #, kde-format msgid "Bond" msgstr "Enlace" #: eqonomize.cpp:1245 eqonomize.cpp:2599 eqonomize.cpp:2659 #, kde-format msgid "Stock" msgstr "Stock" #: eqonomize.cpp:1246 eqonomize.cpp:2601 eqonomize.cpp:2661 eqonomize.cpp:3492 #: eqonomize.cpp:3497 importcsvdialog.cpp:117 qifimportexport.cpp:332 #, kde-format msgid "Other" msgstr "Otro" #: eqonomize.cpp:1249 eqonomize.cpp:1370 eqonomize.cpp:1464 eqonomize.cpp:1529 #, kde-format msgid "Name:" msgstr "Nombre:" #: eqonomize.cpp:1264 #, kde-format msgid "Decimals in Shares:" msgstr "Cuantos decimales utiliza" #: eqonomize.cpp:1267 #, kde-format msgid "Initial Shares:" msgstr "Unidades Iniciales" #: eqonomize.cpp:1270 #, kde-format msgid "Initial quotation:" msgstr "Citas Iniciales" #: eqonomize.cpp:1289 transactioneditwidget.cpp:675 #, kde-format msgid "No suitable account or income category available." msgstr "" "No se encuentra una cuenta o una categoría de renta adecuada disponible" #: eqonomize.cpp:1363 eqonomize.cpp:3488 eqonomize.cpp:4021 #: qifimportexport.cpp:325 #, kde-format msgid "Cash" msgstr "Efectivo" #: eqonomize.cpp:1364 eqonomize.cpp:4016 #, kde-format msgid "Current Account" msgstr "Cuenta actual" #: eqonomize.cpp:1365 eqonomize.cpp:3490 eqonomize.cpp:4017 #, kde-format msgid "Savings Account" msgstr "Cuenta de Ahorros" #: eqonomize.cpp:1366 eqonomize.cpp:4018 #, kde-format msgid "Credit Card" msgstr "Tarjeta de Cŕedito" #: eqonomize.cpp:1367 eqonomize.cpp:4019 #, kde-format msgid "Liabilities" msgstr "Pasivos" #: eqonomize.cpp:1368 eqonomize.cpp:1731 eqonomize.cpp:1732 eqonomize.cpp:3891 #: eqonomize.cpp:3897 eqonomize.cpp:4020 #, kde-format msgid "Securities" msgstr "Acciones" #: eqonomize.cpp:1373 #, kde-format msgid "Initial balance:" msgstr "Balance inicial" #: eqonomize.cpp:1376 #, kde-format msgid "Default account for budgeted transactions" msgstr "" #: eqonomize.cpp:1441 eqonomize.cpp:1507 eqonomize.cpp:1572 #, kde-format msgid "Empty name." msgstr "Nombre vació" #: eqonomize.cpp:1447 #, kde-format msgid "The entered name is used by another account." msgstr "El nombre que ingreso esta siendo utilizado por otra cuenta." #: eqonomize.cpp:1467 eqonomize.cpp:1532 #, kde-format msgid "Monthly budget:" msgstr "Presupuesto Mensual" #: eqonomize.cpp:1513 #, kde-format msgid "The entered name is used by another income category." msgstr "El nombre elegido ya está siendo usado en otra categoría de ingresos." #: eqonomize.cpp:1578 #, kde-format msgid "The entered name is used by another expense category." msgstr "El nombre elegido ya está siendo usado en otra categoría de gastos." #: eqonomize.cpp:1711 eqonomize.cpp:1778 eqonomize.cpp:3984 eqonomize.cpp:5970 #: eqonomize.cpp:5976 #, kde-format msgid "Accounts" msgstr "Cuentas" #: eqonomize.cpp:1712 #, kde-format msgid "Accounts & Categories" msgstr "Cuentas & Categorías" #: eqonomize.cpp:1716 eqonomize.cpp:1717 eqonomize.cpp:1780 #: importcsvdialog.cpp:70 overtimechart.cpp:126 overtimechart.cpp:1727 #: overtimechart.cpp:1731 overtimechart.cpp.bak:119 overtimechart.cpp.bak:1708 #: overtimechart.cpp.bak:1712 overtimereport.cpp:103 overtimereport.cpp:357 #: overtimereport.cpp:377 overtimereport.cpp:395 transactionlistwidget.cpp:251 #: transactionlistwidget.cpp:263 #, kde-format msgid "Expenses" msgstr "Gastos" #: eqonomize.cpp:1721 eqonomize.cpp:1722 eqonomize.cpp:1779 eqonomize.cpp:4043 #: importcsvdialog.cpp:75 overtimechart.cpp:127 overtimechart.cpp:1726 #: overtimechart.cpp:1730 overtimechart.cpp.bak:120 overtimechart.cpp.bak:1707 #: overtimechart.cpp.bak:1711 overtimereport.cpp:104 overtimereport.cpp:349 #: overtimereport.cpp:368 overtimereport.cpp:386 transactionlistwidget.cpp:252 #: transactionlistwidget.cpp:264 #, kde-format msgid "Incomes" msgstr "Ingresos" #: eqonomize.cpp:1726 eqonomize.cpp:1727 importcsvdialog.cpp:78 #: transactionlistwidget.cpp:253 transactionlistwidget.cpp:265 #, kde-format msgid "Transfers" msgstr "Transferencias" #: eqonomize.cpp:1736 #, kde-format msgid "Schedule" msgstr "Calendario" #: eqonomize.cpp:1737 #, kde-format msgid "Scheduled Transactions" msgstr "Transacciones programadas" #: eqonomize.cpp:1753 eqonomize.cpp:1775 #, kde-format msgid "Account / Category" msgstr "Cuenta / Categoría" #: eqonomize.cpp:1754 #, kde-format msgid "Remaining Budget (%1)" msgstr "" #: eqonomize.cpp:1755 #, kde-format msgid "Change (%1)" msgstr "Cambio (%1)" #: eqonomize.cpp:1756 #, kde-format msgid "Total (%1)" msgstr "Total (%1)" #: eqonomize.cpp:1769 #, kde-format msgctxt "%2 remains of %1 budget" msgid "%2 of %1" msgstr "%2 de %1" #: eqonomize.cpp:1785 eqonomize.cpp:4002 #, kde-format msgid "Includes budgeted transactions" msgstr "Incluye transacciones presupuestadas" #: eqonomize.cpp:1793 #, kde-format msgid "Period" msgstr "Periodo" #: eqonomize.cpp:1825 #, kde-format msgid "Select Period" msgstr "Elija un Periodo" #: eqonomize.cpp:1827 eqonomize.cpp:4312 #, kde-format msgid "Current Month" msgstr "Mes Actual" #: eqonomize.cpp:1828 eqonomize.cpp:4313 #, kde-format msgid "Current Year" msgstr "Año Actual" #: eqonomize.cpp:1829 eqonomize.cpp:4314 #, kde-format msgid "Current Whole Month" msgstr "Todo el mes actual" #: eqonomize.cpp:1830 eqonomize.cpp:4315 #, kde-format msgid "Current Whole Year" msgstr "Todo el presente año" #: eqonomize.cpp:1831 #, kde-format msgid "Whole Past Month" msgstr "Todo el mes pasado" #: eqonomize.cpp:1832 #, kde-format msgid "Whole Past Year" msgstr "Todo el año pasado" #: eqonomize.cpp:1833 #, kde-format msgid "Previous Month" msgstr "Mes anterior" #: eqonomize.cpp:1834 #, kde-format msgid "Previous Year" msgstr "Año anterior" #: eqonomize.cpp:1837 #, kde-format msgid "Show partial budget" msgstr "Mostrar el presupuesto parcial" #: eqonomize.cpp:1842 #, kde-format msgid "Edit Budget" msgstr "Editar Presupuesto" #: eqonomize.cpp:1846 #, kde-format msgid "Budget:" msgstr "Presupuesto:" #: eqonomize.cpp:1856 #, kde-format msgid "Month:" msgstr "Mes:" #: eqonomize.cpp:1864 #, kde-format msgid "Result previous month:" msgstr "Resultado del mes anteior:" #: eqonomize.cpp:1917 eqonomize.cpp:4354 #, kde-format msgid "New Security..." msgstr "Nueva Acción..." #: eqonomize.cpp:1919 #, kde-format msgid "New Transaction" msgstr "Nueva Transacción" #: eqonomize.cpp:1922 eqonomize.cpp:4362 #, kde-format msgid "Set Quotation..." msgstr "Escribir Cita" #: eqonomize.cpp:1934 eqonomize.cpp:3987 #, kde-format msgid "Name" msgstr "Nombre" #: eqonomize.cpp:1937 #, kde-format msgid "Quotation" msgstr "Cita" #: eqonomize.cpp:1939 #, kde-format msgid "Profit" msgstr "Beneficio" #: eqonomize.cpp:1940 #, kde-format msgid "Yearly Rate" msgstr "Índice Anual" #: eqonomize.cpp:1942 qifimportexport.cpp:323 #, kde-format msgid "Account" msgstr "Cuenta" #: eqonomize.cpp:1953 #, kde-format msgid "Statistics Period" msgstr "Estadísticas del Periodo" #: eqonomize.cpp:2015 #, kde-format msgid "New Schedule" msgstr "Nuevo Calendario" #: eqonomize.cpp:2018 #, kde-format msgid "Edit" msgstr "Editar" #: eqonomize.cpp:2032 #, kde-format msgid "Next Occurrence" msgstr "Siguiente Ocurrencia" #: eqonomize.cpp:2038 qifimportexport.cpp:152 transactionlistwidget.cpp:144 #, kde-format msgid "Comments" msgstr "Comentarios" #: eqonomize.cpp:2291 #, kde-format msgid "New Security" msgstr "Nueva Acción" #: eqonomize.cpp:2306 #, kde-format msgid "Edit Security" msgstr "Editar Acción" #: eqonomize.cpp:2325 #, kde-format msgid "Profit:" msgstr "Ganancia:" #: eqonomize.cpp:2325 #, kde-format msgid "Rate:" msgstr "Tasa:" #: eqonomize.cpp:2332 #, kde-format msgid "" "Are you sure you want to delete the security \"%1\" and all associated " "transactions?" msgstr "" #: eqonomize.cpp:2394 transactioneditwidget.cpp:700 #, kde-format msgid "No security available." msgstr "Seguridad no Disponible" #: eqonomize.cpp:2466 #, kde-format msgid "Set Quotation (%1)" msgstr "Establecer presupuesto (%1)" #: eqonomize.cpp:2472 transactioneditwidget.cpp:143 #, kde-format msgid "Price per share:" msgstr "Precio por Unidad:" #: eqonomize.cpp:2485 #, kde-format msgid "Future dates are not allowed." msgstr "Fechas posteriores no están permitidas." #: eqonomize.cpp:2513 #, kde-format msgid "Security Transactions" msgstr "Transacciones Seguras" #: eqonomize.cpp:3166 ledgerdialog.cpp:293 #, kde-format msgid "Ledger" msgstr "Libro de Compras" #: eqonomize.cpp:3475 #, kde-format msgid "Untitled" msgstr "" #: eqonomize.cpp:3489 #, kde-format msgid "Check Account" msgstr "Comprobar Cuenta" #: eqonomize.cpp:3491 #, kde-format msgid "Salary" msgstr "Salario" #: eqonomize.cpp:3493 #, kde-format msgid "Bills" msgstr "Cuentas" #: eqonomize.cpp:3494 #, kde-format msgid "Clothing" msgstr "Ropa" #: eqonomize.cpp:3495 #, kde-format msgid "Groceries" msgstr "Comestibles" #: eqonomize.cpp:3496 #, kde-format msgid "Leisure" msgstr "Ocio" #: eqonomize.cpp:3561 importcsvdialog.cpp:795 qifimportexport.cpp:280 #: qifimportexport.cpp:444 #, kde-format msgid "Couldn't fetch %1." msgstr "" #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Error loading %1: %2." msgstr "Error cargando %1: %2." #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Couldn't open file" msgstr "No se pudo abrir el archivo" #: eqonomize.cpp:3627 eqonomize.cpp:3653 #, kde-format msgid "Error saving %1: %2." msgstr "Error grabando %1: %2." #: eqonomize.cpp:3627 eqonomize.cpp:3653 eqonomize.cpp:3673 #, kde-format msgid "Couldn't save file" msgstr "No se pudo grabar el archivo" #: eqonomize.cpp:3673 eqonomize.cpp:4282 ledgerdialog.cpp:281 #: qifimportexport.cpp:634 #, kde-format msgid "Failed to upload file to %1." msgstr "Fallo al cargar el archivo %1." #: eqonomize.cpp:3703 eqonomize.cpp:3728 #, kde-format msgid "Report" msgstr "Reporte" #: eqonomize.cpp:3758 eqonomize.cpp:3783 #, kde-format msgid "Chart" msgstr "Gráfico" #: eqonomize.cpp:3823 eqonomize.cpp:3829 #, kde-format msgid "Transaction Schedule" msgstr "Transacción Programada" #: eqonomize.cpp:3976 #, kde-format msgctxt "html format" msgid "Accounts & Categories" msgstr "Cuentas & Categorías" #: eqonomize.cpp:3981 #, kde-format msgctxt "html format" msgid "Accounts & Categories (%1–%2)" msgstr "Cuentas & Categorías (%1–%2)" #: eqonomize.cpp:3982 #, fuzzy, kde-format msgctxt "html format" msgid "Accounts & Categories (to %1)" msgstr "Cuentas & Categorías" #: eqonomize.cpp:3989 eqonomize.cpp:4049 eqonomize.cpp:4097 eqonomize.cpp:4142 #, kde-format msgid "Change" msgstr "Cambio" #: eqonomize.cpp:3993 ledgerdialog.cpp:140 #, kde-format msgid "Balance" msgstr "Balance" #: eqonomize.cpp:4047 eqonomize.cpp:4095 #, kde-format msgid "Budget" msgstr "Presupuesto" #: eqonomize.cpp:4048 eqonomize.cpp:4096 #, kde-format msgid "Remaining Budget" msgstr "Presupuesto Restante" #: eqonomize.cpp:4050 #, kde-format msgid "Total Incomes" msgstr "Ingresos Totales" #: eqonomize.cpp:4091 #, kde-format msgid "Costs" msgstr "Costos" #: eqonomize.cpp:4098 #, kde-format msgid "Total Expenses" msgstr "Gastos Totales" #: eqonomize.cpp:4167 eqonomize.cpp:4214 #, kde-format msgid "Empty expenses list." msgstr "Lista de gastos vacía." #: eqonomize.cpp:4172 eqonomize.cpp:4219 #, kde-format msgid "Empty incomes list." msgstr "Lista de Ingresos vacia." #: eqonomize.cpp:4177 eqonomize.cpp:4224 #, kde-format msgid "Empty transfers list." msgstr "Lista de transferencias vacia." #: eqonomize.cpp:4182 eqonomize.cpp:4229 #, kde-format msgid "Empty securities list." msgstr "Lista de acciones vacia." #: eqonomize.cpp:4187 eqonomize.cpp:4234 #, kde-format msgid "Empty schedule list." msgstr "" #: eqonomize.cpp:4305 #, kde-format msgid "Export View..." msgstr "" #: eqonomize.cpp:4307 #, kde-format msgid "Print View..." msgstr "Vista de Impresión" #: eqonomize.cpp:4309 #, kde-format msgid "Initial Period" msgstr "Periodo Inicial" #: eqonomize.cpp:4316 #, kde-format msgid "Remember Last Dates" msgstr "Recordar últimas fechas" #: eqonomize.cpp:4319 #, kde-format msgid "Import CSV File..." msgstr "Importar Archivo CSV..." #: eqonomize.cpp:4320 #, kde-format msgid "Import QIF File..." msgstr "Importar Archivo QIF..." #: eqonomize.cpp:4321 #, kde-format msgid "Export As QIF File..." msgstr "Exportar como Archivo QIF..." #: eqonomize.cpp:4323 #, kde-format msgid "Add Account..." msgstr "Añádir Cuenta..." #: eqonomize.cpp:4324 #, kde-format msgid "New Account..." msgstr "Nueva Cuenta..." #: eqonomize.cpp:4325 #, kde-format msgid "New Income Category..." msgstr "Nueva Categoría de Ingresos..." #: eqonomize.cpp:4326 #, kde-format msgid "New Expense Category..." msgstr "Nueva Categoría de Gastos..." #: eqonomize.cpp:4327 #, kde-format msgid "Balance..." msgstr "Balance..." #: eqonomize.cpp:4331 #, kde-format msgid "Show Transactions" msgstr "Mostrar Transacciones" #: eqonomize.cpp:4335 #, kde-format msgid "New Transfer..." msgstr "Nueva Transacción..." #: eqonomize.cpp:4336 #, kde-format msgid "New Split Transaction..." msgstr "" #: eqonomize.cpp:4337 #, kde-format msgid "Edit Transaction(s) (Occurrence)..." msgstr "" #: eqonomize.cpp:4338 #, kde-format msgid "Edit Occurrence..." msgstr "Editar Ocurrencia..." #: eqonomize.cpp:4339 #, kde-format msgid "Edit Schedule (Recurrence)..." msgstr "" #: eqonomize.cpp:4340 #, kde-format msgid "Edit Schedule..." msgstr "Editar Calendario..." #: eqonomize.cpp:4341 #, kde-format msgid "Remove Transaction(s) (Occurrence)" msgstr "Remover Las trasacciones programadas" #: eqonomize.cpp:4342 #, kde-format msgid "Remove Occurrence" msgstr "Remover Ocurrencia" #: eqonomize.cpp:4343 #, kde-format msgid "Delete Schedule (Recurrence)" msgstr "" #: eqonomize.cpp:4344 #, kde-format msgid "Delete Schedule" msgstr "Eliminar Calendario" #: eqonomize.cpp:4345 #, kde-format msgid "Edit Split Transaction..." msgstr "Editar Transacción Dividida..." #: eqonomize.cpp:4346 #, kde-format msgid "Remove Split Transaction" msgstr "Eliminar Transacción Dividida" #: eqonomize.cpp:4347 #, kde-format msgid "Join Transactions..." msgstr "Unir Transacciones..." #: eqonomize.cpp:4348 #, kde-format msgid "Split Up Transaction" msgstr "Dividir Transacción" #: eqonomize.cpp:4350 #, kde-format msgid "Refund..." msgstr "" #: eqonomize.cpp:4351 #, kde-format msgid "Repayment..." msgstr "Repago" #: eqonomize.cpp:4352 #, kde-format msgid "New Refund/Repayment..." msgstr "Reintegro/Repago" #: eqonomize.cpp:4355 #, kde-format msgid "Edit Security..." msgstr "" #: eqonomize.cpp:4356 #, kde-format msgid "Remove Security" msgstr "" #: eqonomize.cpp:4357 #, kde-format msgid "Shares Sold..." msgstr "Acciones Vendidas..." #: eqonomize.cpp:4358 #, kde-format msgid "Shares Bought..." msgstr "Acciones Compradas..." #: eqonomize.cpp:4359 #, kde-format msgid "Dividend..." msgstr "Dividendos..." #: eqonomize.cpp:4360 #, kde-format msgid "Reinvested Dividend..." msgstr "Dividendos reinvertidos..." #: eqonomize.cpp:4361 #, kde-format msgid "Shares Moved..." msgstr "Unidades movidas..." #: eqonomize.cpp:4363 #, kde-format msgid "Edit Quotations..." msgstr "Editar Citas..." #: eqonomize.cpp:4364 #, kde-format msgid "Transactions..." msgstr "Transacciones..." #: eqonomize.cpp:4366 #, kde-format msgid "Development Over Time Report..." msgstr "Reporte Detallado por Tiempo" #: eqonomize.cpp:4367 #, kde-format msgid "Categories Comparison Report..." msgstr "Reporte Comparativo de Categorías..." #: eqonomize.cpp:4368 #, kde-format msgid "Categories Comparison Chart..." msgstr "Tabla comparativa de categorías..." #: eqonomize.cpp:4369 #, kde-format msgid "Development Over Time Chart..." msgstr "Tabla Detallada por Tiempo" #: eqonomize.cpp:4371 #, kde-format msgid "Use Additional Transaction Properties" msgstr "Use Propiedades Adicionales de las Trensacciones" #: eqonomize.cpp:4413 #, kde-format msgid "" "Eqonomize! exited unexpectedly before the file was saved and data was lost.\n" "Do you want to load the last auto-saved version of the file?" msgstr "" "Eqonomize terminó de forma inesperada antes de que el archivo fuera " "guardado. Los datos se han perdido.\n" "¿Quiere cargar la última versión del archivo auto-guardado?" #: eqonomize.cpp:4413 #, kde-format msgid "Crash Recovery" msgstr "Recuperación del cuelgue" #: eqonomize.cpp:4605 eqonomize.cpp:4606 #, kde-format msgid "The current file has been modified. Do you want to save it?" msgstr "El Archivo actual ha sido modificado. ¿Desea guardar los cambios?" #: eqonomize.cpp:4643 #, kde-format msgid "Confirm Schedule" msgstr "" #: eqonomize.cpp:4697 #, kde-format msgid "New Account" msgstr "Nueva Cuenta" #: eqonomize.cpp:4712 #, kde-format msgid "New Income Category" msgstr "Nueva Categoría de Ingresos" #: eqonomize.cpp:4725 #, kde-format msgid "New Expense Category" msgstr "Nueva Categoría de Gastos" #: eqonomize.cpp:4800 #, kde-format msgid "Balance Account" msgstr "Balance de Cuenta" #: eqonomize.cpp:4806 #, kde-format msgid "Book value:" msgstr "Valor del libro:" #: eqonomize.cpp:4813 #, kde-format msgid "Real value:" msgstr "Valor Real:" #: eqonomize.cpp:4836 #, kde-format msgid "Edit Account" msgstr "Editar Cuenta" #: eqonomize.cpp:4869 #, kde-format msgid "Edit Income Category" msgstr "Editar Categoría de Ingresos" #: eqonomize.cpp:4887 #, kde-format msgid "Edit Expense Category" msgstr "Editar Categoría de Gastos" #: eqonomize.cpp:4948 #, kde-format msgid "Move transactions?" msgstr "¿Mover transacción?" #: eqonomize.cpp:4958 #, kde-format msgid "Move to:" msgstr "Mover a:" #: eqonomize.cpp:4965 #, kde-format msgid "" "The category contains some expenses.\n" "What do you want to do with them?" msgstr "" #: eqonomize.cpp:4977 #, kde-format msgid "" "The category contains some incomes.\n" "What do you want to do with them?" msgstr "" #: eqonomize.cpp:4989 #, kde-format msgid "" "The account contains some transactions.\n" "What do you want to do with them?" msgstr "" #: eqonomize.cpp:5011 #, kde-format msgid "" "The category contains some expenses that will be removed. Do you still want " "to remove the category?" msgstr "" #: eqonomize.cpp:5011 eqonomize.cpp:5012 #, kde-format msgid "Remove Category?" msgstr "¿Eliminar Categoría?" #: eqonomize.cpp:5012 #, kde-format msgid "" "The category contains some incomes that will be removed. Do you still want " "to remove the category?" msgstr "" #: eqonomize.cpp:5013 #, kde-format msgid "" "The account contains some transactions that will be removed. Do you still " "want to remove the account?" msgstr "" #: eqonomize.cpp:5013 #, kde-format msgid "Remove Account?" msgstr "¿Eliminar Cuenta?" #: eqonomize.cpp:5531 eqonomize.cpp:5555 eqonomize.cpp:5730 #, kde-format msgctxt "%1: budget; %2: remaining budget" msgid "%2 of %1" msgstr "%2 de %1" #: eqonomize.cpp:5810 eqonomize.cpp:5835 #, kde-format msgid "%1 (with no budget)" msgstr "%1 (sin presupuesto)" #: eqonomize.cpp:5811 eqonomize.cpp:5836 #, kde-format msgid "%1 (with budget %2)" msgstr "%1 (con presupuesto %2)" #: importcsvdialog.cpp:60 #, kde-format msgid "Import CSV file" msgstr "Importar archivo CVS" #: importcsvdialog.cpp:64 #, kde-format msgid "Transaction Type Selection" msgstr "Selecciona el Tipo de Transacción" #: importcsvdialog.cpp:81 #, kde-format msgid "Expenses and incomes (negative cost)" msgstr "Gastos e ingresos (Gastos negativos)" #: importcsvdialog.cpp:84 #, kde-format msgid "Expenses and incomes (separate columns)" msgstr "Gastos e ingresos (Columnas separadas)" #: importcsvdialog.cpp:87 #, kde-format msgid "All types" msgstr "Todos los tipos" #: importcsvdialog.cpp:95 qifimportexport.cpp:62 #, kde-format msgid "File Selection" msgstr "Selección de archivo" #: importcsvdialog.cpp:99 qifimportexport.cpp:66 qifimportexport.cpp:548 #, kde-format msgid "File:" msgstr "Archivo" #: importcsvdialog.cpp:104 #, kde-format msgid "First data row:" msgstr "Primera fila de datos:" #: importcsvdialog.cpp:107 #, kde-format msgid "Auto" msgstr "Automático" #: importcsvdialog.cpp:110 #, kde-format msgid "Column delimiter:" msgstr "Delimitador de Columna:" #: importcsvdialog.cpp:113 #, kde-format msgid "Comma" msgstr "Coma" #: importcsvdialog.cpp:114 #, kde-format msgid "Tabulator" msgstr "Tabulador" #: importcsvdialog.cpp:115 #, kde-format msgid "Semicolon" msgstr "Punto y coma" #: importcsvdialog.cpp:116 #, kde-format msgid "Space" msgstr "Espacio" #: importcsvdialog.cpp:125 #, kde-format msgid "Columns Specification" msgstr "Espicificación de Columnas" #: importcsvdialog.cpp:131 importcsvdialog.cpp:149 importcsvdialog.cpp:172 #: importcsvdialog.cpp:189 importcsvdialog.cpp:208 importcsvdialog.cpp:227 #: importcsvdialog.cpp:245 #, kde-format msgid "Column" msgstr "Columna" #: importcsvdialog.cpp:205 importcsvdialog.cpp:356 importcsvdialog.cpp:365 #: importcsvdialog.cpp:387 importcsvdialog.cpp:398 #: transactioneditwidget.cpp:225 transactioneditwidget.cpp:267 #: transactioneditwidget.cpp:1130 transactionfilterwidget.cpp:102 #: transactionfilterwidget.cpp:113 #, kde-format msgid "Category:" msgstr "Categoría:" #: importcsvdialog.cpp:224 importcsvdialog.cpp:357 importcsvdialog.cpp:374 #: transactioneditwidget.cpp:248 transactioneditwidget.cpp:273 #: transactionfilterwidget.cpp:117 #, kde-format msgid "From account:" msgstr "Desde la cuenta:" #: importcsvdialog.cpp:262 #, kde-format msgid "Create missing categories and accounts" msgstr "" #: importcsvdialog.cpp:354 #, kde-format msgid "" "Imports data as expenses. Costs have positive value. Value is the only " "required column." msgstr "" #: importcsvdialog.cpp:363 #, kde-format msgid "Imports data as incomes. Value is the only required column." msgstr "" #: importcsvdialog.cpp:366 importcsvdialog.cpp:375 #: transactioneditwidget.cpp:231 transactioneditwidget.cpp:258 #: transactionfilterwidget.cpp:106 #, kde-format msgid "To account:" msgstr "Para la cuenta:" #: importcsvdialog.cpp:372 #, kde-format msgid "Imports data as transfers. Value is the only required column." msgstr "" #: importcsvdialog.cpp:373 transactioneditwidget.cpp:182 #: transactioneditwidget.cpp:1109 #, kde-format msgid "Amount:" msgstr "Cuenta:" #: importcsvdialog.cpp:381 #, kde-format msgid "" "Imports data as expenses and incomes. Costs have negative value. Value and " "category are both required columns." msgstr "" "Importar datos como gastos e ingresos. Los gastos tienen valor negativo. El " "valor y la categoría son las columnas requeridas." #: importcsvdialog.cpp:392 #, kde-format msgid "" "Imports data as expenses and incomes. Costs and incomes have separate " "columns. Income, cost, and category are all required columns." msgstr "" "Importar datos como gastos e ingresos. Gastos e ingresos estan en columnas " "separadas. Ingresos, gastos y categoría son columnas requeridas." #: importcsvdialog.cpp:403 #, kde-format msgid "" "Imports data as expenses, incomes, and transfers. Costs have negative or " "positive value. Value, to, and from are all required columns. Accounts and " "categories must be existing." msgstr "" "Importar datos como gastos, ingresos y transacciones. Gastos tiene valor " "positivo o negativo. El valor, el destino y el origen son las columnas " "requeridas." #: importcsvdialog.cpp:413 transactioneditwidget.cpp:209 #: transactionfilterwidget.cpp:74 transactionfilterwidget.cpp:91 #, kde-format msgid "From:" msgstr "De:" #: importcsvdialog.cpp:414 transactioneditwidget.cpp:216 #: transactionfilterwidget.cpp:81 transactionfilterwidget.cpp:95 #, kde-format msgid "To:" msgstr "Para:" #: importcsvdialog.cpp:440 qifimportexport.cpp:258 #, kde-format msgid "A file must be selected." msgstr "Un archivo debe ser seleccionado" #: importcsvdialog.cpp:446 importcsvdialog.cpp:458 qifimportexport.cpp:265 #: qifimportexport.cpp:595 #, kde-format msgid "Selected file is a directory." msgstr "" #: importcsvdialog.cpp:450 importcsvdialog.cpp:462 qifimportexport.cpp:269 #, kde-format msgid "Selected file does not exist." msgstr "El archivo seleccionado no existe." #: importcsvdialog.cpp:468 #, kde-format msgid "Empty delimiter." msgstr "Delimitador vacio." #: importcsvdialog.cpp:712 #, kde-format msgid "The same column number is selected multiple times." msgstr "" #: importcsvdialog.cpp:772 #, kde-format msgid "Selected from account is the same as the to account." msgstr "La cuenta seleccionada desde es la misma que la en." #: importcsvdialog.cpp:803 qifimportexport.cpp:288 qifimportexport.cpp:452 #, kde-format msgid "Couldn't open %1 for reading." msgstr "No se pudo abrir %1 para lectura." #: importcsvdialog.cpp:806 qifimportexport.cpp:291 qifimportexport.cpp:455 #, kde-format msgid "Error reading %1." msgstr "Ocurrió un error cuando se leía %1." #: importcsvdialog.cpp:1187 qifimportexport.cpp:462 #, kde-format msgid "Successfully imported 1 transaction." msgid_plural "Successfully imported %n transactions." msgstr[0] "Importada 1 transacción satisfactoriamente." msgstr[1] "Importada %n transacciónes satisfactoriamente." #: importcsvdialog.cpp:1189 #, kde-format msgid "Unable to import any transactions imported." msgstr "" #: importcsvdialog.cpp:1193 #, kde-format msgid "Failed to import 1 data row." msgid_plural "Failed to import %n data rows." msgstr[0] "Fallo al importar 1 fila de datos." msgstr[1] "Fallo al importar %n filas de datos." #: importcsvdialog.cpp:1194 #, kde-format msgid "Required columns missing." msgstr "No se encuentra una columna requerida" #: importcsvdialog.cpp:1195 #, kde-format msgid "Invalid value." msgstr "Valor no válido." #: importcsvdialog.cpp:1197 #, kde-format msgid "Empty category name." msgstr "Nombre de categoría vacío" #: importcsvdialog.cpp:1197 importcsvdialog.cpp:1198 #, kde-format msgid "Empty account name." msgstr "Nombre de cuenta vacío" #: importcsvdialog.cpp:1199 #, kde-format msgid "Unknown category found." msgstr "Categoría desconocida" #: importcsvdialog.cpp:1199 importcsvdialog.cpp:1200 #, kde-format msgid "Unknown account found." msgstr "Cuenta desconocida" #: importcsvdialog.cpp:1201 #, kde-format msgid "Cannot import security transactions (to/from security accounts)." msgstr "" #: importcsvdialog.cpp:1202 #, kde-format msgid "Balancing account wrongly used." msgstr "Cuenta de Balance mal utilizada" #: importcsvdialog.cpp:1203 #, kde-format msgid "Same to and from account/category." msgstr "El origen y el destino de la cuenta/categoría es el mismo." #: importcsvdialog.cpp:1205 #, kde-format msgid "No data found." msgstr "No se encontraron datos." #: importcsvdialog.cpp:1219 qifimportexport.cpp:345 #, kde-format msgid "Unrecognized date format." msgstr "Formato de fecha desconocido." #: importcsvdialog.cpp:1224 #, kde-format msgid "Specify Format" msgstr "Formato específico" #: importcsvdialog.cpp:1230 #, kde-format msgid "" "The format of dates and/or numbers in the CSV file is ambiguous. Please " "select the correct format." msgstr "" "El formato de las fechas y/o números en el archivo CVS es ambiguo. Por favor " "selecciona un formato correcto." #: importcsvdialog.cpp:1235 qifimportexport.cpp:94 qifimportexport.cpp:533 #, kde-format msgid "Date format:" msgstr "Formato de fecha:" #: importcsvdialog.cpp:1278 qifimportexport.cpp:541 #, kde-format msgid "Value format:" msgstr "" #: kdateedit.cpp:366 #, fuzzy, kde-format msgctxt "the day after today" msgid "tomorrow" msgstr "mañana" #: kdateedit.cpp:367 #, fuzzy, kde-format msgctxt "this day" msgid "today" msgstr "hoy" #: kdateedit.cpp:368 #, fuzzy, kde-format msgctxt "the day before today" msgid "yesterday" msgstr "ayer" #: kdatepickerpopup.cpp:94 #, fuzzy, kde-format msgctxt "@option today" msgid "&Today" msgstr "hoy" #: kdatepickerpopup.cpp:95 #, fuzzy, kde-format msgctxt "@option tomorrow" msgid "To&morrow" msgstr "mañana" #: kdatepickerpopup.cpp:96 #, kde-format msgctxt "@option next week" msgid "Next &Week" msgstr "" #: kdatepickerpopup.cpp:97 #, fuzzy, kde-format msgctxt "@option next month" msgid "Next M&onth" msgstr "Mes Actual" #: kdatepickerpopup.cpp:105 #, fuzzy, kde-format msgctxt "@option do not specify a date" msgid "No Date" msgstr "Fecha" #: ledgerdialog.cpp:122 #, kde-format msgid "Export..." msgstr "Exportar..." #: ledgerdialog.cpp:123 #, kde-format msgid "Print..." msgstr "Imprimir…" #: ledgerdialog.cpp:139 #, kde-format msgid "Withdrawal" msgstr "Retirada" #: ledgerdialog.cpp:162 #, kde-format msgid "Join..." msgstr "Unir..." #: ledgerdialog.cpp:164 #, kde-format msgid "Split Up" msgstr "" #: ledgerdialog.cpp:234 ledgerdialog.cpp:354 #, kde-format msgid "Empty transaction list." msgstr "Lista de la transacción vacia" #: ledgerdialog.cpp:443 transactionlistwidget.cpp:717 #, kde-format msgid "Are you sure you want to delete all (%1) selected transactions?" msgstr "" "¿Esta seguro de que quiere eliminar todas (%1) las transacciones " "seleccionadas?" #: ledgerdialog.cpp:547 transactionlistwidget.cpp:489 #, kde-format msgid "" "Cannot set the value of security transactions using the dialog for modifying " "multiple transactions." msgstr "" #: ledgerdialog.cpp:553 transactionlistwidget.cpp:495 #, kde-format msgid "Cannot change description of dividends and security transactions." msgstr "" #: ledgerdialog.cpp:559 transactionlistwidget.cpp:501 #, kde-format msgid "Cannot change payer of dividends and security transactions." msgstr "" #: ledgerdialog.cpp:565 transactionlistwidget.cpp:507 #, kde-format msgid "" "Cannot change date of transactions that are part of a split transaction." msgstr "" #: main.cpp:39 msgid "Eqonomize!" msgstr "Eqonomize!" #: main.cpp:39 msgid "A personal accounting program" msgstr "" #: main.cpp:39 msgid "(C) 2008 Hanna K." msgstr "" #: main.cpp:40 msgid "Hanna K." msgstr "" #: main.cpp:44 msgid "Start with expenses list displayed" msgstr "" #: main.cpp:46 msgid "Start with incomes list displayed" msgstr "" #: main.cpp:48 msgid "Start with transfers list displayed" msgstr "" #: main.cpp:49 msgid "Document to open" msgstr "Abrir documento:" #: overtimechart.cpp:124 overtimechart.cpp.bak:117 #, kde-format msgid "Incomes and Expenses" msgstr "Ingresos y Gastos" #: overtimechart.cpp:125 overtimechart.cpp:1722 overtimechart.cpp.bak:118 #: overtimechart.cpp.bak:1703 overtimereport.cpp:102 overtimereport.cpp:343 #, kde-format msgid "Profits" msgstr "Beneficios" #: overtimechart.cpp:132 overtimechart.cpp:411 overtimechart.cpp:1949 #: overtimechart.cpp.bak:125 overtimechart.cpp.bak:404 #: overtimechart.cpp.bak:1950 overtimereport.cpp:108 overtimereport.cpp:228 #: overtimereport.cpp:753 #, kde-format msgid "All Categories Combined" msgstr "Todas las Categorías combinadas" #: overtimechart.cpp:138 overtimechart.cpp:296 overtimechart.cpp:400 #: overtimechart.cpp:1852 overtimechart.cpp:1973 overtimechart.cpp.bak:131 #: overtimechart.cpp.bak:289 overtimechart.cpp.bak:393 #: overtimechart.cpp.bak:1853 overtimechart.cpp.bak:1974 #: overtimereport.cpp:113 overtimereport.cpp:176 overtimereport.cpp:225 #: overtimereport.cpp:710 overtimereport.cpp:776 #, kde-format msgid "All Descriptions Combined" msgstr "Todas las Descripciones combinadas" #: overtimechart.cpp:146 overtimechart.cpp:406 overtimechart.cpp.bak:139 #: overtimechart.cpp.bak:399 #, kde-format msgid "All Payees/Payers Combined" msgstr "Todos los Acreedores/Deudores Combinados" #: overtimechart.cpp:155 overtimechart.cpp.bak:148 #, kde-format msgid "Start date:" msgstr "Fecha de inicio:" #: overtimechart.cpp:178 overtimechart.cpp.bak:171 #, kde-format msgid "End date:" msgstr "Fecha de finalización:" #: overtimechart.cpp:197 overtimechart.cpp.bak:190 #, kde-format msgid "Monthly total" msgstr "Total Mensual" #: overtimechart.cpp:201 overtimechart.cpp.bak:194 #, kde-format msgid "Daily average" msgstr "Media diaria" #: overtimechart.cpp:304 overtimechart.cpp:404 overtimechart.cpp:1855 #: overtimechart.cpp:1978 overtimechart.cpp.bak:297 overtimechart.cpp.bak:397 #: overtimechart.cpp.bak:1856 overtimechart.cpp.bak:1979 #, kde-format msgid "All Payers Combined" msgstr "Todos los Deudores Combinados" #: overtimechart.cpp:305 overtimechart.cpp:405 overtimechart.cpp:1856 #: overtimechart.cpp:1977 overtimechart.cpp.bak:298 overtimechart.cpp.bak:398 #: overtimechart.cpp.bak:1857 overtimechart.cpp.bak:1978 #, kde-format msgid "All Payees Combined" msgstr "Todos los Acreedores Combinados" #: overtimechart.cpp:325 overtimechart.cpp:1853 overtimechart.cpp.bak:318 #: overtimechart.cpp.bak:1854 #, kde-format msgid "All Descriptions Split" msgstr "" #: overtimechart.cpp:328 overtimechart.cpp:1857 overtimechart.cpp.bak:321 #: overtimechart.cpp.bak:1858 #, kde-format msgid "All Payers Split" msgstr "Todos los deudores separados" #: overtimechart.cpp:329 overtimechart.cpp:1858 overtimechart.cpp.bak:322 #: overtimechart.cpp.bak:1859 #, kde-format msgid "All Payees Split" msgstr "Todos los acreedores separados" #: overtimechart.cpp:413 overtimechart.cpp:423 overtimechart.cpp:1950 #: overtimechart.cpp.bak:406 overtimechart.cpp.bak:416 #: overtimechart.cpp.bak:1951 #, kde-format msgid "All Categories Split" msgstr "Todas las categorías separadas" #: overtimechart.cpp:1535 overtimechart.cpp.bak:1516 #, kde-format msgid "Value (%1)" msgstr "Valor (%1)" #: overtimechart.cpp:1536 overtimechart.cpp.bak:1517 #, kde-format msgid "Profit (%1)" msgstr "Beneficios (%1)" #: overtimechart.cpp:1537 overtimechart.cpp.bak:1518 #, kde-format msgid "Income (%1)" msgstr "Ingresos (%1)" #: overtimechart.cpp:1538 overtimechart.cpp.bak:1519 #, kde-format msgid "Cost (%1)" msgstr "Gastos (%1)" #: overtimechart.cpp:1579 overtimechart.cpp.bak:1560 #, kde-format msgid "Time" msgstr "Tiempo" #: overtimechart.cpp:1774 overtimechart.cpp:1775 overtimechart.cpp.bak:1755 #: overtimechart.cpp.bak:1756 #, kde-format msgid "no payer" msgstr "no deudor" #: overtimechart.cpp:1778 overtimechart.cpp.bak:1759 #, kde-format msgctxt "%1: Description; %2: Payer" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp:1783 overtimechart.cpp:1784 overtimechart.cpp.bak:1764 #: overtimechart.cpp.bak:1765 #, kde-format msgid "no payee" msgstr "no acreedor" #: overtimechart.cpp:1787 overtimechart.cpp.bak:1768 #, kde-format msgctxt "%1: Description; %2: Payee" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp.bak:649 #, kde-format msgid "Error after saving file; data may not have been saved." msgstr "" "Error después de guardar el archivo; los datos pueden no haber sido " "guardados." #: overtimereport.cpp:344 #, kde-format msgid "Average Profit" msgstr "Promedio de Beneficios" #: overtimereport.cpp:537 #, kde-format msgid "Year" msgstr "Año" #: overtimereport.cpp:538 #, kde-format msgid "Month" msgstr "Mes" #: overtimereport.cpp:566 #, kde-format msgid "Includes scheduled transactions" msgstr "Incluir las transacciones progamadas" #: overtimereport.cpp:570 #, kde-format msgid "Adjusted for the average month / year (%1 / %2 days)" msgstr "" #: overtimereport.cpp:603 overtimereport.cpp:671 #, kde-format msgid "Subtotal" msgstr "Subtotal" #: qifimport.cpp:307 qifimport.cpp:367 qifimportexport.cpp:1259 #: qifimportexport.cpp:1350 qifimportexport.cpp:1470 #, kde-format msgid "Unnamed" msgstr "Sin Nombre" #: qifimport.cpp:337 qifimportexport.cpp:1299 qifimportexport.cpp:1413 #, kde-format msgid "Uncategorized" msgstr "Sin Categoría" #: qifimportexport.cpp:56 #, kde-format msgid "Import QIF file" msgstr "Importar Archivo QIF" #: qifimportexport.cpp:63 #, kde-format msgid "" "Select a QIF file to import. When you click next, the file be analysed and " "you might need to answer some questions about the format of the file." msgstr "" "Seleccione un archivo QIF para importar. Cuando usted haga click en \"Next" "\", se analizará el archivo y es posible que tenga que responder a algunas " "preguntas sobre el formato del archivo." #: qifimportexport.cpp:73 #, kde-format msgid "Local Definitions" msgstr "Definiciones Locales" #: qifimportexport.cpp:74 #, kde-format msgid "" "Unknown elements where found in the QIF file. It is possible that this is " "because of localized type names. Please map them to the correct standard " "names." msgstr "" #: qifimportexport.cpp:80 #, kde-format msgid "Local Text" msgstr "Texto Local" #: qifimportexport.cpp:81 #, kde-format msgid "Standard Text" msgstr "Texto estándar" #: qifimportexport.cpp:84 #, kde-format msgid "Select standard text:" msgstr "Seleccionar texto estándar:" #: qifimportexport.cpp:90 #, kde-format msgid "Date Format" msgstr "Formato de Fecha" #: qifimportexport.cpp:91 #, kde-format msgid "" "The date format in the QIF file is ambiguous. Please select the correct " "format." msgstr "" "El formato de la fecha del archivo QIF es ambiguo. Por favor, elige un " "formato correcto." #: qifimportexport.cpp:100 #, kde-format msgid "Default Account" msgstr "Cuenta por Defecto" #: qifimportexport.cpp:101 #, kde-format msgid "" "Could not find any account definitions in the QIF file. Please select a " "default account. It is also possible that this is caused by a localized " "opening balance text." msgstr "" "No se pudo encontrar ninguna definicion de cuentas en el archivo QIF. Por " "favor, seleccione una cuenta por defecto. Es posible que esto sea causado " "por utilizar una localizacion del texto del balance." #: qifimportexport.cpp:104 #, kde-format msgid "Default account:" msgstr "Cuenta por Defecto:" #: qifimportexport.cpp:115 #, kde-format msgid "Opening balance text:" msgstr "" #: qifimportexport.cpp:121 #, kde-format msgid "Descriptions" msgstr "Descripciones" #: qifimportexport.cpp:122 #, kde-format msgid "" "Transactions in QIF files does not have any specific description property. " "You are therefore given the option to choose how the description of imported " "transactions will be set." msgstr "" #: qifimportexport.cpp:125 #, kde-format msgid "Subcategories as:" msgstr "Subcategorías como:" #: qifimportexport.cpp:134 #, kde-format msgid "Ignore" msgstr "Omitir" #: qifimportexport.cpp:137 #, kde-format msgid "Payee as:" msgstr "Acreedor como:" #: qifimportexport.cpp:142 qifimportexport.cpp:520 #: transactionlistwidget.cpp:119 #, kde-format msgid "Payee" msgstr "Acreedor" #: qifimportexport.cpp:147 #, kde-format msgid "Memo as:" msgstr "" #: qifimportexport.cpp:156 #, kde-format msgid "Priority:" msgstr "Prioridad:" #: qifimportexport.cpp:159 #, kde-format msgid "Subcategory/Payee/Comments" msgstr "Subcategoría/Acreedor/comentarios" #: qifimportexport.cpp:160 #, kde-format msgid "Payee/Subcategory/Comments" msgstr "Acreedor/Subcategoría/Comentarios" #: qifimportexport.cpp:161 #, kde-format msgid "Subcategory/Comments/Payee" msgstr "" #: qifimportexport.cpp:162 #, kde-format msgid "Payee/Comments/Subcategory" msgstr "" #: qifimportexport.cpp:163 #, kde-format msgid "Comments/Subcategory/Payee" msgstr "" #: qifimportexport.cpp:164 #, kde-format msgid "Comments/Payee/Subcategory" msgstr "" #: qifimportexport.cpp:314 qifimportexport.cpp:322 qifimportexport.cpp:338 #, kde-format msgid "Unknown" msgstr "Desconocido" #: qifimportexport.cpp:324 #, kde-format msgid "Bank" msgstr "Banco" #: qifimportexport.cpp:326 #, kde-format msgid "Cat (Category)" msgstr "Cat (Categoría)" #: qifimportexport.cpp:327 #, kde-format msgid "CCard (Credit Card)" msgstr "CCard (Tarjeta de Crédito)" #: qifimportexport.cpp:328 #, kde-format msgid "Invst (Investment)" msgstr "Invst (Inversión)" #: qifimportexport.cpp:329 #, kde-format msgid "Oth A (Other Assets)" msgstr "Oth A (Otros Activos)" #: qifimportexport.cpp:330 #, kde-format msgid "Oth L (Other Liabilities)" msgstr "Oth L (Otras Responsabilidades)" #: qifimportexport.cpp:331 #, kde-format msgid "Security" msgstr "Seguridad" #: qifimportexport.cpp:465 #, kde-format msgid "Successfully imported 1 account." msgid_plural "Successfully imported %n accounts." msgstr[0] "Importada 1 cuenta satisfactoriamente" msgstr[1] "Importadas %n cuentas satisfactoriamente" #: qifimportexport.cpp:469 #, kde-format msgid "Successfully imported 1 category." msgid_plural "Successfully imported %n categories." msgstr[0] "Importada 1 categoría satisfactoriamente." msgstr[1] "Importadas %n categorías satisfactoriamente." #: qifimportexport.cpp:473 #, kde-format msgid "1 duplicate transaction was ignored." msgid_plural "%n duplicate transactions was ignored." msgstr[0] "1 transacción duplicada ha sido ignorada." msgstr[1] "%n transacciones duplicadas han sido ignoradas." #: qifimportexport.cpp:477 #, kde-format msgid "Failed to import 1 transaction." msgid_plural "Failed to import %n transactions." msgstr[0] "Fallo al importar 1 transacción." msgstr[1] "Fallo al importar %n transacciones." #: qifimportexport.cpp:481 #, kde-format msgid "1 security was not imported." msgid_plural "%n securities were not imported." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:485 #, fuzzy, kde-format msgid "1 security transaction was not imported." msgid_plural "%n security transactions were not imported." msgstr[0] "Transacciones Seguras" msgstr[1] "Transacciones Seguras" #: qifimportexport.cpp:494 #, kde-format msgid "Export QIF File" msgstr "Exportar archivo QIF" #: qifimportexport.cpp:506 #, kde-format msgctxt "All accounts" msgid "All" msgstr "Todo" #: qifimportexport.cpp:517 #, kde-format msgid "Export transaction description as:" msgstr "" #: qifimportexport.cpp:524 #, kde-format msgid "Memo" msgstr "Nota" #: qifimportexport.cpp:528 #, kde-format msgid "Subcategory" msgstr "Subcategoría" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 5 #: rc.cpp:3 #, kde-format msgid "&Import" msgstr "&Importar" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 12 #: rc.cpp:6 #, kde-format msgid "&Accounts" msgstr "&Cuentas" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 24 #: rc.cpp:9 #, kde-format msgid "&Transactions" msgstr "&Transacciones" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 41 #: rc.cpp:12 #, kde-format msgid "&Securities" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 56 #: rc.cpp:15 #, kde-format msgid "Stat&istics" msgstr "Estad&ísticas" #: rc.cpp:16 #, kde-format msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" ",Launchpad Contributions:,Alejandro Mas Chiotakis,Dagor Olwe,Ernesto Ramirez " "G,Mario César Señoranis,MiltonInostrozaAguilera,Paco Molinero,Steven De " "Winter,eternal1,Ángel Eduardo" #: rc.cpp:17 #, kde-format msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" ",,alejandro.maschiotakis@gmail.com,soron.registro@gmail.com,,mariocesar." "c50@gmail.com,minoztro@gmail.com,paco@byasl.com,,,arcnor@arcnor.com" #: recurrenceeditwidget.cpp:69 #, kde-format msgid "Edit Exceptions" msgstr "Editar Excepciones" #: recurrenceeditwidget.cpp:186 #, kde-format msgid "Edit Recurrence Range" msgstr "Editar Rango de Repetición" #: recurrenceeditwidget.cpp:194 recurrenceeditwidget.cpp:229 #, kde-format msgid "Begins on: %1" msgstr "Inicia en: %1" #: recurrenceeditwidget.cpp:199 #, kde-format msgid "No ending date" msgstr "Sin fecha de finalización" #: recurrenceeditwidget.cpp:203 #, kde-format msgid "End after" msgstr "Termina después" #: recurrenceeditwidget.cpp:209 #, kde-format msgid "occurrence(s)" msgstr "ocurrencia(s)" #: recurrenceeditwidget.cpp:211 #, kde-format msgid "End on" msgstr "Termina en" #: recurrenceeditwidget.cpp:298 #, kde-format msgid "End date before start date." msgstr "La fecha de finalización es anterior a la fecha de inicio" #: recurrenceeditwidget.cpp:312 #, kde-format msgid "Enable recurrance" msgstr "Repetición permitida" #: recurrenceeditwidget.cpp:315 #, kde-format msgid "Recurrence Rule" msgstr "Regla de repetición" #: recurrenceeditwidget.cpp:321 #, kde-format msgid "Weekly" msgstr "Semanalmente" #: recurrenceeditwidget.cpp:341 recurrenceeditwidget.cpp:352 #: recurrenceeditwidget.cpp:376 recurrenceeditwidget.cpp:462 #, kde-format msgid "Recur every" msgstr "Repetir cada" #: recurrenceeditwidget.cpp:345 #, kde-format msgid "day(s)" msgstr "día(s)" #: recurrenceeditwidget.cpp:356 #, kde-format msgid "week(s) on:" msgstr "semana(s) en:" #: recurrenceeditwidget.cpp:380 #, kde-format msgid "month(s), after the start month" msgstr "mes(es), después del mes de comienzo" #: recurrenceeditwidget.cpp:385 recurrenceeditwidget.cpp:437 #, kde-format msgid "Recur on the" msgstr "Repetir el" #: recurrenceeditwidget.cpp:391 recurrenceeditwidget.cpp:442 #: recurrenceeditwidget.cpp:494 #, kde-format msgid "1st" msgstr "1º" #: recurrenceeditwidget.cpp:392 recurrenceeditwidget.cpp:443 #: recurrenceeditwidget.cpp:495 #, kde-format msgid "2nd" msgstr "2º" #: recurrenceeditwidget.cpp:393 recurrenceeditwidget.cpp:444 #: recurrenceeditwidget.cpp:496 #, kde-format msgid "3rd" msgstr "3º" #: recurrenceeditwidget.cpp:394 recurrenceeditwidget.cpp:445 #: recurrenceeditwidget.cpp:497 #, kde-format msgid "4th" msgstr "4º" #: recurrenceeditwidget.cpp:395 recurrenceeditwidget.cpp:446 #: recurrenceeditwidget.cpp:498 #, kde-format msgid "5th" msgstr "5º" #: recurrenceeditwidget.cpp:396 #, kde-format msgid "6th" msgstr "6º" #: recurrenceeditwidget.cpp:397 #, kde-format msgid "7th" msgstr "7º" #: recurrenceeditwidget.cpp:398 #, kde-format msgid "8th" msgstr "8º" #: recurrenceeditwidget.cpp:399 #, kde-format msgid "9th" msgstr "9º" #: recurrenceeditwidget.cpp:400 #, kde-format msgid "10th" msgstr "10º" #: recurrenceeditwidget.cpp:401 #, kde-format msgid "11th" msgstr "11º" #: recurrenceeditwidget.cpp:402 #, kde-format msgid "12th" msgstr "12º" #: recurrenceeditwidget.cpp:403 #, kde-format msgid "13th" msgstr "13º" #: recurrenceeditwidget.cpp:404 #, kde-format msgid "14th" msgstr "14º" #: recurrenceeditwidget.cpp:405 #, kde-format msgid "15th" msgstr "15º" #: recurrenceeditwidget.cpp:406 #, kde-format msgid "16th" msgstr "16º" #: recurrenceeditwidget.cpp:407 #, kde-format msgid "17th" msgstr "17º" #: recurrenceeditwidget.cpp:408 #, kde-format msgid "18th" msgstr "18º" #: recurrenceeditwidget.cpp:409 #, kde-format msgid "19th" msgstr "19º" #: recurrenceeditwidget.cpp:410 #, kde-format msgid "20th" msgstr "20º" #: recurrenceeditwidget.cpp:411 #, kde-format msgid "21st" msgstr "21" #: recurrenceeditwidget.cpp:412 #, kde-format msgid "22nd" msgstr "22º" #: recurrenceeditwidget.cpp:413 #, kde-format msgid "23rd" msgstr "23º" #: recurrenceeditwidget.cpp:414 #, kde-format msgid "24th" msgstr "24º" #: recurrenceeditwidget.cpp:415 #, kde-format msgid "25th" msgstr "25º" #: recurrenceeditwidget.cpp:416 #, kde-format msgid "26th" msgstr "26º" #: recurrenceeditwidget.cpp:417 #, kde-format msgid "27th" msgstr "27º" #: recurrenceeditwidget.cpp:418 #, kde-format msgid "28th" msgstr "28º" #: recurrenceeditwidget.cpp:419 #, kde-format msgid "29th" msgstr "29º" #: recurrenceeditwidget.cpp:420 #, kde-format msgid "30th" msgstr "30º" #: recurrenceeditwidget.cpp:421 #, kde-format msgid "31st" msgstr "31º" #: recurrenceeditwidget.cpp:422 recurrenceeditwidget.cpp:447 #: recurrenceeditwidget.cpp:499 #, kde-format msgid "Last" msgstr "Último" #: recurrenceeditwidget.cpp:423 recurrenceeditwidget.cpp:448 #: recurrenceeditwidget.cpp:500 #, kde-format msgid "2nd Last" msgstr "Penúltimo" #: recurrenceeditwidget.cpp:424 recurrenceeditwidget.cpp:449 #: recurrenceeditwidget.cpp:501 #, kde-format msgid "3rd Last" msgstr "Antepenúltimo" #: recurrenceeditwidget.cpp:425 recurrenceeditwidget.cpp:450 #: recurrenceeditwidget.cpp:502 #, kde-format msgid "4th Last" msgstr "4 Último" #: recurrenceeditwidget.cpp:426 recurrenceeditwidget.cpp:451 #: recurrenceeditwidget.cpp:503 #, kde-format msgid "5th Last" msgstr "5 Último" #: recurrenceeditwidget.cpp:429 #, kde-format msgid "day" msgstr "día" #: recurrenceeditwidget.cpp:431 recurrenceeditwidget.cpp:483 #: recurrenceeditwidget.cpp:521 #, kde-format msgid "possibly on weekend" msgstr "" #: recurrenceeditwidget.cpp:432 recurrenceeditwidget.cpp:484 #: recurrenceeditwidget.cpp:522 #, kde-format msgid "but before weekend" msgstr "" #: recurrenceeditwidget.cpp:433 recurrenceeditwidget.cpp:485 #: recurrenceeditwidget.cpp:523 #, kde-format msgid "but after weekend" msgstr "pero después del fin de semana" #: recurrenceeditwidget.cpp:466 #, kde-format msgid "year(s), after the start year" msgstr "" #: recurrenceeditwidget.cpp:471 #, kde-format msgctxt "part before XXX of 'Recur on day XXX of month YYY'" msgid "Recur on day" msgstr "Repetir el día" #: recurrenceeditwidget.cpp:479 #, kde-format msgctxt "part between XXX and YYY of 'Recur on day XXX of month YYY'" msgid "of" msgstr "de" #: recurrenceeditwidget.cpp:489 #, kde-format msgctxt "Part before NNN in 'Recur on the NNN. WEEKDAY of MONTH'" msgid "On the" msgstr "En el/la" #: recurrenceeditwidget.cpp:507 #, kde-format msgctxt "part between WEEKDAY and MONTH in 'Recur on NNN. WEEKDAY of MONTH'" msgid "of" msgstr "de" #: recurrenceeditwidget.cpp:512 #, kde-format msgid "Recur on day #" msgstr "" #: recurrenceeditwidget.cpp:519 #, kde-format msgctxt "part after NNN of 'Recur on day #NNN of the year'" msgid " of the year" msgstr " del año" #: recurrenceeditwidget.cpp:533 #, kde-format msgid "Range..." msgstr "Rango..." #: recurrenceeditwidget.cpp:535 #, kde-format msgid "Exceptions..." msgstr "Excepciones..." #: recurrenceeditwidget.cpp:731 #, kde-format msgid "No day of week selected for weekly recurrence." msgstr "Ningún día de la semana seleccionado para la repetición semanal" #: recurrenceeditwidget.cpp:745 recurrenceeditwidget.cpp:774 #: recurrenceeditwidget.cpp:791 #, kde-format msgid "Selected day will never occur with selected frequency and start date." msgstr "" #: recurrenceeditwidget.cpp:761 #, kde-format msgid "Selected day does not exist in selected month." msgstr "" #: transaction.cpp:155 transaction.cpp:186 #, kde-format msgid "Dividend: %1" msgstr "" #: transaction.cpp:253 transaction.cpp:256 transaction.cpp:284 #, kde-format msgid "Account balancing" msgstr "" #: transaction.cpp:337 transaction.cpp:352 #, kde-format msgid "Security: %1 (bought)" msgstr "Seguridad: %1 (comprado)" #: transaction.cpp:375 transaction.cpp:390 #, kde-format msgid "Security: %1 (sold)" msgstr "Seguridad: %1 (vendido)" #: transactioneditwidget.cpp:125 #, kde-format msgid "Shares bought:" msgstr "" #: transactioneditwidget.cpp:130 #, kde-format msgid "Shares sold:" msgstr "" #: transactioneditwidget.cpp:238 transactioneditwidget.cpp:1144 #: transactionfilterwidget.cpp:140 #, kde-format msgid "Payer:" msgstr "Deudor:" #: transactioneditwidget.cpp:280 transactioneditwidget.cpp:1145 #: transactionfilterwidget.cpp:141 #, kde-format msgid "Payee:" msgstr "Acreedor:" #: transactioneditwidget.cpp:664 transactioneditwidget.cpp:1262 #, kde-format msgid "No income category available." msgstr "" #: transactioneditwidget.cpp:689 transactioneditwidget.cpp:1270 #, kde-format msgid "No expense category available." msgstr "Ninguna categoría de gastos disponible" #: transactioneditwidget.cpp:720 #, kde-format msgid "Cannot create a regular transfer to/from a securities account." msgstr "" #: transactioneditwidget.cpp:727 #, kde-format msgid "Cannot create a regular income to a securities account." msgstr "" #: transactioneditwidget.cpp:743 #, kde-format msgid "Zero price per share not allowed." msgstr "" #: transactioneditwidget.cpp:755 #, kde-format msgid "Cannot create a regular expense from a securities account." msgstr "" #: transactioneditwidget.cpp:1086 #, kde-format msgid "Modify Transactions" msgstr "" #: transactionfilterwidget.cpp:99 #, kde-format msgid "Min amount:" msgstr "Cantidad mínima" #: transactionfilterwidget.cpp:100 #, kde-format msgid "Max amount:" msgstr "Cantidad máxima" #: transactionfilterwidget.cpp:110 #, kde-format msgid "Min income:" msgstr "Ingresos mínimos" #: transactionfilterwidget.cpp:111 #, kde-format msgid "Max income:" msgstr "Ingresos máximos" #: transactionfilterwidget.cpp:121 #, kde-format msgid "Min cost:" msgstr "Coste mínimo" #: transactionfilterwidget.cpp:122 #, kde-format msgid "Max cost:" msgstr "Coste máximo" #: transactionfilterwidget.cpp:148 #, kde-format msgid "Include" msgstr "Incluir" #: transactionfilterwidget.cpp:152 #, kde-format msgid "Exclude" msgstr "Excluir" #: transactionlistwidget.cpp:117 #, kde-format msgid "From Account" msgstr "" #: transactionlistwidget.cpp:128 #, kde-format msgid "To Account" msgstr "A la cuenta" #: transactionlistwidget.cpp:130 #, kde-format msgid "Payer" msgstr "Deudor" #: transactionlistwidget.cpp:169 #, kde-format msgid "New/Edit Expense" msgstr "Nuevo/Editar Gasto" #: transactionlistwidget.cpp:170 #, kde-format msgid "Filter" msgstr "Filtro" #: transactionlistwidget.cpp:209 #, kde-format msgid "Total:" msgstr "Total:" #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:328 #, kde-format msgid "Average:" msgstr "Promedio:" #: transactionlistwidget.cpp:209 #, kde-format msgid "Monthly:" msgstr "Mensual" #: transactionlistwidget.cpp:314 #, kde-format msgid "Total cost:" msgstr "Costo Total:" #: transactionlistwidget.cpp:318 #, kde-format msgid "Total income:" msgstr "Ingreso Total" #: transactionlistwidget.cpp:322 #, kde-format msgid "Total amount:" msgstr "Monto total" #: transactionlistwidget.cpp:330 #, kde-format msgid "Monthly average:" msgstr "Promedio Mensual" #: transactionlistwidget.cpp:671 #, kde-format msgid "" "Are you sure you want to delete all (%1) transactions in the selected split " "transaction?" msgstr "" #: transactionlistwidget.cpp:1028 #, kde-format msgid "* Part of split transaction" msgstr "" #: transactionlistwidget.cpp:1029 #, kde-format msgid "* Part of split (%1)" msgstr "* Parte (%1) del corte" #: transactionlistwidget.cpp:1033 #, kde-format msgid "** Recurring (editing occurrance)" msgstr "" #: transactionlistwidget.cpp:1049 #, kde-format msgid "Modify..." msgstr "Modificar..." eqonomize-0.6/po/fr.po0000644000175000017500000024242711107053373013721 0ustar hannahanna# translation of eqonomize.po to Français # This file is put in the public domain. # Jérôme Rapinat , 2006. # Antoine Rodriguez , 2006. # msgid "" msgstr "" "Project-Id-Version: 0.4cvs\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?" "group_id=173799&atid=866832\n" "POT-Creation-Date: 2008-11-13 14:35+0100\n" "PO-Revision-Date: 2008-03-07 22:26+0000\n" "Last-Translator: Perrine \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2008-11-12 16:02+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: budget.cpp:51 editsplitdialog.cpp:118 ledgerdialog.cpp:652 #, kde-format msgid "Balancing" msgstr "solde" #: budget.cpp:84 #, kde-format msgid "Couldn't open %1 for reading" msgstr "Impossible d'ouvrir %1 en lecture" #: budget.cpp:95 #, kde-format msgid "" "Not a valid Eqonomize! file (XML parse error: \"%2\" at line %3, col %4)" msgstr "" "Fichier Eqonomize! non valide (Erreur d'analyse XML: \"%2\" à la ligne %3, " "col %4)" #: budget.cpp:98 #, kde-format msgid "Invalid root element %1 in XML document" msgstr "L'élément racine %1 du document XML est invalide" #: budget.cpp:363 #, kde-format msgid "Unable to load 1 account." msgid_plural "Unable to load %n accounts." msgstr[0] "Impossible de charger 1 compte." msgstr[1] "Impossible de charger %n comptes." #: budget.cpp:368 #, kde-format msgid "Unable to load 1 category." msgid_plural "Unable to load %n categories." msgstr[0] "Impossible de charger 1 catégorie." msgstr[1] "Impossible de charger %n catégories." #: budget.cpp:373 #, kde-format msgid "Unable to load 1 security." msgid_plural "Unable to load %n securities." msgstr[0] "Impossible de charger 1 sécurité." msgstr[1] "Impossible de charger %n sécurités." #: budget.cpp:378 #, kde-format msgid "Unable to load 1 transaction." msgid_plural "Unable to load %n transactions." msgstr[0] "Impossible de charger 1 transaction." msgstr[1] "Impossible de charger %n transactions." #: budget.cpp:389 #, kde-format msgid "File is a directory" msgstr "Le fichier est un répertoire" #: budget.cpp:397 #, kde-format msgid "Couldn't open file for writing" msgstr "Impossible d'ouvrir le fichier en écriture" #: budget.cpp:547 budget.cpp:551 #, kde-format msgid "Error while writing file; file was not saved" msgstr "Erreur lors de l'enregistrement ; fichier non sauvegardé" #: categoriescomparisonchart.cpp:123 categoriescomparisonreport.cpp:164 #: eqonomize.cpp:1797 eqonomize.cpp:1957 eqonomize.cpp:2036 #: transactionlistwidget.cpp:138 #, kde-format msgid "From" msgstr "De" #: categoriescomparisonchart.cpp:130 categoriescomparisonreport.cpp:171 #: eqonomize.cpp:1808 eqonomize.cpp:1969 eqonomize.cpp:2037 #: transactionlistwidget.cpp:139 #, kde-format msgid "To" msgstr "A" #: categoriescomparisonchart.cpp:147 categoriescomparisonreport.cpp:114 #: overtimechart.cpp:112 overtimechart.cpp.bak:106 overtimereport.cpp:97 #, kde-format msgid "Source:" msgstr "Source:" #: categoriescomparisonchart.cpp:150 categoriescomparisonchart.cpp:858 #, kde-format msgid "All Expenses" msgstr "Toutes les dépenses" #: categoriescomparisonchart.cpp:151 categoriescomparisonchart.cpp:859 #, kde-format msgid "All Incomes" msgstr "Tous les revenus" #: categoriescomparisonchart.cpp:152 categoriescomparisonchart.cpp:860 #, kde-format msgid "All Accounts" msgstr "Tous les comptes" #: categoriescomparisonchart.cpp:155 categoriescomparisonchart.cpp:864 #: categoriescomparisonreport.cpp:122 categoriescomparisonreport.cpp:752 #: categoriescomparisonreport.cpp:1016 overtimereport.cpp:375 #, kde-format msgid "Expenses: %1" msgstr "Dépenses: %1" #: categoriescomparisonchart.cpp:160 categoriescomparisonchart.cpp:871 #: categoriescomparisonreport.cpp:127 categoriescomparisonreport.cpp:756 #: categoriescomparisonreport.cpp:1023 overtimereport.cpp:366 #, kde-format msgid "Incomes: %1" msgstr "Revenus: %1" #: categoriescomparisonchart.cpp:199 categoriescomparisonchart.cpp:225 #: categoriescomparisonreport.cpp:334 categoriescomparisonreport.cpp:360 #: editsplitdialog.cpp:411 eqonomize.cpp:482 eqonomize.cpp:571 #: eqonomize.cpp:741 eqonomize.cpp:848 eqonomize.cpp:870 eqonomize.cpp:2483 #: eqonomize.cpp:3180 eqonomize.cpp:3206 eqonomize.cpp:3326 eqonomize.cpp:3352 #: importcsvdialog.cpp:780 importcsvdialog.cpp:1196 overtimechart.cpp:462 #: overtimechart.cpp:500 overtimechart.cpp:528 overtimechart.cpp:566 #: overtimechart.cpp.bak:455 overtimechart.cpp.bak:493 #: overtimechart.cpp.bak:521 overtimechart.cpp.bak:559 #: recurrenceeditwidget.cpp:156 recurrenceeditwidget.cpp:171 #: recurrenceeditwidget.cpp:293 transactioneditwidget.cpp:707 #: transactioneditwidget.cpp:1281 transactionfilterwidget.cpp:564 #: transactionfilterwidget.cpp:590 #, kde-format msgid "Invalid date." msgstr "Date invalide." #: categoriescomparisonchart.cpp:204 categoriescomparisonreport.cpp:339 #: eqonomize.cpp:3185 eqonomize.cpp:3331 transactionfilterwidget.cpp:569 #, kde-format msgid "To date is before from date." msgstr "La date est antérieure à la date visée" #: categoriescomparisonchart.cpp:229 categoriescomparisonreport.cpp:364 #: eqonomize.cpp:3210 eqonomize.cpp:3356 transactionfilterwidget.cpp:594 #, kde-format msgid "From date is after to date." msgstr "La date est postérieure à la date visée" #: categoriescomparisonchart.cpp:340 categoriescomparisonreport.cpp:463 #: eqonomize.cpp:3610 eqonomize.cpp:4252 ledgerdialog.cpp:251 #: overtimechart.cpp:624 overtimechart.cpp.bak:617 overtimereport.cpp:278 #: qifimportexport.cpp:604 #, kde-format msgid "" "The selected file already exists. Would you like to overwrite the old copy?" msgstr "" "Le fichier existe déjà. Voulez-vous réécrire par dessus l'ancien fichier?" #: categoriescomparisonchart.cpp:344 categoriescomparisonreport.cpp:467 #: eqonomize.cpp:4257 ledgerdialog.cpp:255 overtimechart.cpp:628 #: overtimechart.cpp.bak:621 overtimereport.cpp:282 qifimportexport.cpp:608 #, kde-format msgid "You selected a directory!" msgstr "Vous avez sélectionné un répertoire!" #: categoriescomparisonchart.cpp:352 categoriescomparisonreport.cpp:475 #: eqonomize.cpp:4264 ledgerdialog.cpp:263 overtimechart.cpp:636 #: overtimechart.cpp.bak:629 overtimereport.cpp:290 qifimportexport.cpp:616 #, kde-format msgid "Couldn't open file for writing." msgstr "Impossible d' ouvrir le fichier en écriture." #: categoriescomparisonchart.cpp:372 categoriescomparisonreport.cpp:482 #: eqonomize.cpp:4270 ledgerdialog.cpp:269 overtimechart.cpp:656 #: overtimechart.cpp.bak:644 overtimereport.cpp:297 qifimportexport.cpp:622 #, kde-format msgid "Error while writing file; file was not saved." msgstr "Erreur lors de l' écriture du fichier ; fichier non sauvegardé." #: categoriescomparisonchart.cpp:728 categoriescomparisonreport.cpp:303 #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:754 #: categoriescomparisonreport.cpp:839 categoriescomparisonreport.cpp:930 #: categoriescomparisonreport.cpp:977 overtimechart.cpp:373 #: overtimechart.cpp:1740 overtimechart.cpp:1746 overtimechart.cpp:1774 #: overtimechart.cpp:1776 overtimechart.cpp:1783 overtimechart.cpp:1785 #: overtimechart.cpp:1821 overtimechart.cpp:1891 overtimechart.cpp.bak:366 #: overtimechart.cpp.bak:1721 overtimechart.cpp.bak:1727 #: overtimechart.cpp.bak:1755 overtimechart.cpp.bak:1757 #: overtimechart.cpp.bak:1764 overtimechart.cpp.bak:1766 #: overtimechart.cpp.bak:1811 overtimechart.cpp.bak:1892 #: overtimereport.cpp:213 overtimereport.cpp:384 overtimereport.cpp:393 #: overtimereport.cpp:732 #, kde-format msgid "No description" msgstr "Pas de description" #: categoriescomparisonreport.cpp:119 categoriescomparisonreport.cpp:1012 #, kde-format msgid "All Categories" msgstr "Toutes les catégories" #: categoriescomparisonreport.cpp:138 #, kde-format msgid "Descriptions for" msgstr "Descriptions pour" #: categoriescomparisonreport.cpp:145 #, kde-format msgid "Payees/payers for" msgstr "Bénéficiaires/Débiteurs pour" #: categoriescomparisonreport.cpp:161 #, kde-format msgid "Period:" msgstr "Période:" #: categoriescomparisonreport.cpp:186 overtimereport.cpp:120 #, kde-format msgid "Columns:" msgstr "Colonnes:" #: categoriescomparisonreport.cpp:189 categoriescomparisonreport.cpp:782 #: eqonomize.cpp:1062 eqonomize.cpp:1935 eqonomize.cpp:4142 #: importcsvdialog.cpp:139 importcsvdialog.cpp:157 importcsvdialog.cpp:180 #: importcsvdialog.cpp:197 importcsvdialog.cpp:216 importcsvdialog.cpp:235 #: importcsvdialog.cpp:253 overtimereport.cpp:123 #, kde-format msgid "Value" msgstr "Valeur" #: categoriescomparisonreport.cpp:192 overtimereport.cpp:126 #: recurrenceeditwidget.cpp:320 #, kde-format msgid "Daily" msgstr "Journalier" #: categoriescomparisonreport.cpp:195 overtimereport.cpp:129 #: recurrenceeditwidget.cpp:322 #, kde-format msgid "Monthly" msgstr "Mensuel" #: categoriescomparisonreport.cpp:198 overtimereport.cpp:132 #: recurrenceeditwidget.cpp:323 #, kde-format msgid "Yearly" msgstr "Annuel" #: categoriescomparisonreport.cpp:201 categoriescomparisonreport.cpp:787 #: overtimechart.cpp:205 overtimechart.cpp:1534 overtimechart.cpp.bak:198 #: overtimechart.cpp.bak:1515 overtimereport.cpp:135 overtimereport.cpp:549 #: transactionlistwidget.cpp:276 transactionlistwidget.cpp:340 #, kde-format msgid "Quantity" msgstr "Quantité" #: categoriescomparisonreport.cpp:204 overtimechart.cpp:209 #: overtimechart.cpp.bak:202 overtimereport.cpp:138 #, kde-format msgid "Average value" msgstr "Valeur moyenne" #: categoriescomparisonreport.cpp:278 categoriescomparisonreport.cpp:947 #, kde-format msgid "All descriptions" msgstr "Toutes les descriptions" #: categoriescomparisonreport.cpp:279 categoriescomparisonreport.cpp:948 #, kde-format msgid "All payees" msgstr "Tous les bénéficiaires" #: categoriescomparisonreport.cpp:280 categoriescomparisonreport.cpp:949 #, kde-format msgid "All payers" msgstr "Tous les débiteurs" #: categoriescomparisonreport.cpp:309 categoriescomparisonreport.cpp:751 #: categoriescomparisonreport.cpp:837 categoriescomparisonreport.cpp:932 #: categoriescomparisonreport.cpp:994 overtimechart.cpp:382 #: overtimechart.cpp:1758 overtimechart.cpp:1768 overtimechart.cpp:1823 #: overtimechart.cpp:1908 overtimechart.cpp.bak:375 overtimechart.cpp.bak:1739 #: overtimechart.cpp.bak:1749 overtimechart.cpp.bak:1813 #: overtimechart.cpp.bak:1909 #, kde-format msgid "No payee" msgstr "Pas de bénéficiaire" #: categoriescomparisonreport.cpp:310 categoriescomparisonreport.cpp:755 #: categoriescomparisonreport.cpp:838 categoriescomparisonreport.cpp:933 #: categoriescomparisonreport.cpp:995 overtimechart.cpp:381 #: overtimechart.cpp:1752 overtimechart.cpp:1763 overtimechart.cpp:1825 #: overtimechart.cpp:1907 overtimechart.cpp.bak:374 overtimechart.cpp.bak:1733 #: overtimechart.cpp.bak:1744 overtimechart.cpp.bak:1815 #: overtimechart.cpp.bak:1908 #, kde-format msgid "No payer" msgstr "Pas de débiteur" #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:751 #: overtimereport.cpp:393 #, kde-format msgid "Expenses: %2, %1" msgstr "Dépenses: %2, %1" #: categoriescomparisonreport.cpp:754 categoriescomparisonreport.cpp:755 #: overtimereport.cpp:384 #, kde-format msgid "Incomes: %2, %1" msgstr "Revenus: %2, %1" #: categoriescomparisonreport.cpp:758 #, kde-format msgid "Incomes & Expenses" msgstr "Revenus & Dépenses" #: categoriescomparisonreport.cpp:771 #, kde-format msgctxt "html format; %1: title; %2: from date; %3: to date" msgid "%1 (%2–%3)" msgstr "%1 (%2–%3)" #: categoriescomparisonreport.cpp:772 #, kde-format msgctxt "html format; %1: title; %2: to date" msgid "%1 (to %2)" msgstr "%1 (to %2)" #: categoriescomparisonreport.cpp:776 eqonomize.cpp:4046 eqonomize.cpp:4094 #: qifimportexport.cpp:131 transactionlistwidget.cpp:116 #: transactionlistwidget.cpp:127 #, kde-format msgid "Category" msgstr "Catégorie" #: categoriescomparisonreport.cpp:778 eqonomize.cpp:1938 #: transactionlistwidget.cpp:115 #, kde-format msgid "Cost" msgstr "Coût" #: categoriescomparisonreport.cpp:780 editscheduledtransactiondialog.cpp:46 #: editsplitdialog.cpp:108 eqonomize.cpp:285 eqonomize.cpp:329 #: ledgerdialog.cpp:647 transactionlistwidget.cpp:126 #, kde-format msgid "Income" msgstr "Revenu" #: categoriescomparisonreport.cpp:784 overtimereport.cpp:545 #, kde-format msgid "Daily Average" msgstr "Moyenne journalière" #: categoriescomparisonreport.cpp:785 overtimereport.cpp:546 #, kde-format msgid "Monthly Average" msgstr "Moyenne mensuelle" #: categoriescomparisonreport.cpp:786 overtimereport.cpp:547 #, kde-format msgid "Yearly Average" msgstr "Moyenne annuelle" #: categoriescomparisonreport.cpp:789 overtimereport.cpp:358 #: overtimereport.cpp:376 overtimereport.cpp:394 #, kde-format msgid "Average Cost" msgstr "Coût moyen" #: categoriescomparisonreport.cpp:791 overtimereport.cpp:350 #: overtimereport.cpp:367 overtimereport.cpp:385 #, kde-format msgid "Average Income" msgstr "Revenu moyen" #: categoriescomparisonreport.cpp:793 #, kde-format msgid "Average Value" msgstr "Valeur moyenne" #: categoriescomparisonreport.cpp:853 eqonomize.cpp:3932 eqonomize.cpp:4030 #: eqonomize.cpp:4075 eqonomize.cpp:4123 overtimereport.cpp:686 #, kde-format msgid "Total" msgstr "Total" #: categoriescomparisonreport.cpp:878 #, kde-format msgid "Total incomes" msgstr "Revenus totaux" #: categoriescomparisonreport.cpp:902 #, kde-format msgid "Total expenses" msgstr "Dépenses totales" #: categoriescomparisonreport.cpp:912 #, kde-format msgid "Total (Profits)" msgstr "Total (Profits)" #: editscheduledtransactiondialog.cpp:45 editsplitdialog.cpp:111 #: eqonomize.cpp:288 eqonomize.cpp:332 ledgerdialog.cpp:650 #, kde-format msgid "Expense" msgstr "Dépense" #: editscheduledtransactiondialog.cpp:47 editsplitdialog.cpp:120 #: eqonomize.cpp:282 eqonomize.cpp:326 ledgerdialog.cpp:653 #, kde-format msgid "Transfer" msgstr "Transfère" #: editscheduledtransactiondialog.cpp:48 editsplitdialog.cpp:114 #: eqonomize.cpp:289 eqonomize.cpp:333 #, kde-format msgid "Security Buy" msgstr "Achat de titres" #: editscheduledtransactiondialog.cpp:49 editsplitdialog.cpp:116 #: eqonomize.cpp:290 eqonomize.cpp:334 #, kde-format msgid "Security Sell" msgstr "Vente de titres" #: editscheduledtransactiondialog.cpp:56 editscheduledtransactiondialog.cpp:57 #, kde-format msgid "Recurrence" msgstr "Récurrence" #: editscheduledtransactiondialog.cpp:104 #, kde-format msgid "New Expense" msgstr "Nouvelle dépense" #: editscheduledtransactiondialog.cpp:106 #, kde-format msgid "New Dividend" msgstr "Nouveau dividende" #: editscheduledtransactiondialog.cpp:107 #, kde-format msgid "New Income" msgstr "Nouveau revenu" #: editscheduledtransactiondialog.cpp:110 #, kde-format msgid "New Transfer" msgstr "Nouveau transfert" #: editscheduledtransactiondialog.cpp:111 #, kde-format msgid "New Security Buy" msgstr "Nouvel achat de titres" #: editscheduledtransactiondialog.cpp:113 #, kde-format msgid "New Security Sell" msgstr "Nouvelle vente de titres" #: editscheduledtransactiondialog.cpp:128 #: editscheduledtransactiondialog.cpp:149 transactioneditwidget.cpp:1064 #, kde-format msgid "Edit Expense" msgstr "Éditer la dépense" #: editscheduledtransactiondialog.cpp:130 #: editscheduledtransactiondialog.cpp:151 transactioneditwidget.cpp:1066 #, kde-format msgid "Edit Dividend" msgstr "Éditer le dividende" #: editscheduledtransactiondialog.cpp:131 #: editscheduledtransactiondialog.cpp:152 transactioneditwidget.cpp:1067 #, kde-format msgid "Edit Income" msgstr "Éditer le revenu" #: editscheduledtransactiondialog.cpp:134 #: editscheduledtransactiondialog.cpp:155 transactioneditwidget.cpp:1070 #, kde-format msgid "Edit Transfer" msgstr "Éditer le transfert" #: editscheduledtransactiondialog.cpp:135 #: editscheduledtransactiondialog.cpp:156 transactioneditwidget.cpp:1071 #, kde-format msgid "Edit Securities Bought" msgstr "Éditer les titres achetés" #: editscheduledtransactiondialog.cpp:136 #: editscheduledtransactiondialog.cpp:157 transactioneditwidget.cpp:1072 #, kde-format msgid "Edit Securities Sold" msgstr "Éditer les titres vendus" #: editsplitdialog.cpp:107 eqonomize.cpp:284 eqonomize.cpp:328 #: eqonomize.cpp:1167 #, kde-format msgid "Dividend" msgstr "Dividende" #: editsplitdialog.cpp:109 eqonomize.cpp:403 eqonomize.cpp:445 #: ledgerdialog.cpp:648 #, kde-format msgid "Repayment" msgstr "Remboursement" #: editsplitdialog.cpp:112 eqonomize.cpp:404 eqonomize.cpp:446 #: ledgerdialog.cpp:651 #, kde-format msgid "Refund" msgstr "Rembourser" #: editsplitdialog.cpp:126 ledgerdialog.cpp:638 #, kde-format msgid "Split Transaction" msgstr "Transaction séparée" #: editsplitdialog.cpp:138 eqonomize.cpp:1279 eqonomize.cpp:1379 #: eqonomize.cpp:1473 eqonomize.cpp:1538 importcsvdialog.cpp:129 #: transactioneditwidget.cpp:175 transactioneditwidget.cpp:1099 #: transactionfilterwidget.cpp:135 #, kde-format msgid "Description:" msgstr "Description:" #: editsplitdialog.cpp:143 eqonomize.cpp:413 eqonomize.cpp:523 #: eqonomize.cpp:639 eqonomize.cpp:1274 eqonomize.cpp:2476 #: importcsvdialog.cpp:187 transactioneditwidget.cpp:149 #: transactioneditwidget.cpp:199 transactioneditwidget.cpp:1119 #, kde-format msgid "Date:" msgstr "Date:" #: editsplitdialog.cpp:148 eqonomize.cpp:424 eqonomize.cpp:1252 #: importcsvdialog.cpp:388 importcsvdialog.cpp:399 ledgerdialog.cpp:107 #: qifimportexport.cpp:503 #, kde-format msgid "Account:" msgstr "Compte:" #: editsplitdialog.cpp:163 #, kde-format msgid "Transactions:" msgstr "Transactions:" #: editsplitdialog.cpp:172 eqonomize.cpp:914 eqonomize.cpp:1061 #: eqonomize.cpp:1941 eqonomize.cpp:2033 eqonomize.cpp:3988 #: ledgerdialog.cpp:135 #, kde-format msgid "Type" msgstr "Type" #: editsplitdialog.cpp:173 eqonomize.cpp:915 eqonomize.cpp:2034 #: ledgerdialog.cpp:136 qifimportexport.cpp:127 qifimportexport.cpp:139 #: qifimportexport.cpp:149 transactionlistwidget.cpp:111 #, kde-format msgid "Description" msgstr "Description" #: editsplitdialog.cpp:174 eqonomize.cpp:4142 ledgerdialog.cpp:137 #, kde-format msgid "Account/Category" msgstr "Compte/Catégorie" #: editsplitdialog.cpp:175 #, kde-format msgid "Payment" msgstr "Paiement" #: editsplitdialog.cpp:176 ledgerdialog.cpp:138 #, kde-format msgid "Deposit" msgstr "Dépôt" #: editsplitdialog.cpp:181 ledgerdialog.cpp:151 #, kde-format msgid "New" msgstr "Nouveau" #: editsplitdialog.cpp:184 eqonomize.cpp:4333 #, kde-format msgid "New Expense..." msgstr "Nouvelle dépense..." #: editsplitdialog.cpp:185 eqonomize.cpp:4334 #, kde-format msgid "New Income..." msgstr "Nouveau revenu..." #: editsplitdialog.cpp:186 #, kde-format msgid "New Deposit..." msgstr "Nouveau dépôt..." #: editsplitdialog.cpp:187 #, kde-format msgid "New Withdrawal..." msgstr "Nouveau retrait" #: editsplitdialog.cpp:188 #, fuzzy, kde-format msgid "New Security Shares Bought..." msgstr "Parts achetées..." #: editsplitdialog.cpp:189 #, kde-format msgid "Security Shares Sold..." msgstr "" #: editsplitdialog.cpp:190 #, kde-format msgid "New Dividend..." msgstr "Nouveau dividende" #: editsplitdialog.cpp:191 eqonomize.cpp:924 eqonomize.cpp:1071 #: eqonomize.cpp:4328 ledgerdialog.cpp:158 transactionlistwidget.cpp:1051 #, kde-format msgid "Edit..." msgstr "Éditer..." #: editsplitdialog.cpp:221 eqonomize.cpp:2325 #, kde-format msgid "Total value:" msgstr "Valeur totale:" #: editsplitdialog.cpp:403 transactioneditwidget.cpp:653 #: transactioneditwidget.cpp:657 transactioneditwidget.cpp:668 #: transactioneditwidget.cpp:682 transactioneditwidget.cpp:693 #, kde-format msgid "No suitable account available." msgstr "Pas de compte approprié disponible" #: editsplitdialog.cpp:415 #, kde-format msgid "Future dates is not allowed." msgstr "Les dates futures ne sont pas permises." #: editsplitdialog.cpp:419 #, kde-format msgid "A split must contain at least two transactions." msgstr "Une séparation doit contenir au moins deux transactions." #: editsplitdialog.cpp:428 transactioneditwidget.cpp:714 #, kde-format msgid "Cannot transfer money to and from the same account." msgstr "Impossible de transférer de l'argent de et vers le même compte." #: eqonomize.cpp:419 eqonomize.cpp:2325 importcsvdialog.cpp:146 #: importcsvdialog.cpp:169 importcsvdialog.cpp:355 #: transactioneditwidget.cpp:117 transactioneditwidget.cpp:186 #: transactioneditwidget.cpp:1111 #, kde-format msgid "Cost:" msgstr "Coût:" #: eqonomize.cpp:420 importcsvdialog.cpp:364 importcsvdialog.cpp:397 #: transactioneditwidget.cpp:118 transactioneditwidget.cpp:184 #: transactioneditwidget.cpp:1110 #, kde-format msgid "Income:" msgstr "Revenu:" #: eqonomize.cpp:439 transactioneditwidget.cpp:193 #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:310 #, kde-format msgid "Quantity:" msgstr "Quantité:" #: eqonomize.cpp:443 importcsvdialog.cpp:243 transactioneditwidget.cpp:288 #, kde-format msgid "Comments:" msgstr "Commentaires:" #: eqonomize.cpp:491 eqonomize.cpp:1176 #, kde-format msgid "Reinvested Dividend" msgstr "Réinvestir le dividende" #: eqonomize.cpp:501 transactioneditwidget.cpp:97 #: transactioneditwidget.cpp:157 #, kde-format msgid "Security:" msgstr "Titre:" #: eqonomize.cpp:518 #, kde-format msgid "Shares added:" msgstr "Parts ajoutées:" #: eqonomize.cpp:579 #, kde-format msgid "Security Trade" msgstr "Vente de titres" #: eqonomize.cpp:587 #, kde-format msgid "From security:" msgstr "Titre de:" #: eqonomize.cpp:603 #, kde-format msgid "Shares moved:" msgstr "Parts transférées:" #: eqonomize.cpp:608 transactioneditwidget.cpp:135 #: transactionfilterwidget.cpp:167 transactionfilterwidget.cpp:168 #: transactionfilterwidget.cpp:343 transactionfilterwidget.cpp:380 #, kde-format msgid "All" msgstr "Tout" #: eqonomize.cpp:614 #, kde-format msgid "To security:" msgstr "Vers le titre:" #: eqonomize.cpp:631 #, kde-format msgid "Shares received:" msgstr "Parts reçues:" #: eqonomize.cpp:635 importcsvdialog.cpp:386 importcsvdialog.cpp:412 #: overtimechart.cpp:193 overtimechart.cpp.bak:186 #, kde-format msgid "Value:" msgstr "Valeur:" #: eqonomize.cpp:725 #, kde-format msgid "No other security available for trade in the account." msgstr "Pas d'autre titre disponible pour la vente dans ce compte." #: eqonomize.cpp:737 #, kde-format msgid "Selected to and from securities are the same." msgstr "" #: eqonomize.cpp:745 transactioneditwidget.cpp:735 #, kde-format msgid "Zero shares not allowed." msgstr "Zéro partages non autorisé." #: eqonomize.cpp:749 transactioneditwidget.cpp:739 #, kde-format msgid "Zero value not allowed." msgstr "Valeur nulle non autorisée." #: eqonomize.cpp:757 eqonomize.cpp:766 #, kde-format msgid "Quotations" msgstr "Devis" #: eqonomize.cpp:777 eqonomize.cpp:913 eqonomize.cpp:962 eqonomize.cpp:1060 #: ledgerdialog.cpp:134 transactionlistwidget.cpp:110 #, kde-format msgid "Date" msgstr "Date" #: eqonomize.cpp:778 #, kde-format msgid "Price per Share" msgstr "Prix par part" #: eqonomize.cpp:820 #, kde-format msgid "Quotations for %1" msgstr "Quotations pour %1" #: eqonomize.cpp:904 #, kde-format msgid "" "The following transactions was scheduled to occur today or before today.\n" "Confirm that they have indeed occurred (or will occur today)." msgstr "" "Les transactions suivantes étaient prévues pour se dérouler aujourd'hui ou " "avant aujourd'hui.\n" "Veuillez confirmer qu'elles se sont déroulées (ou vont se dérouler " "aujourd'hui)." #: eqonomize.cpp:916 eqonomize.cpp:2035 transactionlistwidget.cpp:137 #, kde-format msgid "Amount" msgstr "Montant" #: eqonomize.cpp:926 #, kde-format msgid "Postpone..." msgstr "Ajourner..." #: eqonomize.cpp:973 #, kde-format msgid "Can only postpone to future dates." msgstr "Opération remise à plus tard." #: eqonomize.cpp:1052 ledgerdialog.cpp:299 #, kde-format msgid "Transactions for %1" msgstr "Transactions pour %1" #: eqonomize.cpp:1063 eqonomize.cpp:1936 #, kde-format msgid "Shares" msgstr "Parts" #: eqonomize.cpp:1160 #, kde-format msgid "Shares Bought" msgstr "Parts achetées" #: eqonomize.cpp:1161 #, kde-format msgid "Shares Sold" msgstr "Parts vendues" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Sold (Traded)" msgstr "Parts vendues (Ventes)" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Bought (Traded)" msgstr "Parts achetées (Ventes=" #: eqonomize.cpp:1204 #, kde-format msgid "Shares Bought (Recurring)" msgstr "Parts achetées (Récurrentes)" #: eqonomize.cpp:1205 #, kde-format msgid "Shares Sold (Recurring)" msgstr "Parts vendues (Récurrentes)" #: eqonomize.cpp:1207 #, kde-format msgid "Shares Bought (Scheduled)" msgstr "Parts achetées (planifiées)" #: eqonomize.cpp:1208 #, kde-format msgid "Shares Sold (Scheduled)" msgstr "Parts vendues (planifiées)" #: eqonomize.cpp:1220 #, kde-format msgid "Recurring Dividend" msgstr "Dividende récurrent" #: eqonomize.cpp:1222 #, kde-format msgid "Scheduled Dividend" msgstr "Dividende planifié" #: eqonomize.cpp:1240 eqonomize.cpp:1360 #, kde-format msgid "Type:" msgstr "Type:" #: eqonomize.cpp:1243 eqonomize.cpp:2600 eqonomize.cpp:2660 #, kde-format msgid "Mutual Fund" msgstr "Fond mutuel" #: eqonomize.cpp:1244 eqonomize.cpp:2598 eqonomize.cpp:2658 #, kde-format msgid "Bond" msgstr "Obligation" #: eqonomize.cpp:1245 eqonomize.cpp:2599 eqonomize.cpp:2659 #, kde-format msgid "Stock" msgstr "Stock" #: eqonomize.cpp:1246 eqonomize.cpp:2601 eqonomize.cpp:2661 eqonomize.cpp:3492 #: eqonomize.cpp:3497 importcsvdialog.cpp:117 qifimportexport.cpp:332 #, kde-format msgid "Other" msgstr "Autre" #: eqonomize.cpp:1249 eqonomize.cpp:1370 eqonomize.cpp:1464 eqonomize.cpp:1529 #, kde-format msgid "Name:" msgstr "Nom:" #: eqonomize.cpp:1264 #, kde-format msgid "Decimals in Shares:" msgstr "Décimales des parts:" #: eqonomize.cpp:1267 #, kde-format msgid "Initial Shares:" msgstr "Parts initiales:" #: eqonomize.cpp:1270 #, kde-format msgid "Initial quotation:" msgstr "Citation initiale:" #: eqonomize.cpp:1289 transactioneditwidget.cpp:675 #, kde-format msgid "No suitable account or income category available." msgstr "Aucune catégorie de compte ou de revenu appropriée." #: eqonomize.cpp:1363 eqonomize.cpp:3488 eqonomize.cpp:4021 #: qifimportexport.cpp:325 #, kde-format msgid "Cash" msgstr "Liquide" #: eqonomize.cpp:1364 eqonomize.cpp:4016 #, kde-format msgid "Current Account" msgstr "Compte courant" #: eqonomize.cpp:1365 eqonomize.cpp:3490 eqonomize.cpp:4017 #, kde-format msgid "Savings Account" msgstr "Compte d'épargne" #: eqonomize.cpp:1366 eqonomize.cpp:4018 #, kde-format msgid "Credit Card" msgstr "Carte de crédit" #: eqonomize.cpp:1367 eqonomize.cpp:4019 #, kde-format msgid "Liabilities" msgstr "Dettes" #: eqonomize.cpp:1368 eqonomize.cpp:1731 eqonomize.cpp:1732 eqonomize.cpp:3891 #: eqonomize.cpp:3897 eqonomize.cpp:4020 #, kde-format msgid "Securities" msgstr "Titres" #: eqonomize.cpp:1373 #, kde-format msgid "Initial balance:" msgstr "Équilibre initial:" #: eqonomize.cpp:1376 #, kde-format msgid "Default account for budgeted transactions" msgstr "Compte par défaut pour les transactions planifiées" #: eqonomize.cpp:1441 eqonomize.cpp:1507 eqonomize.cpp:1572 #, kde-format msgid "Empty name." msgstr "Nom vide." #: eqonomize.cpp:1447 #, kde-format msgid "The entered name is used by another account." msgstr "Le nom saisi est déjà utilisé par un autre compte." #: eqonomize.cpp:1467 eqonomize.cpp:1532 #, kde-format msgid "Monthly budget:" msgstr "Budget mensuel:" #: eqonomize.cpp:1513 #, kde-format msgid "The entered name is used by another income category." msgstr "Le nom saisi est utilisé par une autre catégorie de revenus." #: eqonomize.cpp:1578 #, kde-format msgid "The entered name is used by another expense category." msgstr "Le nom saisi est utilisé par une autre catégorie de dépenses." #: eqonomize.cpp:1711 eqonomize.cpp:1778 eqonomize.cpp:3984 eqonomize.cpp:5970 #: eqonomize.cpp:5976 #, kde-format msgid "Accounts" msgstr "Comptes" #: eqonomize.cpp:1712 #, kde-format msgid "Accounts & Categories" msgstr "Comptes et Catégories" #: eqonomize.cpp:1716 eqonomize.cpp:1717 eqonomize.cpp:1780 #: importcsvdialog.cpp:70 overtimechart.cpp:126 overtimechart.cpp:1727 #: overtimechart.cpp:1731 overtimechart.cpp.bak:119 overtimechart.cpp.bak:1708 #: overtimechart.cpp.bak:1712 overtimereport.cpp:103 overtimereport.cpp:357 #: overtimereport.cpp:377 overtimereport.cpp:395 transactionlistwidget.cpp:251 #: transactionlistwidget.cpp:263 #, kde-format msgid "Expenses" msgstr "Dépenses" #: eqonomize.cpp:1721 eqonomize.cpp:1722 eqonomize.cpp:1779 eqonomize.cpp:4043 #: importcsvdialog.cpp:75 overtimechart.cpp:127 overtimechart.cpp:1726 #: overtimechart.cpp:1730 overtimechart.cpp.bak:120 overtimechart.cpp.bak:1707 #: overtimechart.cpp.bak:1711 overtimereport.cpp:104 overtimereport.cpp:349 #: overtimereport.cpp:368 overtimereport.cpp:386 transactionlistwidget.cpp:252 #: transactionlistwidget.cpp:264 #, kde-format msgid "Incomes" msgstr "Revenus" #: eqonomize.cpp:1726 eqonomize.cpp:1727 importcsvdialog.cpp:78 #: transactionlistwidget.cpp:253 transactionlistwidget.cpp:265 #, kde-format msgid "Transfers" msgstr "Transferts" #: eqonomize.cpp:1736 #, kde-format msgid "Schedule" msgstr "Planning" #: eqonomize.cpp:1737 #, kde-format msgid "Scheduled Transactions" msgstr "Transactions planifiées" #: eqonomize.cpp:1753 eqonomize.cpp:1775 #, kde-format msgid "Account / Category" msgstr "Compte / Catégorie" #: eqonomize.cpp:1754 #, kde-format msgid "Remaining Budget (%1)" msgstr "Budget prévisionnel (%1)" #: eqonomize.cpp:1755 #, kde-format msgid "Change (%1)" msgstr "Change (%1)" #: eqonomize.cpp:1756 #, kde-format msgid "Total (%1)" msgstr "Total (%1)" #: eqonomize.cpp:1769 #, kde-format msgctxt "%2 remains of %1 budget" msgid "%2 of %1" msgstr "%2 de %1" #: eqonomize.cpp:1785 eqonomize.cpp:4002 #, kde-format msgid "Includes budgeted transactions" msgstr "Inclut les transactions planifiées" #: eqonomize.cpp:1793 #, kde-format msgid "Period" msgstr "Période" #: eqonomize.cpp:1825 #, kde-format msgid "Select Period" msgstr "Période sélectionnée" #: eqonomize.cpp:1827 eqonomize.cpp:4312 #, kde-format msgid "Current Month" msgstr "Mois actuel" #: eqonomize.cpp:1828 eqonomize.cpp:4313 #, kde-format msgid "Current Year" msgstr "Année actuelle" #: eqonomize.cpp:1829 eqonomize.cpp:4314 #, kde-format msgid "Current Whole Month" msgstr "Mois entier actuel" #: eqonomize.cpp:1830 eqonomize.cpp:4315 #, kde-format msgid "Current Whole Year" msgstr "Année entière actuelle" #: eqonomize.cpp:1831 #, kde-format msgid "Whole Past Month" msgstr "Mois passé entier" #: eqonomize.cpp:1832 #, kde-format msgid "Whole Past Year" msgstr "Année passée entière" #: eqonomize.cpp:1833 #, kde-format msgid "Previous Month" msgstr "Mois précédent" #: eqonomize.cpp:1834 #, kde-format msgid "Previous Year" msgstr "Années précédente" #: eqonomize.cpp:1837 #, kde-format msgid "Show partial budget" msgstr "Afficher le budget partiel" #: eqonomize.cpp:1842 #, kde-format msgid "Edit Budget" msgstr "Éditer le budget" #: eqonomize.cpp:1846 #, kde-format msgid "Budget:" msgstr "Budget:" #: eqonomize.cpp:1856 #, kde-format msgid "Month:" msgstr "Mois:" #: eqonomize.cpp:1864 #, kde-format msgid "Result previous month:" msgstr "Résultat du mois précédent:" #: eqonomize.cpp:1917 eqonomize.cpp:4354 #, kde-format msgid "New Security..." msgstr "Nouveau titre..." #: eqonomize.cpp:1919 #, kde-format msgid "New Transaction" msgstr "Nouvelle transaction" #: eqonomize.cpp:1922 eqonomize.cpp:4362 #, kde-format msgid "Set Quotation..." msgstr "Mettre une quotation..." #: eqonomize.cpp:1934 eqonomize.cpp:3987 #, kde-format msgid "Name" msgstr "Nom" #: eqonomize.cpp:1937 #, kde-format msgid "Quotation" msgstr "Quotation" #: eqonomize.cpp:1939 #, kde-format msgid "Profit" msgstr "Profit" #: eqonomize.cpp:1940 #, kde-format msgid "Yearly Rate" msgstr "Taux annuel" #: eqonomize.cpp:1942 qifimportexport.cpp:323 #, kde-format msgid "Account" msgstr "Compte" #: eqonomize.cpp:1953 #, kde-format msgid "Statistics Period" msgstr "Statistiques de la période" #: eqonomize.cpp:2015 #, kde-format msgid "New Schedule" msgstr "Nouvelle plannification" #: eqonomize.cpp:2018 #, kde-format msgid "Edit" msgstr "Éditer" #: eqonomize.cpp:2032 #, kde-format msgid "Next Occurrence" msgstr "Occurrence suivante" #: eqonomize.cpp:2038 qifimportexport.cpp:152 transactionlistwidget.cpp:144 #, kde-format msgid "Comments" msgstr "Commentaires" #: eqonomize.cpp:2291 #, kde-format msgid "New Security" msgstr "Nouveau titre" #: eqonomize.cpp:2306 #, kde-format msgid "Edit Security" msgstr "Éditer le titre" #: eqonomize.cpp:2325 #, kde-format msgid "Profit:" msgstr "Profit:" #: eqonomize.cpp:2325 #, kde-format msgid "Rate:" msgstr "Taux:" #: eqonomize.cpp:2332 #, kde-format msgid "" "Are you sure you want to delete the security \"%1\" and all associated " "transactions?" msgstr "" "Êtes-vous certain de vouloir supprimer le titre \"%1\" et toutes les " "transactions associées?" #: eqonomize.cpp:2394 transactioneditwidget.cpp:700 #, kde-format msgid "No security available." msgstr "Aucune garantie disponible" #: eqonomize.cpp:2466 #, kde-format msgid "Set Quotation (%1)" msgstr "Mettre la Quotation (%1)" #: eqonomize.cpp:2472 transactioneditwidget.cpp:143 #, kde-format msgid "Price per share:" msgstr "Prix par part:" #: eqonomize.cpp:2485 #, kde-format msgid "Future dates are not allowed." msgstr "Les dates futures ne sont pas permises." #: eqonomize.cpp:2513 #, kde-format msgid "Security Transactions" msgstr "Transactions de titres" #: eqonomize.cpp:3166 ledgerdialog.cpp:293 #, kde-format msgid "Ledger" msgstr "Registre" #: eqonomize.cpp:3475 #, kde-format msgid "Untitled" msgstr "" #: eqonomize.cpp:3489 #, kde-format msgid "Check Account" msgstr "Vérifier le compte" #: eqonomize.cpp:3491 #, kde-format msgid "Salary" msgstr "Salaire" #: eqonomize.cpp:3493 #, kde-format msgid "Bills" msgstr "Factures" #: eqonomize.cpp:3494 #, kde-format msgid "Clothing" msgstr "Habillement" #: eqonomize.cpp:3495 #, kde-format msgid "Groceries" msgstr "Alimentation" #: eqonomize.cpp:3496 #, kde-format msgid "Leisure" msgstr "Loisir" #: eqonomize.cpp:3561 importcsvdialog.cpp:795 qifimportexport.cpp:280 #: qifimportexport.cpp:444 #, kde-format msgid "Couldn't fetch %1." msgstr "Ne peut pas retrouver %1." #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Error loading %1: %2." msgstr "Erreur lors du chargement de %1: %2." #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Couldn't open file" msgstr "Impossible d' ouvrir le fichier" #: eqonomize.cpp:3627 eqonomize.cpp:3653 #, kde-format msgid "Error saving %1: %2." msgstr "Erreur lors de l'enregistrement de %1: %2." #: eqonomize.cpp:3627 eqonomize.cpp:3653 eqonomize.cpp:3673 #, kde-format msgid "Couldn't save file" msgstr "Impossible d'enregistrer le fichier" #: eqonomize.cpp:3673 eqonomize.cpp:4282 ledgerdialog.cpp:281 #: qifimportexport.cpp:634 #, kde-format msgid "Failed to upload file to %1." msgstr "Impossible de charger le fichier sur %1." #: eqonomize.cpp:3703 eqonomize.cpp:3728 #, kde-format msgid "Report" msgstr "Rapport" #: eqonomize.cpp:3758 eqonomize.cpp:3783 #, kde-format msgid "Chart" msgstr "Diagramme" #: eqonomize.cpp:3823 eqonomize.cpp:3829 #, kde-format msgid "Transaction Schedule" msgstr "Planning de la transaction" #: eqonomize.cpp:3976 #, kde-format msgctxt "html format" msgid "Accounts & Categories" msgstr "Comptes & Catégories" #: eqonomize.cpp:3981 #, kde-format msgctxt "html format" msgid "Accounts & Categories (%1–%2)" msgstr "Comptes & Catégories (%1–%2)" #: eqonomize.cpp:3982 #, kde-format msgctxt "html format" msgid "Accounts & Categories (to %1)" msgstr "Comptes & Catégories (to %1)" #: eqonomize.cpp:3989 eqonomize.cpp:4049 eqonomize.cpp:4097 eqonomize.cpp:4142 #, kde-format msgid "Change" msgstr "Change" #: eqonomize.cpp:3993 ledgerdialog.cpp:140 #, kde-format msgid "Balance" msgstr "Équilibre" #: eqonomize.cpp:4047 eqonomize.cpp:4095 #, kde-format msgid "Budget" msgstr "Budget" #: eqonomize.cpp:4048 eqonomize.cpp:4096 #, kde-format msgid "Remaining Budget" msgstr "Budget prévisionnel" #: eqonomize.cpp:4050 #, kde-format msgid "Total Incomes" msgstr "Revenus totaux" #: eqonomize.cpp:4091 #, kde-format msgid "Costs" msgstr "Coûts" #: eqonomize.cpp:4098 #, kde-format msgid "Total Expenses" msgstr "Dépenses totales" #: eqonomize.cpp:4167 eqonomize.cpp:4214 #, kde-format msgid "Empty expenses list." msgstr "Liste des dépenses vide." #: eqonomize.cpp:4172 eqonomize.cpp:4219 #, kde-format msgid "Empty incomes list." msgstr "Liste des revenus vide." #: eqonomize.cpp:4177 eqonomize.cpp:4224 #, kde-format msgid "Empty transfers list." msgstr "Liste des transferts vide." #: eqonomize.cpp:4182 eqonomize.cpp:4229 #, kde-format msgid "Empty securities list." msgstr "Liste des titres vides." #: eqonomize.cpp:4187 eqonomize.cpp:4234 #, kde-format msgid "Empty schedule list." msgstr "Liste des plannings vide." #: eqonomize.cpp:4305 #, kde-format msgid "Export View..." msgstr "Exporter la vue..." #: eqonomize.cpp:4307 #, kde-format msgid "Print View..." msgstr "Imprimer la vue..." #: eqonomize.cpp:4309 #, kde-format msgid "Initial Period" msgstr "" #: eqonomize.cpp:4316 #, kde-format msgid "Remember Last Dates" msgstr "Se souvenir des dernières dates" #: eqonomize.cpp:4319 #, kde-format msgid "Import CSV File..." msgstr "Importe un fichier CSV..." #: eqonomize.cpp:4320 #, kde-format msgid "Import QIF File..." msgstr "Importer un fichier QIF..." #: eqonomize.cpp:4321 #, kde-format msgid "Export As QIF File..." msgstr "Exporter un fichier QIF..." #: eqonomize.cpp:4323 #, kde-format msgid "Add Account..." msgstr "Ajouter un compte..." #: eqonomize.cpp:4324 #, kde-format msgid "New Account..." msgstr "Nouveau compte..." #: eqonomize.cpp:4325 #, kde-format msgid "New Income Category..." msgstr "Nouvelle catégorie de revenu..." #: eqonomize.cpp:4326 #, kde-format msgid "New Expense Category..." msgstr "Nouvelle catégorie de dépense..." #: eqonomize.cpp:4327 #, kde-format msgid "Balance..." msgstr "Équilibre..." #: eqonomize.cpp:4331 #, kde-format msgid "Show Transactions" msgstr "Montrer les transactions" #: eqonomize.cpp:4335 #, kde-format msgid "New Transfer..." msgstr "Nouveau transfert..." #: eqonomize.cpp:4336 #, kde-format msgid "New Split Transaction..." msgstr "Nouveau transaction séparée..." #: eqonomize.cpp:4337 #, kde-format msgid "Edit Transaction(s) (Occurrence)..." msgstr "Éditer la/les transaction(s) (Occurrence)..." #: eqonomize.cpp:4338 #, kde-format msgid "Edit Occurrence..." msgstr "Éditer l'occurrence..." #: eqonomize.cpp:4339 #, kde-format msgid "Edit Schedule (Recurrence)..." msgstr "Éditer le(s) planning(s) (Occurrence)..." #: eqonomize.cpp:4340 #, kde-format msgid "Edit Schedule..." msgstr "Éditer le planning..." #: eqonomize.cpp:4341 #, kde-format msgid "Remove Transaction(s) (Occurrence)" msgstr "Enlever la/les transaction(s) (Occurrence)" #: eqonomize.cpp:4342 #, kde-format msgid "Remove Occurrence" msgstr "Enlever l' occurrence" #: eqonomize.cpp:4343 #, kde-format msgid "Delete Schedule (Recurrence)" msgstr "Supprimer le(s) plannings (Récurrence)" #: eqonomize.cpp:4344 #, kde-format msgid "Delete Schedule" msgstr "Supprimer le planning" #: eqonomize.cpp:4345 #, kde-format msgid "Edit Split Transaction..." msgstr "Editer une transaction séparée..." #: eqonomize.cpp:4346 #, kde-format msgid "Remove Split Transaction" msgstr "Déplacer la transaction séparée" #: eqonomize.cpp:4347 #, kde-format msgid "Join Transactions..." msgstr "Lier les transactions..." #: eqonomize.cpp:4348 #, kde-format msgid "Split Up Transaction" msgstr "Transaction décomposée" #: eqonomize.cpp:4350 #, kde-format msgid "Refund..." msgstr "Rembourser..." #: eqonomize.cpp:4351 #, kde-format msgid "Repayment..." msgstr "Remboursement..." #: eqonomize.cpp:4352 #, kde-format msgid "New Refund/Repayment..." msgstr "Nouveau remboursement..." #: eqonomize.cpp:4355 #, kde-format msgid "Edit Security..." msgstr "Éditer le titre..." #: eqonomize.cpp:4356 #, kde-format msgid "Remove Security" msgstr "Enlever le titre" #: eqonomize.cpp:4357 #, kde-format msgid "Shares Sold..." msgstr "Parts vendues..." #: eqonomize.cpp:4358 #, kde-format msgid "Shares Bought..." msgstr "Parts achetées..." #: eqonomize.cpp:4359 #, kde-format msgid "Dividend..." msgstr "Dividende..." #: eqonomize.cpp:4360 #, kde-format msgid "Reinvested Dividend..." msgstr "Dividende réinvesti..." #: eqonomize.cpp:4361 #, kde-format msgid "Shares Moved..." msgstr "Parts bougées..." #: eqonomize.cpp:4363 #, kde-format msgid "Edit Quotations..." msgstr "Éditer les quotations" #: eqonomize.cpp:4364 #, kde-format msgid "Transactions..." msgstr "Transactions..." #: eqonomize.cpp:4366 #, kde-format msgid "Development Over Time Report..." msgstr "Rapport de développement temporel..." #: eqonomize.cpp:4367 #, kde-format msgid "Categories Comparison Report..." msgstr "Rapport de comparaison de catégories..." #: eqonomize.cpp:4368 #, kde-format msgid "Categories Comparison Chart..." msgstr "Diagramme de comparaison de catégories..." #: eqonomize.cpp:4369 #, kde-format msgid "Development Over Time Chart..." msgstr "Diagramme de développement temporel..." #: eqonomize.cpp:4371 #, kde-format msgid "Use Additional Transaction Properties" msgstr "Utiliser les paramètres de transaction additionnel" #: eqonomize.cpp:4413 #, kde-format msgid "" "Eqonomize! exited unexpectedly before the file was saved and data was lost.\n" "Do you want to load the last auto-saved version of the file?" msgstr "" "Eqonomize! est quitté sans consentement avant que le fichier ne soit sauvé " "et les données ont été perdues.\n" "Voulez vous charger la dernière version sauvée automatiquement du fichier?" #: eqonomize.cpp:4413 #, kde-format msgid "Crash Recovery" msgstr "Récupération de l'accident" #: eqonomize.cpp:4605 eqonomize.cpp:4606 #, kde-format msgid "The current file has been modified. Do you want to save it?" msgstr "Le fichier courant a été modifié. Voulez-vous l'enregistrer?" #: eqonomize.cpp:4643 #, kde-format msgid "Confirm Schedule" msgstr "Confirmer le planning" #: eqonomize.cpp:4697 #, kde-format msgid "New Account" msgstr "Nouveau compte" #: eqonomize.cpp:4712 #, kde-format msgid "New Income Category" msgstr "Nouvelle catégorie de revenus" #: eqonomize.cpp:4725 #, kde-format msgid "New Expense Category" msgstr "Nouvelle catégorie de dépenses" #: eqonomize.cpp:4800 #, kde-format msgid "Balance Account" msgstr "Équilibre du compte" #: eqonomize.cpp:4806 #, kde-format msgid "Book value:" msgstr "Valeur comptable:" #: eqonomize.cpp:4813 #, kde-format msgid "Real value:" msgstr "Valeur réelle:" #: eqonomize.cpp:4836 #, kde-format msgid "Edit Account" msgstr "Editer le compte" #: eqonomize.cpp:4869 #, kde-format msgid "Edit Income Category" msgstr "Éditer les catégories de revenus" #: eqonomize.cpp:4887 #, kde-format msgid "Edit Expense Category" msgstr "Éditer les catégories de dépenses" #: eqonomize.cpp:4948 #, kde-format msgid "Move transactions?" msgstr "Bouger les transactions?" #: eqonomize.cpp:4958 #, kde-format msgid "Move to:" msgstr "Bouger vers:" #: eqonomize.cpp:4965 #, kde-format msgid "" "The category contains some expenses.\n" "What do you want to do with them?" msgstr "" "La catégorie contient quelques dépenses.\n" "Que voulez-vous faire d'elles?" #: eqonomize.cpp:4977 #, kde-format msgid "" "The category contains some incomes.\n" "What do you want to do with them?" msgstr "" "La catégorie contient quelques revenus.\n" "Que voulez-vous faire d'eux?" #: eqonomize.cpp:4989 #, kde-format msgid "" "The account contains some transactions.\n" "What do you want to do with them?" msgstr "" "Ce compte contient plusieurs transactions.\n" "Que voulez vous en faire ?" #: eqonomize.cpp:5011 #, kde-format msgid "" "The category contains some expenses that will be removed. Do you still want " "to remove the category?" msgstr "" "La catégorie contient quelques dépenses qui seront enlevées. Voulez-vous " "toujours enlever cette catégorie?" #: eqonomize.cpp:5011 eqonomize.cpp:5012 #, kde-format msgid "Remove Category?" msgstr "Enlever la catégorie?" #: eqonomize.cpp:5012 #, kde-format msgid "" "The category contains some incomes that will be removed. Do you still want " "to remove the category?" msgstr "" "La catégorie contient quelques revenus qui seront supprimés. Voulez-vous " "toujours enlever cette catégorie?" #: eqonomize.cpp:5013 #, kde-format msgid "" "The account contains some transactions that will be removed. Do you still " "want to remove the account?" msgstr "" "Ce compte contient plusieurs transactions qui seront enlevées. Voulez vous " "toujours enlever ce compte ?" #: eqonomize.cpp:5013 #, kde-format msgid "Remove Account?" msgstr "Enlever le compte?" #: eqonomize.cpp:5531 eqonomize.cpp:5555 eqonomize.cpp:5730 #, kde-format msgctxt "%1: budget; %2: remaining budget" msgid "%2 of %1" msgstr "%2 de %1" #: eqonomize.cpp:5810 eqonomize.cpp:5835 #, kde-format msgid "%1 (with no budget)" msgstr "%1 (sans budget)" #: eqonomize.cpp:5811 eqonomize.cpp:5836 #, kde-format msgid "%1 (with budget %2)" msgstr "%1 (avec le budget %2)" #: importcsvdialog.cpp:60 #, kde-format msgid "Import CSV file" msgstr "Importer le fichier CSV" #: importcsvdialog.cpp:64 #, kde-format msgid "Transaction Type Selection" msgstr "Choix du type de transaction" #: importcsvdialog.cpp:81 #, kde-format msgid "Expenses and incomes (negative cost)" msgstr "Dépenses et revenus (coût négatif)" #: importcsvdialog.cpp:84 #, kde-format msgid "Expenses and incomes (separate columns)" msgstr "Dépenses et revenus (colonnes séparées)" #: importcsvdialog.cpp:87 #, kde-format msgid "All types" msgstr "Tous types" #: importcsvdialog.cpp:95 qifimportexport.cpp:62 #, kde-format msgid "File Selection" msgstr "Sélection de fichier" #: importcsvdialog.cpp:99 qifimportexport.cpp:66 qifimportexport.cpp:548 #, kde-format msgid "File:" msgstr "Fichier:" #: importcsvdialog.cpp:104 #, kde-format msgid "First data row:" msgstr "Première colonne de données:" #: importcsvdialog.cpp:107 #, kde-format msgid "Auto" msgstr "Voiture" #: importcsvdialog.cpp:110 #, kde-format msgid "Column delimiter:" msgstr "Délimiteur de colonne:" #: importcsvdialog.cpp:113 #, kde-format msgid "Comma" msgstr "Virgule" #: importcsvdialog.cpp:114 #, kde-format msgid "Tabulator" msgstr "Tabulation" #: importcsvdialog.cpp:115 #, kde-format msgid "Semicolon" msgstr "Point virgule" #: importcsvdialog.cpp:116 #, kde-format msgid "Space" msgstr "Espace" #: importcsvdialog.cpp:125 #, kde-format msgid "Columns Specification" msgstr "Spécification de la colonne" #: importcsvdialog.cpp:131 importcsvdialog.cpp:149 importcsvdialog.cpp:172 #: importcsvdialog.cpp:189 importcsvdialog.cpp:208 importcsvdialog.cpp:227 #: importcsvdialog.cpp:245 #, kde-format msgid "Column" msgstr "Colonne" #: importcsvdialog.cpp:205 importcsvdialog.cpp:356 importcsvdialog.cpp:365 #: importcsvdialog.cpp:387 importcsvdialog.cpp:398 #: transactioneditwidget.cpp:225 transactioneditwidget.cpp:267 #: transactioneditwidget.cpp:1130 transactionfilterwidget.cpp:102 #: transactionfilterwidget.cpp:113 #, kde-format msgid "Category:" msgstr "Catégorie:" #: importcsvdialog.cpp:224 importcsvdialog.cpp:357 importcsvdialog.cpp:374 #: transactioneditwidget.cpp:248 transactioneditwidget.cpp:273 #: transactionfilterwidget.cpp:117 #, kde-format msgid "From account:" msgstr "Compte de:" #: importcsvdialog.cpp:262 #, kde-format msgid "Create missing categories and accounts" msgstr "Crée les comptes et catégories manquante" #: importcsvdialog.cpp:354 #, kde-format msgid "" "Imports data as expenses. Costs have positive value. Value is the only " "required column." msgstr "" "Importe les données comme des dépenses. Les coûts ont une valeur positive. " "Le valeur est la seule colonne requise." #: importcsvdialog.cpp:363 #, kde-format msgid "Imports data as incomes. Value is the only required column." msgstr "" "Importe les données comme des revenus. Value est la seule colonne requise." #: importcsvdialog.cpp:366 importcsvdialog.cpp:375 #: transactioneditwidget.cpp:231 transactioneditwidget.cpp:258 #: transactionfilterwidget.cpp:106 #, kde-format msgid "To account:" msgstr "Vers le compte:" #: importcsvdialog.cpp:372 #, kde-format msgid "Imports data as transfers. Value is the only required column." msgstr "" "Importer les données comme des transferts. Value est la seule colonne " "requise." #: importcsvdialog.cpp:373 transactioneditwidget.cpp:182 #: transactioneditwidget.cpp:1109 #, kde-format msgid "Amount:" msgstr "Quantité:" #: importcsvdialog.cpp:381 #, kde-format msgid "" "Imports data as expenses and incomes. Costs have negative value. Value and " "category are both required columns." msgstr "" "Importe les données comme des dépenses et des revenus. Les coûts ont une " "valeur négative. La valeur et la catégorie sont les seules colonnes requises." #: importcsvdialog.cpp:392 #, kde-format msgid "" "Imports data as expenses and incomes. Costs and incomes have separate " "columns. Income, cost, and category are all required columns." msgstr "" "Importe les données comme des dépenses et des revenus. Les coûts ont des " "colonnes séparées. Revenus, coût, et la catégorie sont les seules colonnes " "requises." #: importcsvdialog.cpp:403 #, kde-format msgid "" "Imports data as expenses, incomes, and transfers. Costs have negative or " "positive value. Value, to, and from are all required columns. Accounts and " "categories must be existing." msgstr "" "Importe les données comme dépenses, revenus et transferts. Les coûts ont une " "valeur négative ou positive. Toutes les valeurs sont requises. Comptes et " "catégories doivent exister." #: importcsvdialog.cpp:413 transactioneditwidget.cpp:209 #: transactionfilterwidget.cpp:74 transactionfilterwidget.cpp:91 #, kde-format msgid "From:" msgstr "De:" #: importcsvdialog.cpp:414 transactioneditwidget.cpp:216 #: transactionfilterwidget.cpp:81 transactionfilterwidget.cpp:95 #, kde-format msgid "To:" msgstr "A:" #: importcsvdialog.cpp:440 qifimportexport.cpp:258 #, kde-format msgid "A file must be selected." msgstr "Vous devez sélectionner un fichier." #: importcsvdialog.cpp:446 importcsvdialog.cpp:458 qifimportexport.cpp:265 #: qifimportexport.cpp:595 #, kde-format msgid "Selected file is a directory." msgstr "Le fichier sélectionné est un dossier." #: importcsvdialog.cpp:450 importcsvdialog.cpp:462 qifimportexport.cpp:269 #, kde-format msgid "Selected file does not exist." msgstr "Le fichier sélectionné n'existe pas." #: importcsvdialog.cpp:468 #, kde-format msgid "Empty delimiter." msgstr "Délimiteur vide." #: importcsvdialog.cpp:712 #, kde-format msgid "The same column number is selected multiple times." msgstr "Le même numéro de colonne est sélectionné plusieurs fois." #: importcsvdialog.cpp:772 #, kde-format msgid "Selected from account is the same as the to account." msgstr "Le compte de destination est le même que le compte source." #: importcsvdialog.cpp:803 qifimportexport.cpp:288 qifimportexport.cpp:452 #, kde-format msgid "Couldn't open %1 for reading." msgstr "Impossible d' ouvrir le fichier %1 en lecture." #: importcsvdialog.cpp:806 qifimportexport.cpp:291 qifimportexport.cpp:455 #, kde-format msgid "Error reading %1." msgstr "Erreur lors de la lecture de %1." #: importcsvdialog.cpp:1187 qifimportexport.cpp:462 #, kde-format msgid "Successfully imported 1 transaction." msgid_plural "Successfully imported %n transactions." msgstr[0] "1 transaction importée avec succès." msgstr[1] "%n transactions importées avec succès." #: importcsvdialog.cpp:1189 #, kde-format msgid "Unable to import any transactions imported." msgstr "Impossible d'enregistrer les transactions importées." #: importcsvdialog.cpp:1193 #, kde-format msgid "Failed to import 1 data row." msgid_plural "Failed to import %n data rows." msgstr[0] "Echec à l'importation de une donnée." msgstr[1] "Echec à l'importation de %n données." #: importcsvdialog.cpp:1194 #, kde-format msgid "Required columns missing." msgstr "Les colonnes nécessaires sont manquantes." #: importcsvdialog.cpp:1195 #, kde-format msgid "Invalid value." msgstr "Valeur invalide." #: importcsvdialog.cpp:1197 #, kde-format msgid "Empty category name." msgstr "Nom de catégorie vide." #: importcsvdialog.cpp:1197 importcsvdialog.cpp:1198 #, kde-format msgid "Empty account name." msgstr "Nom de compte vide." #: importcsvdialog.cpp:1199 #, kde-format msgid "Unknown category found." msgstr "Catégorie inconnue trouvée." #: importcsvdialog.cpp:1199 importcsvdialog.cpp:1200 #, kde-format msgid "Unknown account found." msgstr "Compte inconnu trouvé." #: importcsvdialog.cpp:1201 #, kde-format msgid "Cannot import security transactions (to/from security accounts)." msgstr "Impossible d'importer les transaction de titre (comptes A/De)" #: importcsvdialog.cpp:1202 #, kde-format msgid "Balancing account wrongly used." msgstr "Equilibrage des comptes mal utilisé." #: importcsvdialog.cpp:1203 #, kde-format msgid "Same to and from account/category." msgstr "Même De et A compte/catégorie" #: importcsvdialog.cpp:1205 #, kde-format msgid "No data found." msgstr "Pas de donnée trouvée." #: importcsvdialog.cpp:1219 qifimportexport.cpp:345 #, kde-format msgid "Unrecognized date format." msgstr "Format de date non reconnu." #: importcsvdialog.cpp:1224 #, kde-format msgid "Specify Format" msgstr "Format spécifié" #: importcsvdialog.cpp:1230 #, kde-format msgid "" "The format of dates and/or numbers in the CSV file is ambiguous. Please " "select the correct format." msgstr "" "Le format des dates et/ou nombres dans le fichier CSV est ambigu. S'il vous " "plaît sélectionner le format correct." #: importcsvdialog.cpp:1235 qifimportexport.cpp:94 qifimportexport.cpp:533 #, kde-format msgid "Date format:" msgstr "Format de date:" #: importcsvdialog.cpp:1278 qifimportexport.cpp:541 #, kde-format msgid "Value format:" msgstr "Format de valeur:" #: kdateedit.cpp:366 #, kde-format msgctxt "the day after today" msgid "tomorrow" msgstr "demain" #: kdateedit.cpp:367 #, kde-format msgctxt "this day" msgid "today" msgstr "aujorud'hui" #: kdateedit.cpp:368 #, kde-format msgctxt "the day before today" msgid "yesterday" msgstr "hier" #: kdatepickerpopup.cpp:94 #, kde-format msgctxt "@option today" msgid "&Today" msgstr "Aujorud'hui" #: kdatepickerpopup.cpp:95 #, kde-format msgctxt "@option tomorrow" msgid "To&morrow" msgstr "Demain" #: kdatepickerpopup.cpp:96 #, kde-format msgctxt "@option next week" msgid "Next &Week" msgstr "" #: kdatepickerpopup.cpp:97 #, fuzzy, kde-format msgctxt "@option next month" msgid "Next M&onth" msgstr "Mois actuel" #: kdatepickerpopup.cpp:105 #, fuzzy, kde-format msgctxt "@option do not specify a date" msgid "No Date" msgstr "Date" #: ledgerdialog.cpp:122 #, kde-format msgid "Export..." msgstr "Exporter..." #: ledgerdialog.cpp:123 #, kde-format msgid "Print..." msgstr "Imprimer..." #: ledgerdialog.cpp:139 #, kde-format msgid "Withdrawal" msgstr "Retrait" #: ledgerdialog.cpp:162 #, kde-format msgid "Join..." msgstr "Lier..." #: ledgerdialog.cpp:164 #, kde-format msgid "Split Up" msgstr "Décomposer" #: ledgerdialog.cpp:234 ledgerdialog.cpp:354 #, kde-format msgid "Empty transaction list." msgstr "" #: ledgerdialog.cpp:443 transactionlistwidget.cpp:717 #, kde-format msgid "Are you sure you want to delete all (%1) selected transactions?" msgstr "" "Êtes-vous certain de vouloir supprimer toutes (%1) les transactions " "sélectionnées?" #: ledgerdialog.cpp:547 transactionlistwidget.cpp:489 #, kde-format msgid "" "Cannot set the value of security transactions using the dialog for modifying " "multiple transactions." msgstr "" "Impossible de fixer la valeur des transactions de titre en utilisant la " "fenêtre de modification multiple des transactions." #: ledgerdialog.cpp:553 transactionlistwidget.cpp:495 #, kde-format msgid "Cannot change description of dividends and security transactions." msgstr "" "Impossible de changer la description des dividendes et transactions de titre." #: ledgerdialog.cpp:559 transactionlistwidget.cpp:501 #, kde-format msgid "Cannot change payer of dividends and security transactions." msgstr "" "Impossible de changer le débiteur des dividendes et transactions de titres." #: ledgerdialog.cpp:565 transactionlistwidget.cpp:507 #, kde-format msgid "" "Cannot change date of transactions that are part of a split transaction." msgstr "" "Impossible de dater les transactions qui font parti d'une transaction " "séparée." #: main.cpp:39 msgid "Eqonomize!" msgstr "Eqonomize!" #: main.cpp:39 msgid "A personal accounting program" msgstr "Un programme personnel de finance" #: main.cpp:39 msgid "(C) 2008 Hanna K." msgstr "" #: main.cpp:40 msgid "Hanna K." msgstr "" #: main.cpp:44 msgid "Start with expenses list displayed" msgstr "Commencer avec la liste des dépenses montrée" #: main.cpp:46 msgid "Start with incomes list displayed" msgstr "Commencer avec la liste des revenus montrée" #: main.cpp:48 msgid "Start with transfers list displayed" msgstr "Commencer avec la liste des transferts montrée" #: main.cpp:49 msgid "Document to open" msgstr "Document à ouvrir" #: overtimechart.cpp:124 overtimechart.cpp.bak:117 #, kde-format msgid "Incomes and Expenses" msgstr "Revenus et Dépenses" #: overtimechart.cpp:125 overtimechart.cpp:1722 overtimechart.cpp.bak:118 #: overtimechart.cpp.bak:1703 overtimereport.cpp:102 overtimereport.cpp:343 #, kde-format msgid "Profits" msgstr "Profits" #: overtimechart.cpp:132 overtimechart.cpp:411 overtimechart.cpp:1949 #: overtimechart.cpp.bak:125 overtimechart.cpp.bak:404 #: overtimechart.cpp.bak:1950 overtimereport.cpp:108 overtimereport.cpp:228 #: overtimereport.cpp:753 #, kde-format msgid "All Categories Combined" msgstr "Toutes les catégories combinées" #: overtimechart.cpp:138 overtimechart.cpp:296 overtimechart.cpp:400 #: overtimechart.cpp:1852 overtimechart.cpp:1973 overtimechart.cpp.bak:131 #: overtimechart.cpp.bak:289 overtimechart.cpp.bak:393 #: overtimechart.cpp.bak:1853 overtimechart.cpp.bak:1974 #: overtimereport.cpp:113 overtimereport.cpp:176 overtimereport.cpp:225 #: overtimereport.cpp:710 overtimereport.cpp:776 #, kde-format msgid "All Descriptions Combined" msgstr "Toutes les descriptions combinées" #: overtimechart.cpp:146 overtimechart.cpp:406 overtimechart.cpp.bak:139 #: overtimechart.cpp.bak:399 #, kde-format msgid "All Payees/Payers Combined" msgstr "Tous les bénéficiaires/débiteurs combinés" #: overtimechart.cpp:155 overtimechart.cpp.bak:148 #, kde-format msgid "Start date:" msgstr "Date de départ:" #: overtimechart.cpp:178 overtimechart.cpp.bak:171 #, kde-format msgid "End date:" msgstr "" #: overtimechart.cpp:197 overtimechart.cpp.bak:190 #, kde-format msgid "Monthly total" msgstr "Total mensuel" #: overtimechart.cpp:201 overtimechart.cpp.bak:194 #, kde-format msgid "Daily average" msgstr "Moyenne journalière" #: overtimechart.cpp:304 overtimechart.cpp:404 overtimechart.cpp:1855 #: overtimechart.cpp:1978 overtimechart.cpp.bak:297 overtimechart.cpp.bak:397 #: overtimechart.cpp.bak:1856 overtimechart.cpp.bak:1979 #, kde-format msgid "All Payers Combined" msgstr "Tous les débiteurs combinés" #: overtimechart.cpp:305 overtimechart.cpp:405 overtimechart.cpp:1856 #: overtimechart.cpp:1977 overtimechart.cpp.bak:298 overtimechart.cpp.bak:398 #: overtimechart.cpp.bak:1857 overtimechart.cpp.bak:1978 #, kde-format msgid "All Payees Combined" msgstr "Tous les bénéficiaires combinés" #: overtimechart.cpp:325 overtimechart.cpp:1853 overtimechart.cpp.bak:318 #: overtimechart.cpp.bak:1854 #, kde-format msgid "All Descriptions Split" msgstr "Toutes les descriptions séparées" #: overtimechart.cpp:328 overtimechart.cpp:1857 overtimechart.cpp.bak:321 #: overtimechart.cpp.bak:1858 #, kde-format msgid "All Payers Split" msgstr "Tous les débiteurs séparés" #: overtimechart.cpp:329 overtimechart.cpp:1858 overtimechart.cpp.bak:322 #: overtimechart.cpp.bak:1859 #, kde-format msgid "All Payees Split" msgstr "Tous les bénéficiaires séparés" #: overtimechart.cpp:413 overtimechart.cpp:423 overtimechart.cpp:1950 #: overtimechart.cpp.bak:406 overtimechart.cpp.bak:416 #: overtimechart.cpp.bak:1951 #, kde-format msgid "All Categories Split" msgstr "Toutes les catégories séparées" #: overtimechart.cpp:1535 overtimechart.cpp.bak:1516 #, kde-format msgid "Value (%1)" msgstr "Valeur (%1)" #: overtimechart.cpp:1536 overtimechart.cpp.bak:1517 #, kde-format msgid "Profit (%1)" msgstr "Profit (%1)" #: overtimechart.cpp:1537 overtimechart.cpp.bak:1518 #, kde-format msgid "Income (%1)" msgstr "Revenu (%1)" #: overtimechart.cpp:1538 overtimechart.cpp.bak:1519 #, kde-format msgid "Cost (%1)" msgstr "Coût (%1)" #: overtimechart.cpp:1579 overtimechart.cpp.bak:1560 #, kde-format msgid "Time" msgstr "Temps" #: overtimechart.cpp:1774 overtimechart.cpp:1775 overtimechart.cpp.bak:1755 #: overtimechart.cpp.bak:1756 #, kde-format msgid "no payer" msgstr "aucun débiteur" #: overtimechart.cpp:1778 overtimechart.cpp.bak:1759 #, kde-format msgctxt "%1: Description; %2: Payer" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp:1783 overtimechart.cpp:1784 overtimechart.cpp.bak:1764 #: overtimechart.cpp.bak:1765 #, kde-format msgid "no payee" msgstr "aucun bénéficiaire" #: overtimechart.cpp:1787 overtimechart.cpp.bak:1768 #, kde-format msgctxt "%1: Description; %2: Payee" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp.bak:649 #, kde-format msgid "Error after saving file; data may not have been saved." msgstr "" "Erreur après l'enregistrement du fichier ; des données peuvent avoir été " "perdues." #: overtimereport.cpp:344 #, kde-format msgid "Average Profit" msgstr "Profit moyen" #: overtimereport.cpp:537 #, kde-format msgid "Year" msgstr "Année" #: overtimereport.cpp:538 #, kde-format msgid "Month" msgstr "Mois" #: overtimereport.cpp:566 #, kde-format msgid "Includes scheduled transactions" msgstr "Inclut les transactions planifiées" #: overtimereport.cpp:570 #, kde-format msgid "Adjusted for the average month / year (%1 / %2 days)" msgstr "Ajusté pour le mois/annér moyen (%1 / %2 jours)" #: overtimereport.cpp:603 overtimereport.cpp:671 #, kde-format msgid "Subtotal" msgstr "Sous-total" #: qifimport.cpp:307 qifimport.cpp:367 qifimportexport.cpp:1259 #: qifimportexport.cpp:1350 qifimportexport.cpp:1470 #, kde-format msgid "Unnamed" msgstr "Anonyme" #: qifimport.cpp:337 qifimportexport.cpp:1299 qifimportexport.cpp:1413 #, kde-format msgid "Uncategorized" msgstr "N'est pas catégorisé" #: qifimportexport.cpp:56 #, kde-format msgid "Import QIF file" msgstr "Importer le fichier QIF" #: qifimportexport.cpp:63 #, kde-format msgid "" "Select a QIF file to import. When you click next, the file be analysed and " "you might need to answer some questions about the format of the file." msgstr "" "Sélectionner un fichier QIF pour l'importation. Quand vous cliquez sur " "prochain, le fichier sera analysé et vous pourrez devoir répondre à des " "questions sur le format du fichier." #: qifimportexport.cpp:73 #, kde-format msgid "Local Definitions" msgstr "Définitions locales" #: qifimportexport.cpp:74 #, kde-format msgid "" "Unknown elements where found in the QIF file. It is possible that this is " "because of localized type names. Please map them to the correct standard " "names." msgstr "" "Le fichier QIF présente des éléments inconnus. Cela est certainement du à " "l'utilisation de caractères locaux. Veuillez les remplacer par des " "caractères standards." #: qifimportexport.cpp:80 #, kde-format msgid "Local Text" msgstr "Texte local" #: qifimportexport.cpp:81 #, kde-format msgid "Standard Text" msgstr "Texte standard" #: qifimportexport.cpp:84 #, kde-format msgid "Select standard text:" msgstr "Sélectionner un texte standard:" #: qifimportexport.cpp:90 #, kde-format msgid "Date Format" msgstr "Format de date" #: qifimportexport.cpp:91 #, kde-format msgid "" "The date format in the QIF file is ambiguous. Please select the correct " "format." msgstr "" "Le format de date dans le fichier QIF est ambigu. S'il vous plaît " "sélectionner le format correct." #: qifimportexport.cpp:100 #, kde-format msgid "Default Account" msgstr "Compte par défaut" #: qifimportexport.cpp:101 #, kde-format msgid "" "Could not find any account definitions in the QIF file. Please select a " "default account. It is also possible that this is caused by a localized " "opening balance text." msgstr "" "Impossible de trouver les définitions de compte dans le fichier QIF. S'il " "vous plaît sélectionner un compte par défaut. Il est également possible que " "cela soit du au solde ouvert traduit en français." #: qifimportexport.cpp:104 #, kde-format msgid "Default account:" msgstr "Compte par défaut:" #: qifimportexport.cpp:115 #, kde-format msgid "Opening balance text:" msgstr "Texte du solde ouvert:" #: qifimportexport.cpp:121 #, kde-format msgid "Descriptions" msgstr "Descriptions" #: qifimportexport.cpp:122 #, kde-format msgid "" "Transactions in QIF files does not have any specific description property. " "You are therefore given the option to choose how the description of imported " "transactions will be set." msgstr "" "Les transactions dans les fichiers QIF n'ont pas de propriétés de " "description spécifique. C'est pourquoi vous allez donner l'option pour " "définir comment la description des transactions importées sera établie." #: qifimportexport.cpp:125 #, kde-format msgid "Subcategories as:" msgstr "Sous-catégories de:" #: qifimportexport.cpp:134 #, kde-format msgid "Ignore" msgstr "Ignorer" #: qifimportexport.cpp:137 #, kde-format msgid "Payee as:" msgstr "Bénéficiaire de:" #: qifimportexport.cpp:142 qifimportexport.cpp:520 #: transactionlistwidget.cpp:119 #, kde-format msgid "Payee" msgstr "Bénéficiaire" #: qifimportexport.cpp:147 #, kde-format msgid "Memo as:" msgstr "Note de:" #: qifimportexport.cpp:156 #, kde-format msgid "Priority:" msgstr "Priorité:" #: qifimportexport.cpp:159 #, kde-format msgid "Subcategory/Payee/Comments" msgstr "Sous-catégorie/Bénéficiaire/Commentaires" #: qifimportexport.cpp:160 #, kde-format msgid "Payee/Subcategory/Comments" msgstr "Bénéficiaire/Sous-Catégorie/Commentaires" #: qifimportexport.cpp:161 #, kde-format msgid "Subcategory/Comments/Payee" msgstr "Sous-Catégorie/Commentaires/Bénéficiaire" #: qifimportexport.cpp:162 #, kde-format msgid "Payee/Comments/Subcategory" msgstr "Bénéficiaire/Commentaires/Sous-Catégorie" #: qifimportexport.cpp:163 #, kde-format msgid "Comments/Subcategory/Payee" msgstr "Commentaires/Sous-Catégorie/Bénéficiaire" #: qifimportexport.cpp:164 #, kde-format msgid "Comments/Payee/Subcategory" msgstr "Commentaires/Bénéficiaire/Sous-Catégorie" #: qifimportexport.cpp:314 qifimportexport.cpp:322 qifimportexport.cpp:338 #, kde-format msgid "Unknown" msgstr "Inconnu" #: qifimportexport.cpp:324 #, kde-format msgid "Bank" msgstr "Banque" #: qifimportexport.cpp:326 #, kde-format msgid "Cat (Category)" msgstr "Cat (Catégorie)" #: qifimportexport.cpp:327 #, kde-format msgid "CCard (Credit Card)" msgstr "CCard (Carte de crédit)" #: qifimportexport.cpp:328 #, kde-format msgid "Invst (Investment)" msgstr "Invest (Investissement)" #: qifimportexport.cpp:329 #, kde-format msgid "Oth A (Other Assets)" msgstr "Oth A (Other Assets = autres actifs)" #: qifimportexport.cpp:330 #, kde-format msgid "Oth L (Other Liabilities)" msgstr "" #: qifimportexport.cpp:331 #, kde-format msgid "Security" msgstr "Titre" #: qifimportexport.cpp:465 #, kde-format msgid "Successfully imported 1 account." msgid_plural "Successfully imported %n accounts." msgstr[0] "1 compte importé avec succès." msgstr[1] "%n comptes importés avec succès." #: qifimportexport.cpp:469 #, kde-format msgid "Successfully imported 1 category." msgid_plural "Successfully imported %n categories." msgstr[0] "1 catégorie importée avec succès." msgstr[1] "%n catégories importées avec succès." #: qifimportexport.cpp:473 #, kde-format msgid "1 duplicate transaction was ignored." msgid_plural "%n duplicate transactions was ignored." msgstr[0] "1 transaction dupliquée a été ignorée." msgstr[1] "%n transactions dupliquées ont été ignorées." #: qifimportexport.cpp:477 #, kde-format msgid "Failed to import 1 transaction." msgid_plural "Failed to import %n transactions." msgstr[0] "Echec à l'importation d'1 transaction." msgstr[1] "Echec à l'importation de %n transactions." #: qifimportexport.cpp:481 #, kde-format msgid "1 security was not imported." msgid_plural "%n securities were not imported." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:485 #, fuzzy, kde-format msgid "1 security transaction was not imported." msgid_plural "%n security transactions were not imported." msgstr[0] "Impossible d'enregistrer les transactions importées." msgstr[1] "Impossible d'enregistrer les transactions importées." #: qifimportexport.cpp:494 #, kde-format msgid "Export QIF File" msgstr "Exporter le fichier QIF" #: qifimportexport.cpp:506 #, kde-format msgctxt "All accounts" msgid "All" msgstr "Tout" #: qifimportexport.cpp:517 #, kde-format msgid "Export transaction description as:" msgstr "Exporter la description de la transaction comme:" #: qifimportexport.cpp:524 #, kde-format msgid "Memo" msgstr "Mémo" #: qifimportexport.cpp:528 #, kde-format msgid "Subcategory" msgstr "Sous-catégorie" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 5 #: rc.cpp:3 #, kde-format msgid "&Import" msgstr "&Importer" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 12 #: rc.cpp:6 #, kde-format msgid "&Accounts" msgstr "&Comptes" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 24 #: rc.cpp:9 #, kde-format msgid "&Transactions" msgstr "&Transactions" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 41 #: rc.cpp:12 #, kde-format msgid "&Securities" msgstr "&Titres" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 56 #: rc.cpp:15 #, kde-format msgid "Stat&istics" msgstr "Stat&istiques" #: rc.cpp:16 #, kde-format msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" "Jérôme Rapinat, Antoine Rodriguez,,Launchpad Contributions:,Marie-Lise " "Issoire, Nicolas Velin, Perrine, romjerome" #: rc.cpp:17 #, kde-format msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" "gnupower@hotmail.fr, antoiner@gmail.com,,,,nicolas@velin.fr,," "gnupower@hotmail.fr" #: recurrenceeditwidget.cpp:69 #, kde-format msgid "Edit Exceptions" msgstr "Éditer les exceptions" #: recurrenceeditwidget.cpp:186 #, kde-format msgid "Edit Recurrence Range" msgstr "Éditer les marges de récurrence" #: recurrenceeditwidget.cpp:194 recurrenceeditwidget.cpp:229 #, kde-format msgid "Begins on: %1" msgstr "Commence sur : %1" #: recurrenceeditwidget.cpp:199 #, kde-format msgid "No ending date" msgstr "Pas de date de fin" #: recurrenceeditwidget.cpp:203 #, kde-format msgid "End after" msgstr "Fin après" #: recurrenceeditwidget.cpp:209 #, kde-format msgid "occurrence(s)" msgstr "occurrence(s)" #: recurrenceeditwidget.cpp:211 #, kde-format msgid "End on" msgstr "Fin le" #: recurrenceeditwidget.cpp:298 #, kde-format msgid "End date before start date." msgstr "Date de fin avant la date de départ" #: recurrenceeditwidget.cpp:312 #, kde-format msgid "Enable recurrance" msgstr "Autoriser les récurrences" #: recurrenceeditwidget.cpp:315 #, kde-format msgid "Recurrence Rule" msgstr "Règle de récurrence" #: recurrenceeditwidget.cpp:321 #, kde-format msgid "Weekly" msgstr "hebdomadaire" #: recurrenceeditwidget.cpp:341 recurrenceeditwidget.cpp:352 #: recurrenceeditwidget.cpp:376 recurrenceeditwidget.cpp:462 #, kde-format msgid "Recur every" msgstr "Se produit tous les" #: recurrenceeditwidget.cpp:345 #, kde-format msgid "day(s)" msgstr "jour(s)" #: recurrenceeditwidget.cpp:356 #, kde-format msgid "week(s) on:" msgstr "semaine(s) sur:" #: recurrenceeditwidget.cpp:380 #, kde-format msgid "month(s), after the start month" msgstr "mois(s), après le mois de départ" #: recurrenceeditwidget.cpp:385 recurrenceeditwidget.cpp:437 #, kde-format msgid "Recur on the" msgstr "Se produit le" #: recurrenceeditwidget.cpp:391 recurrenceeditwidget.cpp:442 #: recurrenceeditwidget.cpp:494 #, kde-format msgid "1st" msgstr "1er" #: recurrenceeditwidget.cpp:392 recurrenceeditwidget.cpp:443 #: recurrenceeditwidget.cpp:495 #, kde-format msgid "2nd" msgstr "2ème" #: recurrenceeditwidget.cpp:393 recurrenceeditwidget.cpp:444 #: recurrenceeditwidget.cpp:496 #, kde-format msgid "3rd" msgstr "3ème" #: recurrenceeditwidget.cpp:394 recurrenceeditwidget.cpp:445 #: recurrenceeditwidget.cpp:497 #, kde-format msgid "4th" msgstr "4ème" #: recurrenceeditwidget.cpp:395 recurrenceeditwidget.cpp:446 #: recurrenceeditwidget.cpp:498 #, kde-format msgid "5th" msgstr "5ème" #: recurrenceeditwidget.cpp:396 #, kde-format msgid "6th" msgstr "6ème" #: recurrenceeditwidget.cpp:397 #, kde-format msgid "7th" msgstr "7ème" #: recurrenceeditwidget.cpp:398 #, kde-format msgid "8th" msgstr "8ème" #: recurrenceeditwidget.cpp:399 #, kde-format msgid "9th" msgstr "9ème" #: recurrenceeditwidget.cpp:400 #, kde-format msgid "10th" msgstr "10ème" #: recurrenceeditwidget.cpp:401 #, kde-format msgid "11th" msgstr "11ème" #: recurrenceeditwidget.cpp:402 #, kde-format msgid "12th" msgstr "12ème" #: recurrenceeditwidget.cpp:403 #, kde-format msgid "13th" msgstr "13ème" #: recurrenceeditwidget.cpp:404 #, kde-format msgid "14th" msgstr "14ème" #: recurrenceeditwidget.cpp:405 #, kde-format msgid "15th" msgstr "15ème" #: recurrenceeditwidget.cpp:406 #, kde-format msgid "16th" msgstr "16ème" #: recurrenceeditwidget.cpp:407 #, kde-format msgid "17th" msgstr "17ème" #: recurrenceeditwidget.cpp:408 #, kde-format msgid "18th" msgstr "18ème" #: recurrenceeditwidget.cpp:409 #, kde-format msgid "19th" msgstr "19ème" #: recurrenceeditwidget.cpp:410 #, kde-format msgid "20th" msgstr "20ème" #: recurrenceeditwidget.cpp:411 #, kde-format msgid "21st" msgstr "21ème" #: recurrenceeditwidget.cpp:412 #, kde-format msgid "22nd" msgstr "22ème" #: recurrenceeditwidget.cpp:413 #, kde-format msgid "23rd" msgstr "23ème" #: recurrenceeditwidget.cpp:414 #, kde-format msgid "24th" msgstr "24ème" #: recurrenceeditwidget.cpp:415 #, kde-format msgid "25th" msgstr "25ème" #: recurrenceeditwidget.cpp:416 #, kde-format msgid "26th" msgstr "26ème" #: recurrenceeditwidget.cpp:417 #, kde-format msgid "27th" msgstr "27ème" #: recurrenceeditwidget.cpp:418 #, kde-format msgid "28th" msgstr "28ème" #: recurrenceeditwidget.cpp:419 #, kde-format msgid "29th" msgstr "29ème" #: recurrenceeditwidget.cpp:420 #, kde-format msgid "30th" msgstr "30ème" #: recurrenceeditwidget.cpp:421 #, kde-format msgid "31st" msgstr "31ème" #: recurrenceeditwidget.cpp:422 recurrenceeditwidget.cpp:447 #: recurrenceeditwidget.cpp:499 #, kde-format msgid "Last" msgstr "Dernier(e)" #: recurrenceeditwidget.cpp:423 recurrenceeditwidget.cpp:448 #: recurrenceeditwidget.cpp:500 #, kde-format msgid "2nd Last" msgstr "Avant dernier(e)" #: recurrenceeditwidget.cpp:424 recurrenceeditwidget.cpp:449 #: recurrenceeditwidget.cpp:501 #, kde-format msgid "3rd Last" msgstr "3ème dernier(e)" #: recurrenceeditwidget.cpp:425 recurrenceeditwidget.cpp:450 #: recurrenceeditwidget.cpp:502 #, kde-format msgid "4th Last" msgstr "4ème dernier(e)" #: recurrenceeditwidget.cpp:426 recurrenceeditwidget.cpp:451 #: recurrenceeditwidget.cpp:503 #, kde-format msgid "5th Last" msgstr "5ème dernier(e)" #: recurrenceeditwidget.cpp:429 #, kde-format msgid "day" msgstr "jour" #: recurrenceeditwidget.cpp:431 recurrenceeditwidget.cpp:483 #: recurrenceeditwidget.cpp:521 #, kde-format msgid "possibly on weekend" msgstr "si possible le weekend" #: recurrenceeditwidget.cpp:432 recurrenceeditwidget.cpp:484 #: recurrenceeditwidget.cpp:522 #, kde-format msgid "but before weekend" msgstr "mais avant le weekend" #: recurrenceeditwidget.cpp:433 recurrenceeditwidget.cpp:485 #: recurrenceeditwidget.cpp:523 #, kde-format msgid "but after weekend" msgstr "mais après le weekend" #: recurrenceeditwidget.cpp:466 #, kde-format msgid "year(s), after the start year" msgstr "année(s), après l'année de départ" #: recurrenceeditwidget.cpp:471 #, kde-format msgctxt "part before XXX of 'Recur on day XXX of month YYY'" msgid "Recur on day" msgstr "Reste sur le jour" #: recurrenceeditwidget.cpp:479 #, kde-format msgctxt "part between XXX and YYY of 'Recur on day XXX of month YYY'" msgid "of" msgstr "de" #: recurrenceeditwidget.cpp:489 #, kde-format msgctxt "Part before NNN in 'Recur on the NNN. WEEKDAY of MONTH'" msgid "On the" msgstr "Le" #: recurrenceeditwidget.cpp:507 #, kde-format msgctxt "part between WEEKDAY and MONTH in 'Recur on NNN. WEEKDAY of MONTH'" msgid "of" msgstr "de" #: recurrenceeditwidget.cpp:512 #, kde-format msgid "Recur on day #" msgstr "Se produit le jour #" #: recurrenceeditwidget.cpp:519 #, kde-format msgctxt "part after NNN of 'Recur on day #NNN of the year'" msgid " of the year" msgstr "de l'année" #: recurrenceeditwidget.cpp:533 #, kde-format msgid "Range..." msgstr "Intersection..." #: recurrenceeditwidget.cpp:535 #, kde-format msgid "Exceptions..." msgstr "Exceptions..." #: recurrenceeditwidget.cpp:731 #, kde-format msgid "No day of week selected for weekly recurrence." msgstr "Pas de jour de semaine sélectionné pour la récurrence hebdomadaire." #: recurrenceeditwidget.cpp:745 recurrenceeditwidget.cpp:774 #: recurrenceeditwidget.cpp:791 #, kde-format msgid "Selected day will never occur with selected frequency and start date." msgstr "" "Le jour sélectionné ne se produira jamais avec la fréquence et la date de " "départ sélectionnées." #: recurrenceeditwidget.cpp:761 #, kde-format msgid "Selected day does not exist in selected month." msgstr "Le jour sélectionné n'existe pas dans le mois sélectionné." #: transaction.cpp:155 transaction.cpp:186 #, kde-format msgid "Dividend: %1" msgstr "Dividende: %1" #: transaction.cpp:253 transaction.cpp:256 transaction.cpp:284 #, kde-format msgid "Account balancing" msgstr "Equilibrage du compte" #: transaction.cpp:337 transaction.cpp:352 #, kde-format msgid "Security: %1 (bought)" msgstr "Titre: %1 (acheté)" #: transaction.cpp:375 transaction.cpp:390 #, kde-format msgid "Security: %1 (sold)" msgstr "Titre: %1 (vendu)" #: transactioneditwidget.cpp:125 #, kde-format msgid "Shares bought:" msgstr "Parts achetées:" #: transactioneditwidget.cpp:130 #, kde-format msgid "Shares sold:" msgstr "Parts vendues:" #: transactioneditwidget.cpp:238 transactioneditwidget.cpp:1144 #: transactionfilterwidget.cpp:140 #, kde-format msgid "Payer:" msgstr "Débiteur:" #: transactioneditwidget.cpp:280 transactioneditwidget.cpp:1145 #: transactionfilterwidget.cpp:141 #, kde-format msgid "Payee:" msgstr "Bénéficiaire:" #: transactioneditwidget.cpp:664 transactioneditwidget.cpp:1262 #, kde-format msgid "No income category available." msgstr "Pas de catégorie de revenu disponible" #: transactioneditwidget.cpp:689 transactioneditwidget.cpp:1270 #, kde-format msgid "No expense category available." msgstr "Pas de catégorie de dépense disponible" #: transactioneditwidget.cpp:720 #, kde-format msgid "Cannot create a regular transfer to/from a securities account." msgstr "Impossible de créer un transfert régulier de/vers un compte de titres." #: transactioneditwidget.cpp:727 #, kde-format msgid "Cannot create a regular income to a securities account." msgstr "Impossible de créer un revenu régulier vers un compte de titres." #: transactioneditwidget.cpp:743 #, kde-format msgid "Zero price per share not allowed." msgstr "Prix zéro par part non autorisé." #: transactioneditwidget.cpp:755 #, kde-format msgid "Cannot create a regular expense from a securities account." msgstr "" "Impossible de créer une dépense régulière à partir d' un compte de titres." #: transactioneditwidget.cpp:1086 #, kde-format msgid "Modify Transactions" msgstr "Modifier les transactions" #: transactionfilterwidget.cpp:99 #, kde-format msgid "Min amount:" msgstr "Montant min:" #: transactionfilterwidget.cpp:100 #, kde-format msgid "Max amount:" msgstr "Montant max:" #: transactionfilterwidget.cpp:110 #, kde-format msgid "Min income:" msgstr "Revenu min:" #: transactionfilterwidget.cpp:111 #, kde-format msgid "Max income:" msgstr "Revenu max:" #: transactionfilterwidget.cpp:121 #, kde-format msgid "Min cost:" msgstr "Coût min:" #: transactionfilterwidget.cpp:122 #, kde-format msgid "Max cost:" msgstr "Coût max:" #: transactionfilterwidget.cpp:148 #, kde-format msgid "Include" msgstr "Inclut" #: transactionfilterwidget.cpp:152 #, kde-format msgid "Exclude" msgstr "Exclut" #: transactionlistwidget.cpp:117 #, kde-format msgid "From Account" msgstr "Du compte" #: transactionlistwidget.cpp:128 #, kde-format msgid "To Account" msgstr "Vers le compte" #: transactionlistwidget.cpp:130 #, kde-format msgid "Payer" msgstr "Créditeur" #: transactionlistwidget.cpp:169 #, kde-format msgid "New/Edit Expense" msgstr "Nouvelle dépense" #: transactionlistwidget.cpp:170 #, kde-format msgid "Filter" msgstr "Filtre" #: transactionlistwidget.cpp:209 #, kde-format msgid "Total:" msgstr "Total:" #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:328 #, kde-format msgid "Average:" msgstr "Moyenne:" #: transactionlistwidget.cpp:209 #, kde-format msgid "Monthly:" msgstr "Mensuel:" #: transactionlistwidget.cpp:314 #, kde-format msgid "Total cost:" msgstr "Coût total:" #: transactionlistwidget.cpp:318 #, kde-format msgid "Total income:" msgstr "Revenu total:" #: transactionlistwidget.cpp:322 #, kde-format msgid "Total amount:" msgstr "Quantité totale:" #: transactionlistwidget.cpp:330 #, kde-format msgid "Monthly average:" msgstr "Moyenne mensuelle:" #: transactionlistwidget.cpp:671 #, kde-format msgid "" "Are you sure you want to delete all (%1) transactions in the selected split " "transaction?" msgstr "" "Êtes-vous certain de vouloir supprimer toutes les (%1) transactions " "sélectionnées comme transaction séparée?" #: transactionlistwidget.cpp:1028 #, kde-format msgid "* Part of split transaction" msgstr "* partie de la transaction séparée" #: transactionlistwidget.cpp:1029 #, kde-format msgid "* Part of split (%1)" msgstr "* Partie de la séparation (%1)" #: transactionlistwidget.cpp:1033 #, kde-format msgid "** Recurring (editing occurrance)" msgstr "** Se reproduit (éditer l' occurrence)" #: transactionlistwidget.cpp:1049 #, kde-format msgid "Modify..." msgstr "Modifier..." eqonomize-0.6/po/it.po0000644000175000017500000023651311107053373013725 0ustar hannahanna# Italian translation for eqonomize # Copyright (c) 2006 Rosetta Contributors and Canonical Ltd 2006 # This file is distributed under the same license as the eqonomize package. # FIRST AUTHOR , 2006. # msgid "" msgstr "" "Project-Id-Version: eqonomize\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?" "group_id=173799&atid=866832\n" "POT-Creation-Date: 2008-11-13 14:35+0100\n" "PO-Revision-Date: 2008-09-09 12:49+0000\n" "Last-Translator: Guybrush88 \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2008-11-12 16:02+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: budget.cpp:51 editsplitdialog.cpp:118 ledgerdialog.cpp:652 #, kde-format msgid "Balancing" msgstr "Bilanciamento" #: budget.cpp:84 #, kde-format msgid "Couldn't open %1 for reading" msgstr "Impossibile aprire %1 per la lettura" #: budget.cpp:95 #, kde-format msgid "" "Not a valid Eqonomize! file (XML parse error: \"%2\" at line %3, col %4)" msgstr "" "Non è un file valido di Eqonomize! (Errore di analisi XML: \"%2\" alla linea " "%3, colonna %4)" #: budget.cpp:98 #, kde-format msgid "Invalid root element %1 in XML document" msgstr "L'elemento radice %1 del documento XML non è valido" #: budget.cpp:363 #, kde-format msgid "Unable to load 1 account." msgid_plural "Unable to load %n accounts." msgstr[0] "Fallito il caricamento di 1 conto." msgstr[1] "Fallito il caricamento di %n conti." #: budget.cpp:368 #, kde-format msgid "Unable to load 1 category." msgid_plural "Unable to load %n categories." msgstr[0] "Fallito il caricamento di 1 categoria." msgstr[1] "Fallito il caricamento di %n categorie." #: budget.cpp:373 #, kde-format msgid "Unable to load 1 security." msgid_plural "Unable to load %n securities." msgstr[0] "Fallito il caricamento di 1 titolo." msgstr[1] "Fallito il caricamento di %n titoli." #: budget.cpp:378 #, kde-format msgid "Unable to load 1 transaction." msgid_plural "Unable to load %n transactions." msgstr[0] "Fallito il caricamento di 1 transizione." msgstr[1] "Fallito il caricamento di %n transizioni." #: budget.cpp:389 #, kde-format msgid "File is a directory" msgstr "Il file è una directory" #: budget.cpp:397 #, kde-format msgid "Couldn't open file for writing" msgstr "Impossibile aprire il file per la scrittura" #: budget.cpp:547 budget.cpp:551 #, kde-format msgid "Error while writing file; file was not saved" msgstr "Errore nella scrittura del file; il file non è stato salvato." #: categoriescomparisonchart.cpp:123 categoriescomparisonreport.cpp:164 #: eqonomize.cpp:1797 eqonomize.cpp:1957 eqonomize.cpp:2036 #: transactionlistwidget.cpp:138 #, kde-format msgid "From" msgstr "Da" #: categoriescomparisonchart.cpp:130 categoriescomparisonreport.cpp:171 #: eqonomize.cpp:1808 eqonomize.cpp:1969 eqonomize.cpp:2037 #: transactionlistwidget.cpp:139 #, kde-format msgid "To" msgstr "A" #: categoriescomparisonchart.cpp:147 categoriescomparisonreport.cpp:114 #: overtimechart.cpp:112 overtimechart.cpp.bak:106 overtimereport.cpp:97 #, kde-format msgid "Source:" msgstr "Fonte:" #: categoriescomparisonchart.cpp:150 categoriescomparisonchart.cpp:858 #, kde-format msgid "All Expenses" msgstr "Tutte le uscite" #: categoriescomparisonchart.cpp:151 categoriescomparisonchart.cpp:859 #, kde-format msgid "All Incomes" msgstr "Tutte le entrate" #: categoriescomparisonchart.cpp:152 categoriescomparisonchart.cpp:860 #, kde-format msgid "All Accounts" msgstr "Tutti i conti" #: categoriescomparisonchart.cpp:155 categoriescomparisonchart.cpp:864 #: categoriescomparisonreport.cpp:122 categoriescomparisonreport.cpp:752 #: categoriescomparisonreport.cpp:1016 overtimereport.cpp:375 #, kde-format msgid "Expenses: %1" msgstr "Uscite: %1" #: categoriescomparisonchart.cpp:160 categoriescomparisonchart.cpp:871 #: categoriescomparisonreport.cpp:127 categoriescomparisonreport.cpp:756 #: categoriescomparisonreport.cpp:1023 overtimereport.cpp:366 #, kde-format msgid "Incomes: %1" msgstr "Entrate: %1" #: categoriescomparisonchart.cpp:199 categoriescomparisonchart.cpp:225 #: categoriescomparisonreport.cpp:334 categoriescomparisonreport.cpp:360 #: editsplitdialog.cpp:411 eqonomize.cpp:482 eqonomize.cpp:571 #: eqonomize.cpp:741 eqonomize.cpp:848 eqonomize.cpp:870 eqonomize.cpp:2483 #: eqonomize.cpp:3180 eqonomize.cpp:3206 eqonomize.cpp:3326 eqonomize.cpp:3352 #: importcsvdialog.cpp:780 importcsvdialog.cpp:1196 overtimechart.cpp:462 #: overtimechart.cpp:500 overtimechart.cpp:528 overtimechart.cpp:566 #: overtimechart.cpp.bak:455 overtimechart.cpp.bak:493 #: overtimechart.cpp.bak:521 overtimechart.cpp.bak:559 #: recurrenceeditwidget.cpp:156 recurrenceeditwidget.cpp:171 #: recurrenceeditwidget.cpp:293 transactioneditwidget.cpp:707 #: transactioneditwidget.cpp:1281 transactionfilterwidget.cpp:564 #: transactionfilterwidget.cpp:590 #, kde-format msgid "Invalid date." msgstr "Data non valida." #: categoriescomparisonchart.cpp:204 categoriescomparisonreport.cpp:339 #: eqonomize.cpp:3185 eqonomize.cpp:3331 transactionfilterwidget.cpp:569 #, kde-format msgid "To date is before from date." msgstr "La data A è precedente alla data Da." #: categoriescomparisonchart.cpp:229 categoriescomparisonreport.cpp:364 #: eqonomize.cpp:3210 eqonomize.cpp:3356 transactionfilterwidget.cpp:594 #, kde-format msgid "From date is after to date." msgstr "La data Da è posteriore alla data A." #: categoriescomparisonchart.cpp:340 categoriescomparisonreport.cpp:463 #: eqonomize.cpp:3610 eqonomize.cpp:4252 ledgerdialog.cpp:251 #: overtimechart.cpp:624 overtimechart.cpp.bak:617 overtimereport.cpp:278 #: qifimportexport.cpp:604 #, kde-format msgid "" "The selected file already exists. Would you like to overwrite the old copy?" msgstr "Il file selezionato già esiste. Vuoi sovrascriverlo?" #: categoriescomparisonchart.cpp:344 categoriescomparisonreport.cpp:467 #: eqonomize.cpp:4257 ledgerdialog.cpp:255 overtimechart.cpp:628 #: overtimechart.cpp.bak:621 overtimereport.cpp:282 qifimportexport.cpp:608 #, kde-format msgid "You selected a directory!" msgstr "Hai selezionato una cartella!" #: categoriescomparisonchart.cpp:352 categoriescomparisonreport.cpp:475 #: eqonomize.cpp:4264 ledgerdialog.cpp:263 overtimechart.cpp:636 #: overtimechart.cpp.bak:629 overtimereport.cpp:290 qifimportexport.cpp:616 #, kde-format msgid "Couldn't open file for writing." msgstr "Impossibile aprire il file per la scrittura." #: categoriescomparisonchart.cpp:372 categoriescomparisonreport.cpp:482 #: eqonomize.cpp:4270 ledgerdialog.cpp:269 overtimechart.cpp:656 #: overtimechart.cpp.bak:644 overtimereport.cpp:297 qifimportexport.cpp:622 #, kde-format msgid "Error while writing file; file was not saved." msgstr "Errore nella scrittura del file; il file non è stato salvato." #: categoriescomparisonchart.cpp:728 categoriescomparisonreport.cpp:303 #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:754 #: categoriescomparisonreport.cpp:839 categoriescomparisonreport.cpp:930 #: categoriescomparisonreport.cpp:977 overtimechart.cpp:373 #: overtimechart.cpp:1740 overtimechart.cpp:1746 overtimechart.cpp:1774 #: overtimechart.cpp:1776 overtimechart.cpp:1783 overtimechart.cpp:1785 #: overtimechart.cpp:1821 overtimechart.cpp:1891 overtimechart.cpp.bak:366 #: overtimechart.cpp.bak:1721 overtimechart.cpp.bak:1727 #: overtimechart.cpp.bak:1755 overtimechart.cpp.bak:1757 #: overtimechart.cpp.bak:1764 overtimechart.cpp.bak:1766 #: overtimechart.cpp.bak:1811 overtimechart.cpp.bak:1892 #: overtimereport.cpp:213 overtimereport.cpp:384 overtimereport.cpp:393 #: overtimereport.cpp:732 #, kde-format msgid "No description" msgstr "Nessuna descrizione" #: categoriescomparisonreport.cpp:119 categoriescomparisonreport.cpp:1012 #, kde-format msgid "All Categories" msgstr "Tutte le categorie" #: categoriescomparisonreport.cpp:138 #, kde-format msgid "Descriptions for" msgstr "Descrizione per" #: categoriescomparisonreport.cpp:145 #, kde-format msgid "Payees/payers for" msgstr "Creditore/debitore per" #: categoriescomparisonreport.cpp:161 #, kde-format msgid "Period:" msgstr "Periodo:" #: categoriescomparisonreport.cpp:186 overtimereport.cpp:120 #, kde-format msgid "Columns:" msgstr "Colonne:" #: categoriescomparisonreport.cpp:189 categoriescomparisonreport.cpp:782 #: eqonomize.cpp:1062 eqonomize.cpp:1935 eqonomize.cpp:4142 #: importcsvdialog.cpp:139 importcsvdialog.cpp:157 importcsvdialog.cpp:180 #: importcsvdialog.cpp:197 importcsvdialog.cpp:216 importcsvdialog.cpp:235 #: importcsvdialog.cpp:253 overtimereport.cpp:123 #, kde-format msgid "Value" msgstr "Valore" #: categoriescomparisonreport.cpp:192 overtimereport.cpp:126 #: recurrenceeditwidget.cpp:320 #, kde-format msgid "Daily" msgstr "Giornalmente" #: categoriescomparisonreport.cpp:195 overtimereport.cpp:129 #: recurrenceeditwidget.cpp:322 #, kde-format msgid "Monthly" msgstr "Mensilmente" #: categoriescomparisonreport.cpp:198 overtimereport.cpp:132 #: recurrenceeditwidget.cpp:323 #, kde-format msgid "Yearly" msgstr "Annualmente" #: categoriescomparisonreport.cpp:201 categoriescomparisonreport.cpp:787 #: overtimechart.cpp:205 overtimechart.cpp:1534 overtimechart.cpp.bak:198 #: overtimechart.cpp.bak:1515 overtimereport.cpp:135 overtimereport.cpp:549 #: transactionlistwidget.cpp:276 transactionlistwidget.cpp:340 #, kde-format msgid "Quantity" msgstr "Quantità" #: categoriescomparisonreport.cpp:204 overtimechart.cpp:209 #: overtimechart.cpp.bak:202 overtimereport.cpp:138 #, kde-format msgid "Average value" msgstr "Valore medio" #: categoriescomparisonreport.cpp:278 categoriescomparisonreport.cpp:947 #, kde-format msgid "All descriptions" msgstr "Tutte le descrizioni" #: categoriescomparisonreport.cpp:279 categoriescomparisonreport.cpp:948 #, kde-format msgid "All payees" msgstr "Tutti i creditori" #: categoriescomparisonreport.cpp:280 categoriescomparisonreport.cpp:949 #, kde-format msgid "All payers" msgstr "Tutti i debitori" #: categoriescomparisonreport.cpp:309 categoriescomparisonreport.cpp:751 #: categoriescomparisonreport.cpp:837 categoriescomparisonreport.cpp:932 #: categoriescomparisonreport.cpp:994 overtimechart.cpp:382 #: overtimechart.cpp:1758 overtimechart.cpp:1768 overtimechart.cpp:1823 #: overtimechart.cpp:1908 overtimechart.cpp.bak:375 overtimechart.cpp.bak:1739 #: overtimechart.cpp.bak:1749 overtimechart.cpp.bak:1813 #: overtimechart.cpp.bak:1909 #, kde-format msgid "No payee" msgstr "Nessun creditore" #: categoriescomparisonreport.cpp:310 categoriescomparisonreport.cpp:755 #: categoriescomparisonreport.cpp:838 categoriescomparisonreport.cpp:933 #: categoriescomparisonreport.cpp:995 overtimechart.cpp:381 #: overtimechart.cpp:1752 overtimechart.cpp:1763 overtimechart.cpp:1825 #: overtimechart.cpp:1907 overtimechart.cpp.bak:374 overtimechart.cpp.bak:1733 #: overtimechart.cpp.bak:1744 overtimechart.cpp.bak:1815 #: overtimechart.cpp.bak:1908 #, kde-format msgid "No payer" msgstr "Nessun debitore" #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:751 #: overtimereport.cpp:393 #, kde-format msgid "Expenses: %2, %1" msgstr "Uscite: %2, %1" #: categoriescomparisonreport.cpp:754 categoriescomparisonreport.cpp:755 #: overtimereport.cpp:384 #, kde-format msgid "Incomes: %2, %1" msgstr "Entrate: %2, %1" #: categoriescomparisonreport.cpp:758 #, kde-format msgid "Incomes & Expenses" msgstr "Entrate & Uscite" #: categoriescomparisonreport.cpp:771 #, kde-format msgctxt "html format; %1: title; %2: from date; %3: to date" msgid "%1 (%2–%3)" msgstr "%1 (%2–%3)" #: categoriescomparisonreport.cpp:772 #, kde-format msgctxt "html format; %1: title; %2: to date" msgid "%1 (to %2)" msgstr "%1 (a %2)" #: categoriescomparisonreport.cpp:776 eqonomize.cpp:4046 eqonomize.cpp:4094 #: qifimportexport.cpp:131 transactionlistwidget.cpp:116 #: transactionlistwidget.cpp:127 #, kde-format msgid "Category" msgstr "Categoria" #: categoriescomparisonreport.cpp:778 eqonomize.cpp:1938 #: transactionlistwidget.cpp:115 #, kde-format msgid "Cost" msgstr "Costo" #: categoriescomparisonreport.cpp:780 editscheduledtransactiondialog.cpp:46 #: editsplitdialog.cpp:108 eqonomize.cpp:285 eqonomize.cpp:329 #: ledgerdialog.cpp:647 transactionlistwidget.cpp:126 #, kde-format msgid "Income" msgstr "Entrata" #: categoriescomparisonreport.cpp:784 overtimereport.cpp:545 #, kde-format msgid "Daily Average" msgstr "Media Giornaliera" #: categoriescomparisonreport.cpp:785 overtimereport.cpp:546 #, kde-format msgid "Monthly Average" msgstr "Media Mensile" #: categoriescomparisonreport.cpp:786 overtimereport.cpp:547 #, kde-format msgid "Yearly Average" msgstr "Media Annuale" #: categoriescomparisonreport.cpp:789 overtimereport.cpp:358 #: overtimereport.cpp:376 overtimereport.cpp:394 #, kde-format msgid "Average Cost" msgstr "Media dei Costi" #: categoriescomparisonreport.cpp:791 overtimereport.cpp:350 #: overtimereport.cpp:367 overtimereport.cpp:385 #, kde-format msgid "Average Income" msgstr "Media delle Entrate" #: categoriescomparisonreport.cpp:793 #, kde-format msgid "Average Value" msgstr "Valore Medio" #: categoriescomparisonreport.cpp:853 eqonomize.cpp:3932 eqonomize.cpp:4030 #: eqonomize.cpp:4075 eqonomize.cpp:4123 overtimereport.cpp:686 #, kde-format msgid "Total" msgstr "Totale" #: categoriescomparisonreport.cpp:878 #, kde-format msgid "Total incomes" msgstr "Totale delle entrate" #: categoriescomparisonreport.cpp:902 #, kde-format msgid "Total expenses" msgstr "Totale delle uscite" #: categoriescomparisonreport.cpp:912 #, kde-format msgid "Total (Profits)" msgstr "Totale (Profitti)" #: editscheduledtransactiondialog.cpp:45 editsplitdialog.cpp:111 #: eqonomize.cpp:288 eqonomize.cpp:332 ledgerdialog.cpp:650 #, kde-format msgid "Expense" msgstr "Uscita" #: editscheduledtransactiondialog.cpp:47 editsplitdialog.cpp:120 #: eqonomize.cpp:282 eqonomize.cpp:326 ledgerdialog.cpp:653 #, kde-format msgid "Transfer" msgstr "Trasferimento" #: editscheduledtransactiondialog.cpp:48 editsplitdialog.cpp:114 #: eqonomize.cpp:289 eqonomize.cpp:333 #, kde-format msgid "Security Buy" msgstr "Acquisto di titoli" #: editscheduledtransactiondialog.cpp:49 editsplitdialog.cpp:116 #: eqonomize.cpp:290 eqonomize.cpp:334 #, kde-format msgid "Security Sell" msgstr "Vendita di titoli" #: editscheduledtransactiondialog.cpp:56 editscheduledtransactiondialog.cpp:57 #, kde-format msgid "Recurrence" msgstr "Ricorrenza" #: editscheduledtransactiondialog.cpp:104 #, kde-format msgid "New Expense" msgstr "Nuova Uscita" #: editscheduledtransactiondialog.cpp:106 #, kde-format msgid "New Dividend" msgstr "Nuovo Dividendo" #: editscheduledtransactiondialog.cpp:107 #, kde-format msgid "New Income" msgstr "Nuova Entrata" #: editscheduledtransactiondialog.cpp:110 #, kde-format msgid "New Transfer" msgstr "Nuovo Trasferimento" #: editscheduledtransactiondialog.cpp:111 #, kde-format msgid "New Security Buy" msgstr "Nuovo acquisto di titoli" #: editscheduledtransactiondialog.cpp:113 #, kde-format msgid "New Security Sell" msgstr "Nuova vendita di titoli" #: editscheduledtransactiondialog.cpp:128 #: editscheduledtransactiondialog.cpp:149 transactioneditwidget.cpp:1064 #, kde-format msgid "Edit Expense" msgstr "Modifica Uscita" #: editscheduledtransactiondialog.cpp:130 #: editscheduledtransactiondialog.cpp:151 transactioneditwidget.cpp:1066 #, kde-format msgid "Edit Dividend" msgstr "Modifica Dividendo" #: editscheduledtransactiondialog.cpp:131 #: editscheduledtransactiondialog.cpp:152 transactioneditwidget.cpp:1067 #, kde-format msgid "Edit Income" msgstr "Modifica Entrata" #: editscheduledtransactiondialog.cpp:134 #: editscheduledtransactiondialog.cpp:155 transactioneditwidget.cpp:1070 #, kde-format msgid "Edit Transfer" msgstr "Modifica Trasferimento" #: editscheduledtransactiondialog.cpp:135 #: editscheduledtransactiondialog.cpp:156 transactioneditwidget.cpp:1071 #, kde-format msgid "Edit Securities Bought" msgstr "Modifica i titoli acquistati" #: editscheduledtransactiondialog.cpp:136 #: editscheduledtransactiondialog.cpp:157 transactioneditwidget.cpp:1072 #, kde-format msgid "Edit Securities Sold" msgstr "Modifica i titoli venduti" #: editsplitdialog.cpp:107 eqonomize.cpp:284 eqonomize.cpp:328 #: eqonomize.cpp:1167 #, kde-format msgid "Dividend" msgstr "Dividendo" #: editsplitdialog.cpp:109 eqonomize.cpp:403 eqonomize.cpp:445 #: ledgerdialog.cpp:648 #, kde-format msgid "Repayment" msgstr "Rimborso" #: editsplitdialog.cpp:112 eqonomize.cpp:404 eqonomize.cpp:446 #: ledgerdialog.cpp:651 #, kde-format msgid "Refund" msgstr "Rimborso" #: editsplitdialog.cpp:126 ledgerdialog.cpp:638 #, kde-format msgid "Split Transaction" msgstr "Dividi la Transazione" #: editsplitdialog.cpp:138 eqonomize.cpp:1279 eqonomize.cpp:1379 #: eqonomize.cpp:1473 eqonomize.cpp:1538 importcsvdialog.cpp:129 #: transactioneditwidget.cpp:175 transactioneditwidget.cpp:1099 #: transactionfilterwidget.cpp:135 #, kde-format msgid "Description:" msgstr "Descrizione:" #: editsplitdialog.cpp:143 eqonomize.cpp:413 eqonomize.cpp:523 #: eqonomize.cpp:639 eqonomize.cpp:1274 eqonomize.cpp:2476 #: importcsvdialog.cpp:187 transactioneditwidget.cpp:149 #: transactioneditwidget.cpp:199 transactioneditwidget.cpp:1119 #, kde-format msgid "Date:" msgstr "Data:" #: editsplitdialog.cpp:148 eqonomize.cpp:424 eqonomize.cpp:1252 #: importcsvdialog.cpp:388 importcsvdialog.cpp:399 ledgerdialog.cpp:107 #: qifimportexport.cpp:503 #, kde-format msgid "Account:" msgstr "Conto:" #: editsplitdialog.cpp:163 #, kde-format msgid "Transactions:" msgstr "Transazioni:" #: editsplitdialog.cpp:172 eqonomize.cpp:914 eqonomize.cpp:1061 #: eqonomize.cpp:1941 eqonomize.cpp:2033 eqonomize.cpp:3988 #: ledgerdialog.cpp:135 #, kde-format msgid "Type" msgstr "Tipo" #: editsplitdialog.cpp:173 eqonomize.cpp:915 eqonomize.cpp:2034 #: ledgerdialog.cpp:136 qifimportexport.cpp:127 qifimportexport.cpp:139 #: qifimportexport.cpp:149 transactionlistwidget.cpp:111 #, kde-format msgid "Description" msgstr "Descrizione" #: editsplitdialog.cpp:174 eqonomize.cpp:4142 ledgerdialog.cpp:137 #, kde-format msgid "Account/Category" msgstr "Conto/Categoria" #: editsplitdialog.cpp:175 #, kde-format msgid "Payment" msgstr "Pagamento" #: editsplitdialog.cpp:176 ledgerdialog.cpp:138 #, kde-format msgid "Deposit" msgstr "Deposito" #: editsplitdialog.cpp:181 ledgerdialog.cpp:151 #, kde-format msgid "New" msgstr "Nuovo" #: editsplitdialog.cpp:184 eqonomize.cpp:4333 #, kde-format msgid "New Expense..." msgstr "Nuova Uscita..." #: editsplitdialog.cpp:185 eqonomize.cpp:4334 #, kde-format msgid "New Income..." msgstr "Nuova Entrata..." #: editsplitdialog.cpp:186 #, kde-format msgid "New Deposit..." msgstr "Nuovo Deposito..." #: editsplitdialog.cpp:187 #, kde-format msgid "New Withdrawal..." msgstr "Nuovo Prelievo..." #: editsplitdialog.cpp:188 #, fuzzy, kde-format msgid "New Security Shares Bought..." msgstr "Azioni Acquistate..." #: editsplitdialog.cpp:189 #, kde-format msgid "Security Shares Sold..." msgstr "" #: editsplitdialog.cpp:190 #, kde-format msgid "New Dividend..." msgstr "" #: editsplitdialog.cpp:191 eqonomize.cpp:924 eqonomize.cpp:1071 #: eqonomize.cpp:4328 ledgerdialog.cpp:158 transactionlistwidget.cpp:1051 #, kde-format msgid "Edit..." msgstr "Modifica..." #: editsplitdialog.cpp:221 eqonomize.cpp:2325 #, kde-format msgid "Total value:" msgstr "Valore totale:" #: editsplitdialog.cpp:403 transactioneditwidget.cpp:653 #: transactioneditwidget.cpp:657 transactioneditwidget.cpp:668 #: transactioneditwidget.cpp:682 transactioneditwidget.cpp:693 #, kde-format msgid "No suitable account available." msgstr "Nessun conto adeguato è disponibile." #: editsplitdialog.cpp:415 #, kde-format msgid "Future dates is not allowed." msgstr "Date future non sono permesse" #: editsplitdialog.cpp:419 #, kde-format msgid "A split must contain at least two transactions." msgstr "Una suddivisione deve contenere almeno due transazioni." #: editsplitdialog.cpp:428 transactioneditwidget.cpp:714 #, kde-format msgid "Cannot transfer money to and from the same account." msgstr "Impossibile trasferire denaro a e dallo stesso conto." #: eqonomize.cpp:419 eqonomize.cpp:2325 importcsvdialog.cpp:146 #: importcsvdialog.cpp:169 importcsvdialog.cpp:355 #: transactioneditwidget.cpp:117 transactioneditwidget.cpp:186 #: transactioneditwidget.cpp:1111 #, kde-format msgid "Cost:" msgstr "Costo:" #: eqonomize.cpp:420 importcsvdialog.cpp:364 importcsvdialog.cpp:397 #: transactioneditwidget.cpp:118 transactioneditwidget.cpp:184 #: transactioneditwidget.cpp:1110 #, kde-format msgid "Income:" msgstr "Entrata:" #: eqonomize.cpp:439 transactioneditwidget.cpp:193 #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:310 #, kde-format msgid "Quantity:" msgstr "Quantità:" #: eqonomize.cpp:443 importcsvdialog.cpp:243 transactioneditwidget.cpp:288 #, kde-format msgid "Comments:" msgstr "Commenti:" #: eqonomize.cpp:491 eqonomize.cpp:1176 #, kde-format msgid "Reinvested Dividend" msgstr "Dividendo Reinvestito" #: eqonomize.cpp:501 transactioneditwidget.cpp:97 #: transactioneditwidget.cpp:157 #, kde-format msgid "Security:" msgstr "Sicurezza:" #: eqonomize.cpp:518 #, kde-format msgid "Shares added:" msgstr "Azioni aggiunte:" #: eqonomize.cpp:579 #, kde-format msgid "Security Trade" msgstr "Commercio di titoli" #: eqonomize.cpp:587 #, kde-format msgid "From security:" msgstr "Dal titolo:" #: eqonomize.cpp:603 #, kde-format msgid "Shares moved:" msgstr "Titoli trasferiti:" #: eqonomize.cpp:608 transactioneditwidget.cpp:135 #: transactionfilterwidget.cpp:167 transactionfilterwidget.cpp:168 #: transactionfilterwidget.cpp:343 transactionfilterwidget.cpp:380 #, kde-format msgid "All" msgstr "Tutti" #: eqonomize.cpp:614 #, kde-format msgid "To security:" msgstr "Al titolo:" #: eqonomize.cpp:631 #, kde-format msgid "Shares received:" msgstr "Azioni ricevute:" #: eqonomize.cpp:635 importcsvdialog.cpp:386 importcsvdialog.cpp:412 #: overtimechart.cpp:193 overtimechart.cpp.bak:186 #, kde-format msgid "Value:" msgstr "Valore:" #: eqonomize.cpp:725 #, kde-format msgid "No other security available for trade in the account." msgstr "Nessun altro titolo disponibile per commercio, nel conto." #: eqonomize.cpp:737 #, kde-format msgid "Selected to and from securities are the same." msgstr "A e Da sicurezze sono la stessa." #: eqonomize.cpp:745 transactioneditwidget.cpp:735 #, kde-format msgid "Zero shares not allowed." msgstr "Zero azioni non è permesso." #: eqonomize.cpp:749 transactioneditwidget.cpp:739 #, kde-format msgid "Zero value not allowed." msgstr "Il valore zero non è permesso." #: eqonomize.cpp:757 eqonomize.cpp:766 #, kde-format msgid "Quotations" msgstr "Quotazione" #: eqonomize.cpp:777 eqonomize.cpp:913 eqonomize.cpp:962 eqonomize.cpp:1060 #: ledgerdialog.cpp:134 transactionlistwidget.cpp:110 #, kde-format msgid "Date" msgstr "Data" #: eqonomize.cpp:778 #, kde-format msgid "Price per Share" msgstr "Prezzo per Azione" #: eqonomize.cpp:820 #, kde-format msgid "Quotations for %1" msgstr "Quotazione per %1" #: eqonomize.cpp:904 #, kde-format msgid "" "The following transactions was scheduled to occur today or before today.\n" "Confirm that they have indeed occurred (or will occur today)." msgstr "" "La seguente transazione è stata pianificata per occorrere oggi o " "precedentemente.\n" "Conferma che è veramente occorsa (o che occorrerà oggi)." #: eqonomize.cpp:916 eqonomize.cpp:2035 transactionlistwidget.cpp:137 #, kde-format msgid "Amount" msgstr "Quantità" #: eqonomize.cpp:926 #, kde-format msgid "Postpone..." msgstr "Rinvia..." #: eqonomize.cpp:973 #, kde-format msgid "Can only postpone to future dates." msgstr "Si può rinviare solo a date future." #: eqonomize.cpp:1052 ledgerdialog.cpp:299 #, kde-format msgid "Transactions for %1" msgstr "Transazione per %1" #: eqonomize.cpp:1063 eqonomize.cpp:1936 #, kde-format msgid "Shares" msgstr "Azioni" #: eqonomize.cpp:1160 #, kde-format msgid "Shares Bought" msgstr "Azioni comprate" #: eqonomize.cpp:1161 #, kde-format msgid "Shares Sold" msgstr "Azioni vendute" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Sold (Traded)" msgstr "Azioni vendute (commerciate)" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Bought (Traded)" msgstr "Azioni comprate (commerciate)" #: eqonomize.cpp:1204 #, kde-format msgid "Shares Bought (Recurring)" msgstr "Azioni comprate (con ricorrenza)" #: eqonomize.cpp:1205 #, kde-format msgid "Shares Sold (Recurring)" msgstr "Azioni vendute (con ricorrenza)" #: eqonomize.cpp:1207 #, kde-format msgid "Shares Bought (Scheduled)" msgstr "Azioni comprate (pianificate)" #: eqonomize.cpp:1208 #, kde-format msgid "Shares Sold (Scheduled)" msgstr "Azioni vendute (pianificate)" #: eqonomize.cpp:1220 #, kde-format msgid "Recurring Dividend" msgstr "Dividendo ricorrente" #: eqonomize.cpp:1222 #, kde-format msgid "Scheduled Dividend" msgstr "Dividendo pianificato" #: eqonomize.cpp:1240 eqonomize.cpp:1360 #, kde-format msgid "Type:" msgstr "Tipo:" #: eqonomize.cpp:1243 eqonomize.cpp:2600 eqonomize.cpp:2660 #, kde-format msgid "Mutual Fund" msgstr "Fondi Comuni" #: eqonomize.cpp:1244 eqonomize.cpp:2598 eqonomize.cpp:2658 #, kde-format msgid "Bond" msgstr "Bond" #: eqonomize.cpp:1245 eqonomize.cpp:2599 eqonomize.cpp:2659 #, kde-format msgid "Stock" msgstr "Azione" #: eqonomize.cpp:1246 eqonomize.cpp:2601 eqonomize.cpp:2661 eqonomize.cpp:3492 #: eqonomize.cpp:3497 importcsvdialog.cpp:117 qifimportexport.cpp:332 #, kde-format msgid "Other" msgstr "Altro" #: eqonomize.cpp:1249 eqonomize.cpp:1370 eqonomize.cpp:1464 eqonomize.cpp:1529 #, kde-format msgid "Name:" msgstr "Nome:" #: eqonomize.cpp:1264 #, kde-format msgid "Decimals in Shares:" msgstr "Decimali in Azioni:" #: eqonomize.cpp:1267 #, kde-format msgid "Initial Shares:" msgstr "Azioni Iniziali:" #: eqonomize.cpp:1270 #, kde-format msgid "Initial quotation:" msgstr "Quotazione iniziale:" #: eqonomize.cpp:1289 transactioneditwidget.cpp:675 #, kde-format msgid "No suitable account or income category available." msgstr "" #: eqonomize.cpp:1363 eqonomize.cpp:3488 eqonomize.cpp:4021 #: qifimportexport.cpp:325 #, kde-format msgid "Cash" msgstr "Contante" #: eqonomize.cpp:1364 eqonomize.cpp:4016 #, kde-format msgid "Current Account" msgstr "Conto Corrente" #: eqonomize.cpp:1365 eqonomize.cpp:3490 eqonomize.cpp:4017 #, kde-format msgid "Savings Account" msgstr "Libretto di Risparmio" #: eqonomize.cpp:1366 eqonomize.cpp:4018 #, kde-format msgid "Credit Card" msgstr "Carta di Credito" #: eqonomize.cpp:1367 eqonomize.cpp:4019 #, kde-format msgid "Liabilities" msgstr "Passività" #: eqonomize.cpp:1368 eqonomize.cpp:1731 eqonomize.cpp:1732 eqonomize.cpp:3891 #: eqonomize.cpp:3897 eqonomize.cpp:4020 #, kde-format msgid "Securities" msgstr "Titoli" #: eqonomize.cpp:1373 #, kde-format msgid "Initial balance:" msgstr "Bilancio iniziale:" #: eqonomize.cpp:1376 #, kde-format msgid "Default account for budgeted transactions" msgstr "Account predefinito per transazioni finanziate" #: eqonomize.cpp:1441 eqonomize.cpp:1507 eqonomize.cpp:1572 #, kde-format msgid "Empty name." msgstr "Nome vuoto." #: eqonomize.cpp:1447 #, kde-format msgid "The entered name is used by another account." msgstr "Il nome inserito è utilizzato da un altro conto." #: eqonomize.cpp:1467 eqonomize.cpp:1532 #, kde-format msgid "Monthly budget:" msgstr "Budget Mensile:" #: eqonomize.cpp:1513 #, kde-format msgid "The entered name is used by another income category." msgstr "Il nome inserito è utilizzato da un'altra categoria d'entrata." #: eqonomize.cpp:1578 #, kde-format msgid "The entered name is used by another expense category." msgstr "Il nome inserito è utilizzato da un'altra categoria di uscita." #: eqonomize.cpp:1711 eqonomize.cpp:1778 eqonomize.cpp:3984 eqonomize.cpp:5970 #: eqonomize.cpp:5976 #, kde-format msgid "Accounts" msgstr "Conti" #: eqonomize.cpp:1712 #, kde-format msgid "Accounts & Categories" msgstr "Conti & Categorie" #: eqonomize.cpp:1716 eqonomize.cpp:1717 eqonomize.cpp:1780 #: importcsvdialog.cpp:70 overtimechart.cpp:126 overtimechart.cpp:1727 #: overtimechart.cpp:1731 overtimechart.cpp.bak:119 overtimechart.cpp.bak:1708 #: overtimechart.cpp.bak:1712 overtimereport.cpp:103 overtimereport.cpp:357 #: overtimereport.cpp:377 overtimereport.cpp:395 transactionlistwidget.cpp:251 #: transactionlistwidget.cpp:263 #, kde-format msgid "Expenses" msgstr "Uscite:" #: eqonomize.cpp:1721 eqonomize.cpp:1722 eqonomize.cpp:1779 eqonomize.cpp:4043 #: importcsvdialog.cpp:75 overtimechart.cpp:127 overtimechart.cpp:1726 #: overtimechart.cpp:1730 overtimechart.cpp.bak:120 overtimechart.cpp.bak:1707 #: overtimechart.cpp.bak:1711 overtimereport.cpp:104 overtimereport.cpp:349 #: overtimereport.cpp:368 overtimereport.cpp:386 transactionlistwidget.cpp:252 #: transactionlistwidget.cpp:264 #, kde-format msgid "Incomes" msgstr "Entrate:" #: eqonomize.cpp:1726 eqonomize.cpp:1727 importcsvdialog.cpp:78 #: transactionlistwidget.cpp:253 transactionlistwidget.cpp:265 #, kde-format msgid "Transfers" msgstr "Trasferimenti:" #: eqonomize.cpp:1736 #, kde-format msgid "Schedule" msgstr "Pianificazione" #: eqonomize.cpp:1737 #, kde-format msgid "Scheduled Transactions" msgstr "Transazioni Pianificate" #: eqonomize.cpp:1753 eqonomize.cpp:1775 #, kde-format msgid "Account / Category" msgstr "Conto / Categoria" #: eqonomize.cpp:1754 #, kde-format msgid "Remaining Budget (%1)" msgstr "Budget Restante (%1)" #: eqonomize.cpp:1755 #, kde-format msgid "Change (%1)" msgstr "Cambio (%1)" #: eqonomize.cpp:1756 #, kde-format msgid "Total (%1)" msgstr "Totale (%1)" #: eqonomize.cpp:1769 #, kde-format msgctxt "%2 remains of %1 budget" msgid "%2 of %1" msgstr "%2 di %1" #: eqonomize.cpp:1785 eqonomize.cpp:4002 #, kde-format msgid "Includes budgeted transactions" msgstr "Incluse le transazioni preventivate" #: eqonomize.cpp:1793 #, kde-format msgid "Period" msgstr "Periodo" #: eqonomize.cpp:1825 #, kde-format msgid "Select Period" msgstr "Seleziona Periodo" #: eqonomize.cpp:1827 eqonomize.cpp:4312 #, kde-format msgid "Current Month" msgstr "Il Mese Corrente" #: eqonomize.cpp:1828 eqonomize.cpp:4313 #, kde-format msgid "Current Year" msgstr "L'Anno Corrente" #: eqonomize.cpp:1829 eqonomize.cpp:4314 #, kde-format msgid "Current Whole Month" msgstr "L'Intero Mese Corrente" #: eqonomize.cpp:1830 eqonomize.cpp:4315 #, kde-format msgid "Current Whole Year" msgstr "L'Intero Anno Corrente" #: eqonomize.cpp:1831 #, kde-format msgid "Whole Past Month" msgstr "L'Intero Mese Trascorso" #: eqonomize.cpp:1832 #, kde-format msgid "Whole Past Year" msgstr "L'intero Anno Trascorso" #: eqonomize.cpp:1833 #, kde-format msgid "Previous Month" msgstr "Il Mese Precedente" #: eqonomize.cpp:1834 #, kde-format msgid "Previous Year" msgstr "L'Anno Precedente" #: eqonomize.cpp:1837 #, kde-format msgid "Show partial budget" msgstr "Mostra budget parziale" #: eqonomize.cpp:1842 #, kde-format msgid "Edit Budget" msgstr "Modifica il Budget" #: eqonomize.cpp:1846 #, kde-format msgid "Budget:" msgstr "Budget:" #: eqonomize.cpp:1856 #, kde-format msgid "Month:" msgstr "Mese:" #: eqonomize.cpp:1864 #, kde-format msgid "Result previous month:" msgstr "Risultato del mese precedente:" #: eqonomize.cpp:1917 eqonomize.cpp:4354 #, kde-format msgid "New Security..." msgstr "Nuovo titolo..." #: eqonomize.cpp:1919 #, kde-format msgid "New Transaction" msgstr "Nuova Transazione" #: eqonomize.cpp:1922 eqonomize.cpp:4362 #, kde-format msgid "Set Quotation..." msgstr "Fissa Quotazione..." #: eqonomize.cpp:1934 eqonomize.cpp:3987 #, kde-format msgid "Name" msgstr "Nome" #: eqonomize.cpp:1937 #, kde-format msgid "Quotation" msgstr "Quotazione" #: eqonomize.cpp:1939 #, kde-format msgid "Profit" msgstr "Profitto" #: eqonomize.cpp:1940 #, kde-format msgid "Yearly Rate" msgstr "Tasso Annuale" #: eqonomize.cpp:1942 qifimportexport.cpp:323 #, kde-format msgid "Account" msgstr "Conto" #: eqonomize.cpp:1953 #, kde-format msgid "Statistics Period" msgstr "Periodo Statistiche" #: eqonomize.cpp:2015 #, kde-format msgid "New Schedule" msgstr "Nuova Pianificazione" #: eqonomize.cpp:2018 #, kde-format msgid "Edit" msgstr "Modifica" #: eqonomize.cpp:2032 #, kde-format msgid "Next Occurrence" msgstr "Prossima Ricorrenza" #: eqonomize.cpp:2038 qifimportexport.cpp:152 transactionlistwidget.cpp:144 #, kde-format msgid "Comments" msgstr "Commenti" #: eqonomize.cpp:2291 #, kde-format msgid "New Security" msgstr "Nuovo titolo" #: eqonomize.cpp:2306 #, kde-format msgid "Edit Security" msgstr "Modifica titolo" #: eqonomize.cpp:2325 #, kde-format msgid "Profit:" msgstr "Profitto:" #: eqonomize.cpp:2325 #, kde-format msgid "Rate:" msgstr "Tasso:" #: eqonomize.cpp:2332 #, kde-format msgid "" "Are you sure you want to delete the security \"%1\" and all associated " "transactions?" msgstr "" "Sei sicuro di voler eliminare il titolo \"%1\" e tutte le transazioni " "associate?" #: eqonomize.cpp:2394 transactioneditwidget.cpp:700 #, kde-format msgid "No security available." msgstr "" #: eqonomize.cpp:2466 #, kde-format msgid "Set Quotation (%1)" msgstr "Fissa Quotazione (%1)" #: eqonomize.cpp:2472 transactioneditwidget.cpp:143 #, kde-format msgid "Price per share:" msgstr "Prezzo per azione:" #: eqonomize.cpp:2485 #, kde-format msgid "Future dates are not allowed." msgstr "Date future non sono permesse." #: eqonomize.cpp:2513 #, kde-format msgid "Security Transactions" msgstr "Transazioni di titoli" #: eqonomize.cpp:3166 ledgerdialog.cpp:293 #, kde-format msgid "Ledger" msgstr "Libro Maestro" #: eqonomize.cpp:3475 #, kde-format msgid "Untitled" msgstr "" #: eqonomize.cpp:3489 #, kde-format msgid "Check Account" msgstr "Controlla Account" #: eqonomize.cpp:3491 #, kde-format msgid "Salary" msgstr "Stipendio" #: eqonomize.cpp:3493 #, kde-format msgid "Bills" msgstr "Ricevute" #: eqonomize.cpp:3494 #, kde-format msgid "Clothing" msgstr "Vestiario" #: eqonomize.cpp:3495 #, kde-format msgid "Groceries" msgstr "Cibario" #: eqonomize.cpp:3496 #, kde-format msgid "Leisure" msgstr "Comodità" #: eqonomize.cpp:3561 importcsvdialog.cpp:795 qifimportexport.cpp:280 #: qifimportexport.cpp:444 #, kde-format msgid "Couldn't fetch %1." msgstr "" #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Error loading %1: %2." msgstr "Errore caricando %1: %2." #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Couldn't open file" msgstr "Impossibile aprire il file" #: eqonomize.cpp:3627 eqonomize.cpp:3653 #, kde-format msgid "Error saving %1: %2." msgstr "Errore salvando %1: %2." #: eqonomize.cpp:3627 eqonomize.cpp:3653 eqonomize.cpp:3673 #, kde-format msgid "Couldn't save file" msgstr "Impossibile salvare il file" #: eqonomize.cpp:3673 eqonomize.cpp:4282 ledgerdialog.cpp:281 #: qifimportexport.cpp:634 #, kde-format msgid "Failed to upload file to %1." msgstr "Fallito l'upload del file a %1." #: eqonomize.cpp:3703 eqonomize.cpp:3728 #, kde-format msgid "Report" msgstr "Rapporto" #: eqonomize.cpp:3758 eqonomize.cpp:3783 #, kde-format msgid "Chart" msgstr "Diagramma" #: eqonomize.cpp:3823 eqonomize.cpp:3829 #, kde-format msgid "Transaction Schedule" msgstr "Transazione Pianificata" #: eqonomize.cpp:3976 #, kde-format msgctxt "html format" msgid "Accounts & Categories" msgstr "Conti & Categorie" #: eqonomize.cpp:3981 #, kde-format msgctxt "html format" msgid "Accounts & Categories (%1–%2)" msgstr "Conti & Categorie (%1–%2)" #: eqonomize.cpp:3982 #, kde-format msgctxt "html format" msgid "Accounts & Categories (to %1)" msgstr "Conti & Categorie (a %1)" #: eqonomize.cpp:3989 eqonomize.cpp:4049 eqonomize.cpp:4097 eqonomize.cpp:4142 #, kde-format msgid "Change" msgstr "Cambio" #: eqonomize.cpp:3993 ledgerdialog.cpp:140 #, kde-format msgid "Balance" msgstr "Bilanciamento" #: eqonomize.cpp:4047 eqonomize.cpp:4095 #, kde-format msgid "Budget" msgstr "Budget" #: eqonomize.cpp:4048 eqonomize.cpp:4096 #, kde-format msgid "Remaining Budget" msgstr "Budget restante" #: eqonomize.cpp:4050 #, kde-format msgid "Total Incomes" msgstr "Totale delle Entrate" #: eqonomize.cpp:4091 #, kde-format msgid "Costs" msgstr "Costi" #: eqonomize.cpp:4098 #, kde-format msgid "Total Expenses" msgstr "Totale delle Uscite" #: eqonomize.cpp:4167 eqonomize.cpp:4214 #, kde-format msgid "Empty expenses list." msgstr "Svuota la lista delle uscite." #: eqonomize.cpp:4172 eqonomize.cpp:4219 #, kde-format msgid "Empty incomes list." msgstr "Svuota la lista delle entrate." #: eqonomize.cpp:4177 eqonomize.cpp:4224 #, kde-format msgid "Empty transfers list." msgstr "Svuota la lista dei trasferimenti." #: eqonomize.cpp:4182 eqonomize.cpp:4229 #, kde-format msgid "Empty securities list." msgstr "Svuola la lista dei titoli" #: eqonomize.cpp:4187 eqonomize.cpp:4234 #, kde-format msgid "Empty schedule list." msgstr "Svuota la lista delle pianificazioni." #: eqonomize.cpp:4305 #, kde-format msgid "Export View..." msgstr "Esporta vista..." #: eqonomize.cpp:4307 #, kde-format msgid "Print View..." msgstr "Stampa vista..." #: eqonomize.cpp:4309 #, kde-format msgid "Initial Period" msgstr "" #: eqonomize.cpp:4316 #, kde-format msgid "Remember Last Dates" msgstr "Ricorda Ultimi Appuntamenti" #: eqonomize.cpp:4319 #, kde-format msgid "Import CSV File..." msgstr "Importa File CSV..." #: eqonomize.cpp:4320 #, kde-format msgid "Import QIF File..." msgstr "Importa File QIF..." #: eqonomize.cpp:4321 #, kde-format msgid "Export As QIF File..." msgstr "Esporta file come QIF..." #: eqonomize.cpp:4323 #, kde-format msgid "Add Account..." msgstr "Aggiungi Conto..." #: eqonomize.cpp:4324 #, kde-format msgid "New Account..." msgstr "Nuovo Conto..." #: eqonomize.cpp:4325 #, kde-format msgid "New Income Category..." msgstr "Nuova Categoria d'Entrata..." #: eqonomize.cpp:4326 #, kde-format msgid "New Expense Category..." msgstr "Nuova Categoria di Uscita..." #: eqonomize.cpp:4327 #, kde-format msgid "Balance..." msgstr "Bilanciamento..." #: eqonomize.cpp:4331 #, kde-format msgid "Show Transactions" msgstr "Mostra Transazioni" #: eqonomize.cpp:4335 #, kde-format msgid "New Transfer..." msgstr "Nuovo Trasferimento..." #: eqonomize.cpp:4336 #, kde-format msgid "New Split Transaction..." msgstr "Nuova Transazione Suddivisa" #: eqonomize.cpp:4337 #, kde-format msgid "Edit Transaction(s) (Occurrence)..." msgstr "Modifica Transazione(i) (Occorrenza)..." #: eqonomize.cpp:4338 #, kde-format msgid "Edit Occurrence..." msgstr "Modifica Ricorrenza" #: eqonomize.cpp:4339 #, kde-format msgid "Edit Schedule (Recurrence)..." msgstr "Modifica Pianificazione (Ricorrenza)..." #: eqonomize.cpp:4340 #, kde-format msgid "Edit Schedule..." msgstr "Modifca Pianificazione..." #: eqonomize.cpp:4341 #, kde-format msgid "Remove Transaction(s) (Occurrence)" msgstr "Elimina Transazione(i) (Occorrenza)" #: eqonomize.cpp:4342 #, kde-format msgid "Remove Occurrence" msgstr "Elimina Ricorrenza" #: eqonomize.cpp:4343 #, kde-format msgid "Delete Schedule (Recurrence)" msgstr "Elimina Pianficazione (Ricorrenza)" #: eqonomize.cpp:4344 #, kde-format msgid "Delete Schedule" msgstr "Elimina Pianificazione" #: eqonomize.cpp:4345 #, kde-format msgid "Edit Split Transaction..." msgstr "Modifica Transazione Suddivisa" #: eqonomize.cpp:4346 #, kde-format msgid "Remove Split Transaction" msgstr "Elimina Transazione Suddivisa" #: eqonomize.cpp:4347 #, kde-format msgid "Join Transactions..." msgstr "Unisci Transazioni..." #: eqonomize.cpp:4348 #, kde-format msgid "Split Up Transaction" msgstr "Suddividi Transazione" #: eqonomize.cpp:4350 #, kde-format msgid "Refund..." msgstr "" #: eqonomize.cpp:4351 #, kde-format msgid "Repayment..." msgstr "Ripagamento..." #: eqonomize.cpp:4352 #, kde-format msgid "New Refund/Repayment..." msgstr "" #: eqonomize.cpp:4355 #, kde-format msgid "Edit Security..." msgstr "Modifica titolo..." #: eqonomize.cpp:4356 #, kde-format msgid "Remove Security" msgstr "Elimina titolo" #: eqonomize.cpp:4357 #, kde-format msgid "Shares Sold..." msgstr "Azioni Vendute..." #: eqonomize.cpp:4358 #, kde-format msgid "Shares Bought..." msgstr "Azioni Acquistate..." #: eqonomize.cpp:4359 #, kde-format msgid "Dividend..." msgstr "Dividendo..." #: eqonomize.cpp:4360 #, kde-format msgid "Reinvested Dividend..." msgstr "Dividendo Reinvestito..." #: eqonomize.cpp:4361 #, kde-format msgid "Shares Moved..." msgstr "Azioni Spostate..." #: eqonomize.cpp:4363 #, kde-format msgid "Edit Quotations..." msgstr "Modifica Quotazioni..." #: eqonomize.cpp:4364 #, kde-format msgid "Transactions..." msgstr "Transazioni..." #: eqonomize.cpp:4366 #, kde-format msgid "Development Over Time Report..." msgstr "Rapporto di sviluppo temporale..." #: eqonomize.cpp:4367 #, kde-format msgid "Categories Comparison Report..." msgstr "Rapporto di comparazioni delle categorie..." #: eqonomize.cpp:4368 #, kde-format msgid "Categories Comparison Chart..." msgstr "Diagramma di comparazione delle categorie..." #: eqonomize.cpp:4369 #, kde-format msgid "Development Over Time Chart..." msgstr "Diagramma su sviluppo temporale..." #: eqonomize.cpp:4371 #, kde-format msgid "Use Additional Transaction Properties" msgstr "Utilizza le proprietà aggiuntive per le transazioni" #: eqonomize.cpp:4413 #, kde-format msgid "" "Eqonomize! exited unexpectedly before the file was saved and data was lost.\n" "Do you want to load the last auto-saved version of the file?" msgstr "" "Eqonomize! è uscito inaspettatamente prima che il file venisse salvato. I " "dati sono stati persi.\n" "Vuoi caricare l'ultima versione auto-salvata del file?" #: eqonomize.cpp:4413 #, kde-format msgid "Crash Recovery" msgstr "Recupero dal crash" #: eqonomize.cpp:4605 eqonomize.cpp:4606 #, kde-format msgid "The current file has been modified. Do you want to save it?" msgstr "Il file corrente è stato modificato. Vuoi salvarlo?" #: eqonomize.cpp:4643 #, kde-format msgid "Confirm Schedule" msgstr "Conferma Pianificazione" #: eqonomize.cpp:4697 #, kde-format msgid "New Account" msgstr "Nuovo Conto" #: eqonomize.cpp:4712 #, kde-format msgid "New Income Category" msgstr "Nuova categoria d'entrata" #: eqonomize.cpp:4725 #, kde-format msgid "New Expense Category" msgstr "Nuova categoria di uscita" #: eqonomize.cpp:4800 #, kde-format msgid "Balance Account" msgstr "Bilanciamento del conto" #: eqonomize.cpp:4806 #, kde-format msgid "Book value:" msgstr "Valore contabile:" #: eqonomize.cpp:4813 #, kde-format msgid "Real value:" msgstr "Valore reale:" #: eqonomize.cpp:4836 #, kde-format msgid "Edit Account" msgstr "Modifica Conto" #: eqonomize.cpp:4869 #, kde-format msgid "Edit Income Category" msgstr "Modifica categoria di entrata" #: eqonomize.cpp:4887 #, kde-format msgid "Edit Expense Category" msgstr "Modifica categoria di uscite" #: eqonomize.cpp:4948 #, kde-format msgid "Move transactions?" msgstr "Spostare le transizioni?" #: eqonomize.cpp:4958 #, kde-format msgid "Move to:" msgstr "Sposta a:" #: eqonomize.cpp:4965 #, kde-format msgid "" "The category contains some expenses.\n" "What do you want to do with them?" msgstr "" "La categoria contiene delle uscite.\n" "Cosa vuoi farne?" #: eqonomize.cpp:4977 #, kde-format msgid "" "The category contains some incomes.\n" "What do you want to do with them?" msgstr "" "La categoria contiene delle entrate.\n" "Cosa vuoi farne?" #: eqonomize.cpp:4989 #, kde-format msgid "" "The account contains some transactions.\n" "What do you want to do with them?" msgstr "" "La categoria contiene delle transazioni.\n" "Cosa vuoi farne?" #: eqonomize.cpp:5011 #, kde-format msgid "" "The category contains some expenses that will be removed. Do you still want " "to remove the category?" msgstr "" "La categoria contiene delle uscite che verranno eliminate. Sei sicuro di " "voler eliminare la categoria?" #: eqonomize.cpp:5011 eqonomize.cpp:5012 #, kde-format msgid "Remove Category?" msgstr "Rimuovere la categoria?" #: eqonomize.cpp:5012 #, kde-format msgid "" "The category contains some incomes that will be removed. Do you still want " "to remove the category?" msgstr "" "La categoria contiene delle entrate che verranno eliminate. Sei sicuro di " "voler eliminare la categoria" #: eqonomize.cpp:5013 #, kde-format msgid "" "The account contains some transactions that will be removed. Do you still " "want to remove the account?" msgstr "" "La categoria contiene delle transizioni che verranno eliminate. Sei sicuro " "di voler eliminare la categoria" #: eqonomize.cpp:5013 #, kde-format msgid "Remove Account?" msgstr "Eliminare il Conto?" #: eqonomize.cpp:5531 eqonomize.cpp:5555 eqonomize.cpp:5730 #, kde-format msgctxt "%1: budget; %2: remaining budget" msgid "%2 of %1" msgstr "%2 di %1" #: eqonomize.cpp:5810 eqonomize.cpp:5835 #, kde-format msgid "%1 (with no budget)" msgstr "%1 (senza budget)" #: eqonomize.cpp:5811 eqonomize.cpp:5836 #, kde-format msgid "%1 (with budget %2)" msgstr "%1 (con budget %2)" #: importcsvdialog.cpp:60 #, kde-format msgid "Import CSV file" msgstr "Importa file CSV" #: importcsvdialog.cpp:64 #, kde-format msgid "Transaction Type Selection" msgstr "Selezione Tipo di Transazione" #: importcsvdialog.cpp:81 #, kde-format msgid "Expenses and incomes (negative cost)" msgstr "Uscite ed entrate (costi negativi)" #: importcsvdialog.cpp:84 #, kde-format msgid "Expenses and incomes (separate columns)" msgstr "Uscite ed entrate (colonne separate)" #: importcsvdialog.cpp:87 #, kde-format msgid "All types" msgstr "Tutti i tipi" #: importcsvdialog.cpp:95 qifimportexport.cpp:62 #, kde-format msgid "File Selection" msgstr "Selezione file" #: importcsvdialog.cpp:99 qifimportexport.cpp:66 qifimportexport.cpp:548 #, kde-format msgid "File:" msgstr "File:" #: importcsvdialog.cpp:104 #, kde-format msgid "First data row:" msgstr "Prima colonna di dati:" #: importcsvdialog.cpp:107 #, kde-format msgid "Auto" msgstr "Auto" #: importcsvdialog.cpp:110 #, kde-format msgid "Column delimiter:" msgstr "Delimitatore delle Colonne:" #: importcsvdialog.cpp:113 #, kde-format msgid "Comma" msgstr "Virgola" #: importcsvdialog.cpp:114 #, kde-format msgid "Tabulator" msgstr "Tabulatore" #: importcsvdialog.cpp:115 #, kde-format msgid "Semicolon" msgstr "Punto e virgola" #: importcsvdialog.cpp:116 #, kde-format msgid "Space" msgstr "Spazio" #: importcsvdialog.cpp:125 #, kde-format msgid "Columns Specification" msgstr "Specifica delle colonne" #: importcsvdialog.cpp:131 importcsvdialog.cpp:149 importcsvdialog.cpp:172 #: importcsvdialog.cpp:189 importcsvdialog.cpp:208 importcsvdialog.cpp:227 #: importcsvdialog.cpp:245 #, kde-format msgid "Column" msgstr "Colonna" #: importcsvdialog.cpp:205 importcsvdialog.cpp:356 importcsvdialog.cpp:365 #: importcsvdialog.cpp:387 importcsvdialog.cpp:398 #: transactioneditwidget.cpp:225 transactioneditwidget.cpp:267 #: transactioneditwidget.cpp:1130 transactionfilterwidget.cpp:102 #: transactionfilterwidget.cpp:113 #, kde-format msgid "Category:" msgstr "Categoria:" #: importcsvdialog.cpp:224 importcsvdialog.cpp:357 importcsvdialog.cpp:374 #: transactioneditwidget.cpp:248 transactioneditwidget.cpp:273 #: transactionfilterwidget.cpp:117 #, kde-format msgid "From account:" msgstr "Dal conto:" #: importcsvdialog.cpp:262 #, kde-format msgid "Create missing categories and accounts" msgstr "Creare le categorie e i conti mancanti" #: importcsvdialog.cpp:354 #, kde-format msgid "" "Imports data as expenses. Costs have positive value. Value is the only " "required column." msgstr "" "Importa i dati come uscite. I costi hanno un valore positivo. L'unica " "colonna richiesta è: valore." #: importcsvdialog.cpp:363 #, kde-format msgid "Imports data as incomes. Value is the only required column." msgstr "Importa i dati come entrate. L'unica colonna richiesta è: valore." #: importcsvdialog.cpp:366 importcsvdialog.cpp:375 #: transactioneditwidget.cpp:231 transactioneditwidget.cpp:258 #: transactionfilterwidget.cpp:106 #, kde-format msgid "To account:" msgstr "Al conto:" #: importcsvdialog.cpp:372 #, kde-format msgid "Imports data as transfers. Value is the only required column." msgstr "" "Importa i dati come trasferimenti. L'unica colonna richiesta è: valore." #: importcsvdialog.cpp:373 transactioneditwidget.cpp:182 #: transactioneditwidget.cpp:1109 #, kde-format msgid "Amount:" msgstr "Quantità:" #: importcsvdialog.cpp:381 #, kde-format msgid "" "Imports data as expenses and incomes. Costs have negative value. Value and " "category are both required columns." msgstr "" "Importa i dati come uscite ed entrate. I costi hanno un valore negativo. " "Sono richieste le colonne: valore, categoria." #: importcsvdialog.cpp:392 #, kde-format msgid "" "Imports data as expenses and incomes. Costs and incomes have separate " "columns. Income, cost, and category are all required columns." msgstr "" "Importa i dati come uscite ed entrate. I costi e le entrate hanno colonne " "separate. Sono richieste le colonne: entrata, costo, categoria." #: importcsvdialog.cpp:403 #, kde-format msgid "" "Imports data as expenses, incomes, and transfers. Costs have negative or " "positive value. Value, to, and from are all required columns. Accounts and " "categories must be existing." msgstr "" "Importa i dati come uscite, entrate e trasferimenti. I costi hanno dei " "valori negativi o positivi. Sono richieste le colonne: valore, a, da. Conti " "e categorie devono essere presenti." #: importcsvdialog.cpp:413 transactioneditwidget.cpp:209 #: transactionfilterwidget.cpp:74 transactionfilterwidget.cpp:91 #, kde-format msgid "From:" msgstr "Da:" #: importcsvdialog.cpp:414 transactioneditwidget.cpp:216 #: transactionfilterwidget.cpp:81 transactionfilterwidget.cpp:95 #, kde-format msgid "To:" msgstr "A:" #: importcsvdialog.cpp:440 qifimportexport.cpp:258 #, kde-format msgid "A file must be selected." msgstr "Deve essere selezionato un file." #: importcsvdialog.cpp:446 importcsvdialog.cpp:458 qifimportexport.cpp:265 #: qifimportexport.cpp:595 #, kde-format msgid "Selected file is a directory." msgstr "Il file selezionato è una cartella." #: importcsvdialog.cpp:450 importcsvdialog.cpp:462 qifimportexport.cpp:269 #, kde-format msgid "Selected file does not exist." msgstr "Il file selezionato non esiste." #: importcsvdialog.cpp:468 #, kde-format msgid "Empty delimiter." msgstr "Delimitatore vuoto." #: importcsvdialog.cpp:712 #, kde-format msgid "The same column number is selected multiple times." msgstr "Lo stesso numero di colonna è selezionato più volte" #: importcsvdialog.cpp:772 #, kde-format msgid "Selected from account is the same as the to account." msgstr "Il conto Da selezionato è lo stesso del conto A." #: importcsvdialog.cpp:803 qifimportexport.cpp:288 qifimportexport.cpp:452 #, kde-format msgid "Couldn't open %1 for reading." msgstr "Impossibile aprire %1 in lettura." #: importcsvdialog.cpp:806 qifimportexport.cpp:291 qifimportexport.cpp:455 #, kde-format msgid "Error reading %1." msgstr "Errore leggendo %1." #: importcsvdialog.cpp:1187 qifimportexport.cpp:462 #, kde-format msgid "Successfully imported 1 transaction." msgid_plural "Successfully imported %n transactions." msgstr[0] "Importo di 1 transazione riuscito." msgstr[1] "Importo di %n transazioni riuscito." #: importcsvdialog.cpp:1189 #, kde-format msgid "Unable to import any transactions imported." msgstr "Fallito l'importo delle transazioni importati." #: importcsvdialog.cpp:1193 #, kde-format msgid "Failed to import 1 data row." msgid_plural "Failed to import %n data rows." msgstr[0] "Fallito l'importo di 1 linea di dati." msgstr[1] "Fallito l'importo di %n linee di dati" #: importcsvdialog.cpp:1194 #, kde-format msgid "Required columns missing." msgstr "Richieste delle colonne mancanti." #: importcsvdialog.cpp:1195 #, kde-format msgid "Invalid value." msgstr "Valore non valido." #: importcsvdialog.cpp:1197 #, kde-format msgid "Empty category name." msgstr "Nome categoria vuoto." #: importcsvdialog.cpp:1197 importcsvdialog.cpp:1198 #, kde-format msgid "Empty account name." msgstr "Nome account vuoto." #: importcsvdialog.cpp:1199 #, kde-format msgid "Unknown category found." msgstr "Trovata categoria sconosciuta." #: importcsvdialog.cpp:1199 importcsvdialog.cpp:1200 #, kde-format msgid "Unknown account found." msgstr "Trovato un conto non conosciuto." #: importcsvdialog.cpp:1201 #, kde-format msgid "Cannot import security transactions (to/from security accounts)." msgstr "" "Impossibile importare le transazioni dei titoli (da/a conti di titoli)." #: importcsvdialog.cpp:1202 #, kde-format msgid "Balancing account wrongly used." msgstr "Il bilanciamento del conto è utilizzato incorrettamente." #: importcsvdialog.cpp:1203 #, kde-format msgid "Same to and from account/category." msgstr "" #: importcsvdialog.cpp:1205 #, kde-format msgid "No data found." msgstr "Nessuna dato trovato." #: importcsvdialog.cpp:1219 qifimportexport.cpp:345 #, kde-format msgid "Unrecognized date format." msgstr "Il formato della data non è riconosciuto." #: importcsvdialog.cpp:1224 #, kde-format msgid "Specify Format" msgstr "Specificare il formato" #: importcsvdialog.cpp:1230 #, kde-format msgid "" "The format of dates and/or numbers in the CSV file is ambiguous. Please " "select the correct format." msgstr "" "Il formato delle date e/o i numeri nel file CSV è ambiguo. Per favore " "seleziona il formato corretto." #: importcsvdialog.cpp:1235 qifimportexport.cpp:94 qifimportexport.cpp:533 #, kde-format msgid "Date format:" msgstr "Formato della data:" #: importcsvdialog.cpp:1278 qifimportexport.cpp:541 #, kde-format msgid "Value format:" msgstr "Formato del valore:" #: kdateedit.cpp:366 #, fuzzy, kde-format msgctxt "the day after today" msgid "tomorrow" msgstr "domani" #: kdateedit.cpp:367 #, fuzzy, kde-format msgctxt "this day" msgid "today" msgstr "oggi" #: kdateedit.cpp:368 #, fuzzy, kde-format msgctxt "the day before today" msgid "yesterday" msgstr "ieri" #: kdatepickerpopup.cpp:94 #, fuzzy, kde-format msgctxt "@option today" msgid "&Today" msgstr "oggi" #: kdatepickerpopup.cpp:95 #, fuzzy, kde-format msgctxt "@option tomorrow" msgid "To&morrow" msgstr "domani" #: kdatepickerpopup.cpp:96 #, kde-format msgctxt "@option next week" msgid "Next &Week" msgstr "" #: kdatepickerpopup.cpp:97 #, fuzzy, kde-format msgctxt "@option next month" msgid "Next M&onth" msgstr "Il Mese Corrente" #: kdatepickerpopup.cpp:105 #, fuzzy, kde-format msgctxt "@option do not specify a date" msgid "No Date" msgstr "Data" #: ledgerdialog.cpp:122 #, kde-format msgid "Export..." msgstr "Esporta..." #: ledgerdialog.cpp:123 #, kde-format msgid "Print..." msgstr "Stampa..." #: ledgerdialog.cpp:139 #, kde-format msgid "Withdrawal" msgstr "Prelievo" #: ledgerdialog.cpp:162 #, kde-format msgid "Join..." msgstr "Unisci..." #: ledgerdialog.cpp:164 #, kde-format msgid "Split Up" msgstr "Dividi" #: ledgerdialog.cpp:234 ledgerdialog.cpp:354 #, kde-format msgid "Empty transaction list." msgstr "Svuota la lista delle transazioni." #: ledgerdialog.cpp:443 transactionlistwidget.cpp:717 #, kde-format msgid "Are you sure you want to delete all (%1) selected transactions?" msgstr "Sei sicuro di volere eliminare tutte le (%1) transazioni?" #: ledgerdialog.cpp:547 transactionlistwidget.cpp:489 #, kde-format msgid "" "Cannot set the value of security transactions using the dialog for modifying " "multiple transactions." msgstr "" #: ledgerdialog.cpp:553 transactionlistwidget.cpp:495 #, kde-format msgid "Cannot change description of dividends and security transactions." msgstr "" "Impossibile cambiare la descrizione dei dividendi e delle transazioni dei " "titoli." #: ledgerdialog.cpp:559 transactionlistwidget.cpp:501 #, kde-format msgid "Cannot change payer of dividends and security transactions." msgstr "" "Impossibile cambiare il debitore dei dividenti e delle transazioni dei " "titoli." #: ledgerdialog.cpp:565 transactionlistwidget.cpp:507 #, kde-format msgid "" "Cannot change date of transactions that are part of a split transaction." msgstr "" "Impossibile cambiare la data delle transizione che fanno parte di una " "transizione suddivisa." #: main.cpp:39 msgid "Eqonomize!" msgstr "Eqonomize!" #: main.cpp:39 msgid "A personal accounting program" msgstr "Un programma di contabilità personale" #: main.cpp:39 msgid "(C) 2008 Hanna K." msgstr "" #: main.cpp:40 msgid "Hanna K." msgstr "" #: main.cpp:44 msgid "Start with expenses list displayed" msgstr "Avvia mostrando la lista delle uscite" #: main.cpp:46 msgid "Start with incomes list displayed" msgstr "Avvia mostrando la lista delle entrate" #: main.cpp:48 msgid "Start with transfers list displayed" msgstr "Avvia mostrando la lista dei trasferimenti" #: main.cpp:49 msgid "Document to open" msgstr "Documento da aprire" #: overtimechart.cpp:124 overtimechart.cpp.bak:117 #, kde-format msgid "Incomes and Expenses" msgstr "Entrate ed Uscite" #: overtimechart.cpp:125 overtimechart.cpp:1722 overtimechart.cpp.bak:118 #: overtimechart.cpp.bak:1703 overtimereport.cpp:102 overtimereport.cpp:343 #, kde-format msgid "Profits" msgstr "Profitti" #: overtimechart.cpp:132 overtimechart.cpp:411 overtimechart.cpp:1949 #: overtimechart.cpp.bak:125 overtimechart.cpp.bak:404 #: overtimechart.cpp.bak:1950 overtimereport.cpp:108 overtimereport.cpp:228 #: overtimereport.cpp:753 #, kde-format msgid "All Categories Combined" msgstr "Tutte le categorie combinate" #: overtimechart.cpp:138 overtimechart.cpp:296 overtimechart.cpp:400 #: overtimechart.cpp:1852 overtimechart.cpp:1973 overtimechart.cpp.bak:131 #: overtimechart.cpp.bak:289 overtimechart.cpp.bak:393 #: overtimechart.cpp.bak:1853 overtimechart.cpp.bak:1974 #: overtimereport.cpp:113 overtimereport.cpp:176 overtimereport.cpp:225 #: overtimereport.cpp:710 overtimereport.cpp:776 #, kde-format msgid "All Descriptions Combined" msgstr "Tutte le descrizioni combinate" #: overtimechart.cpp:146 overtimechart.cpp:406 overtimechart.cpp.bak:139 #: overtimechart.cpp.bak:399 #, kde-format msgid "All Payees/Payers Combined" msgstr "Tutti debitori/creditori combinati" #: overtimechart.cpp:155 overtimechart.cpp.bak:148 #, kde-format msgid "Start date:" msgstr "Data di inizio:" #: overtimechart.cpp:178 overtimechart.cpp.bak:171 #, kde-format msgid "End date:" msgstr "" #: overtimechart.cpp:197 overtimechart.cpp.bak:190 #, kde-format msgid "Monthly total" msgstr "Totale mensile" #: overtimechart.cpp:201 overtimechart.cpp.bak:194 #, kde-format msgid "Daily average" msgstr "Media giornaliera" #: overtimechart.cpp:304 overtimechart.cpp:404 overtimechart.cpp:1855 #: overtimechart.cpp:1978 overtimechart.cpp.bak:297 overtimechart.cpp.bak:397 #: overtimechart.cpp.bak:1856 overtimechart.cpp.bak:1979 #, kde-format msgid "All Payers Combined" msgstr "Tutti i debitori combinati" #: overtimechart.cpp:305 overtimechart.cpp:405 overtimechart.cpp:1856 #: overtimechart.cpp:1977 overtimechart.cpp.bak:298 overtimechart.cpp.bak:398 #: overtimechart.cpp.bak:1857 overtimechart.cpp.bak:1978 #, kde-format msgid "All Payees Combined" msgstr "Tutti i creditori combinati" #: overtimechart.cpp:325 overtimechart.cpp:1853 overtimechart.cpp.bak:318 #: overtimechart.cpp.bak:1854 #, kde-format msgid "All Descriptions Split" msgstr "Tutte le descrizioni suddivise" #: overtimechart.cpp:328 overtimechart.cpp:1857 overtimechart.cpp.bak:321 #: overtimechart.cpp.bak:1858 #, kde-format msgid "All Payers Split" msgstr "Tutti i debitori suddivisi" #: overtimechart.cpp:329 overtimechart.cpp:1858 overtimechart.cpp.bak:322 #: overtimechart.cpp.bak:1859 #, kde-format msgid "All Payees Split" msgstr "Tutti i creditori suddivisi" #: overtimechart.cpp:413 overtimechart.cpp:423 overtimechart.cpp:1950 #: overtimechart.cpp.bak:406 overtimechart.cpp.bak:416 #: overtimechart.cpp.bak:1951 #, kde-format msgid "All Categories Split" msgstr "Tutte le categorie suddivise" #: overtimechart.cpp:1535 overtimechart.cpp.bak:1516 #, kde-format msgid "Value (%1)" msgstr "Valore (%1)" #: overtimechart.cpp:1536 overtimechart.cpp.bak:1517 #, kde-format msgid "Profit (%1)" msgstr "Profitto (%1)" #: overtimechart.cpp:1537 overtimechart.cpp.bak:1518 #, kde-format msgid "Income (%1)" msgstr "Entrata (%1)" #: overtimechart.cpp:1538 overtimechart.cpp.bak:1519 #, kde-format msgid "Cost (%1)" msgstr "Costo (%1)" #: overtimechart.cpp:1579 overtimechart.cpp.bak:1560 #, kde-format msgid "Time" msgstr "Tempo" #: overtimechart.cpp:1774 overtimechart.cpp:1775 overtimechart.cpp.bak:1755 #: overtimechart.cpp.bak:1756 #, kde-format msgid "no payer" msgstr "nessun debitore" #: overtimechart.cpp:1778 overtimechart.cpp.bak:1759 #, kde-format msgctxt "%1: Description; %2: Payer" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp:1783 overtimechart.cpp:1784 overtimechart.cpp.bak:1764 #: overtimechart.cpp.bak:1765 #, kde-format msgid "no payee" msgstr "nessun creditore" #: overtimechart.cpp:1787 overtimechart.cpp.bak:1768 #, kde-format msgctxt "%1: Description; %2: Payee" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp.bak:649 #, kde-format msgid "Error after saving file; data may not have been saved." msgstr "" "Errore dopo il salvataggio del file; i dati potrebbero non essere stati " "salvati." #: overtimereport.cpp:344 #, kde-format msgid "Average Profit" msgstr "Profitto Medio" #: overtimereport.cpp:537 #, kde-format msgid "Year" msgstr "Anno" #: overtimereport.cpp:538 #, kde-format msgid "Month" msgstr "Mese" #: overtimereport.cpp:566 #, kde-format msgid "Includes scheduled transactions" msgstr "Includi le transizioni pianificate" #: overtimereport.cpp:570 #, kde-format msgid "Adjusted for the average month / year (%1 / %2 days)" msgstr "Adattati per la media mese / anno (%1 / %2 giorni)" #: overtimereport.cpp:603 overtimereport.cpp:671 #, kde-format msgid "Subtotal" msgstr "Subtotale" #: qifimport.cpp:307 qifimport.cpp:367 qifimportexport.cpp:1259 #: qifimportexport.cpp:1350 qifimportexport.cpp:1470 #, kde-format msgid "Unnamed" msgstr "Senza nome" #: qifimport.cpp:337 qifimportexport.cpp:1299 qifimportexport.cpp:1413 #, kde-format msgid "Uncategorized" msgstr "Non categorizzato" #: qifimportexport.cpp:56 #, kde-format msgid "Import QIF file" msgstr "Importa file QIF" #: qifimportexport.cpp:63 #, kde-format msgid "" "Select a QIF file to import. When you click next, the file be analysed and " "you might need to answer some questions about the format of the file." msgstr "" "Seleziona un file QIF da importare. Quando cliccherai su prossimo, il file " "verrà analizzato e potresti avere il bisogno di rispondere ad alcune domande " "riguardo al formato del file." #: qifimportexport.cpp:73 #, kde-format msgid "Local Definitions" msgstr "Definizioni locali" #: qifimportexport.cpp:74 #, kde-format msgid "" "Unknown elements where found in the QIF file. It is possible that this is " "because of localized type names. Please map them to the correct standard " "names." msgstr "" #: qifimportexport.cpp:80 #, kde-format msgid "Local Text" msgstr "Testo locale" #: qifimportexport.cpp:81 #, kde-format msgid "Standard Text" msgstr "Testo standard" #: qifimportexport.cpp:84 #, kde-format msgid "Select standard text:" msgstr "Seleziona il testo standard:" #: qifimportexport.cpp:90 #, kde-format msgid "Date Format" msgstr "Formato della data" #: qifimportexport.cpp:91 #, kde-format msgid "" "The date format in the QIF file is ambiguous. Please select the correct " "format." msgstr "" "Il formato della data nel file QIF è ambigua. Per favore seleziona il " "formato corretto." #: qifimportexport.cpp:100 #, kde-format msgid "Default Account" msgstr "Conto predefinito" #: qifimportexport.cpp:101 #, kde-format msgid "" "Could not find any account definitions in the QIF file. Please select a " "default account. It is also possible that this is caused by a localized " "opening balance text." msgstr "" #: qifimportexport.cpp:104 #, kde-format msgid "Default account:" msgstr "Conto predefinito:" #: qifimportexport.cpp:115 #, kde-format msgid "Opening balance text:" msgstr "Testo di apertura bilancio:" #: qifimportexport.cpp:121 #, kde-format msgid "Descriptions" msgstr "Descrizioni" #: qifimportexport.cpp:122 #, kde-format msgid "" "Transactions in QIF files does not have any specific description property. " "You are therefore given the option to choose how the description of imported " "transactions will be set." msgstr "" #: qifimportexport.cpp:125 #, kde-format msgid "Subcategories as:" msgstr "Sottocategorizza come:" #: qifimportexport.cpp:134 #, kde-format msgid "Ignore" msgstr "Ignora" #: qifimportexport.cpp:137 #, kde-format msgid "Payee as:" msgstr "Creditore come:" #: qifimportexport.cpp:142 qifimportexport.cpp:520 #: transactionlistwidget.cpp:119 #, kde-format msgid "Payee" msgstr "Debitore" #: qifimportexport.cpp:147 #, kde-format msgid "Memo as:" msgstr "Memorizza come:" #: qifimportexport.cpp:156 #, kde-format msgid "Priority:" msgstr "Priorità:" #: qifimportexport.cpp:159 #, kde-format msgid "Subcategory/Payee/Comments" msgstr "Sottocategoria/Creditore/Commenti" #: qifimportexport.cpp:160 #, kde-format msgid "Payee/Subcategory/Comments" msgstr "Creditore/Sottocategoria/Commenti" #: qifimportexport.cpp:161 #, kde-format msgid "Subcategory/Comments/Payee" msgstr "Sottocategoria/Commenti/Creditore" #: qifimportexport.cpp:162 #, kde-format msgid "Payee/Comments/Subcategory" msgstr "Creditore/Commenti/Sottocategoria" #: qifimportexport.cpp:163 #, kde-format msgid "Comments/Subcategory/Payee" msgstr "Commenti/Sottocategoria/Creditore" #: qifimportexport.cpp:164 #, kde-format msgid "Comments/Payee/Subcategory" msgstr "Commenti/Creditore/Sottocategoria" #: qifimportexport.cpp:314 qifimportexport.cpp:322 qifimportexport.cpp:338 #, kde-format msgid "Unknown" msgstr "Sconosciuto" #: qifimportexport.cpp:324 #, kde-format msgid "Bank" msgstr "Banca" #: qifimportexport.cpp:326 #, kde-format msgid "Cat (Category)" msgstr "Cat (Categoria)" #: qifimportexport.cpp:327 #, kde-format msgid "CCard (Credit Card)" msgstr "CCredito (Carta di Credito)" #: qifimportexport.cpp:328 #, kde-format msgid "Invst (Investment)" msgstr "Invest (Investimento)" #: qifimportexport.cpp:329 #, kde-format msgid "Oth A (Other Assets)" msgstr "Altre A (Altre Attività)" #: qifimportexport.cpp:330 #, kde-format msgid "Oth L (Other Liabilities)" msgstr "Altre P (Altre Passività)" #: qifimportexport.cpp:331 #, kde-format msgid "Security" msgstr "Titolo" #: qifimportexport.cpp:465 #, kde-format msgid "Successfully imported 1 account." msgid_plural "Successfully imported %n accounts." msgstr[0] "Importato correttamente 1 conto." msgstr[1] "Importati correttamente %n conti." #: qifimportexport.cpp:469 #, kde-format msgid "Successfully imported 1 category." msgid_plural "Successfully imported %n categories." msgstr[0] "Importata correttamente 1 categoria." msgstr[1] "Importate correttamente %n categorie." #: qifimportexport.cpp:473 #, kde-format msgid "1 duplicate transaction was ignored." msgid_plural "%n duplicate transactions was ignored." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:477 #, kde-format msgid "Failed to import 1 transaction." msgid_plural "Failed to import %n transactions." msgstr[0] "Fallito l'importo di 1 transazione." msgstr[1] "Fallito l'importo di %n transazioni." #: qifimportexport.cpp:481 #, kde-format msgid "1 security was not imported." msgid_plural "%n securities were not imported." msgstr[0] "1 titolo non è stato importato." msgstr[1] "%n titoli non sono stati importati." #: qifimportexport.cpp:485 #, kde-format msgid "1 security transaction was not imported." msgid_plural "%n security transactions were not imported." msgstr[0] "1 transazione di titolo non è stata importata." msgstr[1] "%n transazioni di titoli non sono state importate." #: qifimportexport.cpp:494 #, kde-format msgid "Export QIF File" msgstr "Esporta file QIF" #: qifimportexport.cpp:506 #, kde-format msgctxt "All accounts" msgid "All" msgstr "Tutti" #: qifimportexport.cpp:517 #, kde-format msgid "Export transaction description as:" msgstr "Esporta le descrizioni delle transizione come:" #: qifimportexport.cpp:524 #, kde-format msgid "Memo" msgstr "Memo" #: qifimportexport.cpp:528 #, kde-format msgid "Subcategory" msgstr "Sottocategoria" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 5 #: rc.cpp:3 #, kde-format msgid "&Import" msgstr "&Importa" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 12 #: rc.cpp:6 #, kde-format msgid "&Accounts" msgstr "&Conti" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 24 #: rc.cpp:9 #, kde-format msgid "&Transactions" msgstr "&Transazioni" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 41 #: rc.cpp:12 #, kde-format msgid "&Securities" msgstr "&Titoli" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 56 #: rc.cpp:15 #, kde-format msgid "Stat&istics" msgstr "Stat&istiche" #: rc.cpp:16 #, kde-format msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" "Giuseppe Bottiglieri,,Launchpad Contributions:,Giuseppe Bottiglieri," "Guybrush88,Luca Livraghi,Marco" #: rc.cpp:17 #, kde-format msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" "Giuseppe.Bottiglieri@gmail.com,,,Giuseppe.Bottiglieri@gmail.com,," "luca.91@hotmail.it," #: recurrenceeditwidget.cpp:69 #, kde-format msgid "Edit Exceptions" msgstr "Modifica eccezioni" #: recurrenceeditwidget.cpp:186 #, kde-format msgid "Edit Recurrence Range" msgstr "Modifica intervallo di ricorrenza" #: recurrenceeditwidget.cpp:194 recurrenceeditwidget.cpp:229 #, kde-format msgid "Begins on: %1" msgstr "Comincia il: %1" #: recurrenceeditwidget.cpp:199 #, kde-format msgid "No ending date" msgstr "Nessuna data finale" #: recurrenceeditwidget.cpp:203 #, kde-format msgid "End after" msgstr "Termina dopo" #: recurrenceeditwidget.cpp:209 #, kde-format msgid "occurrence(s)" msgstr "occorrenza/e" #: recurrenceeditwidget.cpp:211 #, kde-format msgid "End on" msgstr "Verso la fine" #: recurrenceeditwidget.cpp:298 #, kde-format msgid "End date before start date." msgstr "La data finale è prima della data di inizio." #: recurrenceeditwidget.cpp:312 #, kde-format msgid "Enable recurrance" msgstr "Abilita ricorrenza" #: recurrenceeditwidget.cpp:315 #, kde-format msgid "Recurrence Rule" msgstr "Regola di ricorrenza" #: recurrenceeditwidget.cpp:321 #, kde-format msgid "Weekly" msgstr "Settimanalmente" #: recurrenceeditwidget.cpp:341 recurrenceeditwidget.cpp:352 #: recurrenceeditwidget.cpp:376 recurrenceeditwidget.cpp:462 #, kde-format msgid "Recur every" msgstr "Occorri ogni" #: recurrenceeditwidget.cpp:345 #, kde-format msgid "day(s)" msgstr "giorno/i" #: recurrenceeditwidget.cpp:356 #, kde-format msgid "week(s) on:" msgstr "settimana/e di:" #: recurrenceeditwidget.cpp:380 #, kde-format msgid "month(s), after the start month" msgstr "mese/i, dopo il mese di avvio" #: recurrenceeditwidget.cpp:385 recurrenceeditwidget.cpp:437 #, kde-format msgid "Recur on the" msgstr "Occorri il" #: recurrenceeditwidget.cpp:391 recurrenceeditwidget.cpp:442 #: recurrenceeditwidget.cpp:494 #, kde-format msgid "1st" msgstr "1°" #: recurrenceeditwidget.cpp:392 recurrenceeditwidget.cpp:443 #: recurrenceeditwidget.cpp:495 #, kde-format msgid "2nd" msgstr "2°" #: recurrenceeditwidget.cpp:393 recurrenceeditwidget.cpp:444 #: recurrenceeditwidget.cpp:496 #, kde-format msgid "3rd" msgstr "3°" #: recurrenceeditwidget.cpp:394 recurrenceeditwidget.cpp:445 #: recurrenceeditwidget.cpp:497 #, kde-format msgid "4th" msgstr "4" #: recurrenceeditwidget.cpp:395 recurrenceeditwidget.cpp:446 #: recurrenceeditwidget.cpp:498 #, kde-format msgid "5th" msgstr "5" #: recurrenceeditwidget.cpp:396 #, kde-format msgid "6th" msgstr "6" #: recurrenceeditwidget.cpp:397 #, kde-format msgid "7th" msgstr "7" #: recurrenceeditwidget.cpp:398 #, kde-format msgid "8th" msgstr "8" #: recurrenceeditwidget.cpp:399 #, kde-format msgid "9th" msgstr "9" #: recurrenceeditwidget.cpp:400 #, kde-format msgid "10th" msgstr "10" #: recurrenceeditwidget.cpp:401 #, kde-format msgid "11th" msgstr "11" #: recurrenceeditwidget.cpp:402 #, kde-format msgid "12th" msgstr "12" #: recurrenceeditwidget.cpp:403 #, kde-format msgid "13th" msgstr "13" #: recurrenceeditwidget.cpp:404 #, kde-format msgid "14th" msgstr "14" #: recurrenceeditwidget.cpp:405 #, kde-format msgid "15th" msgstr "15" #: recurrenceeditwidget.cpp:406 #, kde-format msgid "16th" msgstr "16" #: recurrenceeditwidget.cpp:407 #, kde-format msgid "17th" msgstr "17" #: recurrenceeditwidget.cpp:408 #, kde-format msgid "18th" msgstr "18" #: recurrenceeditwidget.cpp:409 #, kde-format msgid "19th" msgstr "19" #: recurrenceeditwidget.cpp:410 #, kde-format msgid "20th" msgstr "20" #: recurrenceeditwidget.cpp:411 #, kde-format msgid "21st" msgstr "21" #: recurrenceeditwidget.cpp:412 #, kde-format msgid "22nd" msgstr "22" #: recurrenceeditwidget.cpp:413 #, kde-format msgid "23rd" msgstr "23" #: recurrenceeditwidget.cpp:414 #, kde-format msgid "24th" msgstr "24" #: recurrenceeditwidget.cpp:415 #, kde-format msgid "25th" msgstr "25" #: recurrenceeditwidget.cpp:416 #, kde-format msgid "26th" msgstr "26" #: recurrenceeditwidget.cpp:417 #, kde-format msgid "27th" msgstr "27" #: recurrenceeditwidget.cpp:418 #, kde-format msgid "28th" msgstr "28" #: recurrenceeditwidget.cpp:419 #, kde-format msgid "29th" msgstr "29" #: recurrenceeditwidget.cpp:420 #, kde-format msgid "30th" msgstr "30" #: recurrenceeditwidget.cpp:421 #, kde-format msgid "31st" msgstr "31" #: recurrenceeditwidget.cpp:422 recurrenceeditwidget.cpp:447 #: recurrenceeditwidget.cpp:499 #, kde-format msgid "Last" msgstr "Ultimo" #: recurrenceeditwidget.cpp:423 recurrenceeditwidget.cpp:448 #: recurrenceeditwidget.cpp:500 #, kde-format msgid "2nd Last" msgstr "penultimo" #: recurrenceeditwidget.cpp:424 recurrenceeditwidget.cpp:449 #: recurrenceeditwidget.cpp:501 #, kde-format msgid "3rd Last" msgstr "terzultimo" #: recurrenceeditwidget.cpp:425 recurrenceeditwidget.cpp:450 #: recurrenceeditwidget.cpp:502 #, kde-format msgid "4th Last" msgstr "quartultimo" #: recurrenceeditwidget.cpp:426 recurrenceeditwidget.cpp:451 #: recurrenceeditwidget.cpp:503 #, kde-format msgid "5th Last" msgstr "quintultimo" #: recurrenceeditwidget.cpp:429 #, kde-format msgid "day" msgstr "giorno" #: recurrenceeditwidget.cpp:431 recurrenceeditwidget.cpp:483 #: recurrenceeditwidget.cpp:521 #, kde-format msgid "possibly on weekend" msgstr "possibilmente in settimana" #: recurrenceeditwidget.cpp:432 recurrenceeditwidget.cpp:484 #: recurrenceeditwidget.cpp:522 #, kde-format msgid "but before weekend" msgstr "ma prima del fine settimana" #: recurrenceeditwidget.cpp:433 recurrenceeditwidget.cpp:485 #: recurrenceeditwidget.cpp:523 #, kde-format msgid "but after weekend" msgstr "ma dopo il fine settimana" #: recurrenceeditwidget.cpp:466 #, kde-format msgid "year(s), after the start year" msgstr "anno/i, dopo l'anno di inizio" #: recurrenceeditwidget.cpp:471 #, fuzzy, kde-format msgctxt "part before XXX of 'Recur on day XXX of month YYY'" msgid "Recur on day" msgstr "Ricorri il giorno #" #: recurrenceeditwidget.cpp:479 #, kde-format msgctxt "part between XXX and YYY of 'Recur on day XXX of month YYY'" msgid "of" msgstr "" #: recurrenceeditwidget.cpp:489 #, fuzzy, kde-format msgctxt "Part before NNN in 'Recur on the NNN. WEEKDAY of MONTH'" msgid "On the" msgstr "Altro" #: recurrenceeditwidget.cpp:507 #, kde-format msgctxt "part between WEEKDAY and MONTH in 'Recur on NNN. WEEKDAY of MONTH'" msgid "of" msgstr "" #: recurrenceeditwidget.cpp:512 #, kde-format msgid "Recur on day #" msgstr "Ricorri il giorno #" #: recurrenceeditwidget.cpp:519 #, kde-format msgctxt "part after NNN of 'Recur on day #NNN of the year'" msgid " of the year" msgstr "" #: recurrenceeditwidget.cpp:533 #, kde-format msgid "Range..." msgstr "Intervallo..." #: recurrenceeditwidget.cpp:535 #, kde-format msgid "Exceptions..." msgstr "Eccezioni..." #: recurrenceeditwidget.cpp:731 #, kde-format msgid "No day of week selected for weekly recurrence." msgstr "" "Nessun giorno della settimana è stato selezionato per la ricorrenza " "settimanale." #: recurrenceeditwidget.cpp:745 recurrenceeditwidget.cpp:774 #: recurrenceeditwidget.cpp:791 #, kde-format msgid "Selected day will never occur with selected frequency and start date." msgstr "" #: recurrenceeditwidget.cpp:761 #, kde-format msgid "Selected day does not exist in selected month." msgstr "Il giorno selezionato non esiste nel mese selezionato." #: transaction.cpp:155 transaction.cpp:186 #, kde-format msgid "Dividend: %1" msgstr "Dividendo: %1" #: transaction.cpp:253 transaction.cpp:256 transaction.cpp:284 #, kde-format msgid "Account balancing" msgstr "Bilanciamento del conto" #: transaction.cpp:337 transaction.cpp:352 #, kde-format msgid "Security: %1 (bought)" msgstr "Titolo: %1 (comprato)" #: transaction.cpp:375 transaction.cpp:390 #, kde-format msgid "Security: %1 (sold)" msgstr "Titolo: %1 (venduto)" #: transactioneditwidget.cpp:125 #, kde-format msgid "Shares bought:" msgstr "Azioni acquistate:" #: transactioneditwidget.cpp:130 #, kde-format msgid "Shares sold:" msgstr "Azioni vendute:" #: transactioneditwidget.cpp:238 transactioneditwidget.cpp:1144 #: transactionfilterwidget.cpp:140 #, kde-format msgid "Payer:" msgstr "Debitore:" #: transactioneditwidget.cpp:280 transactioneditwidget.cpp:1145 #: transactionfilterwidget.cpp:141 #, kde-format msgid "Payee:" msgstr "Creditore:" #: transactioneditwidget.cpp:664 transactioneditwidget.cpp:1262 #, kde-format msgid "No income category available." msgstr "Nessuna categoria di entrata è disponibile." #: transactioneditwidget.cpp:689 transactioneditwidget.cpp:1270 #, kde-format msgid "No expense category available." msgstr "Nessuna categoria di uscita è disponibile." #: transactioneditwidget.cpp:720 #, kde-format msgid "Cannot create a regular transfer to/from a securities account." msgstr "Impossibile creare un regolare trasferimento a/da un conto di titoli." #: transactioneditwidget.cpp:727 #, kde-format msgid "Cannot create a regular income to a securities account." msgstr "Impossibile creare una regolare entrata da un conto di titoli." #: transactioneditwidget.cpp:743 #, kde-format msgid "Zero price per share not allowed." msgstr "Zero per cento delle azioni non è permesso." #: transactioneditwidget.cpp:755 #, kde-format msgid "Cannot create a regular expense from a securities account." msgstr "Impossibile creare una regolare uscita da un conto di titoli." #: transactioneditwidget.cpp:1086 #, kde-format msgid "Modify Transactions" msgstr "Modifica Transazioni" #: transactionfilterwidget.cpp:99 #, kde-format msgid "Min amount:" msgstr "Min quantità:" #: transactionfilterwidget.cpp:100 #, kde-format msgid "Max amount:" msgstr "Max quantità:" #: transactionfilterwidget.cpp:110 #, kde-format msgid "Min income:" msgstr "Min entrata:" #: transactionfilterwidget.cpp:111 #, kde-format msgid "Max income:" msgstr "Max entrata:" #: transactionfilterwidget.cpp:121 #, kde-format msgid "Min cost:" msgstr "Min costo:" #: transactionfilterwidget.cpp:122 #, kde-format msgid "Max cost:" msgstr "Max costo:" #: transactionfilterwidget.cpp:148 #, kde-format msgid "Include" msgstr "Includi" #: transactionfilterwidget.cpp:152 #, kde-format msgid "Exclude" msgstr "Escludi" #: transactionlistwidget.cpp:117 #, kde-format msgid "From Account" msgstr "Dal Conto" #: transactionlistwidget.cpp:128 #, kde-format msgid "To Account" msgstr "Al Conto" #: transactionlistwidget.cpp:130 #, kde-format msgid "Payer" msgstr "Debitore" #: transactionlistwidget.cpp:169 #, kde-format msgid "New/Edit Expense" msgstr "Nuova/Modifica Uscita" #: transactionlistwidget.cpp:170 #, kde-format msgid "Filter" msgstr "Filtro" #: transactionlistwidget.cpp:209 #, kde-format msgid "Total:" msgstr "Totale:" #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:328 #, kde-format msgid "Average:" msgstr "Media:" #: transactionlistwidget.cpp:209 #, kde-format msgid "Monthly:" msgstr "Mensilmente:" #: transactionlistwidget.cpp:314 #, kde-format msgid "Total cost:" msgstr "Totale dei costi:" #: transactionlistwidget.cpp:318 #, kde-format msgid "Total income:" msgstr "Totale delle entrate:" #: transactionlistwidget.cpp:322 #, kde-format msgid "Total amount:" msgstr "Tatale delle quantità:" #: transactionlistwidget.cpp:330 #, kde-format msgid "Monthly average:" msgstr "Media mensile:" #: transactionlistwidget.cpp:671 #, kde-format msgid "" "Are you sure you want to delete all (%1) transactions in the selected split " "transaction?" msgstr "" #: transactionlistwidget.cpp:1028 #, kde-format msgid "* Part of split transaction" msgstr "* Parte di una transazione suddivisa" #: transactionlistwidget.cpp:1029 #, kde-format msgid "* Part of split (%1)" msgstr "*Parte di una suddivisione (%1)" #: transactionlistwidget.cpp:1033 #, kde-format msgid "** Recurring (editing occurrance)" msgstr "" #: transactionlistwidget.cpp:1049 #, kde-format msgid "Modify..." msgstr "Modifica..." eqonomize-0.6/po/nl.po0000644000175000017500000024001511107053374013713 0ustar hannahanna# Dutch translation for eqonomize # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the eqonomize package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: eqonomize\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?" "group_id=173799&atid=866832\n" "POT-Creation-Date: 2008-11-13 14:35+0100\n" "PO-Revision-Date: 2007-10-21 20:39+0000\n" "Last-Translator: Bert van der Perk \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2008-11-12 16:01+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: budget.cpp:51 editsplitdialog.cpp:118 ledgerdialog.cpp:652 #, kde-format msgid "Balancing" msgstr "Balans" #: budget.cpp:84 #, kde-format msgid "Couldn't open %1 for reading" msgstr "Kan %1 niet openen om te lezen" #: budget.cpp:95 #, kde-format msgid "" "Not a valid Eqonomize! file (XML parse error: \"%2\" at line %3, col %4)" msgstr "" #: budget.cpp:98 #, kde-format msgid "Invalid root element %1 in XML document" msgstr "" #: budget.cpp:363 #, kde-format msgid "Unable to load 1 account." msgid_plural "Unable to load %n accounts." msgstr[0] "Kan 1 rekening niet inlezen." msgstr[1] "Kan %n rekeningen niet inlezen." #: budget.cpp:368 #, kde-format msgid "Unable to load 1 category." msgid_plural "Unable to load %n categories." msgstr[0] "Kan 1 categorie niet inlezen." msgstr[1] "Kan %n categorieën niet inlezen." #: budget.cpp:373 #, kde-format msgid "Unable to load 1 security." msgid_plural "Unable to load %n securities." msgstr[0] "" msgstr[1] "" #: budget.cpp:378 #, kde-format msgid "Unable to load 1 transaction." msgid_plural "Unable to load %n transactions." msgstr[0] "Kan 1 transactie niet inlezen." msgstr[1] "Kan %n transacties niet inlezen." #: budget.cpp:389 #, kde-format msgid "File is a directory" msgstr "Bestand is een directory" #: budget.cpp:397 #, kde-format msgid "Couldn't open file for writing" msgstr "Kan bestand niet openen om te schrijven" #: budget.cpp:547 budget.cpp:551 #, kde-format msgid "Error while writing file; file was not saved" msgstr "Fout tijdens het schrijven van het bestand; bestand is niet opgeslagen" #: categoriescomparisonchart.cpp:123 categoriescomparisonreport.cpp:164 #: eqonomize.cpp:1797 eqonomize.cpp:1957 eqonomize.cpp:2036 #: transactionlistwidget.cpp:138 #, kde-format msgid "From" msgstr "Vanaf" #: categoriescomparisonchart.cpp:130 categoriescomparisonreport.cpp:171 #: eqonomize.cpp:1808 eqonomize.cpp:1969 eqonomize.cpp:2037 #: transactionlistwidget.cpp:139 #, kde-format msgid "To" msgstr "Tot" #: categoriescomparisonchart.cpp:147 categoriescomparisonreport.cpp:114 #: overtimechart.cpp:112 overtimechart.cpp.bak:106 overtimereport.cpp:97 #, kde-format msgid "Source:" msgstr "Bron:" #: categoriescomparisonchart.cpp:150 categoriescomparisonchart.cpp:858 #, kde-format msgid "All Expenses" msgstr "Alle Uitgaven" #: categoriescomparisonchart.cpp:151 categoriescomparisonchart.cpp:859 #, kde-format msgid "All Incomes" msgstr "Alle Inkomsten" #: categoriescomparisonchart.cpp:152 categoriescomparisonchart.cpp:860 #, kde-format msgid "All Accounts" msgstr "Alle Rekeningen" #: categoriescomparisonchart.cpp:155 categoriescomparisonchart.cpp:864 #: categoriescomparisonreport.cpp:122 categoriescomparisonreport.cpp:752 #: categoriescomparisonreport.cpp:1016 overtimereport.cpp:375 #, kde-format msgid "Expenses: %1" msgstr "Uitgaven: %1" #: categoriescomparisonchart.cpp:160 categoriescomparisonchart.cpp:871 #: categoriescomparisonreport.cpp:127 categoriescomparisonreport.cpp:756 #: categoriescomparisonreport.cpp:1023 overtimereport.cpp:366 #, kde-format msgid "Incomes: %1" msgstr "Inkomsten: %1" #: categoriescomparisonchart.cpp:199 categoriescomparisonchart.cpp:225 #: categoriescomparisonreport.cpp:334 categoriescomparisonreport.cpp:360 #: editsplitdialog.cpp:411 eqonomize.cpp:482 eqonomize.cpp:571 #: eqonomize.cpp:741 eqonomize.cpp:848 eqonomize.cpp:870 eqonomize.cpp:2483 #: eqonomize.cpp:3180 eqonomize.cpp:3206 eqonomize.cpp:3326 eqonomize.cpp:3352 #: importcsvdialog.cpp:780 importcsvdialog.cpp:1196 overtimechart.cpp:462 #: overtimechart.cpp:500 overtimechart.cpp:528 overtimechart.cpp:566 #: overtimechart.cpp.bak:455 overtimechart.cpp.bak:493 #: overtimechart.cpp.bak:521 overtimechart.cpp.bak:559 #: recurrenceeditwidget.cpp:156 recurrenceeditwidget.cpp:171 #: recurrenceeditwidget.cpp:293 transactioneditwidget.cpp:707 #: transactioneditwidget.cpp:1281 transactionfilterwidget.cpp:564 #: transactionfilterwidget.cpp:590 #, kde-format msgid "Invalid date." msgstr "Ongeldige datum" #: categoriescomparisonchart.cpp:204 categoriescomparisonreport.cpp:339 #: eqonomize.cpp:3185 eqonomize.cpp:3331 transactionfilterwidget.cpp:569 #, kde-format msgid "To date is before from date." msgstr "Datum Tot is eerder dan Datum Vanaf." #: categoriescomparisonchart.cpp:229 categoriescomparisonreport.cpp:364 #: eqonomize.cpp:3210 eqonomize.cpp:3356 transactionfilterwidget.cpp:594 #, kde-format msgid "From date is after to date." msgstr "Datum Vanaf is later dan Datum Tot" #: categoriescomparisonchart.cpp:340 categoriescomparisonreport.cpp:463 #: eqonomize.cpp:3610 eqonomize.cpp:4252 ledgerdialog.cpp:251 #: overtimechart.cpp:624 overtimechart.cpp.bak:617 overtimereport.cpp:278 #: qifimportexport.cpp:604 #, kde-format msgid "" "The selected file already exists. Would you like to overwrite the old copy?" msgstr "" "Het geselecteerde bestand bestaat al. Wilt je de oude versie overschrijven?" #: categoriescomparisonchart.cpp:344 categoriescomparisonreport.cpp:467 #: eqonomize.cpp:4257 ledgerdialog.cpp:255 overtimechart.cpp:628 #: overtimechart.cpp.bak:621 overtimereport.cpp:282 qifimportexport.cpp:608 #, kde-format msgid "You selected a directory!" msgstr "Je hebt een directory geselecteerd!" #: categoriescomparisonchart.cpp:352 categoriescomparisonreport.cpp:475 #: eqonomize.cpp:4264 ledgerdialog.cpp:263 overtimechart.cpp:636 #: overtimechart.cpp.bak:629 overtimereport.cpp:290 qifimportexport.cpp:616 #, kde-format msgid "Couldn't open file for writing." msgstr "Kan bestand niet openen voor schrijven." #: categoriescomparisonchart.cpp:372 categoriescomparisonreport.cpp:482 #: eqonomize.cpp:4270 ledgerdialog.cpp:269 overtimechart.cpp:656 #: overtimechart.cpp.bak:644 overtimereport.cpp:297 qifimportexport.cpp:622 #, kde-format msgid "Error while writing file; file was not saved." msgstr "" "Fout tijdens het schrijven van het bestand; bestand is niet opgeslagen." #: categoriescomparisonchart.cpp:728 categoriescomparisonreport.cpp:303 #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:754 #: categoriescomparisonreport.cpp:839 categoriescomparisonreport.cpp:930 #: categoriescomparisonreport.cpp:977 overtimechart.cpp:373 #: overtimechart.cpp:1740 overtimechart.cpp:1746 overtimechart.cpp:1774 #: overtimechart.cpp:1776 overtimechart.cpp:1783 overtimechart.cpp:1785 #: overtimechart.cpp:1821 overtimechart.cpp:1891 overtimechart.cpp.bak:366 #: overtimechart.cpp.bak:1721 overtimechart.cpp.bak:1727 #: overtimechart.cpp.bak:1755 overtimechart.cpp.bak:1757 #: overtimechart.cpp.bak:1764 overtimechart.cpp.bak:1766 #: overtimechart.cpp.bak:1811 overtimechart.cpp.bak:1892 #: overtimereport.cpp:213 overtimereport.cpp:384 overtimereport.cpp:393 #: overtimereport.cpp:732 #, kde-format msgid "No description" msgstr "Geen omschrijving" #: categoriescomparisonreport.cpp:119 categoriescomparisonreport.cpp:1012 #, kde-format msgid "All Categories" msgstr "Alle categorieën" #: categoriescomparisonreport.cpp:138 #, kde-format msgid "Descriptions for" msgstr "Omschrijving voor" #: categoriescomparisonreport.cpp:145 #, kde-format msgid "Payees/payers for" msgstr "Crediteuren/debiteuren voor" #: categoriescomparisonreport.cpp:161 #, kde-format msgid "Period:" msgstr "Periode:" #: categoriescomparisonreport.cpp:186 overtimereport.cpp:120 #, kde-format msgid "Columns:" msgstr "Kolommen:" #: categoriescomparisonreport.cpp:189 categoriescomparisonreport.cpp:782 #: eqonomize.cpp:1062 eqonomize.cpp:1935 eqonomize.cpp:4142 #: importcsvdialog.cpp:139 importcsvdialog.cpp:157 importcsvdialog.cpp:180 #: importcsvdialog.cpp:197 importcsvdialog.cpp:216 importcsvdialog.cpp:235 #: importcsvdialog.cpp:253 overtimereport.cpp:123 #, kde-format msgid "Value" msgstr "Waarde" #: categoriescomparisonreport.cpp:192 overtimereport.cpp:126 #: recurrenceeditwidget.cpp:320 #, kde-format msgid "Daily" msgstr "Dagelijks" #: categoriescomparisonreport.cpp:195 overtimereport.cpp:129 #: recurrenceeditwidget.cpp:322 #, kde-format msgid "Monthly" msgstr "Maandelijks" #: categoriescomparisonreport.cpp:198 overtimereport.cpp:132 #: recurrenceeditwidget.cpp:323 #, kde-format msgid "Yearly" msgstr "Jaarlijks" #: categoriescomparisonreport.cpp:201 categoriescomparisonreport.cpp:787 #: overtimechart.cpp:205 overtimechart.cpp:1534 overtimechart.cpp.bak:198 #: overtimechart.cpp.bak:1515 overtimereport.cpp:135 overtimereport.cpp:549 #: transactionlistwidget.cpp:276 transactionlistwidget.cpp:340 #, kde-format msgid "Quantity" msgstr "" #: categoriescomparisonreport.cpp:204 overtimechart.cpp:209 #: overtimechart.cpp.bak:202 overtimereport.cpp:138 #, kde-format msgid "Average value" msgstr "Gemiddelde waarde" #: categoriescomparisonreport.cpp:278 categoriescomparisonreport.cpp:947 #, kde-format msgid "All descriptions" msgstr "Alle omschrijvingen" #: categoriescomparisonreport.cpp:279 categoriescomparisonreport.cpp:948 #, kde-format msgid "All payees" msgstr "Alle crediteuren" #: categoriescomparisonreport.cpp:280 categoriescomparisonreport.cpp:949 #, kde-format msgid "All payers" msgstr "Alle debiteuren" #: categoriescomparisonreport.cpp:309 categoriescomparisonreport.cpp:751 #: categoriescomparisonreport.cpp:837 categoriescomparisonreport.cpp:932 #: categoriescomparisonreport.cpp:994 overtimechart.cpp:382 #: overtimechart.cpp:1758 overtimechart.cpp:1768 overtimechart.cpp:1823 #: overtimechart.cpp:1908 overtimechart.cpp.bak:375 overtimechart.cpp.bak:1739 #: overtimechart.cpp.bak:1749 overtimechart.cpp.bak:1813 #: overtimechart.cpp.bak:1909 #, kde-format msgid "No payee" msgstr "Geen crediteur" #: categoriescomparisonreport.cpp:310 categoriescomparisonreport.cpp:755 #: categoriescomparisonreport.cpp:838 categoriescomparisonreport.cpp:933 #: categoriescomparisonreport.cpp:995 overtimechart.cpp:381 #: overtimechart.cpp:1752 overtimechart.cpp:1763 overtimechart.cpp:1825 #: overtimechart.cpp:1907 overtimechart.cpp.bak:374 overtimechart.cpp.bak:1733 #: overtimechart.cpp.bak:1744 overtimechart.cpp.bak:1815 #: overtimechart.cpp.bak:1908 #, kde-format msgid "No payer" msgstr "Geen debiteur" #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:751 #: overtimereport.cpp:393 #, kde-format msgid "Expenses: %2, %1" msgstr "Uitgaven: %2, %1" #: categoriescomparisonreport.cpp:754 categoriescomparisonreport.cpp:755 #: overtimereport.cpp:384 #, kde-format msgid "Incomes: %2, %1" msgstr "Inkomsten: %2, %1" #: categoriescomparisonreport.cpp:758 #, kde-format msgid "Incomes & Expenses" msgstr "Inkomsten & Uitgaven" #: categoriescomparisonreport.cpp:771 #, kde-format msgctxt "html format; %1: title; %2: from date; %3: to date" msgid "%1 (%2–%3)" msgstr "%1 (%2–%3)" #: categoriescomparisonreport.cpp:772 #, kde-format msgctxt "html format; %1: title; %2: to date" msgid "%1 (to %2)" msgstr "%1 (tot %2)" #: categoriescomparisonreport.cpp:776 eqonomize.cpp:4046 eqonomize.cpp:4094 #: qifimportexport.cpp:131 transactionlistwidget.cpp:116 #: transactionlistwidget.cpp:127 #, kde-format msgid "Category" msgstr "Categorie" #: categoriescomparisonreport.cpp:778 eqonomize.cpp:1938 #: transactionlistwidget.cpp:115 #, kde-format msgid "Cost" msgstr "Kosten" #: categoriescomparisonreport.cpp:780 editscheduledtransactiondialog.cpp:46 #: editsplitdialog.cpp:108 eqonomize.cpp:285 eqonomize.cpp:329 #: ledgerdialog.cpp:647 transactionlistwidget.cpp:126 #, kde-format msgid "Income" msgstr "Inkomsten" #: categoriescomparisonreport.cpp:784 overtimereport.cpp:545 #, kde-format msgid "Daily Average" msgstr "Dagelijks Gemiddelde" #: categoriescomparisonreport.cpp:785 overtimereport.cpp:546 #, kde-format msgid "Monthly Average" msgstr "Maandelijks Gemiddelde" #: categoriescomparisonreport.cpp:786 overtimereport.cpp:547 #, kde-format msgid "Yearly Average" msgstr "Jaarlijks Gemiddelde" #: categoriescomparisonreport.cpp:789 overtimereport.cpp:358 #: overtimereport.cpp:376 overtimereport.cpp:394 #, kde-format msgid "Average Cost" msgstr "Gemiddelde kosten" #: categoriescomparisonreport.cpp:791 overtimereport.cpp:350 #: overtimereport.cpp:367 overtimereport.cpp:385 #, kde-format msgid "Average Income" msgstr "Gemiddelde inkomsten" #: categoriescomparisonreport.cpp:793 #, kde-format msgid "Average Value" msgstr "Gemiddelde Waarde" #: categoriescomparisonreport.cpp:853 eqonomize.cpp:3932 eqonomize.cpp:4030 #: eqonomize.cpp:4075 eqonomize.cpp:4123 overtimereport.cpp:686 #, kde-format msgid "Total" msgstr "Totaal" #: categoriescomparisonreport.cpp:878 #, kde-format msgid "Total incomes" msgstr "Totaal inkomsten" #: categoriescomparisonreport.cpp:902 #, kde-format msgid "Total expenses" msgstr "Totaal uitgaven" #: categoriescomparisonreport.cpp:912 #, kde-format msgid "Total (Profits)" msgstr "Totaal (Winst)" #: editscheduledtransactiondialog.cpp:45 editsplitdialog.cpp:111 #: eqonomize.cpp:288 eqonomize.cpp:332 ledgerdialog.cpp:650 #, kde-format msgid "Expense" msgstr "Uitgaven" #: editscheduledtransactiondialog.cpp:47 editsplitdialog.cpp:120 #: eqonomize.cpp:282 eqonomize.cpp:326 ledgerdialog.cpp:653 #, kde-format msgid "Transfer" msgstr "Overboeking" #: editscheduledtransactiondialog.cpp:48 editsplitdialog.cpp:114 #: eqonomize.cpp:289 eqonomize.cpp:333 #, kde-format msgid "Security Buy" msgstr "" #: editscheduledtransactiondialog.cpp:49 editsplitdialog.cpp:116 #: eqonomize.cpp:290 eqonomize.cpp:334 #, kde-format msgid "Security Sell" msgstr "Waardepapier Verkopen" #: editscheduledtransactiondialog.cpp:56 editscheduledtransactiondialog.cpp:57 #, kde-format msgid "Recurrence" msgstr "Herhaling" #: editscheduledtransactiondialog.cpp:104 #, kde-format msgid "New Expense" msgstr "Nieuwe Kosten" #: editscheduledtransactiondialog.cpp:106 #, kde-format msgid "New Dividend" msgstr "Nieuw Dividend" #: editscheduledtransactiondialog.cpp:107 #, kde-format msgid "New Income" msgstr "Nieuwe Inkomsten" #: editscheduledtransactiondialog.cpp:110 #, kde-format msgid "New Transfer" msgstr "Nieuwe Transactie" #: editscheduledtransactiondialog.cpp:111 #, kde-format msgid "New Security Buy" msgstr "Nieuwe effectenaankoop" #: editscheduledtransactiondialog.cpp:113 #, kde-format msgid "New Security Sell" msgstr "Nieuwe effectenverkoop" #: editscheduledtransactiondialog.cpp:128 #: editscheduledtransactiondialog.cpp:149 transactioneditwidget.cpp:1064 #, kde-format msgid "Edit Expense" msgstr "Bewerk Kosten" #: editscheduledtransactiondialog.cpp:130 #: editscheduledtransactiondialog.cpp:151 transactioneditwidget.cpp:1066 #, kde-format msgid "Edit Dividend" msgstr "Bewerk Dividend" #: editscheduledtransactiondialog.cpp:131 #: editscheduledtransactiondialog.cpp:152 transactioneditwidget.cpp:1067 #, kde-format msgid "Edit Income" msgstr "Bewerk Inkomsten" #: editscheduledtransactiondialog.cpp:134 #: editscheduledtransactiondialog.cpp:155 transactioneditwidget.cpp:1070 #, kde-format msgid "Edit Transfer" msgstr "Bewerk Transactie" #: editscheduledtransactiondialog.cpp:135 #: editscheduledtransactiondialog.cpp:156 transactioneditwidget.cpp:1071 #, kde-format msgid "Edit Securities Bought" msgstr "Bewerk Gekochte Waardepapieren" #: editscheduledtransactiondialog.cpp:136 #: editscheduledtransactiondialog.cpp:157 transactioneditwidget.cpp:1072 #, kde-format msgid "Edit Securities Sold" msgstr "Bewerk Verkochte Waardepapieren" #: editsplitdialog.cpp:107 eqonomize.cpp:284 eqonomize.cpp:328 #: eqonomize.cpp:1167 #, kde-format msgid "Dividend" msgstr "Dividend" #: editsplitdialog.cpp:109 eqonomize.cpp:403 eqonomize.cpp:445 #: ledgerdialog.cpp:648 #, kde-format msgid "Repayment" msgstr "Aflossing" #: editsplitdialog.cpp:112 eqonomize.cpp:404 eqonomize.cpp:446 #: ledgerdialog.cpp:651 #, kde-format msgid "Refund" msgstr "Terugstorten" #: editsplitdialog.cpp:126 ledgerdialog.cpp:638 #, kde-format msgid "Split Transaction" msgstr "Gesplitste Transactie" #: editsplitdialog.cpp:138 eqonomize.cpp:1279 eqonomize.cpp:1379 #: eqonomize.cpp:1473 eqonomize.cpp:1538 importcsvdialog.cpp:129 #: transactioneditwidget.cpp:175 transactioneditwidget.cpp:1099 #: transactionfilterwidget.cpp:135 #, kde-format msgid "Description:" msgstr "Omschrijving:" #: editsplitdialog.cpp:143 eqonomize.cpp:413 eqonomize.cpp:523 #: eqonomize.cpp:639 eqonomize.cpp:1274 eqonomize.cpp:2476 #: importcsvdialog.cpp:187 transactioneditwidget.cpp:149 #: transactioneditwidget.cpp:199 transactioneditwidget.cpp:1119 #, kde-format msgid "Date:" msgstr "Datum:" #: editsplitdialog.cpp:148 eqonomize.cpp:424 eqonomize.cpp:1252 #: importcsvdialog.cpp:388 importcsvdialog.cpp:399 ledgerdialog.cpp:107 #: qifimportexport.cpp:503 #, kde-format msgid "Account:" msgstr "Account:" #: editsplitdialog.cpp:163 #, kde-format msgid "Transactions:" msgstr "Transacties:" #: editsplitdialog.cpp:172 eqonomize.cpp:914 eqonomize.cpp:1061 #: eqonomize.cpp:1941 eqonomize.cpp:2033 eqonomize.cpp:3988 #: ledgerdialog.cpp:135 #, kde-format msgid "Type" msgstr "Type" #: editsplitdialog.cpp:173 eqonomize.cpp:915 eqonomize.cpp:2034 #: ledgerdialog.cpp:136 qifimportexport.cpp:127 qifimportexport.cpp:139 #: qifimportexport.cpp:149 transactionlistwidget.cpp:111 #, kde-format msgid "Description" msgstr "Omschrijving" #: editsplitdialog.cpp:174 eqonomize.cpp:4142 ledgerdialog.cpp:137 #, kde-format msgid "Account/Category" msgstr "Rekening/Categorie" #: editsplitdialog.cpp:175 #, kde-format msgid "Payment" msgstr "Betaling" #: editsplitdialog.cpp:176 ledgerdialog.cpp:138 #, kde-format msgid "Deposit" msgstr "Storting" #: editsplitdialog.cpp:181 ledgerdialog.cpp:151 #, kde-format msgid "New" msgstr "Nieuw" #: editsplitdialog.cpp:184 eqonomize.cpp:4333 #, kde-format msgid "New Expense..." msgstr "Nieuwe Kosten..." #: editsplitdialog.cpp:185 eqonomize.cpp:4334 #, kde-format msgid "New Income..." msgstr "Nieuwe Inkomsten..." #: editsplitdialog.cpp:186 #, kde-format msgid "New Deposit..." msgstr "Nieuwe Storting..." #: editsplitdialog.cpp:187 #, kde-format msgid "New Withdrawal..." msgstr "Nieuwe Opname..." #: editsplitdialog.cpp:188 #, fuzzy, kde-format msgid "New Security Shares Bought..." msgstr "Aandelen gekocht..." #: editsplitdialog.cpp:189 #, kde-format msgid "Security Shares Sold..." msgstr "Aandelen verkocht..." #: editsplitdialog.cpp:190 #, kde-format msgid "New Dividend..." msgstr "Nieuw dividend..." #: editsplitdialog.cpp:191 eqonomize.cpp:924 eqonomize.cpp:1071 #: eqonomize.cpp:4328 ledgerdialog.cpp:158 transactionlistwidget.cpp:1051 #, kde-format msgid "Edit..." msgstr "Bewerk..." #: editsplitdialog.cpp:221 eqonomize.cpp:2325 #, kde-format msgid "Total value:" msgstr "Totale waarde:" #: editsplitdialog.cpp:403 transactioneditwidget.cpp:653 #: transactioneditwidget.cpp:657 transactioneditwidget.cpp:668 #: transactioneditwidget.cpp:682 transactioneditwidget.cpp:693 #, kde-format msgid "No suitable account available." msgstr "Geen geschikte rekening beschikbaar." #: editsplitdialog.cpp:415 #, kde-format msgid "Future dates is not allowed." msgstr "Datums in de toekomst zijn niet toegestaan." #: editsplitdialog.cpp:419 #, kde-format msgid "A split must contain at least two transactions." msgstr "Een splitsing moet minstens twee transacties bevatten." #: editsplitdialog.cpp:428 transactioneditwidget.cpp:714 #, kde-format msgid "Cannot transfer money to and from the same account." msgstr "Kan geen geld overmaken naar en van dezelde rekening." #: eqonomize.cpp:419 eqonomize.cpp:2325 importcsvdialog.cpp:146 #: importcsvdialog.cpp:169 importcsvdialog.cpp:355 #: transactioneditwidget.cpp:117 transactioneditwidget.cpp:186 #: transactioneditwidget.cpp:1111 #, kde-format msgid "Cost:" msgstr "Kosten:" #: eqonomize.cpp:420 importcsvdialog.cpp:364 importcsvdialog.cpp:397 #: transactioneditwidget.cpp:118 transactioneditwidget.cpp:184 #: transactioneditwidget.cpp:1110 #, kde-format msgid "Income:" msgstr "Inkomsten:" #: eqonomize.cpp:439 transactioneditwidget.cpp:193 #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:310 #, kde-format msgid "Quantity:" msgstr "Hoeveelheid:" #: eqonomize.cpp:443 importcsvdialog.cpp:243 transactioneditwidget.cpp:288 #, kde-format msgid "Comments:" msgstr "Opmerkingen:" #: eqonomize.cpp:491 eqonomize.cpp:1176 #, kde-format msgid "Reinvested Dividend" msgstr "Herinvesteerd Dividend" #: eqonomize.cpp:501 transactioneditwidget.cpp:97 #: transactioneditwidget.cpp:157 #, kde-format msgid "Security:" msgstr "Waardepapier:" #: eqonomize.cpp:518 #, kde-format msgid "Shares added:" msgstr "Aandelen toegevoegd:" #: eqonomize.cpp:579 #, kde-format msgid "Security Trade" msgstr "Effecten Handel" #: eqonomize.cpp:587 #, kde-format msgid "From security:" msgstr "Van effecten:" #: eqonomize.cpp:603 #, kde-format msgid "Shares moved:" msgstr "Effecten verplaatst:" #: eqonomize.cpp:608 transactioneditwidget.cpp:135 #: transactionfilterwidget.cpp:167 transactionfilterwidget.cpp:168 #: transactionfilterwidget.cpp:343 transactionfilterwidget.cpp:380 #, kde-format msgid "All" msgstr "Alle" #: eqonomize.cpp:614 #, kde-format msgid "To security:" msgstr "Naar Effecten:" #: eqonomize.cpp:631 #, kde-format msgid "Shares received:" msgstr "Effecten ontvangen:" #: eqonomize.cpp:635 importcsvdialog.cpp:386 importcsvdialog.cpp:412 #: overtimechart.cpp:193 overtimechart.cpp.bak:186 #, kde-format msgid "Value:" msgstr "Waarde:" #: eqonomize.cpp:725 #, kde-format msgid "No other security available for trade in the account." msgstr "Geen andere effecten beschikbaar om te verhandelen in deze rekening." #: eqonomize.cpp:737 #, kde-format msgid "Selected to and from securities are the same." msgstr "Gekozen effecten Van en Naar zijn hetzelfde." #: eqonomize.cpp:745 transactioneditwidget.cpp:735 #, kde-format msgid "Zero shares not allowed." msgstr "Geen Effecten niet toegestaan." #: eqonomize.cpp:749 transactioneditwidget.cpp:739 #, kde-format msgid "Zero value not allowed." msgstr "Geen waarde niet toegestaan." #: eqonomize.cpp:757 eqonomize.cpp:766 #, kde-format msgid "Quotations" msgstr "Noteringen" #: eqonomize.cpp:777 eqonomize.cpp:913 eqonomize.cpp:962 eqonomize.cpp:1060 #: ledgerdialog.cpp:134 transactionlistwidget.cpp:110 #, kde-format msgid "Date" msgstr "Datum" #: eqonomize.cpp:778 #, kde-format msgid "Price per Share" msgstr "Prijs per Aandeel" #: eqonomize.cpp:820 #, kde-format msgid "Quotations for %1" msgstr "Noteringen voor %1" #: eqonomize.cpp:904 #, kde-format msgid "" "The following transactions was scheduled to occur today or before today.\n" "Confirm that they have indeed occurred (or will occur today)." msgstr "" "De volgende transacties waren gepland vandaag of eerder plaats te vinden.\n" "Bevestig dat ze plaats hebben gevonden (of vandaag nog plaats zullen vinden)." #: eqonomize.cpp:916 eqonomize.cpp:2035 transactionlistwidget.cpp:137 #, kde-format msgid "Amount" msgstr "" #: eqonomize.cpp:926 #, kde-format msgid "Postpone..." msgstr "Uitstellen..." #: eqonomize.cpp:973 #, kde-format msgid "Can only postpone to future dates." msgstr "Kan alleen uitstellen naar een datum in de toekomst." #: eqonomize.cpp:1052 ledgerdialog.cpp:299 #, kde-format msgid "Transactions for %1" msgstr "Transacties voor %1" #: eqonomize.cpp:1063 eqonomize.cpp:1936 #, kde-format msgid "Shares" msgstr "Aandelen" #: eqonomize.cpp:1160 #, kde-format msgid "Shares Bought" msgstr "Aandelen Gekocht" #: eqonomize.cpp:1161 #, kde-format msgid "Shares Sold" msgstr "Aandelen Verkocht" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Sold (Traded)" msgstr "Aandelen Verkocht (Handel)" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Bought (Traded)" msgstr "Aandelen Gekocht (Handel)" #: eqonomize.cpp:1204 #, kde-format msgid "Shares Bought (Recurring)" msgstr "Aandelen Gekocht (Herhalend)" #: eqonomize.cpp:1205 #, kde-format msgid "Shares Sold (Recurring)" msgstr "Aandelen Verkocht (Herhalend)" #: eqonomize.cpp:1207 #, kde-format msgid "Shares Bought (Scheduled)" msgstr "Aandelen Gekocht (Gepland)" #: eqonomize.cpp:1208 #, kde-format msgid "Shares Sold (Scheduled)" msgstr "Aandelen Verkocht (Gepland)" #: eqonomize.cpp:1220 #, kde-format msgid "Recurring Dividend" msgstr "Herhalend Dividend" #: eqonomize.cpp:1222 #, kde-format msgid "Scheduled Dividend" msgstr "Gepland Dividend" #: eqonomize.cpp:1240 eqonomize.cpp:1360 #, kde-format msgid "Type:" msgstr "Soort:" #: eqonomize.cpp:1243 eqonomize.cpp:2600 eqonomize.cpp:2660 #, kde-format msgid "Mutual Fund" msgstr "Beleggingsfonds" #: eqonomize.cpp:1244 eqonomize.cpp:2598 eqonomize.cpp:2658 #, kde-format msgid "Bond" msgstr "Obligatie" #: eqonomize.cpp:1245 eqonomize.cpp:2599 eqonomize.cpp:2659 #, kde-format msgid "Stock" msgstr "" #: eqonomize.cpp:1246 eqonomize.cpp:2601 eqonomize.cpp:2661 eqonomize.cpp:3492 #: eqonomize.cpp:3497 importcsvdialog.cpp:117 qifimportexport.cpp:332 #, kde-format msgid "Other" msgstr "" #: eqonomize.cpp:1249 eqonomize.cpp:1370 eqonomize.cpp:1464 eqonomize.cpp:1529 #, kde-format msgid "Name:" msgstr "Naam:" #: eqonomize.cpp:1264 #, kde-format msgid "Decimals in Shares:" msgstr "Decimalen in Aandelen:" #: eqonomize.cpp:1267 #, kde-format msgid "Initial Shares:" msgstr "Aanvankelijke Aandelen:" #: eqonomize.cpp:1270 #, kde-format msgid "Initial quotation:" msgstr "Aanvankelijke Notering:" #: eqonomize.cpp:1289 transactioneditwidget.cpp:675 #, kde-format msgid "No suitable account or income category available." msgstr "Geen geschikte rekening of inkomsten categorie beschikbaar." #: eqonomize.cpp:1363 eqonomize.cpp:3488 eqonomize.cpp:4021 #: qifimportexport.cpp:325 #, kde-format msgid "Cash" msgstr "Contant Geld" #: eqonomize.cpp:1364 eqonomize.cpp:4016 #, kde-format msgid "Current Account" msgstr "Lopende rekening" #: eqonomize.cpp:1365 eqonomize.cpp:3490 eqonomize.cpp:4017 #, kde-format msgid "Savings Account" msgstr "Spaarrekening" #: eqonomize.cpp:1366 eqonomize.cpp:4018 #, kde-format msgid "Credit Card" msgstr "Creditcard" #: eqonomize.cpp:1367 eqonomize.cpp:4019 #, kde-format msgid "Liabilities" msgstr "Passiva" #: eqonomize.cpp:1368 eqonomize.cpp:1731 eqonomize.cpp:1732 eqonomize.cpp:3891 #: eqonomize.cpp:3897 eqonomize.cpp:4020 #, kde-format msgid "Securities" msgstr "Effecten" #: eqonomize.cpp:1373 #, kde-format msgid "Initial balance:" msgstr "Openingsbalans:" #: eqonomize.cpp:1376 #, kde-format msgid "Default account for budgeted transactions" msgstr "Standaard rekening voor gebudgetteerde transacties" #: eqonomize.cpp:1441 eqonomize.cpp:1507 eqonomize.cpp:1572 #, kde-format msgid "Empty name." msgstr "Lege naam." #: eqonomize.cpp:1447 #, kde-format msgid "The entered name is used by another account." msgstr "De ingevoerde naam is al gebruikt voor een andere rekening." #: eqonomize.cpp:1467 eqonomize.cpp:1532 #, kde-format msgid "Monthly budget:" msgstr "Maandelijks budget:" #: eqonomize.cpp:1513 #, kde-format msgid "The entered name is used by another income category." msgstr "De ingevoerde naam is gebruikt voor een andere inkomsten categorie." #: eqonomize.cpp:1578 #, kde-format msgid "The entered name is used by another expense category." msgstr "De ingevoerde naam is gebruikt voor een andere kosten categorie." #: eqonomize.cpp:1711 eqonomize.cpp:1778 eqonomize.cpp:3984 eqonomize.cpp:5970 #: eqonomize.cpp:5976 #, kde-format msgid "Accounts" msgstr "Rekeningen" #: eqonomize.cpp:1712 #, kde-format msgid "Accounts & Categories" msgstr "Rekeningen & Categorieën" #: eqonomize.cpp:1716 eqonomize.cpp:1717 eqonomize.cpp:1780 #: importcsvdialog.cpp:70 overtimechart.cpp:126 overtimechart.cpp:1727 #: overtimechart.cpp:1731 overtimechart.cpp.bak:119 overtimechart.cpp.bak:1708 #: overtimechart.cpp.bak:1712 overtimereport.cpp:103 overtimereport.cpp:357 #: overtimereport.cpp:377 overtimereport.cpp:395 transactionlistwidget.cpp:251 #: transactionlistwidget.cpp:263 #, kde-format msgid "Expenses" msgstr "Uitgaven" #: eqonomize.cpp:1721 eqonomize.cpp:1722 eqonomize.cpp:1779 eqonomize.cpp:4043 #: importcsvdialog.cpp:75 overtimechart.cpp:127 overtimechart.cpp:1726 #: overtimechart.cpp:1730 overtimechart.cpp.bak:120 overtimechart.cpp.bak:1707 #: overtimechart.cpp.bak:1711 overtimereport.cpp:104 overtimereport.cpp:349 #: overtimereport.cpp:368 overtimereport.cpp:386 transactionlistwidget.cpp:252 #: transactionlistwidget.cpp:264 #, kde-format msgid "Incomes" msgstr "Inkomsten" #: eqonomize.cpp:1726 eqonomize.cpp:1727 importcsvdialog.cpp:78 #: transactionlistwidget.cpp:253 transactionlistwidget.cpp:265 #, kde-format msgid "Transfers" msgstr "" #: eqonomize.cpp:1736 #, kde-format msgid "Schedule" msgstr "Planning" #: eqonomize.cpp:1737 #, kde-format msgid "Scheduled Transactions" msgstr "Geplande Transacties" #: eqonomize.cpp:1753 eqonomize.cpp:1775 #, kde-format msgid "Account / Category" msgstr "Rekening / Categorie" #: eqonomize.cpp:1754 #, kde-format msgid "Remaining Budget (%1)" msgstr "Resterend Budget (%1)" #: eqonomize.cpp:1755 #, kde-format msgid "Change (%1)" msgstr "" #: eqonomize.cpp:1756 #, kde-format msgid "Total (%1)" msgstr "Totaal (%1)" #: eqonomize.cpp:1769 #, kde-format msgctxt "%2 remains of %1 budget" msgid "%2 of %1" msgstr "%2 van %1" #: eqonomize.cpp:1785 eqonomize.cpp:4002 #, kde-format msgid "Includes budgeted transactions" msgstr "Inclusief gebudgetteerde transacties" #: eqonomize.cpp:1793 #, kde-format msgid "Period" msgstr "Periode" #: eqonomize.cpp:1825 #, kde-format msgid "Select Period" msgstr "Selecteer Periode" #: eqonomize.cpp:1827 eqonomize.cpp:4312 #, kde-format msgid "Current Month" msgstr "Huidige Maand" #: eqonomize.cpp:1828 eqonomize.cpp:4313 #, kde-format msgid "Current Year" msgstr "Huidig Jaar" #: eqonomize.cpp:1829 eqonomize.cpp:4314 #, kde-format msgid "Current Whole Month" msgstr "Huidige Hele Maand" #: eqonomize.cpp:1830 eqonomize.cpp:4315 #, kde-format msgid "Current Whole Year" msgstr "Huidig Heel Jaar" #: eqonomize.cpp:1831 #, kde-format msgid "Whole Past Month" msgstr "Hele Afgelopen Maand" #: eqonomize.cpp:1832 #, kde-format msgid "Whole Past Year" msgstr "Heel Vorig Jaar" #: eqonomize.cpp:1833 #, kde-format msgid "Previous Month" msgstr "Vorige Maand" #: eqonomize.cpp:1834 #, kde-format msgid "Previous Year" msgstr "Vorig Jaar" #: eqonomize.cpp:1837 #, kde-format msgid "Show partial budget" msgstr "Toon gedeeltelijk budget" #: eqonomize.cpp:1842 #, kde-format msgid "Edit Budget" msgstr "Bewerk Budget" #: eqonomize.cpp:1846 #, kde-format msgid "Budget:" msgstr "Budget:" #: eqonomize.cpp:1856 #, kde-format msgid "Month:" msgstr "Maand:" #: eqonomize.cpp:1864 #, kde-format msgid "Result previous month:" msgstr "Resultaat vorige maand:" #: eqonomize.cpp:1917 eqonomize.cpp:4354 #, kde-format msgid "New Security..." msgstr "Nieuw Effecten..." #: eqonomize.cpp:1919 #, kde-format msgid "New Transaction" msgstr "Nieuwe Transactie" #: eqonomize.cpp:1922 eqonomize.cpp:4362 #, kde-format msgid "Set Quotation..." msgstr "Voer notering in..." #: eqonomize.cpp:1934 eqonomize.cpp:3987 #, kde-format msgid "Name" msgstr "Naam" #: eqonomize.cpp:1937 #, kde-format msgid "Quotation" msgstr "Notering" #: eqonomize.cpp:1939 #, kde-format msgid "Profit" msgstr "Winst" #: eqonomize.cpp:1940 #, kde-format msgid "Yearly Rate" msgstr "Jaarlijkse Ontwikkeling" #: eqonomize.cpp:1942 qifimportexport.cpp:323 #, kde-format msgid "Account" msgstr "Rekening" #: eqonomize.cpp:1953 #, kde-format msgid "Statistics Period" msgstr "Statistieken Periode" #: eqonomize.cpp:2015 #, kde-format msgid "New Schedule" msgstr "Nieuwe Planning" #: eqonomize.cpp:2018 #, kde-format msgid "Edit" msgstr "Bewerk" #: eqonomize.cpp:2032 #, kde-format msgid "Next Occurrence" msgstr "Volgende gebeurtenis" #: eqonomize.cpp:2038 qifimportexport.cpp:152 transactionlistwidget.cpp:144 #, kde-format msgid "Comments" msgstr "Beschrijving" #: eqonomize.cpp:2291 #, kde-format msgid "New Security" msgstr "Nieuw Waardepapier" #: eqonomize.cpp:2306 #, kde-format msgid "Edit Security" msgstr "Bewerk Waardepapier" #: eqonomize.cpp:2325 #, kde-format msgid "Profit:" msgstr "Winst:" #: eqonomize.cpp:2325 #, kde-format msgid "Rate:" msgstr "" #: eqonomize.cpp:2332 #, kde-format msgid "" "Are you sure you want to delete the security \"%1\" and all associated " "transactions?" msgstr "" "Weet je zeker dat je het waardepapier \"%1\" en alle geassocieerde " "transacties wilt verwijderen ?" #: eqonomize.cpp:2394 transactioneditwidget.cpp:700 #, kde-format msgid "No security available." msgstr "Geen effecten beschikbaar," #: eqonomize.cpp:2466 #, kde-format msgid "Set Quotation (%1)" msgstr "Voer notering in (%1)" #: eqonomize.cpp:2472 transactioneditwidget.cpp:143 #, kde-format msgid "Price per share:" msgstr "Prijs per aandeel:" #: eqonomize.cpp:2485 #, kde-format msgid "Future dates are not allowed." msgstr "Datum in de toekomst is niet toegestaan." #: eqonomize.cpp:2513 #, kde-format msgid "Security Transactions" msgstr "Waardepapier transacties" #: eqonomize.cpp:3166 ledgerdialog.cpp:293 #, kde-format msgid "Ledger" msgstr "" #: eqonomize.cpp:3475 #, kde-format msgid "Untitled" msgstr "" #: eqonomize.cpp:3489 #, kde-format msgid "Check Account" msgstr "Lopende rekening" #: eqonomize.cpp:3491 #, kde-format msgid "Salary" msgstr "Salaris" #: eqonomize.cpp:3493 #, kde-format msgid "Bills" msgstr "Rekeningen" #: eqonomize.cpp:3494 #, kde-format msgid "Clothing" msgstr "Kleding" #: eqonomize.cpp:3495 #, kde-format msgid "Groceries" msgstr "Boodschappen" #: eqonomize.cpp:3496 #, kde-format msgid "Leisure" msgstr "Vrijetijd" #: eqonomize.cpp:3561 importcsvdialog.cpp:795 qifimportexport.cpp:280 #: qifimportexport.cpp:444 #, kde-format msgid "Couldn't fetch %1." msgstr "Kon %1 niet ophalen." #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Error loading %1: %2." msgstr "Fout tijdens inlezen %1: %2." #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Couldn't open file" msgstr "Kan bestand niet openen" #: eqonomize.cpp:3627 eqonomize.cpp:3653 #, kde-format msgid "Error saving %1: %2." msgstr "Fout bij opslaan %1: %2." #: eqonomize.cpp:3627 eqonomize.cpp:3653 eqonomize.cpp:3673 #, kde-format msgid "Couldn't save file" msgstr "Kan bestand niet opslaan" #: eqonomize.cpp:3673 eqonomize.cpp:4282 ledgerdialog.cpp:281 #: qifimportexport.cpp:634 #, kde-format msgid "Failed to upload file to %1." msgstr "Kan bestand niet uploaden naar %1." #: eqonomize.cpp:3703 eqonomize.cpp:3728 #, kde-format msgid "Report" msgstr "Rapportage" #: eqonomize.cpp:3758 eqonomize.cpp:3783 #, kde-format msgid "Chart" msgstr "Grafiek" #: eqonomize.cpp:3823 eqonomize.cpp:3829 #, kde-format msgid "Transaction Schedule" msgstr "Transactie Planning" #: eqonomize.cpp:3976 #, kde-format msgctxt "html format" msgid "Accounts & Categories" msgstr "Rekeningen & Categorieën" #: eqonomize.cpp:3981 #, kde-format msgctxt "html format" msgid "Accounts & Categories (%1–%2)" msgstr "Rekeningen & Categorieën (%1–%2)" #: eqonomize.cpp:3982 #, kde-format msgctxt "html format" msgid "Accounts & Categories (to %1)" msgstr "Rekeningen & Categorieën (naar %1)" #: eqonomize.cpp:3989 eqonomize.cpp:4049 eqonomize.cpp:4097 eqonomize.cpp:4142 #, kde-format msgid "Change" msgstr "" #: eqonomize.cpp:3993 ledgerdialog.cpp:140 #, kde-format msgid "Balance" msgstr "Balans" #: eqonomize.cpp:4047 eqonomize.cpp:4095 #, kde-format msgid "Budget" msgstr "Budget" #: eqonomize.cpp:4048 eqonomize.cpp:4096 #, kde-format msgid "Remaining Budget" msgstr "Resterend Budget" #: eqonomize.cpp:4050 #, kde-format msgid "Total Incomes" msgstr "Totale Inkomsten" #: eqonomize.cpp:4091 #, kde-format msgid "Costs" msgstr "Kosten" #: eqonomize.cpp:4098 #, kde-format msgid "Total Expenses" msgstr "Totale Uitgaven" #: eqonomize.cpp:4167 eqonomize.cpp:4214 #, kde-format msgid "Empty expenses list." msgstr "Lege uitgaven lijst." #: eqonomize.cpp:4172 eqonomize.cpp:4219 #, kde-format msgid "Empty incomes list." msgstr "Lege inkomsten lijst." #: eqonomize.cpp:4177 eqonomize.cpp:4224 #, kde-format msgid "Empty transfers list." msgstr "Lege transactie lijst." #: eqonomize.cpp:4182 eqonomize.cpp:4229 #, kde-format msgid "Empty securities list." msgstr "Lege waardepapieren lijst." #: eqonomize.cpp:4187 eqonomize.cpp:4234 #, kde-format msgid "Empty schedule list." msgstr "Lege Planning." #: eqonomize.cpp:4305 #, kde-format msgid "Export View..." msgstr "Exporteer Overzicht..." #: eqonomize.cpp:4307 #, kde-format msgid "Print View..." msgstr "Print Overzicht..." #: eqonomize.cpp:4309 #, kde-format msgid "Initial Period" msgstr "Start met periode" #: eqonomize.cpp:4316 #, kde-format msgid "Remember Last Dates" msgstr "Onthoud laatst gebuikte datums" #: eqonomize.cpp:4319 #, kde-format msgid "Import CSV File..." msgstr "Importeer CSV Bestand..." #: eqonomize.cpp:4320 #, kde-format msgid "Import QIF File..." msgstr "Importeer QIF Bestand..." #: eqonomize.cpp:4321 #, kde-format msgid "Export As QIF File..." msgstr "Exporteer Als QIF Bestand..." #: eqonomize.cpp:4323 #, kde-format msgid "Add Account..." msgstr "Rekening Toevoegen..." #: eqonomize.cpp:4324 #, kde-format msgid "New Account..." msgstr "Nieuwe Rekening..." #: eqonomize.cpp:4325 #, kde-format msgid "New Income Category..." msgstr "Nieuwe Inkomsten Categorie..." #: eqonomize.cpp:4326 #, kde-format msgid "New Expense Category..." msgstr "Nieuwe Uitgaven Categorie..." #: eqonomize.cpp:4327 #, kde-format msgid "Balance..." msgstr "Balans..." #: eqonomize.cpp:4331 #, kde-format msgid "Show Transactions" msgstr "Toon Transacties" #: eqonomize.cpp:4335 #, kde-format msgid "New Transfer..." msgstr "Nieuwe Overboeking:" #: eqonomize.cpp:4336 #, kde-format msgid "New Split Transaction..." msgstr "Nieuwe Gesplitste Transactie..." #: eqonomize.cpp:4337 #, kde-format msgid "Edit Transaction(s) (Occurrence)..." msgstr "Bewerk Transactie(s) (Gebeurtenis)..." #: eqonomize.cpp:4338 #, kde-format msgid "Edit Occurrence..." msgstr "Bewerk Herhaling..." #: eqonomize.cpp:4339 #, kde-format msgid "Edit Schedule (Recurrence)..." msgstr "Bewerk Planning (Herhaling)..." #: eqonomize.cpp:4340 #, kde-format msgid "Edit Schedule..." msgstr "Bewerk Planning..." #: eqonomize.cpp:4341 #, kde-format msgid "Remove Transaction(s) (Occurrence)" msgstr "Verwijder Transactie(s) (Gebeurtenis)" #: eqonomize.cpp:4342 #, kde-format msgid "Remove Occurrence" msgstr "Verwijder Herhaling" #: eqonomize.cpp:4343 #, kde-format msgid "Delete Schedule (Recurrence)" msgstr "Verwijder Planning (Herhaling)" #: eqonomize.cpp:4344 #, kde-format msgid "Delete Schedule" msgstr "Verwijder Planning" #: eqonomize.cpp:4345 #, kde-format msgid "Edit Split Transaction..." msgstr "Bewerk Gesplitste Transactie..." #: eqonomize.cpp:4346 #, kde-format msgid "Remove Split Transaction" msgstr "Verwijder Gesplitste Transactie" #: eqonomize.cpp:4347 #, kde-format msgid "Join Transactions..." msgstr "Transacties Samenvoegen..." #: eqonomize.cpp:4348 #, kde-format msgid "Split Up Transaction" msgstr "Splits Transacties" #: eqonomize.cpp:4350 #, kde-format msgid "Refund..." msgstr "Restitutie..." #: eqonomize.cpp:4351 #, kde-format msgid "Repayment..." msgstr "Terugbetaling..." #: eqonomize.cpp:4352 #, kde-format msgid "New Refund/Repayment..." msgstr "Nieuw Restitutie/Terugbetaling..." #: eqonomize.cpp:4355 #, kde-format msgid "Edit Security..." msgstr "Bewerk Waardepapier..." #: eqonomize.cpp:4356 #, kde-format msgid "Remove Security" msgstr "Verwijder Waardepapier" #: eqonomize.cpp:4357 #, kde-format msgid "Shares Sold..." msgstr "Aandelen Verkocht..." #: eqonomize.cpp:4358 #, kde-format msgid "Shares Bought..." msgstr "Aandelen Gekocht..." #: eqonomize.cpp:4359 #, kde-format msgid "Dividend..." msgstr "Dividend..." #: eqonomize.cpp:4360 #, kde-format msgid "Reinvested Dividend..." msgstr "Herinversteerd Dividend..." #: eqonomize.cpp:4361 #, kde-format msgid "Shares Moved..." msgstr "Aandelen Verplaatst..." #: eqonomize.cpp:4363 #, kde-format msgid "Edit Quotations..." msgstr "Bewerk noteringen..." #: eqonomize.cpp:4364 #, kde-format msgid "Transactions..." msgstr "Transacties..." #: eqonomize.cpp:4366 #, kde-format msgid "Development Over Time Report..." msgstr "Rapportage per periode..." #: eqonomize.cpp:4367 #, kde-format msgid "Categories Comparison Report..." msgstr "Rapportage per Categorie..." #: eqonomize.cpp:4368 #, kde-format msgid "Categories Comparison Chart..." msgstr "Grafiek per Categorie..." #: eqonomize.cpp:4369 #, kde-format msgid "Development Over Time Chart..." msgstr "Grafiek per periode..." #: eqonomize.cpp:4371 #, kde-format msgid "Use Additional Transaction Properties" msgstr "Extra transactie-eigenschappen gebruiken" #: eqonomize.cpp:4413 #, kde-format msgid "" "Eqonomize! exited unexpectedly before the file was saved and data was lost.\n" "Do you want to load the last auto-saved version of the file?" msgstr "" "Eqonomize! is onverwachts afgesloten voordat het bestand was opgelagen en " "gegevens zijn verloren.\n" "Wilt je de laaste automatisch opgelagen versie van het bestanden inladen?" #: eqonomize.cpp:4413 #, kde-format msgid "Crash Recovery" msgstr "Herstellen na vastlopen" #: eqonomize.cpp:4605 eqonomize.cpp:4606 #, kde-format msgid "The current file has been modified. Do you want to save it?" msgstr "Het huidige bestand is gewijzigd. Wilt u het bestand opslaan?" #: eqonomize.cpp:4643 #, kde-format msgid "Confirm Schedule" msgstr "Bevestig Planning" #: eqonomize.cpp:4697 #, kde-format msgid "New Account" msgstr "Nieuwe Rekening" #: eqonomize.cpp:4712 #, kde-format msgid "New Income Category" msgstr "Nieuwe Inkomsten Categorie" #: eqonomize.cpp:4725 #, kde-format msgid "New Expense Category" msgstr "Nieuwe Uitgaven Categorie" #: eqonomize.cpp:4800 #, kde-format msgid "Balance Account" msgstr "Balansrekening" #: eqonomize.cpp:4806 #, kde-format msgid "Book value:" msgstr "Boek waarde:" #: eqonomize.cpp:4813 #, kde-format msgid "Real value:" msgstr "Echte waarde:" #: eqonomize.cpp:4836 #, kde-format msgid "Edit Account" msgstr "Bewerk Rekening" #: eqonomize.cpp:4869 #, kde-format msgid "Edit Income Category" msgstr "Bewerk Inkomsten Categorie" #: eqonomize.cpp:4887 #, kde-format msgid "Edit Expense Category" msgstr "Bewerk Uitgaven Categorie" #: eqonomize.cpp:4948 #, kde-format msgid "Move transactions?" msgstr "Verplaats transactie?" #: eqonomize.cpp:4958 #, kde-format msgid "Move to:" msgstr "Verplaatsen naar:" #: eqonomize.cpp:4965 #, kde-format msgid "" "The category contains some expenses.\n" "What do you want to do with them?" msgstr "" "De categorie bevat enkele uitgaven.\n" "Wat wil je er mee doen?" #: eqonomize.cpp:4977 #, kde-format msgid "" "The category contains some incomes.\n" "What do you want to do with them?" msgstr "" "De categorie bevat enkele inkomsten.\n" "Wat wil je er mee doen?" #: eqonomize.cpp:4989 #, kde-format msgid "" "The account contains some transactions.\n" "What do you want to do with them?" msgstr "" "Het account bevat enkele transacties.\n" "Wat wil je er mee doen?" #: eqonomize.cpp:5011 #, kde-format msgid "" "The category contains some expenses that will be removed. Do you still want " "to remove the category?" msgstr "" "De categorie bevat enkele uitgaven die verwijderd zullen worden. Wil je nog " "steeds de categorie verwijderen?" #: eqonomize.cpp:5011 eqonomize.cpp:5012 #, kde-format msgid "Remove Category?" msgstr "Verwijder Categorie?" #: eqonomize.cpp:5012 #, kde-format msgid "" "The category contains some incomes that will be removed. Do you still want " "to remove the category?" msgstr "" "De categorie bevat enkele inkomsten die verwijderd zullen worden. Wil je nog " "steeds de categorie verwijderen?" #: eqonomize.cpp:5013 #, kde-format msgid "" "The account contains some transactions that will be removed. Do you still " "want to remove the account?" msgstr "" "De categorie bevat enkele transacties die verwijderd zullen worden. Wil je " "nog steeds de categorie verwijderen?" #: eqonomize.cpp:5013 #, kde-format msgid "Remove Account?" msgstr "Verwijder Account?" #: eqonomize.cpp:5531 eqonomize.cpp:5555 eqonomize.cpp:5730 #, kde-format msgctxt "%1: budget; %2: remaining budget" msgid "%2 of %1" msgstr "%2 van %1" #: eqonomize.cpp:5810 eqonomize.cpp:5835 #, kde-format msgid "%1 (with no budget)" msgstr "%1 (zonder budget)" #: eqonomize.cpp:5811 eqonomize.cpp:5836 #, kde-format msgid "%1 (with budget %2)" msgstr "%1 (met budget %2)" #: importcsvdialog.cpp:60 #, kde-format msgid "Import CSV file" msgstr "Importeer CSV bestand" #: importcsvdialog.cpp:64 #, kde-format msgid "Transaction Type Selection" msgstr "Selectie Transactiesoort" #: importcsvdialog.cpp:81 #, kde-format msgid "Expenses and incomes (negative cost)" msgstr "Uitgaven en inkomsten (negatieve kosten)" #: importcsvdialog.cpp:84 #, kde-format msgid "Expenses and incomes (separate columns)" msgstr "Uitgaven en inkomsten (afgezonderde kolommen)" #: importcsvdialog.cpp:87 #, kde-format msgid "All types" msgstr "Alle soorten" #: importcsvdialog.cpp:95 qifimportexport.cpp:62 #, kde-format msgid "File Selection" msgstr "Bestandselectie" #: importcsvdialog.cpp:99 qifimportexport.cpp:66 qifimportexport.cpp:548 #, kde-format msgid "File:" msgstr "Bestand:" #: importcsvdialog.cpp:104 #, kde-format msgid "First data row:" msgstr "Eerste gegevens rij:" #: importcsvdialog.cpp:107 #, kde-format msgid "Auto" msgstr "Automatisch" #: importcsvdialog.cpp:110 #, kde-format msgid "Column delimiter:" msgstr "Kolom scheiding:" #: importcsvdialog.cpp:113 #, kde-format msgid "Comma" msgstr "Komma" #: importcsvdialog.cpp:114 #, kde-format msgid "Tabulator" msgstr "Tabulator" #: importcsvdialog.cpp:115 #, kde-format msgid "Semicolon" msgstr "Puntkomma" #: importcsvdialog.cpp:116 #, kde-format msgid "Space" msgstr "Witruimte" #: importcsvdialog.cpp:125 #, kde-format msgid "Columns Specification" msgstr "Kolommen Specificatie" #: importcsvdialog.cpp:131 importcsvdialog.cpp:149 importcsvdialog.cpp:172 #: importcsvdialog.cpp:189 importcsvdialog.cpp:208 importcsvdialog.cpp:227 #: importcsvdialog.cpp:245 #, kde-format msgid "Column" msgstr "Kolom" #: importcsvdialog.cpp:205 importcsvdialog.cpp:356 importcsvdialog.cpp:365 #: importcsvdialog.cpp:387 importcsvdialog.cpp:398 #: transactioneditwidget.cpp:225 transactioneditwidget.cpp:267 #: transactioneditwidget.cpp:1130 transactionfilterwidget.cpp:102 #: transactionfilterwidget.cpp:113 #, kde-format msgid "Category:" msgstr "Categorie:" #: importcsvdialog.cpp:224 importcsvdialog.cpp:357 importcsvdialog.cpp:374 #: transactioneditwidget.cpp:248 transactioneditwidget.cpp:273 #: transactionfilterwidget.cpp:117 #, kde-format msgid "From account:" msgstr "Van rekening:" #: importcsvdialog.cpp:262 #, kde-format msgid "Create missing categories and accounts" msgstr "Maak ontbrekende categorieën en rekeningen" #: importcsvdialog.cpp:354 #, kde-format msgid "" "Imports data as expenses. Costs have positive value. Value is the only " "required column." msgstr "" "Importeer gegevens als uitgaven. Kosten hebben positieve waarde. Waarde is " "de enige vereiste kolom." #: importcsvdialog.cpp:363 #, kde-format msgid "Imports data as incomes. Value is the only required column." msgstr "Importeer gegevens als inkomsten. Waarde is de enige vereiste kolom." #: importcsvdialog.cpp:366 importcsvdialog.cpp:375 #: transactioneditwidget.cpp:231 transactioneditwidget.cpp:258 #: transactionfilterwidget.cpp:106 #, kde-format msgid "To account:" msgstr "Naar rekening:" #: importcsvdialog.cpp:372 #, kde-format msgid "Imports data as transfers. Value is the only required column." msgstr "" "Importeer gegevens als overboekingen. Waarde is de enige vereiste kolom." #: importcsvdialog.cpp:373 transactioneditwidget.cpp:182 #: transactioneditwidget.cpp:1109 #, kde-format msgid "Amount:" msgstr "Hoeveelheid:" #: importcsvdialog.cpp:381 #, kde-format msgid "" "Imports data as expenses and incomes. Costs have negative value. Value and " "category are both required columns." msgstr "" "Importeer gegevens als uitgaven en inkomsten. Kosten hebben negatieve " "waarde. Waarde en categorie zijn beide vereiste kolommen." #: importcsvdialog.cpp:392 #, kde-format msgid "" "Imports data as expenses and incomes. Costs and incomes have separate " "columns. Income, cost, and category are all required columns." msgstr "" "Importeer gegevens als uitgaven en inkomsten. Kosten en inkomsten hebben " "gescheiden kolommen. Inkomsten, kosten en categorie zijn alle vereiste " "kolommen." #: importcsvdialog.cpp:403 #, kde-format msgid "" "Imports data as expenses, incomes, and transfers. Costs have negative or " "positive value. Value, to, and from are all required columns. Accounts and " "categories must be existing." msgstr "" "Importeer gegevens als uitgaven, inkomsten en overboekingen. Kosten hebben " "negatieve of positieve waarde. Waarde, naar en van zijn alle vereiste " "kolommen. Rekeningen en categorieën moeten bestaan." #: importcsvdialog.cpp:413 transactioneditwidget.cpp:209 #: transactionfilterwidget.cpp:74 transactionfilterwidget.cpp:91 #, kde-format msgid "From:" msgstr "Van:" #: importcsvdialog.cpp:414 transactioneditwidget.cpp:216 #: transactionfilterwidget.cpp:81 transactionfilterwidget.cpp:95 #, kde-format msgid "To:" msgstr "Naar:" #: importcsvdialog.cpp:440 qifimportexport.cpp:258 #, kde-format msgid "A file must be selected." msgstr "Er moet een bestand gelecteerd zijn." #: importcsvdialog.cpp:446 importcsvdialog.cpp:458 qifimportexport.cpp:265 #: qifimportexport.cpp:595 #, kde-format msgid "Selected file is a directory." msgstr "Geselecteerd bestand is een directory." #: importcsvdialog.cpp:450 importcsvdialog.cpp:462 qifimportexport.cpp:269 #, kde-format msgid "Selected file does not exist." msgstr "Geselecteerd bestand bestaat niet." #: importcsvdialog.cpp:468 #, kde-format msgid "Empty delimiter." msgstr "Leeg scheidingsteken." #: importcsvdialog.cpp:712 #, kde-format msgid "The same column number is selected multiple times." msgstr "Hetzelfde kolomnummer is meerdere keren geselecteerd." #: importcsvdialog.cpp:772 #, kde-format msgid "Selected from account is the same as the to account." msgstr "Geselecteerde Van Rekening is hetzelfde als de Naar Rekening." #: importcsvdialog.cpp:803 qifimportexport.cpp:288 qifimportexport.cpp:452 #, kde-format msgid "Couldn't open %1 for reading." msgstr "Kan bestand %1 niet openen om te lezen." #: importcsvdialog.cpp:806 qifimportexport.cpp:291 qifimportexport.cpp:455 #, kde-format msgid "Error reading %1." msgstr "Fout bij lezen %1." #: importcsvdialog.cpp:1187 qifimportexport.cpp:462 #, kde-format msgid "Successfully imported 1 transaction." msgid_plural "Successfully imported %n transactions." msgstr[0] "Er is 1 transactie succesvol geïmporteerd." msgstr[1] "Er zijn %n transacties succesvol geïmporteerd." #: importcsvdialog.cpp:1189 #, kde-format msgid "Unable to import any transactions imported." msgstr "Het importeren van transacties is niet gelukt." #: importcsvdialog.cpp:1193 #, kde-format msgid "Failed to import 1 data row." msgid_plural "Failed to import %n data rows." msgstr[0] "Het importeren van 1 rij met gegevens is niet gelukt." msgstr[1] "Het importeren van %n rijen met gegevens is niet gelukt." #: importcsvdialog.cpp:1194 #, kde-format msgid "Required columns missing." msgstr "Benodigde kolommen ontbreken." #: importcsvdialog.cpp:1195 #, kde-format msgid "Invalid value." msgstr "Ongeldige waarde." #: importcsvdialog.cpp:1197 #, kde-format msgid "Empty category name." msgstr "De naam van een categorie is leeg." #: importcsvdialog.cpp:1197 importcsvdialog.cpp:1198 #, kde-format msgid "Empty account name." msgstr "De naam van een rekening is leeg." #: importcsvdialog.cpp:1199 #, kde-format msgid "Unknown category found." msgstr "Onbekende catagorie gevonden." #: importcsvdialog.cpp:1199 importcsvdialog.cpp:1200 #, kde-format msgid "Unknown account found." msgstr "Er is een onbekende rekening aangetroffen." #: importcsvdialog.cpp:1201 #, kde-format msgid "Cannot import security transactions (to/from security accounts)." msgstr "" #: importcsvdialog.cpp:1202 #, kde-format msgid "Balancing account wrongly used." msgstr "Balansrekening verkeerd gebuikt." #: importcsvdialog.cpp:1203 #, kde-format msgid "Same to and from account/category." msgstr "Rekening/Categorie van en naar zijn hetzelfde." #: importcsvdialog.cpp:1205 #, kde-format msgid "No data found." msgstr "Geen gegevens gevonden." #: importcsvdialog.cpp:1219 qifimportexport.cpp:345 #, kde-format msgid "Unrecognized date format." msgstr "Onherkenbare datumnotatie." #: importcsvdialog.cpp:1224 #, kde-format msgid "Specify Format" msgstr "Geef notatie aan" #: importcsvdialog.cpp:1230 #, kde-format msgid "" "The format of dates and/or numbers in the CSV file is ambiguous. Please " "select the correct format." msgstr "" "De notatie van datums en/of getallen in het CSV-bestand is niet eenduidig. " "Kies a.u.b. de juiste notatie." #: importcsvdialog.cpp:1235 qifimportexport.cpp:94 qifimportexport.cpp:533 #, kde-format msgid "Date format:" msgstr "Datumnotatie:" #: importcsvdialog.cpp:1278 qifimportexport.cpp:541 #, kde-format msgid "Value format:" msgstr "Notatie van waarde:" #: kdateedit.cpp:366 #, fuzzy, kde-format msgctxt "the day after today" msgid "tomorrow" msgstr "morgen" #: kdateedit.cpp:367 #, fuzzy, kde-format msgctxt "this day" msgid "today" msgstr "vandaag" #: kdateedit.cpp:368 #, fuzzy, kde-format msgctxt "the day before today" msgid "yesterday" msgstr "gisteren" #: kdatepickerpopup.cpp:94 #, fuzzy, kde-format msgctxt "@option today" msgid "&Today" msgstr "vandaag" #: kdatepickerpopup.cpp:95 #, fuzzy, kde-format msgctxt "@option tomorrow" msgid "To&morrow" msgstr "morgen" #: kdatepickerpopup.cpp:96 #, kde-format msgctxt "@option next week" msgid "Next &Week" msgstr "" #: kdatepickerpopup.cpp:97 #, fuzzy, kde-format msgctxt "@option next month" msgid "Next M&onth" msgstr "Huidige Maand" #: kdatepickerpopup.cpp:105 #, fuzzy, kde-format msgctxt "@option do not specify a date" msgid "No Date" msgstr "Datum" #: ledgerdialog.cpp:122 #, kde-format msgid "Export..." msgstr "Exporteren..." #: ledgerdialog.cpp:123 #, kde-format msgid "Print..." msgstr "Afdrukken…" #: ledgerdialog.cpp:139 #, kde-format msgid "Withdrawal" msgstr "Opname" #: ledgerdialog.cpp:162 #, kde-format msgid "Join..." msgstr "Samenvoegen..." #: ledgerdialog.cpp:164 #, kde-format msgid "Split Up" msgstr "Splitsen" #: ledgerdialog.cpp:234 ledgerdialog.cpp:354 #, kde-format msgid "Empty transaction list." msgstr "Lege transactielijst." #: ledgerdialog.cpp:443 transactionlistwidget.cpp:717 #, kde-format msgid "Are you sure you want to delete all (%1) selected transactions?" msgstr "Wilt u alle (%1) geselecteerde transacties verwijderen?" #: ledgerdialog.cpp:547 transactionlistwidget.cpp:489 #, kde-format msgid "" "Cannot set the value of security transactions using the dialog for modifying " "multiple transactions." msgstr "" "Met het scherm voor het wijzigen van meerdere transacties kunt u de waarde " "van beleggingstransacties niet instellen." #: ledgerdialog.cpp:553 transactionlistwidget.cpp:495 #, kde-format msgid "Cannot change description of dividends and security transactions." msgstr "" "Kan de omschrijving van dividenden en effectentransacties niet wijzigen." #: ledgerdialog.cpp:559 transactionlistwidget.cpp:501 #, kde-format msgid "Cannot change payer of dividends and security transactions." msgstr "Kan de debiteur van dividenden en effectentransacties niet wijzigen." #: ledgerdialog.cpp:565 transactionlistwidget.cpp:507 #, kde-format msgid "" "Cannot change date of transactions that are part of a split transaction." msgstr "" "Kan de datum van transacties die deel zijn van een gesplitste transactie " "niet wijzigen." #: main.cpp:39 msgid "Eqonomize!" msgstr "Eqonomize!" #: main.cpp:39 msgid "A personal accounting program" msgstr "" #: main.cpp:39 msgid "(C) 2008 Hanna K." msgstr "" #: main.cpp:40 msgid "Hanna K." msgstr "" #: main.cpp:44 msgid "Start with expenses list displayed" msgstr "Startweergave met de lijst van uitgaven" #: main.cpp:46 msgid "Start with incomes list displayed" msgstr "Startweergave met de lijst van inkomsten" #: main.cpp:48 msgid "Start with transfers list displayed" msgstr "Startweergave met de lijst van overboekingen" #: main.cpp:49 msgid "Document to open" msgstr "Document om te openen" #: overtimechart.cpp:124 overtimechart.cpp.bak:117 #, kde-format msgid "Incomes and Expenses" msgstr "Inkomsten en Uitgaven" #: overtimechart.cpp:125 overtimechart.cpp:1722 overtimechart.cpp.bak:118 #: overtimechart.cpp.bak:1703 overtimereport.cpp:102 overtimereport.cpp:343 #, kde-format msgid "Profits" msgstr "Winsten" #: overtimechart.cpp:132 overtimechart.cpp:411 overtimechart.cpp:1949 #: overtimechart.cpp.bak:125 overtimechart.cpp.bak:404 #: overtimechart.cpp.bak:1950 overtimereport.cpp:108 overtimereport.cpp:228 #: overtimereport.cpp:753 #, kde-format msgid "All Categories Combined" msgstr "Alle categorieën gecombineerd" #: overtimechart.cpp:138 overtimechart.cpp:296 overtimechart.cpp:400 #: overtimechart.cpp:1852 overtimechart.cpp:1973 overtimechart.cpp.bak:131 #: overtimechart.cpp.bak:289 overtimechart.cpp.bak:393 #: overtimechart.cpp.bak:1853 overtimechart.cpp.bak:1974 #: overtimereport.cpp:113 overtimereport.cpp:176 overtimereport.cpp:225 #: overtimereport.cpp:710 overtimereport.cpp:776 #, kde-format msgid "All Descriptions Combined" msgstr "Alle omschrijvingen gecombineerd" #: overtimechart.cpp:146 overtimechart.cpp:406 overtimechart.cpp.bak:139 #: overtimechart.cpp.bak:399 #, kde-format msgid "All Payees/Payers Combined" msgstr "Alle debiteuren/crediteuren gecombineerd" #: overtimechart.cpp:155 overtimechart.cpp.bak:148 #, kde-format msgid "Start date:" msgstr "Begindatum:" #: overtimechart.cpp:178 overtimechart.cpp.bak:171 #, kde-format msgid "End date:" msgstr "Einddatum:" #: overtimechart.cpp:197 overtimechart.cpp.bak:190 #, kde-format msgid "Monthly total" msgstr "Totaal per maand" #: overtimechart.cpp:201 overtimechart.cpp.bak:194 #, kde-format msgid "Daily average" msgstr "Gemiddeld per dag" #: overtimechart.cpp:304 overtimechart.cpp:404 overtimechart.cpp:1855 #: overtimechart.cpp:1978 overtimechart.cpp.bak:297 overtimechart.cpp.bak:397 #: overtimechart.cpp.bak:1856 overtimechart.cpp.bak:1979 #, kde-format msgid "All Payers Combined" msgstr "Alle debiteuren gecombineerd" #: overtimechart.cpp:305 overtimechart.cpp:405 overtimechart.cpp:1856 #: overtimechart.cpp:1977 overtimechart.cpp.bak:298 overtimechart.cpp.bak:398 #: overtimechart.cpp.bak:1857 overtimechart.cpp.bak:1978 #, kde-format msgid "All Payees Combined" msgstr "Alle crediteuren gecombineerd" #: overtimechart.cpp:325 overtimechart.cpp:1853 overtimechart.cpp.bak:318 #: overtimechart.cpp.bak:1854 #, kde-format msgid "All Descriptions Split" msgstr "Alle omschrijvingen apart" #: overtimechart.cpp:328 overtimechart.cpp:1857 overtimechart.cpp.bak:321 #: overtimechart.cpp.bak:1858 #, kde-format msgid "All Payers Split" msgstr "Alle debiteuren apart" #: overtimechart.cpp:329 overtimechart.cpp:1858 overtimechart.cpp.bak:322 #: overtimechart.cpp.bak:1859 #, kde-format msgid "All Payees Split" msgstr "Alle crediteuren apart" #: overtimechart.cpp:413 overtimechart.cpp:423 overtimechart.cpp:1950 #: overtimechart.cpp.bak:406 overtimechart.cpp.bak:416 #: overtimechart.cpp.bak:1951 #, kde-format msgid "All Categories Split" msgstr "Alle categorieën apart" #: overtimechart.cpp:1535 overtimechart.cpp.bak:1516 #, kde-format msgid "Value (%1)" msgstr "Waarde (%1)" #: overtimechart.cpp:1536 overtimechart.cpp.bak:1517 #, kde-format msgid "Profit (%1)" msgstr "Winst (%1)" #: overtimechart.cpp:1537 overtimechart.cpp.bak:1518 #, kde-format msgid "Income (%1)" msgstr "Inkomsten (%1)" #: overtimechart.cpp:1538 overtimechart.cpp.bak:1519 #, kde-format msgid "Cost (%1)" msgstr "Uitgaven (%1)" #: overtimechart.cpp:1579 overtimechart.cpp.bak:1560 #, kde-format msgid "Time" msgstr "Tijd" #: overtimechart.cpp:1774 overtimechart.cpp:1775 overtimechart.cpp.bak:1755 #: overtimechart.cpp.bak:1756 #, kde-format msgid "no payer" msgstr "geen debiteur" #: overtimechart.cpp:1778 overtimechart.cpp.bak:1759 #, kde-format msgctxt "%1: Description; %2: Payer" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp:1783 overtimechart.cpp:1784 overtimechart.cpp.bak:1764 #: overtimechart.cpp.bak:1765 #, kde-format msgid "no payee" msgstr "geen crediteur" #: overtimechart.cpp:1787 overtimechart.cpp.bak:1768 #, kde-format msgctxt "%1: Description; %2: Payee" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp.bak:649 #, kde-format msgid "Error after saving file; data may not have been saved." msgstr "" "Fout na het opslaan van het bestand; gegevens zijn mogelijk niet opgeslagen." #: overtimereport.cpp:344 #, kde-format msgid "Average Profit" msgstr "Gemiddelde winst" #: overtimereport.cpp:537 #, kde-format msgid "Year" msgstr "Jaar" #: overtimereport.cpp:538 #, kde-format msgid "Month" msgstr "Maand" #: overtimereport.cpp:566 #, kde-format msgid "Includes scheduled transactions" msgstr "Inclusief geplande transacties" #: overtimereport.cpp:570 #, kde-format msgid "Adjusted for the average month / year (%1 / %2 days)" msgstr "Aangepast voor de gemiddelde maand / jaar (%1 / %2 dagen)" #: overtimereport.cpp:603 overtimereport.cpp:671 #, kde-format msgid "Subtotal" msgstr "Subtotaal" #: qifimport.cpp:307 qifimport.cpp:367 qifimportexport.cpp:1259 #: qifimportexport.cpp:1350 qifimportexport.cpp:1470 #, kde-format msgid "Unnamed" msgstr "Onbenoemd" #: qifimport.cpp:337 qifimportexport.cpp:1299 qifimportexport.cpp:1413 #, kde-format msgid "Uncategorized" msgstr "Zonder categorie" #: qifimportexport.cpp:56 #, kde-format msgid "Import QIF file" msgstr "Importeer QIF-bestand" #: qifimportexport.cpp:63 #, kde-format msgid "" "Select a QIF file to import. When you click next, the file be analysed and " "you might need to answer some questions about the format of the file." msgstr "" "Kies een QIF-bestand om te importeren. Wanneer u op Volgende klikt, zal het " "bestand geanaliseerd worden, en zult u eventueel nog enkele vragen over de " "indeling van het bestand moeten beantwoorden." #: qifimportexport.cpp:73 #, kde-format msgid "Local Definitions" msgstr "" #: qifimportexport.cpp:74 #, kde-format msgid "" "Unknown elements where found in the QIF file. It is possible that this is " "because of localized type names. Please map them to the correct standard " "names." msgstr "" "Er zijn onbekende elementen aangetroffen in het QIF-bestand. Mogelijk komt " "dit door gelokaliseerde type-namen. Geef alstublieft de juiste vertalingen " "naar standaardnamen aan." #: qifimportexport.cpp:80 #, kde-format msgid "Local Text" msgstr "" #: qifimportexport.cpp:81 #, kde-format msgid "Standard Text" msgstr "Standaardtekst" #: qifimportexport.cpp:84 #, kde-format msgid "Select standard text:" msgstr "Selecteer standaardtekst" #: qifimportexport.cpp:90 #, kde-format msgid "Date Format" msgstr "Datumnotatie" #: qifimportexport.cpp:91 #, kde-format msgid "" "The date format in the QIF file is ambiguous. Please select the correct " "format." msgstr "" "De datumnotatie in het QIF-bestand is niet eenduidig. Kies a.u.b. de juiste " "notatie." #: qifimportexport.cpp:100 #, kde-format msgid "Default Account" msgstr "" #: qifimportexport.cpp:101 #, kde-format msgid "" "Could not find any account definitions in the QIF file. Please select a " "default account. It is also possible that this is caused by a localized " "opening balance text." msgstr "" "Er zijn geen rekeningdefinities in het QIF-bestand aangetroffen. U kunt een " "terugval-rekening kiezen. Het is ook mogelijk dat dit probleem het gevolg is " "van een gelokaliseerde openingsbalanstekst." #: qifimportexport.cpp:104 #, kde-format msgid "Default account:" msgstr "Standaard account:" #: qifimportexport.cpp:115 #, kde-format msgid "Opening balance text:" msgstr "Openingsbalanstekst:" #: qifimportexport.cpp:121 #, kde-format msgid "Descriptions" msgstr "Omschrijvingen" #: qifimportexport.cpp:122 #, kde-format msgid "" "Transactions in QIF files does not have any specific description property. " "You are therefore given the option to choose how the description of imported " "transactions will be set." msgstr "" #: qifimportexport.cpp:125 #, kde-format msgid "Subcategories as:" msgstr "Subcategorieën als:" #: qifimportexport.cpp:134 #, kde-format msgid "Ignore" msgstr "Negeer" #: qifimportexport.cpp:137 #, kde-format msgid "Payee as:" msgstr "Crediteur als:" #: qifimportexport.cpp:142 qifimportexport.cpp:520 #: transactionlistwidget.cpp:119 #, kde-format msgid "Payee" msgstr "Crediteur" #: qifimportexport.cpp:147 #, kde-format msgid "Memo as:" msgstr "Notitie als:" #: qifimportexport.cpp:156 #, kde-format msgid "Priority:" msgstr "Prioriteit:" #: qifimportexport.cpp:159 #, kde-format msgid "Subcategory/Payee/Comments" msgstr "Subcategorie/Crediteur/Opmerkingen" #: qifimportexport.cpp:160 #, kde-format msgid "Payee/Subcategory/Comments" msgstr "Crediteur/Subcategorie/Opmerkingen" #: qifimportexport.cpp:161 #, kde-format msgid "Subcategory/Comments/Payee" msgstr "Subcategorie/Opmerkingen/Crediteur" #: qifimportexport.cpp:162 #, kde-format msgid "Payee/Comments/Subcategory" msgstr "Crediteur/Opmerkingen/Subcategorie" #: qifimportexport.cpp:163 #, kde-format msgid "Comments/Subcategory/Payee" msgstr "Opmerkingen/Subcategorie/Crediteur" #: qifimportexport.cpp:164 #, kde-format msgid "Comments/Payee/Subcategory" msgstr "Opmerkingen/Crediteur/Subcategorie" #: qifimportexport.cpp:314 qifimportexport.cpp:322 qifimportexport.cpp:338 #, kde-format msgid "Unknown" msgstr "Onbekend" #: qifimportexport.cpp:324 #, kde-format msgid "Bank" msgstr "Bank" #: qifimportexport.cpp:326 #, kde-format msgid "Cat (Category)" msgstr "Cat (Categorie)" #: qifimportexport.cpp:327 #, kde-format msgid "CCard (Credit Card)" msgstr "CCard (Creditcard)" #: qifimportexport.cpp:328 #, kde-format msgid "Invst (Investment)" msgstr "Invst (Investering)" #: qifimportexport.cpp:329 #, kde-format msgid "Oth A (Other Assets)" msgstr "Oth A (Overige Activa)" #: qifimportexport.cpp:330 #, kde-format msgid "Oth L (Other Liabilities)" msgstr "Oth L (Overige Passiva)" #: qifimportexport.cpp:331 #, kde-format msgid "Security" msgstr "Beveiliging" #: qifimportexport.cpp:465 #, kde-format msgid "Successfully imported 1 account." msgid_plural "Successfully imported %n accounts." msgstr[0] "Er is 1 rekening succesvol geïmporteerd." msgstr[1] "Er zijn %n rekeningen succesvol geïmporteerd." #: qifimportexport.cpp:469 #, kde-format msgid "Successfully imported 1 category." msgid_plural "Successfully imported %n categories." msgstr[0] "Er is 1 categorie succesvol geïmporteerd." msgstr[1] "Er zijn %n categorieën succesvol geïmporteerd." #: qifimportexport.cpp:473 #, kde-format msgid "1 duplicate transaction was ignored." msgid_plural "%n duplicate transactions was ignored." msgstr[0] "Er is 1 duplicaat-transactie overgeslagen." msgstr[1] "Er zijn %n duplicaat-transacties overgeslagen." #: qifimportexport.cpp:477 #, kde-format msgid "Failed to import 1 transaction." msgid_plural "Failed to import %n transactions." msgstr[0] "Het importeren van 1 transactie is mislukt." msgstr[1] "Het importeren van %n transactie is mislukt." #: qifimportexport.cpp:481 #, kde-format msgid "1 security was not imported." msgid_plural "%n securities were not imported." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:485 #, kde-format msgid "1 security transaction was not imported." msgid_plural "%n security transactions were not imported." msgstr[0] "Er is 1 effectentransactie niet geïmporteerd." msgstr[1] "Er zijn %n effectentransacties niet geïmporteerd." #: qifimportexport.cpp:494 #, kde-format msgid "Export QIF File" msgstr "QIF-bestand exporteren" #: qifimportexport.cpp:506 #, kde-format msgctxt "All accounts" msgid "All" msgstr "Alle" #: qifimportexport.cpp:517 #, kde-format msgid "Export transaction description as:" msgstr "Exporteer transactiebeschrijving als:" #: qifimportexport.cpp:524 #, kde-format msgid "Memo" msgstr "Memo" #: qifimportexport.cpp:528 #, kde-format msgid "Subcategory" msgstr "Subcategorie" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 5 #: rc.cpp:3 #, kde-format msgid "&Import" msgstr "&Importeer" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 12 #: rc.cpp:6 #, kde-format msgid "&Accounts" msgstr "&Rekeningen" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 24 #: rc.cpp:9 #, kde-format msgid "&Transactions" msgstr "&Transacties" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 41 #: rc.cpp:12 #, kde-format msgid "&Securities" msgstr "&Effecten" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 56 #: rc.cpp:15 #, kde-format msgid "Stat&istics" msgstr "&Overzichten" #: rc.cpp:16 #, kde-format msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr ",Launchpad Contributions:,Bert van der Perk,Vis,afiege" #: rc.cpp:17 #, kde-format msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr ",,,m.b.vis@spronvis.nl," #: recurrenceeditwidget.cpp:69 #, kde-format msgid "Edit Exceptions" msgstr "Uitzonderingen bewerken" #: recurrenceeditwidget.cpp:186 #, kde-format msgid "Edit Recurrence Range" msgstr "Periode van herhaling bewerken" #: recurrenceeditwidget.cpp:194 recurrenceeditwidget.cpp:229 #, kde-format msgid "Begins on: %1" msgstr "Begint op: %1" #: recurrenceeditwidget.cpp:199 #, kde-format msgid "No ending date" msgstr "Geen einddatum" #: recurrenceeditwidget.cpp:203 #, kde-format msgid "End after" msgstr "Eindigt na" #: recurrenceeditwidget.cpp:209 #, kde-format msgid "occurrence(s)" msgstr "herhaling(en)" #: recurrenceeditwidget.cpp:211 #, kde-format msgid "End on" msgstr "Eindigt op" #: recurrenceeditwidget.cpp:298 #, kde-format msgid "End date before start date." msgstr "Einddatum is eerder dan begindatum." #: recurrenceeditwidget.cpp:312 #, kde-format msgid "Enable recurrance" msgstr "Herhaal deze transactie" #: recurrenceeditwidget.cpp:315 #, kde-format msgid "Recurrence Rule" msgstr "Herhalingsregel" #: recurrenceeditwidget.cpp:321 #, kde-format msgid "Weekly" msgstr "Wekelijks" #: recurrenceeditwidget.cpp:341 recurrenceeditwidget.cpp:352 #: recurrenceeditwidget.cpp:376 recurrenceeditwidget.cpp:462 #, kde-format msgid "Recur every" msgstr "Herhaal elke" #: recurrenceeditwidget.cpp:345 #, kde-format msgid "day(s)" msgstr "dag(en)" #: recurrenceeditwidget.cpp:356 #, kde-format msgid "week(s) on:" msgstr "week/weken op:" #: recurrenceeditwidget.cpp:380 #, kde-format msgid "month(s), after the start month" msgstr "maand(en), na de beginmaand" #: recurrenceeditwidget.cpp:385 recurrenceeditwidget.cpp:437 #, kde-format msgid "Recur on the" msgstr "Herhaal op de" #: recurrenceeditwidget.cpp:391 recurrenceeditwidget.cpp:442 #: recurrenceeditwidget.cpp:494 #, kde-format msgid "1st" msgstr "1ste" #: recurrenceeditwidget.cpp:392 recurrenceeditwidget.cpp:443 #: recurrenceeditwidget.cpp:495 #, kde-format msgid "2nd" msgstr "2de" #: recurrenceeditwidget.cpp:393 recurrenceeditwidget.cpp:444 #: recurrenceeditwidget.cpp:496 #, kde-format msgid "3rd" msgstr "3de" #: recurrenceeditwidget.cpp:394 recurrenceeditwidget.cpp:445 #: recurrenceeditwidget.cpp:497 #, kde-format msgid "4th" msgstr "4de" #: recurrenceeditwidget.cpp:395 recurrenceeditwidget.cpp:446 #: recurrenceeditwidget.cpp:498 #, kde-format msgid "5th" msgstr "5de" #: recurrenceeditwidget.cpp:396 #, kde-format msgid "6th" msgstr "6de" #: recurrenceeditwidget.cpp:397 #, kde-format msgid "7th" msgstr "7de" #: recurrenceeditwidget.cpp:398 #, kde-format msgid "8th" msgstr "8ste" #: recurrenceeditwidget.cpp:399 #, kde-format msgid "9th" msgstr "9de" #: recurrenceeditwidget.cpp:400 #, kde-format msgid "10th" msgstr "10de" #: recurrenceeditwidget.cpp:401 #, kde-format msgid "11th" msgstr "11de" #: recurrenceeditwidget.cpp:402 #, kde-format msgid "12th" msgstr "12de" #: recurrenceeditwidget.cpp:403 #, kde-format msgid "13th" msgstr "13de" #: recurrenceeditwidget.cpp:404 #, kde-format msgid "14th" msgstr "14de" #: recurrenceeditwidget.cpp:405 #, kde-format msgid "15th" msgstr "15de" #: recurrenceeditwidget.cpp:406 #, kde-format msgid "16th" msgstr "16de" #: recurrenceeditwidget.cpp:407 #, kde-format msgid "17th" msgstr "17de" #: recurrenceeditwidget.cpp:408 #, kde-format msgid "18th" msgstr "18de" #: recurrenceeditwidget.cpp:409 #, kde-format msgid "19th" msgstr "19de" #: recurrenceeditwidget.cpp:410 #, kde-format msgid "20th" msgstr "20ste" #: recurrenceeditwidget.cpp:411 #, kde-format msgid "21st" msgstr "21ste" #: recurrenceeditwidget.cpp:412 #, kde-format msgid "22nd" msgstr "22ste" #: recurrenceeditwidget.cpp:413 #, kde-format msgid "23rd" msgstr "23ste" #: recurrenceeditwidget.cpp:414 #, kde-format msgid "24th" msgstr "24ste" #: recurrenceeditwidget.cpp:415 #, kde-format msgid "25th" msgstr "25ste" #: recurrenceeditwidget.cpp:416 #, kde-format msgid "26th" msgstr "26ste" #: recurrenceeditwidget.cpp:417 #, kde-format msgid "27th" msgstr "27ste" #: recurrenceeditwidget.cpp:418 #, kde-format msgid "28th" msgstr "28ste" #: recurrenceeditwidget.cpp:419 #, kde-format msgid "29th" msgstr "29ste" #: recurrenceeditwidget.cpp:420 #, kde-format msgid "30th" msgstr "30ste" #: recurrenceeditwidget.cpp:421 #, kde-format msgid "31st" msgstr "31ste" #: recurrenceeditwidget.cpp:422 recurrenceeditwidget.cpp:447 #: recurrenceeditwidget.cpp:499 #, kde-format msgid "Last" msgstr "Laatste" #: recurrenceeditwidget.cpp:423 recurrenceeditwidget.cpp:448 #: recurrenceeditwidget.cpp:500 #, kde-format msgid "2nd Last" msgstr "Voorlaatste" #: recurrenceeditwidget.cpp:424 recurrenceeditwidget.cpp:449 #: recurrenceeditwidget.cpp:501 #, kde-format msgid "3rd Last" msgstr "Op 2 na laatste" #: recurrenceeditwidget.cpp:425 recurrenceeditwidget.cpp:450 #: recurrenceeditwidget.cpp:502 #, kde-format msgid "4th Last" msgstr "Op 3 na laatste" #: recurrenceeditwidget.cpp:426 recurrenceeditwidget.cpp:451 #: recurrenceeditwidget.cpp:503 #, kde-format msgid "5th Last" msgstr "Op 4 na laatste" #: recurrenceeditwidget.cpp:429 #, kde-format msgid "day" msgstr "dag" #: recurrenceeditwidget.cpp:431 recurrenceeditwidget.cpp:483 #: recurrenceeditwidget.cpp:521 #, kde-format msgid "possibly on weekend" msgstr "mogelijk in het weekeinde" #: recurrenceeditwidget.cpp:432 recurrenceeditwidget.cpp:484 #: recurrenceeditwidget.cpp:522 #, kde-format msgid "but before weekend" msgstr "maar voor het weekeinde" #: recurrenceeditwidget.cpp:433 recurrenceeditwidget.cpp:485 #: recurrenceeditwidget.cpp:523 #, kde-format msgid "but after weekend" msgstr "maar na het weekeinde" #: recurrenceeditwidget.cpp:466 #, kde-format msgid "year(s), after the start year" msgstr "jaar/jaren, na het beginjaar" #: recurrenceeditwidget.cpp:471 #, kde-format msgctxt "part before XXX of 'Recur on day XXX of month YYY'" msgid "Recur on day" msgstr "Herhaal op dag" #: recurrenceeditwidget.cpp:479 #, kde-format msgctxt "part between XXX and YYY of 'Recur on day XXX of month YYY'" msgid "of" msgstr "van maand" #: recurrenceeditwidget.cpp:489 #, kde-format msgctxt "Part before NNN in 'Recur on the NNN. WEEKDAY of MONTH'" msgid "On the" msgstr "Herhaal op de" #: recurrenceeditwidget.cpp:507 #, kde-format msgctxt "part between WEEKDAY and MONTH in 'Recur on NNN. WEEKDAY of MONTH'" msgid "of" msgstr "van" #: recurrenceeditwidget.cpp:512 #, kde-format msgid "Recur on day #" msgstr "Herhaal op dag" #: recurrenceeditwidget.cpp:519 #, kde-format msgctxt "part after NNN of 'Recur on day #NNN of the year'" msgid " of the year" msgstr " van het jaar" #: recurrenceeditwidget.cpp:533 #, kde-format msgid "Range..." msgstr "Geldigheidsperiode..." #: recurrenceeditwidget.cpp:535 #, kde-format msgid "Exceptions..." msgstr "Uitzonderingen..." #: recurrenceeditwidget.cpp:731 #, kde-format msgid "No day of week selected for weekly recurrence." msgstr "Geen dag van de week gekozen bij wekelijkse herhaling." #: recurrenceeditwidget.cpp:745 recurrenceeditwidget.cpp:774 #: recurrenceeditwidget.cpp:791 #, kde-format msgid "Selected day will never occur with selected frequency and start date." msgstr "" "De gekozen dag zal nooit voorkomen bij de gekozen frekwentie en begindatum." #: recurrenceeditwidget.cpp:761 #, kde-format msgid "Selected day does not exist in selected month." msgstr "De gekozen dag bestaat niet in de gekozen maand." #: transaction.cpp:155 transaction.cpp:186 #, kde-format msgid "Dividend: %1" msgstr "Dividend: %1" #: transaction.cpp:253 transaction.cpp:256 transaction.cpp:284 #, kde-format msgid "Account balancing" msgstr "" #: transaction.cpp:337 transaction.cpp:352 #, kde-format msgid "Security: %1 (bought)" msgstr "" #: transaction.cpp:375 transaction.cpp:390 #, kde-format msgid "Security: %1 (sold)" msgstr "" #: transactioneditwidget.cpp:125 #, kde-format msgid "Shares bought:" msgstr "Aandelen gekocht:" #: transactioneditwidget.cpp:130 #, kde-format msgid "Shares sold:" msgstr "Aandelen verkocht:" #: transactioneditwidget.cpp:238 transactioneditwidget.cpp:1144 #: transactionfilterwidget.cpp:140 #, kde-format msgid "Payer:" msgstr "Debiteur:" #: transactioneditwidget.cpp:280 transactioneditwidget.cpp:1145 #: transactionfilterwidget.cpp:141 #, kde-format msgid "Payee:" msgstr "Crediteur:" #: transactioneditwidget.cpp:664 transactioneditwidget.cpp:1262 #, kde-format msgid "No income category available." msgstr "Geen beschikbare inkomenscategorie." #: transactioneditwidget.cpp:689 transactioneditwidget.cpp:1270 #, kde-format msgid "No expense category available." msgstr "Geen beschikbare uitgavencategorie." #: transactioneditwidget.cpp:720 #, kde-format msgid "Cannot create a regular transfer to/from a securities account." msgstr "" "Van of naar een effectenrekening kan geen gewone overboeking worden " "ingevoerd." #: transactioneditwidget.cpp:727 #, kde-format msgid "Cannot create a regular income to a securities account." msgstr "Naar een effectenrekening kan geen gewoon inkomen worden geboekt." #: transactioneditwidget.cpp:743 #, kde-format msgid "Zero price per share not allowed." msgstr "Het is niet toegestaan om een prijs per aandeel van nul in te voeren." #: transactioneditwidget.cpp:755 #, kde-format msgid "Cannot create a regular expense from a securities account." msgstr "Van een effectenrekening kan geen gewone uitgave worden geboekt." #: transactioneditwidget.cpp:1086 #, kde-format msgid "Modify Transactions" msgstr "Transacties Bewerken" #: transactionfilterwidget.cpp:99 #, kde-format msgid "Min amount:" msgstr "Minimum bedrag:" #: transactionfilterwidget.cpp:100 #, kde-format msgid "Max amount:" msgstr "Maximum bedrag:" #: transactionfilterwidget.cpp:110 #, kde-format msgid "Min income:" msgstr "Minimum inkomen:" #: transactionfilterwidget.cpp:111 #, kde-format msgid "Max income:" msgstr "Maximum inkomen:" #: transactionfilterwidget.cpp:121 #, kde-format msgid "Min cost:" msgstr "Minimum kosten:" #: transactionfilterwidget.cpp:122 #, kde-format msgid "Max cost:" msgstr "Maximum kosten:" #: transactionfilterwidget.cpp:148 #, kde-format msgid "Include" msgstr "Tonen" #: transactionfilterwidget.cpp:152 #, kde-format msgid "Exclude" msgstr "Niet tonen" #: transactionlistwidget.cpp:117 #, kde-format msgid "From Account" msgstr "Van Rekening" #: transactionlistwidget.cpp:128 #, kde-format msgid "To Account" msgstr "Naar Rekening" #: transactionlistwidget.cpp:130 #, kde-format msgid "Payer" msgstr "Debiteur" #: transactionlistwidget.cpp:169 #, kde-format msgid "New/Edit Expense" msgstr "Uitgave toevoegen/bewerken" #: transactionlistwidget.cpp:170 #, kde-format msgid "Filter" msgstr "Filteren" #: transactionlistwidget.cpp:209 #, kde-format msgid "Total:" msgstr "Totaal:" #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:328 #, kde-format msgid "Average:" msgstr "Gemiddeld:" #: transactionlistwidget.cpp:209 #, kde-format msgid "Monthly:" msgstr "Per maand:" #: transactionlistwidget.cpp:314 #, kde-format msgid "Total cost:" msgstr "Totaal uitgaven:" #: transactionlistwidget.cpp:318 #, kde-format msgid "Total income:" msgstr "Totaal inkomsten:" #: transactionlistwidget.cpp:322 #, kde-format msgid "Total amount:" msgstr "Totaal bedrag:" #: transactionlistwidget.cpp:330 #, kde-format msgid "Monthly average:" msgstr "Maandelijks gemiddelde:" #: transactionlistwidget.cpp:671 #, kde-format msgid "" "Are you sure you want to delete all (%1) transactions in the selected split " "transaction?" msgstr "" "Weet u zeker dat u alle (%1) transacties in de geselecteerde gesplitste " "transactie wilt verwijderen?" #: transactionlistwidget.cpp:1028 #, kde-format msgid "* Part of split transaction" msgstr "* Deel van gesplitste transactie" #: transactionlistwidget.cpp:1029 #, kde-format msgid "* Part of split (%1)" msgstr "Deel van splitsing (%1)" #: transactionlistwidget.cpp:1033 #, kde-format msgid "** Recurring (editing occurrance)" msgstr "** Herhalend (individuele gebeurtenis wordt bewerkt)" #: transactionlistwidget.cpp:1049 #, kde-format msgid "Modify..." msgstr "Wijzigen..." eqonomize-0.6/po/pt.po0000644000175000017500000021457711107053374013743 0ustar hannahanna# Portuguese translation for eqonomize # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the eqonomize package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: eqonomize\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?" "group_id=173799&atid=866832\n" "POT-Creation-Date: 2008-11-13 14:35+0100\n" "PO-Revision-Date: 2008-02-11 21:33+0000\n" "Last-Translator: Ricardo Jorge Maçãs \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2008-11-12 16:01+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: budget.cpp:51 editsplitdialog.cpp:118 ledgerdialog.cpp:652 #, kde-format msgid "Balancing" msgstr "Balanceament" #: budget.cpp:84 #, kde-format msgid "Couldn't open %1 for reading" msgstr "Impossível abrir %1 para leitura" #: budget.cpp:95 #, fuzzy, kde-format msgid "" "Not a valid Eqonomize! file (XML parse error: \"%2\" at line %3, col %4)" msgstr "" "Ficheiro Eqonomize! inválido (Erro de parsing XML: \"%\" na linha %3, coluna " "%4)" #: budget.cpp:98 #, kde-format msgid "Invalid root element %1 in XML document" msgstr "Elemento raíz inválido %1 no documento XML" #: budget.cpp:363 #, kde-format msgid "Unable to load 1 account." msgid_plural "Unable to load %n accounts." msgstr[0] "Impossível carregar 1 conta" msgstr[1] "Impossível carregar conta %n" #: budget.cpp:368 #, kde-format msgid "Unable to load 1 category." msgid_plural "Unable to load %n categories." msgstr[0] "Impossível carregar categoria 1." msgstr[1] "Impossível carregar %n categorias." #: budget.cpp:373 #, kde-format msgid "Unable to load 1 security." msgid_plural "Unable to load %n securities." msgstr[0] "Impossível carregar segurança 1." msgstr[1] "Impossível carregar %n segurança." #: budget.cpp:378 #, kde-format msgid "Unable to load 1 transaction." msgid_plural "Unable to load %n transactions." msgstr[0] "Impossível carregar 1 transacção." msgstr[1] "Impossível carregar %n transacções." #: budget.cpp:389 #, kde-format msgid "File is a directory" msgstr "O ficheiro é uma directoria" #: budget.cpp:397 #, kde-format msgid "Couldn't open file for writing" msgstr "Não foi possível abrir o ficheiro para leitura" #: budget.cpp:547 budget.cpp:551 #, kde-format msgid "Error while writing file; file was not saved" msgstr "Erro quando tentava gravar o ficheiro: ficheiro não gravado" #: categoriescomparisonchart.cpp:123 categoriescomparisonreport.cpp:164 #: eqonomize.cpp:1797 eqonomize.cpp:1957 eqonomize.cpp:2036 #: transactionlistwidget.cpp:138 #, kde-format msgid "From" msgstr "De" #: categoriescomparisonchart.cpp:130 categoriescomparisonreport.cpp:171 #: eqonomize.cpp:1808 eqonomize.cpp:1969 eqonomize.cpp:2037 #: transactionlistwidget.cpp:139 #, kde-format msgid "To" msgstr "Para" #: categoriescomparisonchart.cpp:147 categoriescomparisonreport.cpp:114 #: overtimechart.cpp:112 overtimechart.cpp.bak:106 overtimereport.cpp:97 #, kde-format msgid "Source:" msgstr "Fonte:" #: categoriescomparisonchart.cpp:150 categoriescomparisonchart.cpp:858 #, kde-format msgid "All Expenses" msgstr "Todas as Despesas" #: categoriescomparisonchart.cpp:151 categoriescomparisonchart.cpp:859 #, kde-format msgid "All Incomes" msgstr "Todas as Entradas" #: categoriescomparisonchart.cpp:152 categoriescomparisonchart.cpp:860 #, kde-format msgid "All Accounts" msgstr "Todas as contas" #: categoriescomparisonchart.cpp:155 categoriescomparisonchart.cpp:864 #: categoriescomparisonreport.cpp:122 categoriescomparisonreport.cpp:752 #: categoriescomparisonreport.cpp:1016 overtimereport.cpp:375 #, kde-format msgid "Expenses: %1" msgstr "Despesas: %1" #: categoriescomparisonchart.cpp:160 categoriescomparisonchart.cpp:871 #: categoriescomparisonreport.cpp:127 categoriescomparisonreport.cpp:756 #: categoriescomparisonreport.cpp:1023 overtimereport.cpp:366 #, kde-format msgid "Incomes: %1" msgstr "Entradas: %1" #: categoriescomparisonchart.cpp:199 categoriescomparisonchart.cpp:225 #: categoriescomparisonreport.cpp:334 categoriescomparisonreport.cpp:360 #: editsplitdialog.cpp:411 eqonomize.cpp:482 eqonomize.cpp:571 #: eqonomize.cpp:741 eqonomize.cpp:848 eqonomize.cpp:870 eqonomize.cpp:2483 #: eqonomize.cpp:3180 eqonomize.cpp:3206 eqonomize.cpp:3326 eqonomize.cpp:3352 #: importcsvdialog.cpp:780 importcsvdialog.cpp:1196 overtimechart.cpp:462 #: overtimechart.cpp:500 overtimechart.cpp:528 overtimechart.cpp:566 #: overtimechart.cpp.bak:455 overtimechart.cpp.bak:493 #: overtimechart.cpp.bak:521 overtimechart.cpp.bak:559 #: recurrenceeditwidget.cpp:156 recurrenceeditwidget.cpp:171 #: recurrenceeditwidget.cpp:293 transactioneditwidget.cpp:707 #: transactioneditwidget.cpp:1281 transactionfilterwidget.cpp:564 #: transactionfilterwidget.cpp:590 #, kde-format msgid "Invalid date." msgstr "Data inválida." #: categoriescomparisonchart.cpp:204 categoriescomparisonreport.cpp:339 #: eqonomize.cpp:3185 eqonomize.cpp:3331 transactionfilterwidget.cpp:569 #, kde-format msgid "To date is before from date." msgstr "A date final é antes da data inicial." #: categoriescomparisonchart.cpp:229 categoriescomparisonreport.cpp:364 #: eqonomize.cpp:3210 eqonomize.cpp:3356 transactionfilterwidget.cpp:594 #, kde-format msgid "From date is after to date." msgstr "Data incial é depois da data final." #: categoriescomparisonchart.cpp:340 categoriescomparisonreport.cpp:463 #: eqonomize.cpp:3610 eqonomize.cpp:4252 ledgerdialog.cpp:251 #: overtimechart.cpp:624 overtimechart.cpp.bak:617 overtimereport.cpp:278 #: qifimportexport.cpp:604 #, kde-format msgid "" "The selected file already exists. Would you like to overwrite the old copy?" msgstr "O ficheiro seleccionado já existe. Deseja sobrepor a cópia antiga?" #: categoriescomparisonchart.cpp:344 categoriescomparisonreport.cpp:467 #: eqonomize.cpp:4257 ledgerdialog.cpp:255 overtimechart.cpp:628 #: overtimechart.cpp.bak:621 overtimereport.cpp:282 qifimportexport.cpp:608 #, kde-format msgid "You selected a directory!" msgstr "Seleccionou uma directoria!" #: categoriescomparisonchart.cpp:352 categoriescomparisonreport.cpp:475 #: eqonomize.cpp:4264 ledgerdialog.cpp:263 overtimechart.cpp:636 #: overtimechart.cpp.bak:629 overtimereport.cpp:290 qifimportexport.cpp:616 #, kde-format msgid "Couldn't open file for writing." msgstr "Não é possível abrir o ficheiro para escrita." #: categoriescomparisonchart.cpp:372 categoriescomparisonreport.cpp:482 #: eqonomize.cpp:4270 ledgerdialog.cpp:269 overtimechart.cpp:656 #: overtimechart.cpp.bak:644 overtimereport.cpp:297 qifimportexport.cpp:622 #, kde-format msgid "Error while writing file; file was not saved." msgstr "Erro ao gravar o ficheiro: O ficheiro não foi gravado." #: categoriescomparisonchart.cpp:728 categoriescomparisonreport.cpp:303 #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:754 #: categoriescomparisonreport.cpp:839 categoriescomparisonreport.cpp:930 #: categoriescomparisonreport.cpp:977 overtimechart.cpp:373 #: overtimechart.cpp:1740 overtimechart.cpp:1746 overtimechart.cpp:1774 #: overtimechart.cpp:1776 overtimechart.cpp:1783 overtimechart.cpp:1785 #: overtimechart.cpp:1821 overtimechart.cpp:1891 overtimechart.cpp.bak:366 #: overtimechart.cpp.bak:1721 overtimechart.cpp.bak:1727 #: overtimechart.cpp.bak:1755 overtimechart.cpp.bak:1757 #: overtimechart.cpp.bak:1764 overtimechart.cpp.bak:1766 #: overtimechart.cpp.bak:1811 overtimechart.cpp.bak:1892 #: overtimereport.cpp:213 overtimereport.cpp:384 overtimereport.cpp:393 #: overtimereport.cpp:732 #, kde-format msgid "No description" msgstr "Sem descrição" #: categoriescomparisonreport.cpp:119 categoriescomparisonreport.cpp:1012 #, kde-format msgid "All Categories" msgstr "Todas as Categorias" #: categoriescomparisonreport.cpp:138 #, kde-format msgid "Descriptions for" msgstr "Descrições para" #: categoriescomparisonreport.cpp:145 #, kde-format msgid "Payees/payers for" msgstr "Recebedores/pagadores para" #: categoriescomparisonreport.cpp:161 #, kde-format msgid "Period:" msgstr "Período:" #: categoriescomparisonreport.cpp:186 overtimereport.cpp:120 #, kde-format msgid "Columns:" msgstr "Colunas" #: categoriescomparisonreport.cpp:189 categoriescomparisonreport.cpp:782 #: eqonomize.cpp:1062 eqonomize.cpp:1935 eqonomize.cpp:4142 #: importcsvdialog.cpp:139 importcsvdialog.cpp:157 importcsvdialog.cpp:180 #: importcsvdialog.cpp:197 importcsvdialog.cpp:216 importcsvdialog.cpp:235 #: importcsvdialog.cpp:253 overtimereport.cpp:123 #, kde-format msgid "Value" msgstr "Valor" #: categoriescomparisonreport.cpp:192 overtimereport.cpp:126 #: recurrenceeditwidget.cpp:320 #, kde-format msgid "Daily" msgstr "Diariamente" #: categoriescomparisonreport.cpp:195 overtimereport.cpp:129 #: recurrenceeditwidget.cpp:322 #, kde-format msgid "Monthly" msgstr "Mensalmente" #: categoriescomparisonreport.cpp:198 overtimereport.cpp:132 #: recurrenceeditwidget.cpp:323 #, kde-format msgid "Yearly" msgstr "Anualmente" #: categoriescomparisonreport.cpp:201 categoriescomparisonreport.cpp:787 #: overtimechart.cpp:205 overtimechart.cpp:1534 overtimechart.cpp.bak:198 #: overtimechart.cpp.bak:1515 overtimereport.cpp:135 overtimereport.cpp:549 #: transactionlistwidget.cpp:276 transactionlistwidget.cpp:340 #, kde-format msgid "Quantity" msgstr "Quantidade" #: categoriescomparisonreport.cpp:204 overtimechart.cpp:209 #: overtimechart.cpp.bak:202 overtimereport.cpp:138 #, kde-format msgid "Average value" msgstr "Valor médio" #: categoriescomparisonreport.cpp:278 categoriescomparisonreport.cpp:947 #, kde-format msgid "All descriptions" msgstr "Todas as descrições" #: categoriescomparisonreport.cpp:279 categoriescomparisonreport.cpp:948 #, kde-format msgid "All payees" msgstr "Todos os recebedores" #: categoriescomparisonreport.cpp:280 categoriescomparisonreport.cpp:949 #, kde-format msgid "All payers" msgstr "Todos os pagadores" #: categoriescomparisonreport.cpp:309 categoriescomparisonreport.cpp:751 #: categoriescomparisonreport.cpp:837 categoriescomparisonreport.cpp:932 #: categoriescomparisonreport.cpp:994 overtimechart.cpp:382 #: overtimechart.cpp:1758 overtimechart.cpp:1768 overtimechart.cpp:1823 #: overtimechart.cpp:1908 overtimechart.cpp.bak:375 overtimechart.cpp.bak:1739 #: overtimechart.cpp.bak:1749 overtimechart.cpp.bak:1813 #: overtimechart.cpp.bak:1909 #, kde-format msgid "No payee" msgstr "Sem recebedor" #: categoriescomparisonreport.cpp:310 categoriescomparisonreport.cpp:755 #: categoriescomparisonreport.cpp:838 categoriescomparisonreport.cpp:933 #: categoriescomparisonreport.cpp:995 overtimechart.cpp:381 #: overtimechart.cpp:1752 overtimechart.cpp:1763 overtimechart.cpp:1825 #: overtimechart.cpp:1907 overtimechart.cpp.bak:374 overtimechart.cpp.bak:1733 #: overtimechart.cpp.bak:1744 overtimechart.cpp.bak:1815 #: overtimechart.cpp.bak:1908 #, kde-format msgid "No payer" msgstr "Sem pagador" #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:751 #: overtimereport.cpp:393 #, kde-format msgid "Expenses: %2, %1" msgstr "Despesas: %2, %1" #: categoriescomparisonreport.cpp:754 categoriescomparisonreport.cpp:755 #: overtimereport.cpp:384 #, kde-format msgid "Incomes: %2, %1" msgstr "Entradas: %2, %1" #: categoriescomparisonreport.cpp:758 #, kde-format msgid "Incomes & Expenses" msgstr "Entradas & Despesas" #: categoriescomparisonreport.cpp:771 #, kde-format msgctxt "html format; %1: title; %2: from date; %3: to date" msgid "%1 (%2–%3)" msgstr "%1 (%2–%3)" #: categoriescomparisonreport.cpp:772 #, kde-format msgctxt "html format; %1: title; %2: to date" msgid "%1 (to %2)" msgstr "%1 (à %2)" #: categoriescomparisonreport.cpp:776 eqonomize.cpp:4046 eqonomize.cpp:4094 #: qifimportexport.cpp:131 transactionlistwidget.cpp:116 #: transactionlistwidget.cpp:127 #, kde-format msgid "Category" msgstr "Categoria" #: categoriescomparisonreport.cpp:778 eqonomize.cpp:1938 #: transactionlistwidget.cpp:115 #, kde-format msgid "Cost" msgstr "Custo" #: categoriescomparisonreport.cpp:780 editscheduledtransactiondialog.cpp:46 #: editsplitdialog.cpp:108 eqonomize.cpp:285 eqonomize.cpp:329 #: ledgerdialog.cpp:647 transactionlistwidget.cpp:126 #, kde-format msgid "Income" msgstr "Entrada" #: categoriescomparisonreport.cpp:784 overtimereport.cpp:545 #, kde-format msgid "Daily Average" msgstr "Média diária" #: categoriescomparisonreport.cpp:785 overtimereport.cpp:546 #, kde-format msgid "Monthly Average" msgstr "Média Mensal" #: categoriescomparisonreport.cpp:786 overtimereport.cpp:547 #, kde-format msgid "Yearly Average" msgstr "Média Anual" #: categoriescomparisonreport.cpp:789 overtimereport.cpp:358 #: overtimereport.cpp:376 overtimereport.cpp:394 #, kde-format msgid "Average Cost" msgstr "Custo Médio" #: categoriescomparisonreport.cpp:791 overtimereport.cpp:350 #: overtimereport.cpp:367 overtimereport.cpp:385 #, kde-format msgid "Average Income" msgstr "Entrada Média" #: categoriescomparisonreport.cpp:793 #, kde-format msgid "Average Value" msgstr "Valor Médio" #: categoriescomparisonreport.cpp:853 eqonomize.cpp:3932 eqonomize.cpp:4030 #: eqonomize.cpp:4075 eqonomize.cpp:4123 overtimereport.cpp:686 #, kde-format msgid "Total" msgstr "Total" #: categoriescomparisonreport.cpp:878 #, kde-format msgid "Total incomes" msgstr "Total entradas" #: categoriescomparisonreport.cpp:902 #, kde-format msgid "Total expenses" msgstr "Total despesas" #: categoriescomparisonreport.cpp:912 #, kde-format msgid "Total (Profits)" msgstr "Total (Lucros)" #: editscheduledtransactiondialog.cpp:45 editsplitdialog.cpp:111 #: eqonomize.cpp:288 eqonomize.cpp:332 ledgerdialog.cpp:650 #, kde-format msgid "Expense" msgstr "Despesa" #: editscheduledtransactiondialog.cpp:47 editsplitdialog.cpp:120 #: eqonomize.cpp:282 eqonomize.cpp:326 ledgerdialog.cpp:653 #, kde-format msgid "Transfer" msgstr "Transferência" #: editscheduledtransactiondialog.cpp:48 editsplitdialog.cpp:114 #: eqonomize.cpp:289 eqonomize.cpp:333 #, kde-format msgid "Security Buy" msgstr "Compra Segura" #: editscheduledtransactiondialog.cpp:49 editsplitdialog.cpp:116 #: eqonomize.cpp:290 eqonomize.cpp:334 #, kde-format msgid "Security Sell" msgstr "Venda Segura" #: editscheduledtransactiondialog.cpp:56 editscheduledtransactiondialog.cpp:57 #, kde-format msgid "Recurrence" msgstr "Recurrência" #: editscheduledtransactiondialog.cpp:104 #, kde-format msgid "New Expense" msgstr "Nova Despesa" #: editscheduledtransactiondialog.cpp:106 #, kde-format msgid "New Dividend" msgstr "Novo Dividendo" #: editscheduledtransactiondialog.cpp:107 #, kde-format msgid "New Income" msgstr "Nova Entrada" #: editscheduledtransactiondialog.cpp:110 #, kde-format msgid "New Transfer" msgstr "Nova Transferência" #: editscheduledtransactiondialog.cpp:111 #, kde-format msgid "New Security Buy" msgstr "Nova compra segura" #: editscheduledtransactiondialog.cpp:113 #, kde-format msgid "New Security Sell" msgstr "Nova venda segura" #: editscheduledtransactiondialog.cpp:128 #: editscheduledtransactiondialog.cpp:149 transactioneditwidget.cpp:1064 #, kde-format msgid "Edit Expense" msgstr "Editar Despesa" #: editscheduledtransactiondialog.cpp:130 #: editscheduledtransactiondialog.cpp:151 transactioneditwidget.cpp:1066 #, kde-format msgid "Edit Dividend" msgstr "Editar Dividendo" #: editscheduledtransactiondialog.cpp:131 #: editscheduledtransactiondialog.cpp:152 transactioneditwidget.cpp:1067 #, kde-format msgid "Edit Income" msgstr "Editar Entrada" #: editscheduledtransactiondialog.cpp:134 #: editscheduledtransactiondialog.cpp:155 transactioneditwidget.cpp:1070 #, kde-format msgid "Edit Transfer" msgstr "Editar Transferência" #: editscheduledtransactiondialog.cpp:135 #: editscheduledtransactiondialog.cpp:156 transactioneditwidget.cpp:1071 #, kde-format msgid "Edit Securities Bought" msgstr "Editar Seguranças Compradas" #: editscheduledtransactiondialog.cpp:136 #: editscheduledtransactiondialog.cpp:157 transactioneditwidget.cpp:1072 #, kde-format msgid "Edit Securities Sold" msgstr "Editar Seguranças Compradas" #: editsplitdialog.cpp:107 eqonomize.cpp:284 eqonomize.cpp:328 #: eqonomize.cpp:1167 #, kde-format msgid "Dividend" msgstr "Dividendo" #: editsplitdialog.cpp:109 eqonomize.cpp:403 eqonomize.cpp:445 #: ledgerdialog.cpp:648 #, kde-format msgid "Repayment" msgstr "Re-pagamento" #: editsplitdialog.cpp:112 eqonomize.cpp:404 eqonomize.cpp:446 #: ledgerdialog.cpp:651 #, kde-format msgid "Refund" msgstr "Devolução" #: editsplitdialog.cpp:126 ledgerdialog.cpp:638 #, kde-format msgid "Split Transaction" msgstr "Dividir Transacção" #: editsplitdialog.cpp:138 eqonomize.cpp:1279 eqonomize.cpp:1379 #: eqonomize.cpp:1473 eqonomize.cpp:1538 importcsvdialog.cpp:129 #: transactioneditwidget.cpp:175 transactioneditwidget.cpp:1099 #: transactionfilterwidget.cpp:135 #, kde-format msgid "Description:" msgstr "Descrição:" #: editsplitdialog.cpp:143 eqonomize.cpp:413 eqonomize.cpp:523 #: eqonomize.cpp:639 eqonomize.cpp:1274 eqonomize.cpp:2476 #: importcsvdialog.cpp:187 transactioneditwidget.cpp:149 #: transactioneditwidget.cpp:199 transactioneditwidget.cpp:1119 #, kde-format msgid "Date:" msgstr "Data:" #: editsplitdialog.cpp:148 eqonomize.cpp:424 eqonomize.cpp:1252 #: importcsvdialog.cpp:388 importcsvdialog.cpp:399 ledgerdialog.cpp:107 #: qifimportexport.cpp:503 #, kde-format msgid "Account:" msgstr "Conta:" #: editsplitdialog.cpp:163 #, kde-format msgid "Transactions:" msgstr "Transacções" #: editsplitdialog.cpp:172 eqonomize.cpp:914 eqonomize.cpp:1061 #: eqonomize.cpp:1941 eqonomize.cpp:2033 eqonomize.cpp:3988 #: ledgerdialog.cpp:135 #, kde-format msgid "Type" msgstr "Tipo" #: editsplitdialog.cpp:173 eqonomize.cpp:915 eqonomize.cpp:2034 #: ledgerdialog.cpp:136 qifimportexport.cpp:127 qifimportexport.cpp:139 #: qifimportexport.cpp:149 transactionlistwidget.cpp:111 #, kde-format msgid "Description" msgstr "Descrição" #: editsplitdialog.cpp:174 eqonomize.cpp:4142 ledgerdialog.cpp:137 #, kde-format msgid "Account/Category" msgstr "Conta/Categoria" #: editsplitdialog.cpp:175 #, kde-format msgid "Payment" msgstr "Pagamento" #: editsplitdialog.cpp:176 ledgerdialog.cpp:138 #, kde-format msgid "Deposit" msgstr "Depósito" #: editsplitdialog.cpp:181 ledgerdialog.cpp:151 #, kde-format msgid "New" msgstr "Novo" #: editsplitdialog.cpp:184 eqonomize.cpp:4333 #, kde-format msgid "New Expense..." msgstr "Nova Despesa..." #: editsplitdialog.cpp:185 eqonomize.cpp:4334 #, kde-format msgid "New Income..." msgstr "Nova Entrada..." #: editsplitdialog.cpp:186 #, kde-format msgid "New Deposit..." msgstr "Novo Depósito" #: editsplitdialog.cpp:187 #, kde-format msgid "New Withdrawal..." msgstr "Novo Levantamento..." #: editsplitdialog.cpp:188 #, fuzzy, kde-format msgid "New Security Shares Bought..." msgstr "Compra Segura de Acções..." #: editsplitdialog.cpp:189 #, kde-format msgid "Security Shares Sold..." msgstr "Vanda Segura de Acções" #: editsplitdialog.cpp:190 #, kde-format msgid "New Dividend..." msgstr "Novo Dividendo..." #: editsplitdialog.cpp:191 eqonomize.cpp:924 eqonomize.cpp:1071 #: eqonomize.cpp:4328 ledgerdialog.cpp:158 transactionlistwidget.cpp:1051 #, kde-format msgid "Edit..." msgstr "Editar..." #: editsplitdialog.cpp:221 eqonomize.cpp:2325 #, kde-format msgid "Total value:" msgstr "Valor total:" #: editsplitdialog.cpp:403 transactioneditwidget.cpp:653 #: transactioneditwidget.cpp:657 transactioneditwidget.cpp:668 #: transactioneditwidget.cpp:682 transactioneditwidget.cpp:693 #, kde-format msgid "No suitable account available." msgstr "Sem conta adequado disponível" #: editsplitdialog.cpp:415 #, kde-format msgid "Future dates is not allowed." msgstr "Datas futuras não são permitidas." #: editsplitdialog.cpp:419 #, kde-format msgid "A split must contain at least two transactions." msgstr "Um divisão tem que conter primeiro duas transacções" #: editsplitdialog.cpp:428 transactioneditwidget.cpp:714 #, kde-format msgid "Cannot transfer money to and from the same account." msgstr "Não pode ser transferido dinheiro da e para a mesma conta" #: eqonomize.cpp:419 eqonomize.cpp:2325 importcsvdialog.cpp:146 #: importcsvdialog.cpp:169 importcsvdialog.cpp:355 #: transactioneditwidget.cpp:117 transactioneditwidget.cpp:186 #: transactioneditwidget.cpp:1111 #, kde-format msgid "Cost:" msgstr "Custo:" #: eqonomize.cpp:420 importcsvdialog.cpp:364 importcsvdialog.cpp:397 #: transactioneditwidget.cpp:118 transactioneditwidget.cpp:184 #: transactioneditwidget.cpp:1110 #, kde-format msgid "Income:" msgstr "Entrada:" #: eqonomize.cpp:439 transactioneditwidget.cpp:193 #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:310 #, kde-format msgid "Quantity:" msgstr "Quantidade:" #: eqonomize.cpp:443 importcsvdialog.cpp:243 transactioneditwidget.cpp:288 #, kde-format msgid "Comments:" msgstr "Comentários:" #: eqonomize.cpp:491 eqonomize.cpp:1176 #, kde-format msgid "Reinvested Dividend" msgstr "Re-investir Dividendos" #: eqonomize.cpp:501 transactioneditwidget.cpp:97 #: transactioneditwidget.cpp:157 #, kde-format msgid "Security:" msgstr "Segurança:" #: eqonomize.cpp:518 #, kde-format msgid "Shares added:" msgstr "Acções adicionadas:" #: eqonomize.cpp:579 #, kde-format msgid "Security Trade" msgstr "Transacção Segura" #: eqonomize.cpp:587 #, kde-format msgid "From security:" msgstr "De segurança:" #: eqonomize.cpp:603 #, kde-format msgid "Shares moved:" msgstr "Acções movidas:" #: eqonomize.cpp:608 transactioneditwidget.cpp:135 #: transactionfilterwidget.cpp:167 transactionfilterwidget.cpp:168 #: transactionfilterwidget.cpp:343 transactionfilterwidget.cpp:380 #, kde-format msgid "All" msgstr "Todos" #: eqonomize.cpp:614 #, kde-format msgid "To security:" msgstr "Para segurança:" #: eqonomize.cpp:631 #, kde-format msgid "Shares received:" msgstr "Acções recebidas:" #: eqonomize.cpp:635 importcsvdialog.cpp:386 importcsvdialog.cpp:412 #: overtimechart.cpp:193 overtimechart.cpp.bak:186 #, kde-format msgid "Value:" msgstr "Valor:" #: eqonomize.cpp:725 #, kde-format msgid "No other security available for trade in the account." msgstr "Sem outra segurança disponível na conta para trocar." #: eqonomize.cpp:737 #, kde-format msgid "Selected to and from securities are the same." msgstr "Seguranças seleccionadas de e para são as mesmas." #: eqonomize.cpp:745 transactioneditwidget.cpp:735 #, kde-format msgid "Zero shares not allowed." msgstr "Zero acções não permitidas" #: eqonomize.cpp:749 transactioneditwidget.cpp:739 #, kde-format msgid "Zero value not allowed." msgstr "Valor zero não permitido" #: eqonomize.cpp:757 eqonomize.cpp:766 #, kde-format msgid "Quotations" msgstr "Cotações" #: eqonomize.cpp:777 eqonomize.cpp:913 eqonomize.cpp:962 eqonomize.cpp:1060 #: ledgerdialog.cpp:134 transactionlistwidget.cpp:110 #, kde-format msgid "Date" msgstr "Data" #: eqonomize.cpp:778 #, kde-format msgid "Price per Share" msgstr "Preço por Share" #: eqonomize.cpp:820 #, kde-format msgid "Quotations for %1" msgstr "Cotações para %1" #: eqonomize.cpp:904 #, kde-format msgid "" "The following transactions was scheduled to occur today or before today.\n" "Confirm that they have indeed occurred (or will occur today)." msgstr "" "As seguintes transacções foram agendadas para ocorrerem hoje ou antes de " "hoje.\n" "Confirme se elas ocorreram (ou se irão ocorrer hoje)." #: eqonomize.cpp:916 eqonomize.cpp:2035 transactionlistwidget.cpp:137 #, kde-format msgid "Amount" msgstr "Montante" #: eqonomize.cpp:926 #, kde-format msgid "Postpone..." msgstr "Adiar..." #: eqonomize.cpp:973 #, kde-format msgid "Can only postpone to future dates." msgstr "Pode apenas adiar para datas futuras." #: eqonomize.cpp:1052 ledgerdialog.cpp:299 #, kde-format msgid "Transactions for %1" msgstr "Transacções para %1" #: eqonomize.cpp:1063 eqonomize.cpp:1936 #, kde-format msgid "Shares" msgstr "Acções" #: eqonomize.cpp:1160 #, kde-format msgid "Shares Bought" msgstr "Acções Compradas" #: eqonomize.cpp:1161 #, kde-format msgid "Shares Sold" msgstr "Acções Vendidas" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Sold (Traded)" msgstr "Acções Vendidas (Trocadas)" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Bought (Traded)" msgstr "Acções Compradas (Trocadas)" #: eqonomize.cpp:1204 #, kde-format msgid "Shares Bought (Recurring)" msgstr "Acções Compradas (Recorrente)" #: eqonomize.cpp:1205 #, kde-format msgid "Shares Sold (Recurring)" msgstr "Acções Vendidas (Recorrente)" #: eqonomize.cpp:1207 #, kde-format msgid "Shares Bought (Scheduled)" msgstr "Acções Compradas (Agendado)" #: eqonomize.cpp:1208 #, kde-format msgid "Shares Sold (Scheduled)" msgstr "Acções Vendidas (Agendado)" #: eqonomize.cpp:1220 #, kde-format msgid "Recurring Dividend" msgstr "Dividendos recorrentes" #: eqonomize.cpp:1222 #, kde-format msgid "Scheduled Dividend" msgstr "Dividendos Agendados" #: eqonomize.cpp:1240 eqonomize.cpp:1360 #, kde-format msgid "Type:" msgstr "Tipo:" #: eqonomize.cpp:1243 eqonomize.cpp:2600 eqonomize.cpp:2660 #, kde-format msgid "Mutual Fund" msgstr "Fundo Mútuo" #: eqonomize.cpp:1244 eqonomize.cpp:2598 eqonomize.cpp:2658 #, kde-format msgid "Bond" msgstr "" #: eqonomize.cpp:1245 eqonomize.cpp:2599 eqonomize.cpp:2659 #, kde-format msgid "Stock" msgstr "Cotações" #: eqonomize.cpp:1246 eqonomize.cpp:2601 eqonomize.cpp:2661 eqonomize.cpp:3492 #: eqonomize.cpp:3497 importcsvdialog.cpp:117 qifimportexport.cpp:332 #, kde-format msgid "Other" msgstr "Outro" #: eqonomize.cpp:1249 eqonomize.cpp:1370 eqonomize.cpp:1464 eqonomize.cpp:1529 #, kde-format msgid "Name:" msgstr "Nome:" #: eqonomize.cpp:1264 #, kde-format msgid "Decimals in Shares:" msgstr "" #: eqonomize.cpp:1267 #, kde-format msgid "Initial Shares:" msgstr "Share inicial" #: eqonomize.cpp:1270 #, kde-format msgid "Initial quotation:" msgstr "Cotação inicial:" #: eqonomize.cpp:1289 transactioneditwidget.cpp:675 #, kde-format msgid "No suitable account or income category available." msgstr "" #: eqonomize.cpp:1363 eqonomize.cpp:3488 eqonomize.cpp:4021 #: qifimportexport.cpp:325 #, kde-format msgid "Cash" msgstr "Dinheiro" #: eqonomize.cpp:1364 eqonomize.cpp:4016 #, kde-format msgid "Current Account" msgstr "Conta Corrente" #: eqonomize.cpp:1365 eqonomize.cpp:3490 eqonomize.cpp:4017 #, kde-format msgid "Savings Account" msgstr "Conta Poupanças" #: eqonomize.cpp:1366 eqonomize.cpp:4018 #, kde-format msgid "Credit Card" msgstr "Cartão de Crédito" #: eqonomize.cpp:1367 eqonomize.cpp:4019 #, kde-format msgid "Liabilities" msgstr "" #: eqonomize.cpp:1368 eqonomize.cpp:1731 eqonomize.cpp:1732 eqonomize.cpp:3891 #: eqonomize.cpp:3897 eqonomize.cpp:4020 #, kde-format msgid "Securities" msgstr "Segurança" #: eqonomize.cpp:1373 #, kde-format msgid "Initial balance:" msgstr "Balanço Inicial" #: eqonomize.cpp:1376 #, kde-format msgid "Default account for budgeted transactions" msgstr "Conta por omissão para transacções orçamentadas" #: eqonomize.cpp:1441 eqonomize.cpp:1507 eqonomize.cpp:1572 #, kde-format msgid "Empty name." msgstr "Nome em branco" #: eqonomize.cpp:1447 #, kde-format msgid "The entered name is used by another account." msgstr "O nome escolhido é utilizado por outra conta" #: eqonomize.cpp:1467 eqonomize.cpp:1532 #, kde-format msgid "Monthly budget:" msgstr "Saldo mensal:" #: eqonomize.cpp:1513 #, kde-format msgid "The entered name is used by another income category." msgstr "O nome introduzido é utilizado noutra categoria de recebimento" #: eqonomize.cpp:1578 #, kde-format msgid "The entered name is used by another expense category." msgstr "O nome introduzido é utilizado noutra categoria de despesa" #: eqonomize.cpp:1711 eqonomize.cpp:1778 eqonomize.cpp:3984 eqonomize.cpp:5970 #: eqonomize.cpp:5976 #, kde-format msgid "Accounts" msgstr "Contas" #: eqonomize.cpp:1712 #, kde-format msgid "Accounts & Categories" msgstr "Contas & Categorias" #: eqonomize.cpp:1716 eqonomize.cpp:1717 eqonomize.cpp:1780 #: importcsvdialog.cpp:70 overtimechart.cpp:126 overtimechart.cpp:1727 #: overtimechart.cpp:1731 overtimechart.cpp.bak:119 overtimechart.cpp.bak:1708 #: overtimechart.cpp.bak:1712 overtimereport.cpp:103 overtimereport.cpp:357 #: overtimereport.cpp:377 overtimereport.cpp:395 transactionlistwidget.cpp:251 #: transactionlistwidget.cpp:263 #, kde-format msgid "Expenses" msgstr "Despesas" #: eqonomize.cpp:1721 eqonomize.cpp:1722 eqonomize.cpp:1779 eqonomize.cpp:4043 #: importcsvdialog.cpp:75 overtimechart.cpp:127 overtimechart.cpp:1726 #: overtimechart.cpp:1730 overtimechart.cpp.bak:120 overtimechart.cpp.bak:1707 #: overtimechart.cpp.bak:1711 overtimereport.cpp:104 overtimereport.cpp:349 #: overtimereport.cpp:368 overtimereport.cpp:386 transactionlistwidget.cpp:252 #: transactionlistwidget.cpp:264 #, kde-format msgid "Incomes" msgstr "Recebimentos" #: eqonomize.cpp:1726 eqonomize.cpp:1727 importcsvdialog.cpp:78 #: transactionlistwidget.cpp:253 transactionlistwidget.cpp:265 #, kde-format msgid "Transfers" msgstr "Transferências" #: eqonomize.cpp:1736 #, kde-format msgid "Schedule" msgstr "Agenda" #: eqonomize.cpp:1737 #, kde-format msgid "Scheduled Transactions" msgstr "Transacções agendadas" #: eqonomize.cpp:1753 eqonomize.cpp:1775 #, kde-format msgid "Account / Category" msgstr "Conta/ Categoria" #: eqonomize.cpp:1754 #, kde-format msgid "Remaining Budget (%1)" msgstr "Saldo remanescente (%1)" #: eqonomize.cpp:1755 #, kde-format msgid "Change (%1)" msgstr "Mudança (%1)" #: eqonomize.cpp:1756 #, kde-format msgid "Total (%1)" msgstr "Total (%1)" #: eqonomize.cpp:1769 #, kde-format msgctxt "%2 remains of %1 budget" msgid "%2 of %1" msgstr "" #: eqonomize.cpp:1785 eqonomize.cpp:4002 #, kde-format msgid "Includes budgeted transactions" msgstr "" #: eqonomize.cpp:1793 #, kde-format msgid "Period" msgstr "Período" #: eqonomize.cpp:1825 #, kde-format msgid "Select Period" msgstr "Período selecionado" #: eqonomize.cpp:1827 eqonomize.cpp:4312 #, kde-format msgid "Current Month" msgstr "Mês corrente" #: eqonomize.cpp:1828 eqonomize.cpp:4313 #, kde-format msgid "Current Year" msgstr "Ano corrente" #: eqonomize.cpp:1829 eqonomize.cpp:4314 #, kde-format msgid "Current Whole Month" msgstr "" #: eqonomize.cpp:1830 eqonomize.cpp:4315 #, kde-format msgid "Current Whole Year" msgstr "" #: eqonomize.cpp:1831 #, kde-format msgid "Whole Past Month" msgstr "" #: eqonomize.cpp:1832 #, kde-format msgid "Whole Past Year" msgstr "" #: eqonomize.cpp:1833 #, kde-format msgid "Previous Month" msgstr "Mês Passado" #: eqonomize.cpp:1834 #, kde-format msgid "Previous Year" msgstr "Ano Passado" #: eqonomize.cpp:1837 #, kde-format msgid "Show partial budget" msgstr "Mostrar saldo parcial" #: eqonomize.cpp:1842 #, kde-format msgid "Edit Budget" msgstr "Editar Saldo" #: eqonomize.cpp:1846 #, kde-format msgid "Budget:" msgstr "Saldo:" #: eqonomize.cpp:1856 #, kde-format msgid "Month:" msgstr "Mês:" #: eqonomize.cpp:1864 #, kde-format msgid "Result previous month:" msgstr "Resultados do mês anterior:" #: eqonomize.cpp:1917 eqonomize.cpp:4354 #, kde-format msgid "New Security..." msgstr "Nova Segurança" #: eqonomize.cpp:1919 #, kde-format msgid "New Transaction" msgstr "" #: eqonomize.cpp:1922 eqonomize.cpp:4362 #, kde-format msgid "Set Quotation..." msgstr "" #: eqonomize.cpp:1934 eqonomize.cpp:3987 #, kde-format msgid "Name" msgstr "" #: eqonomize.cpp:1937 #, kde-format msgid "Quotation" msgstr "" #: eqonomize.cpp:1939 #, kde-format msgid "Profit" msgstr "" #: eqonomize.cpp:1940 #, kde-format msgid "Yearly Rate" msgstr "" #: eqonomize.cpp:1942 qifimportexport.cpp:323 #, kde-format msgid "Account" msgstr "" #: eqonomize.cpp:1953 #, kde-format msgid "Statistics Period" msgstr "" #: eqonomize.cpp:2015 #, kde-format msgid "New Schedule" msgstr "" #: eqonomize.cpp:2018 #, kde-format msgid "Edit" msgstr "Editar" #: eqonomize.cpp:2032 #, kde-format msgid "Next Occurrence" msgstr "" #: eqonomize.cpp:2038 qifimportexport.cpp:152 transactionlistwidget.cpp:144 #, kde-format msgid "Comments" msgstr "" #: eqonomize.cpp:2291 #, kde-format msgid "New Security" msgstr "" #: eqonomize.cpp:2306 #, kde-format msgid "Edit Security" msgstr "" #: eqonomize.cpp:2325 #, kde-format msgid "Profit:" msgstr "" #: eqonomize.cpp:2325 #, kde-format msgid "Rate:" msgstr "" #: eqonomize.cpp:2332 #, kde-format msgid "" "Are you sure you want to delete the security \"%1\" and all associated " "transactions?" msgstr "" #: eqonomize.cpp:2394 transactioneditwidget.cpp:700 #, kde-format msgid "No security available." msgstr "" #: eqonomize.cpp:2466 #, kde-format msgid "Set Quotation (%1)" msgstr "" #: eqonomize.cpp:2472 transactioneditwidget.cpp:143 #, kde-format msgid "Price per share:" msgstr "" #: eqonomize.cpp:2485 #, kde-format msgid "Future dates are not allowed." msgstr "" #: eqonomize.cpp:2513 #, kde-format msgid "Security Transactions" msgstr "" #: eqonomize.cpp:3166 ledgerdialog.cpp:293 #, kde-format msgid "Ledger" msgstr "" #: eqonomize.cpp:3475 #, kde-format msgid "Untitled" msgstr "" #: eqonomize.cpp:3489 #, kde-format msgid "Check Account" msgstr "" #: eqonomize.cpp:3491 #, kde-format msgid "Salary" msgstr "" #: eqonomize.cpp:3493 #, kde-format msgid "Bills" msgstr "" #: eqonomize.cpp:3494 #, kde-format msgid "Clothing" msgstr "" #: eqonomize.cpp:3495 #, kde-format msgid "Groceries" msgstr "" #: eqonomize.cpp:3496 #, kde-format msgid "Leisure" msgstr "" #: eqonomize.cpp:3561 importcsvdialog.cpp:795 qifimportexport.cpp:280 #: qifimportexport.cpp:444 #, kde-format msgid "Couldn't fetch %1." msgstr "" #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Error loading %1: %2." msgstr "" #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Couldn't open file" msgstr "" #: eqonomize.cpp:3627 eqonomize.cpp:3653 #, kde-format msgid "Error saving %1: %2." msgstr "" #: eqonomize.cpp:3627 eqonomize.cpp:3653 eqonomize.cpp:3673 #, kde-format msgid "Couldn't save file" msgstr "" #: eqonomize.cpp:3673 eqonomize.cpp:4282 ledgerdialog.cpp:281 #: qifimportexport.cpp:634 #, kde-format msgid "Failed to upload file to %1." msgstr "" #: eqonomize.cpp:3703 eqonomize.cpp:3728 #, kde-format msgid "Report" msgstr "" #: eqonomize.cpp:3758 eqonomize.cpp:3783 #, kde-format msgid "Chart" msgstr "" #: eqonomize.cpp:3823 eqonomize.cpp:3829 #, kde-format msgid "Transaction Schedule" msgstr "" #: eqonomize.cpp:3976 #, kde-format msgctxt "html format" msgid "Accounts & Categories" msgstr "Contas & Categorias" #: eqonomize.cpp:3981 #, kde-format msgctxt "html format" msgid "Accounts & Categories (%1–%2)" msgstr "Contas & Categorias (%1–%2)" #: eqonomize.cpp:3982 #, fuzzy, kde-format msgctxt "html format" msgid "Accounts & Categories (to %1)" msgstr "Contas & Categorias" #: eqonomize.cpp:3989 eqonomize.cpp:4049 eqonomize.cpp:4097 eqonomize.cpp:4142 #, kde-format msgid "Change" msgstr "Mudança" #: eqonomize.cpp:3993 ledgerdialog.cpp:140 #, kde-format msgid "Balance" msgstr "" #: eqonomize.cpp:4047 eqonomize.cpp:4095 #, kde-format msgid "Budget" msgstr "" #: eqonomize.cpp:4048 eqonomize.cpp:4096 #, kde-format msgid "Remaining Budget" msgstr "" #: eqonomize.cpp:4050 #, kde-format msgid "Total Incomes" msgstr "" #: eqonomize.cpp:4091 #, kde-format msgid "Costs" msgstr "" #: eqonomize.cpp:4098 #, kde-format msgid "Total Expenses" msgstr "" #: eqonomize.cpp:4167 eqonomize.cpp:4214 #, kde-format msgid "Empty expenses list." msgstr "" #: eqonomize.cpp:4172 eqonomize.cpp:4219 #, kde-format msgid "Empty incomes list." msgstr "" #: eqonomize.cpp:4177 eqonomize.cpp:4224 #, kde-format msgid "Empty transfers list." msgstr "" #: eqonomize.cpp:4182 eqonomize.cpp:4229 #, kde-format msgid "Empty securities list." msgstr "" #: eqonomize.cpp:4187 eqonomize.cpp:4234 #, kde-format msgid "Empty schedule list." msgstr "" #: eqonomize.cpp:4305 #, kde-format msgid "Export View..." msgstr "" #: eqonomize.cpp:4307 #, kde-format msgid "Print View..." msgstr "" #: eqonomize.cpp:4309 #, kde-format msgid "Initial Period" msgstr "" #: eqonomize.cpp:4316 #, kde-format msgid "Remember Last Dates" msgstr "" #: eqonomize.cpp:4319 #, kde-format msgid "Import CSV File..." msgstr "" #: eqonomize.cpp:4320 #, kde-format msgid "Import QIF File..." msgstr "" #: eqonomize.cpp:4321 #, kde-format msgid "Export As QIF File..." msgstr "" #: eqonomize.cpp:4323 #, kde-format msgid "Add Account..." msgstr "" #: eqonomize.cpp:4324 #, kde-format msgid "New Account..." msgstr "" #: eqonomize.cpp:4325 #, kde-format msgid "New Income Category..." msgstr "" #: eqonomize.cpp:4326 #, kde-format msgid "New Expense Category..." msgstr "" #: eqonomize.cpp:4327 #, kde-format msgid "Balance..." msgstr "" #: eqonomize.cpp:4331 #, kde-format msgid "Show Transactions" msgstr "" #: eqonomize.cpp:4335 #, kde-format msgid "New Transfer..." msgstr "" #: eqonomize.cpp:4336 #, kde-format msgid "New Split Transaction..." msgstr "" #: eqonomize.cpp:4337 #, kde-format msgid "Edit Transaction(s) (Occurrence)..." msgstr "" #: eqonomize.cpp:4338 #, kde-format msgid "Edit Occurrence..." msgstr "" #: eqonomize.cpp:4339 #, kde-format msgid "Edit Schedule (Recurrence)..." msgstr "" #: eqonomize.cpp:4340 #, kde-format msgid "Edit Schedule..." msgstr "" #: eqonomize.cpp:4341 #, kde-format msgid "Remove Transaction(s) (Occurrence)" msgstr "" #: eqonomize.cpp:4342 #, kde-format msgid "Remove Occurrence" msgstr "" #: eqonomize.cpp:4343 #, kde-format msgid "Delete Schedule (Recurrence)" msgstr "" #: eqonomize.cpp:4344 #, kde-format msgid "Delete Schedule" msgstr "" #: eqonomize.cpp:4345 #, kde-format msgid "Edit Split Transaction..." msgstr "" #: eqonomize.cpp:4346 #, kde-format msgid "Remove Split Transaction" msgstr "" #: eqonomize.cpp:4347 #, kde-format msgid "Join Transactions..." msgstr "" #: eqonomize.cpp:4348 #, kde-format msgid "Split Up Transaction" msgstr "" #: eqonomize.cpp:4350 #, kde-format msgid "Refund..." msgstr "" #: eqonomize.cpp:4351 #, kde-format msgid "Repayment..." msgstr "" #: eqonomize.cpp:4352 #, kde-format msgid "New Refund/Repayment..." msgstr "" #: eqonomize.cpp:4355 #, kde-format msgid "Edit Security..." msgstr "" #: eqonomize.cpp:4356 #, kde-format msgid "Remove Security" msgstr "" #: eqonomize.cpp:4357 #, kde-format msgid "Shares Sold..." msgstr "" #: eqonomize.cpp:4358 #, kde-format msgid "Shares Bought..." msgstr "" #: eqonomize.cpp:4359 #, kde-format msgid "Dividend..." msgstr "" #: eqonomize.cpp:4360 #, kde-format msgid "Reinvested Dividend..." msgstr "" #: eqonomize.cpp:4361 #, kde-format msgid "Shares Moved..." msgstr "" #: eqonomize.cpp:4363 #, kde-format msgid "Edit Quotations..." msgstr "" #: eqonomize.cpp:4364 #, kde-format msgid "Transactions..." msgstr "" #: eqonomize.cpp:4366 #, kde-format msgid "Development Over Time Report..." msgstr "" #: eqonomize.cpp:4367 #, kde-format msgid "Categories Comparison Report..." msgstr "" #: eqonomize.cpp:4368 #, kde-format msgid "Categories Comparison Chart..." msgstr "" #: eqonomize.cpp:4369 #, kde-format msgid "Development Over Time Chart..." msgstr "" #: eqonomize.cpp:4371 #, kde-format msgid "Use Additional Transaction Properties" msgstr "" #: eqonomize.cpp:4413 #, kde-format msgid "" "Eqonomize! exited unexpectedly before the file was saved and data was lost.\n" "Do you want to load the last auto-saved version of the file?" msgstr "" #: eqonomize.cpp:4413 #, kde-format msgid "Crash Recovery" msgstr "" #: eqonomize.cpp:4605 eqonomize.cpp:4606 #, kde-format msgid "The current file has been modified. Do you want to save it?" msgstr "" #: eqonomize.cpp:4643 #, kde-format msgid "Confirm Schedule" msgstr "" #: eqonomize.cpp:4697 #, kde-format msgid "New Account" msgstr "" #: eqonomize.cpp:4712 #, kde-format msgid "New Income Category" msgstr "" #: eqonomize.cpp:4725 #, kde-format msgid "New Expense Category" msgstr "" #: eqonomize.cpp:4800 #, kde-format msgid "Balance Account" msgstr "" #: eqonomize.cpp:4806 #, kde-format msgid "Book value:" msgstr "" #: eqonomize.cpp:4813 #, kde-format msgid "Real value:" msgstr "" #: eqonomize.cpp:4836 #, kde-format msgid "Edit Account" msgstr "" #: eqonomize.cpp:4869 #, kde-format msgid "Edit Income Category" msgstr "" #: eqonomize.cpp:4887 #, kde-format msgid "Edit Expense Category" msgstr "" #: eqonomize.cpp:4948 #, kde-format msgid "Move transactions?" msgstr "" #: eqonomize.cpp:4958 #, kde-format msgid "Move to:" msgstr "" #: eqonomize.cpp:4965 #, kde-format msgid "" "The category contains some expenses.\n" "What do you want to do with them?" msgstr "" #: eqonomize.cpp:4977 #, kde-format msgid "" "The category contains some incomes.\n" "What do you want to do with them?" msgstr "" #: eqonomize.cpp:4989 #, kde-format msgid "" "The account contains some transactions.\n" "What do you want to do with them?" msgstr "" #: eqonomize.cpp:5011 #, kde-format msgid "" "The category contains some expenses that will be removed. Do you still want " "to remove the category?" msgstr "" #: eqonomize.cpp:5011 eqonomize.cpp:5012 #, kde-format msgid "Remove Category?" msgstr "" #: eqonomize.cpp:5012 #, kde-format msgid "" "The category contains some incomes that will be removed. Do you still want " "to remove the category?" msgstr "" #: eqonomize.cpp:5013 #, kde-format msgid "" "The account contains some transactions that will be removed. Do you still " "want to remove the account?" msgstr "" #: eqonomize.cpp:5013 #, kde-format msgid "Remove Account?" msgstr "" #: eqonomize.cpp:5531 eqonomize.cpp:5555 eqonomize.cpp:5730 #, kde-format msgctxt "%1: budget; %2: remaining budget" msgid "%2 of %1" msgstr "" #: eqonomize.cpp:5810 eqonomize.cpp:5835 #, kde-format msgid "%1 (with no budget)" msgstr "" #: eqonomize.cpp:5811 eqonomize.cpp:5836 #, kde-format msgid "%1 (with budget %2)" msgstr "" #: importcsvdialog.cpp:60 #, kde-format msgid "Import CSV file" msgstr "" #: importcsvdialog.cpp:64 #, kde-format msgid "Transaction Type Selection" msgstr "" #: importcsvdialog.cpp:81 #, kde-format msgid "Expenses and incomes (negative cost)" msgstr "" #: importcsvdialog.cpp:84 #, kde-format msgid "Expenses and incomes (separate columns)" msgstr "" #: importcsvdialog.cpp:87 #, kde-format msgid "All types" msgstr "" #: importcsvdialog.cpp:95 qifimportexport.cpp:62 #, kde-format msgid "File Selection" msgstr "" #: importcsvdialog.cpp:99 qifimportexport.cpp:66 qifimportexport.cpp:548 #, kde-format msgid "File:" msgstr "" #: importcsvdialog.cpp:104 #, kde-format msgid "First data row:" msgstr "" #: importcsvdialog.cpp:107 #, kde-format msgid "Auto" msgstr "" #: importcsvdialog.cpp:110 #, kde-format msgid "Column delimiter:" msgstr "" #: importcsvdialog.cpp:113 #, kde-format msgid "Comma" msgstr "" #: importcsvdialog.cpp:114 #, kde-format msgid "Tabulator" msgstr "" #: importcsvdialog.cpp:115 #, kde-format msgid "Semicolon" msgstr "" #: importcsvdialog.cpp:116 #, kde-format msgid "Space" msgstr "" #: importcsvdialog.cpp:125 #, kde-format msgid "Columns Specification" msgstr "" #: importcsvdialog.cpp:131 importcsvdialog.cpp:149 importcsvdialog.cpp:172 #: importcsvdialog.cpp:189 importcsvdialog.cpp:208 importcsvdialog.cpp:227 #: importcsvdialog.cpp:245 #, kde-format msgid "Column" msgstr "" #: importcsvdialog.cpp:205 importcsvdialog.cpp:356 importcsvdialog.cpp:365 #: importcsvdialog.cpp:387 importcsvdialog.cpp:398 #: transactioneditwidget.cpp:225 transactioneditwidget.cpp:267 #: transactioneditwidget.cpp:1130 transactionfilterwidget.cpp:102 #: transactionfilterwidget.cpp:113 #, kde-format msgid "Category:" msgstr "" #: importcsvdialog.cpp:224 importcsvdialog.cpp:357 importcsvdialog.cpp:374 #: transactioneditwidget.cpp:248 transactioneditwidget.cpp:273 #: transactionfilterwidget.cpp:117 #, kde-format msgid "From account:" msgstr "" #: importcsvdialog.cpp:262 #, kde-format msgid "Create missing categories and accounts" msgstr "" #: importcsvdialog.cpp:354 #, kde-format msgid "" "Imports data as expenses. Costs have positive value. Value is the only " "required column." msgstr "" #: importcsvdialog.cpp:363 #, kde-format msgid "Imports data as incomes. Value is the only required column." msgstr "" #: importcsvdialog.cpp:366 importcsvdialog.cpp:375 #: transactioneditwidget.cpp:231 transactioneditwidget.cpp:258 #: transactionfilterwidget.cpp:106 #, kde-format msgid "To account:" msgstr "" #: importcsvdialog.cpp:372 #, kde-format msgid "Imports data as transfers. Value is the only required column." msgstr "" #: importcsvdialog.cpp:373 transactioneditwidget.cpp:182 #: transactioneditwidget.cpp:1109 #, kde-format msgid "Amount:" msgstr "" #: importcsvdialog.cpp:381 #, kde-format msgid "" "Imports data as expenses and incomes. Costs have negative value. Value and " "category are both required columns." msgstr "" #: importcsvdialog.cpp:392 #, kde-format msgid "" "Imports data as expenses and incomes. Costs and incomes have separate " "columns. Income, cost, and category are all required columns." msgstr "" #: importcsvdialog.cpp:403 #, kde-format msgid "" "Imports data as expenses, incomes, and transfers. Costs have negative or " "positive value. Value, to, and from are all required columns. Accounts and " "categories must be existing." msgstr "" #: importcsvdialog.cpp:413 transactioneditwidget.cpp:209 #: transactionfilterwidget.cpp:74 transactionfilterwidget.cpp:91 #, kde-format msgid "From:" msgstr "" #: importcsvdialog.cpp:414 transactioneditwidget.cpp:216 #: transactionfilterwidget.cpp:81 transactionfilterwidget.cpp:95 #, kde-format msgid "To:" msgstr "" #: importcsvdialog.cpp:440 qifimportexport.cpp:258 #, kde-format msgid "A file must be selected." msgstr "" #: importcsvdialog.cpp:446 importcsvdialog.cpp:458 qifimportexport.cpp:265 #: qifimportexport.cpp:595 #, kde-format msgid "Selected file is a directory." msgstr "" #: importcsvdialog.cpp:450 importcsvdialog.cpp:462 qifimportexport.cpp:269 #, kde-format msgid "Selected file does not exist." msgstr "" #: importcsvdialog.cpp:468 #, kde-format msgid "Empty delimiter." msgstr "" #: importcsvdialog.cpp:712 #, kde-format msgid "The same column number is selected multiple times." msgstr "" #: importcsvdialog.cpp:772 #, kde-format msgid "Selected from account is the same as the to account." msgstr "" #: importcsvdialog.cpp:803 qifimportexport.cpp:288 qifimportexport.cpp:452 #, kde-format msgid "Couldn't open %1 for reading." msgstr "" #: importcsvdialog.cpp:806 qifimportexport.cpp:291 qifimportexport.cpp:455 #, kde-format msgid "Error reading %1." msgstr "" #: importcsvdialog.cpp:1187 qifimportexport.cpp:462 #, fuzzy, kde-format msgid "Successfully imported 1 transaction." msgid_plural "Successfully imported %n transactions." msgstr[0] "Transacções agendadas" msgstr[1] "Transacções agendadas" #: importcsvdialog.cpp:1189 #, kde-format msgid "Unable to import any transactions imported." msgstr "" #: importcsvdialog.cpp:1193 #, kde-format msgid "Failed to import 1 data row." msgid_plural "Failed to import %n data rows." msgstr[0] "" msgstr[1] "" #: importcsvdialog.cpp:1194 #, kde-format msgid "Required columns missing." msgstr "" #: importcsvdialog.cpp:1195 #, kde-format msgid "Invalid value." msgstr "" #: importcsvdialog.cpp:1197 #, kde-format msgid "Empty category name." msgstr "" #: importcsvdialog.cpp:1197 importcsvdialog.cpp:1198 #, kde-format msgid "Empty account name." msgstr "" #: importcsvdialog.cpp:1199 #, kde-format msgid "Unknown category found." msgstr "" #: importcsvdialog.cpp:1199 importcsvdialog.cpp:1200 #, kde-format msgid "Unknown account found." msgstr "" #: importcsvdialog.cpp:1201 #, kde-format msgid "Cannot import security transactions (to/from security accounts)." msgstr "" #: importcsvdialog.cpp:1202 #, kde-format msgid "Balancing account wrongly used." msgstr "" #: importcsvdialog.cpp:1203 #, kde-format msgid "Same to and from account/category." msgstr "" #: importcsvdialog.cpp:1205 #, kde-format msgid "No data found." msgstr "" #: importcsvdialog.cpp:1219 qifimportexport.cpp:345 #, kde-format msgid "Unrecognized date format." msgstr "" #: importcsvdialog.cpp:1224 #, kde-format msgid "Specify Format" msgstr "" #: importcsvdialog.cpp:1230 #, kde-format msgid "" "The format of dates and/or numbers in the CSV file is ambiguous. Please " "select the correct format." msgstr "" #: importcsvdialog.cpp:1235 qifimportexport.cpp:94 qifimportexport.cpp:533 #, kde-format msgid "Date format:" msgstr "" #: importcsvdialog.cpp:1278 qifimportexport.cpp:541 #, kde-format msgid "Value format:" msgstr "" #: kdateedit.cpp:366 #, kde-format msgctxt "the day after today" msgid "tomorrow" msgstr "" #: kdateedit.cpp:367 #, kde-format msgctxt "this day" msgid "today" msgstr "" #: kdateedit.cpp:368 #, kde-format msgctxt "the day before today" msgid "yesterday" msgstr "" #: kdatepickerpopup.cpp:94 #, kde-format msgctxt "@option today" msgid "&Today" msgstr "" #: kdatepickerpopup.cpp:95 #, kde-format msgctxt "@option tomorrow" msgid "To&morrow" msgstr "" #: kdatepickerpopup.cpp:96 #, kde-format msgctxt "@option next week" msgid "Next &Week" msgstr "" #: kdatepickerpopup.cpp:97 #, fuzzy, kde-format msgctxt "@option next month" msgid "Next M&onth" msgstr "Mês corrente" #: kdatepickerpopup.cpp:105 #, fuzzy, kde-format msgctxt "@option do not specify a date" msgid "No Date" msgstr "Data" #: ledgerdialog.cpp:122 #, kde-format msgid "Export..." msgstr "" #: ledgerdialog.cpp:123 #, kde-format msgid "Print..." msgstr "" #: ledgerdialog.cpp:139 #, kde-format msgid "Withdrawal" msgstr "" #: ledgerdialog.cpp:162 #, kde-format msgid "Join..." msgstr "" #: ledgerdialog.cpp:164 #, kde-format msgid "Split Up" msgstr "" #: ledgerdialog.cpp:234 ledgerdialog.cpp:354 #, kde-format msgid "Empty transaction list." msgstr "" #: ledgerdialog.cpp:443 transactionlistwidget.cpp:717 #, kde-format msgid "Are you sure you want to delete all (%1) selected transactions?" msgstr "" #: ledgerdialog.cpp:547 transactionlistwidget.cpp:489 #, kde-format msgid "" "Cannot set the value of security transactions using the dialog for modifying " "multiple transactions." msgstr "" #: ledgerdialog.cpp:553 transactionlistwidget.cpp:495 #, kde-format msgid "Cannot change description of dividends and security transactions." msgstr "" #: ledgerdialog.cpp:559 transactionlistwidget.cpp:501 #, kde-format msgid "Cannot change payer of dividends and security transactions." msgstr "" #: ledgerdialog.cpp:565 transactionlistwidget.cpp:507 #, kde-format msgid "" "Cannot change date of transactions that are part of a split transaction." msgstr "" #: main.cpp:39 msgid "Eqonomize!" msgstr "" #: main.cpp:39 msgid "A personal accounting program" msgstr "" #: main.cpp:39 msgid "(C) 2008 Hanna K." msgstr "" #: main.cpp:40 msgid "Hanna K." msgstr "" #: main.cpp:44 msgid "Start with expenses list displayed" msgstr "" #: main.cpp:46 msgid "Start with incomes list displayed" msgstr "" #: main.cpp:48 msgid "Start with transfers list displayed" msgstr "" #: main.cpp:49 msgid "Document to open" msgstr "" #: overtimechart.cpp:124 overtimechart.cpp.bak:117 #, kde-format msgid "Incomes and Expenses" msgstr "" #: overtimechart.cpp:125 overtimechart.cpp:1722 overtimechart.cpp.bak:118 #: overtimechart.cpp.bak:1703 overtimereport.cpp:102 overtimereport.cpp:343 #, kde-format msgid "Profits" msgstr "" #: overtimechart.cpp:132 overtimechart.cpp:411 overtimechart.cpp:1949 #: overtimechart.cpp.bak:125 overtimechart.cpp.bak:404 #: overtimechart.cpp.bak:1950 overtimereport.cpp:108 overtimereport.cpp:228 #: overtimereport.cpp:753 #, kde-format msgid "All Categories Combined" msgstr "" #: overtimechart.cpp:138 overtimechart.cpp:296 overtimechart.cpp:400 #: overtimechart.cpp:1852 overtimechart.cpp:1973 overtimechart.cpp.bak:131 #: overtimechart.cpp.bak:289 overtimechart.cpp.bak:393 #: overtimechart.cpp.bak:1853 overtimechart.cpp.bak:1974 #: overtimereport.cpp:113 overtimereport.cpp:176 overtimereport.cpp:225 #: overtimereport.cpp:710 overtimereport.cpp:776 #, kde-format msgid "All Descriptions Combined" msgstr "" #: overtimechart.cpp:146 overtimechart.cpp:406 overtimechart.cpp.bak:139 #: overtimechart.cpp.bak:399 #, kde-format msgid "All Payees/Payers Combined" msgstr "" #: overtimechart.cpp:155 overtimechart.cpp.bak:148 #, kde-format msgid "Start date:" msgstr "" #: overtimechart.cpp:178 overtimechart.cpp.bak:171 #, kde-format msgid "End date:" msgstr "" #: overtimechart.cpp:197 overtimechart.cpp.bak:190 #, kde-format msgid "Monthly total" msgstr "" #: overtimechart.cpp:201 overtimechart.cpp.bak:194 #, kde-format msgid "Daily average" msgstr "" #: overtimechart.cpp:304 overtimechart.cpp:404 overtimechart.cpp:1855 #: overtimechart.cpp:1978 overtimechart.cpp.bak:297 overtimechart.cpp.bak:397 #: overtimechart.cpp.bak:1856 overtimechart.cpp.bak:1979 #, kde-format msgid "All Payers Combined" msgstr "" #: overtimechart.cpp:305 overtimechart.cpp:405 overtimechart.cpp:1856 #: overtimechart.cpp:1977 overtimechart.cpp.bak:298 overtimechart.cpp.bak:398 #: overtimechart.cpp.bak:1857 overtimechart.cpp.bak:1978 #, kde-format msgid "All Payees Combined" msgstr "" #: overtimechart.cpp:325 overtimechart.cpp:1853 overtimechart.cpp.bak:318 #: overtimechart.cpp.bak:1854 #, kde-format msgid "All Descriptions Split" msgstr "" #: overtimechart.cpp:328 overtimechart.cpp:1857 overtimechart.cpp.bak:321 #: overtimechart.cpp.bak:1858 #, kde-format msgid "All Payers Split" msgstr "" #: overtimechart.cpp:329 overtimechart.cpp:1858 overtimechart.cpp.bak:322 #: overtimechart.cpp.bak:1859 #, kde-format msgid "All Payees Split" msgstr "" #: overtimechart.cpp:413 overtimechart.cpp:423 overtimechart.cpp:1950 #: overtimechart.cpp.bak:406 overtimechart.cpp.bak:416 #: overtimechart.cpp.bak:1951 #, kde-format msgid "All Categories Split" msgstr "" #: overtimechart.cpp:1535 overtimechart.cpp.bak:1516 #, kde-format msgid "Value (%1)" msgstr "" #: overtimechart.cpp:1536 overtimechart.cpp.bak:1517 #, kde-format msgid "Profit (%1)" msgstr "" #: overtimechart.cpp:1537 overtimechart.cpp.bak:1518 #, kde-format msgid "Income (%1)" msgstr "" #: overtimechart.cpp:1538 overtimechart.cpp.bak:1519 #, kde-format msgid "Cost (%1)" msgstr "" #: overtimechart.cpp:1579 overtimechart.cpp.bak:1560 #, kde-format msgid "Time" msgstr "" #: overtimechart.cpp:1774 overtimechart.cpp:1775 overtimechart.cpp.bak:1755 #: overtimechart.cpp.bak:1756 #, kde-format msgid "no payer" msgstr "" #: overtimechart.cpp:1778 overtimechart.cpp.bak:1759 #, kde-format msgctxt "%1: Description; %2: Payer" msgid "%1/%2" msgstr "" #: overtimechart.cpp:1783 overtimechart.cpp:1784 overtimechart.cpp.bak:1764 #: overtimechart.cpp.bak:1765 #, kde-format msgid "no payee" msgstr "" #: overtimechart.cpp:1787 overtimechart.cpp.bak:1768 #, kde-format msgctxt "%1: Description; %2: Payee" msgid "%1/%2" msgstr "" #: overtimechart.cpp.bak:649 #, kde-format msgid "Error after saving file; data may not have been saved." msgstr "" "Erro depois de gravar o ficheiro: Os dados podem não ter sido gravados." #: overtimereport.cpp:344 #, kde-format msgid "Average Profit" msgstr "" #: overtimereport.cpp:537 #, kde-format msgid "Year" msgstr "" #: overtimereport.cpp:538 #, kde-format msgid "Month" msgstr "" #: overtimereport.cpp:566 #, kde-format msgid "Includes scheduled transactions" msgstr "" #: overtimereport.cpp:570 #, kde-format msgid "Adjusted for the average month / year (%1 / %2 days)" msgstr "" #: overtimereport.cpp:603 overtimereport.cpp:671 #, kde-format msgid "Subtotal" msgstr "" #: qifimport.cpp:307 qifimport.cpp:367 qifimportexport.cpp:1259 #: qifimportexport.cpp:1350 qifimportexport.cpp:1470 #, kde-format msgid "Unnamed" msgstr "" #: qifimport.cpp:337 qifimportexport.cpp:1299 qifimportexport.cpp:1413 #, kde-format msgid "Uncategorized" msgstr "" #: qifimportexport.cpp:56 #, kde-format msgid "Import QIF file" msgstr "" #: qifimportexport.cpp:63 #, kde-format msgid "" "Select a QIF file to import. When you click next, the file be analysed and " "you might need to answer some questions about the format of the file." msgstr "" #: qifimportexport.cpp:73 #, kde-format msgid "Local Definitions" msgstr "" #: qifimportexport.cpp:74 #, kde-format msgid "" "Unknown elements where found in the QIF file. It is possible that this is " "because of localized type names. Please map them to the correct standard " "names." msgstr "" #: qifimportexport.cpp:80 #, kde-format msgid "Local Text" msgstr "" #: qifimportexport.cpp:81 #, kde-format msgid "Standard Text" msgstr "" #: qifimportexport.cpp:84 #, kde-format msgid "Select standard text:" msgstr "" #: qifimportexport.cpp:90 #, kde-format msgid "Date Format" msgstr "" #: qifimportexport.cpp:91 #, kde-format msgid "" "The date format in the QIF file is ambiguous. Please select the correct " "format." msgstr "" #: qifimportexport.cpp:100 #, kde-format msgid "Default Account" msgstr "" #: qifimportexport.cpp:101 #, kde-format msgid "" "Could not find any account definitions in the QIF file. Please select a " "default account. It is also possible that this is caused by a localized " "opening balance text." msgstr "" #: qifimportexport.cpp:104 #, kde-format msgid "Default account:" msgstr "" #: qifimportexport.cpp:115 #, kde-format msgid "Opening balance text:" msgstr "" #: qifimportexport.cpp:121 #, kde-format msgid "Descriptions" msgstr "" #: qifimportexport.cpp:122 #, kde-format msgid "" "Transactions in QIF files does not have any specific description property. " "You are therefore given the option to choose how the description of imported " "transactions will be set." msgstr "" #: qifimportexport.cpp:125 #, kde-format msgid "Subcategories as:" msgstr "" #: qifimportexport.cpp:134 #, kde-format msgid "Ignore" msgstr "" #: qifimportexport.cpp:137 #, kde-format msgid "Payee as:" msgstr "" #: qifimportexport.cpp:142 qifimportexport.cpp:520 #: transactionlistwidget.cpp:119 #, kde-format msgid "Payee" msgstr "" #: qifimportexport.cpp:147 #, kde-format msgid "Memo as:" msgstr "" #: qifimportexport.cpp:156 #, kde-format msgid "Priority:" msgstr "" #: qifimportexport.cpp:159 #, kde-format msgid "Subcategory/Payee/Comments" msgstr "" #: qifimportexport.cpp:160 #, kde-format msgid "Payee/Subcategory/Comments" msgstr "" #: qifimportexport.cpp:161 #, kde-format msgid "Subcategory/Comments/Payee" msgstr "" #: qifimportexport.cpp:162 #, kde-format msgid "Payee/Comments/Subcategory" msgstr "" #: qifimportexport.cpp:163 #, kde-format msgid "Comments/Subcategory/Payee" msgstr "" #: qifimportexport.cpp:164 #, kde-format msgid "Comments/Payee/Subcategory" msgstr "" #: qifimportexport.cpp:314 qifimportexport.cpp:322 qifimportexport.cpp:338 #, kde-format msgid "Unknown" msgstr "" #: qifimportexport.cpp:324 #, kde-format msgid "Bank" msgstr "" #: qifimportexport.cpp:326 #, kde-format msgid "Cat (Category)" msgstr "" #: qifimportexport.cpp:327 #, kde-format msgid "CCard (Credit Card)" msgstr "" #: qifimportexport.cpp:328 #, kde-format msgid "Invst (Investment)" msgstr "" #: qifimportexport.cpp:329 #, kde-format msgid "Oth A (Other Assets)" msgstr "" #: qifimportexport.cpp:330 #, kde-format msgid "Oth L (Other Liabilities)" msgstr "" #: qifimportexport.cpp:331 #, kde-format msgid "Security" msgstr "" #: qifimportexport.cpp:465 #, kde-format msgid "Successfully imported 1 account." msgid_plural "Successfully imported %n accounts." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:469 #, kde-format msgid "Successfully imported 1 category." msgid_plural "Successfully imported %n categories." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:473 #, kde-format msgid "1 duplicate transaction was ignored." msgid_plural "%n duplicate transactions was ignored." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:477 #, kde-format msgid "Failed to import 1 transaction." msgid_plural "Failed to import %n transactions." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:481 #, kde-format msgid "1 security was not imported." msgid_plural "%n securities were not imported." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:485 #, kde-format msgid "1 security transaction was not imported." msgid_plural "%n security transactions were not imported." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:494 #, kde-format msgid "Export QIF File" msgstr "" #: qifimportexport.cpp:506 #, kde-format msgctxt "All accounts" msgid "All" msgstr "Todos" #: qifimportexport.cpp:517 #, kde-format msgid "Export transaction description as:" msgstr "" #: qifimportexport.cpp:524 #, kde-format msgid "Memo" msgstr "" #: qifimportexport.cpp:528 #, kde-format msgid "Subcategory" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 5 #: rc.cpp:3 #, kde-format msgid "&Import" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 12 #: rc.cpp:6 #, kde-format msgid "&Accounts" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 24 #: rc.cpp:9 #, kde-format msgid "&Transactions" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 41 #: rc.cpp:12 #, kde-format msgid "&Securities" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 56 #: rc.cpp:15 #, kde-format msgid "Stat&istics" msgstr "" #: rc.cpp:16 #, kde-format msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" ",Launchpad Contributions:,Mário Pereira Martins,Ricardo Jorge Maçãs,Tiago " "Silva" #: rc.cpp:17 #, kde-format msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr ",,mario.martins@javali.pt,," #: recurrenceeditwidget.cpp:69 #, kde-format msgid "Edit Exceptions" msgstr "" #: recurrenceeditwidget.cpp:186 #, kde-format msgid "Edit Recurrence Range" msgstr "" #: recurrenceeditwidget.cpp:194 recurrenceeditwidget.cpp:229 #, kde-format msgid "Begins on: %1" msgstr "" #: recurrenceeditwidget.cpp:199 #, kde-format msgid "No ending date" msgstr "" #: recurrenceeditwidget.cpp:203 #, kde-format msgid "End after" msgstr "" #: recurrenceeditwidget.cpp:209 #, kde-format msgid "occurrence(s)" msgstr "" #: recurrenceeditwidget.cpp:211 #, kde-format msgid "End on" msgstr "" #: recurrenceeditwidget.cpp:298 #, kde-format msgid "End date before start date." msgstr "" #: recurrenceeditwidget.cpp:312 #, kde-format msgid "Enable recurrance" msgstr "" #: recurrenceeditwidget.cpp:315 #, kde-format msgid "Recurrence Rule" msgstr "" #: recurrenceeditwidget.cpp:321 #, kde-format msgid "Weekly" msgstr "" #: recurrenceeditwidget.cpp:341 recurrenceeditwidget.cpp:352 #: recurrenceeditwidget.cpp:376 recurrenceeditwidget.cpp:462 #, kde-format msgid "Recur every" msgstr "" #: recurrenceeditwidget.cpp:345 #, kde-format msgid "day(s)" msgstr "" #: recurrenceeditwidget.cpp:356 #, kde-format msgid "week(s) on:" msgstr "" #: recurrenceeditwidget.cpp:380 #, kde-format msgid "month(s), after the start month" msgstr "" #: recurrenceeditwidget.cpp:385 recurrenceeditwidget.cpp:437 #, kde-format msgid "Recur on the" msgstr "" #: recurrenceeditwidget.cpp:391 recurrenceeditwidget.cpp:442 #: recurrenceeditwidget.cpp:494 #, kde-format msgid "1st" msgstr "" #: recurrenceeditwidget.cpp:392 recurrenceeditwidget.cpp:443 #: recurrenceeditwidget.cpp:495 #, kde-format msgid "2nd" msgstr "" #: recurrenceeditwidget.cpp:393 recurrenceeditwidget.cpp:444 #: recurrenceeditwidget.cpp:496 #, kde-format msgid "3rd" msgstr "" #: recurrenceeditwidget.cpp:394 recurrenceeditwidget.cpp:445 #: recurrenceeditwidget.cpp:497 #, kde-format msgid "4th" msgstr "" #: recurrenceeditwidget.cpp:395 recurrenceeditwidget.cpp:446 #: recurrenceeditwidget.cpp:498 #, kde-format msgid "5th" msgstr "" #: recurrenceeditwidget.cpp:396 #, kde-format msgid "6th" msgstr "" #: recurrenceeditwidget.cpp:397 #, kde-format msgid "7th" msgstr "" #: recurrenceeditwidget.cpp:398 #, kde-format msgid "8th" msgstr "" #: recurrenceeditwidget.cpp:399 #, kde-format msgid "9th" msgstr "" #: recurrenceeditwidget.cpp:400 #, kde-format msgid "10th" msgstr "" #: recurrenceeditwidget.cpp:401 #, kde-format msgid "11th" msgstr "" #: recurrenceeditwidget.cpp:402 #, kde-format msgid "12th" msgstr "" #: recurrenceeditwidget.cpp:403 #, kde-format msgid "13th" msgstr "" #: recurrenceeditwidget.cpp:404 #, kde-format msgid "14th" msgstr "" #: recurrenceeditwidget.cpp:405 #, kde-format msgid "15th" msgstr "" #: recurrenceeditwidget.cpp:406 #, kde-format msgid "16th" msgstr "" #: recurrenceeditwidget.cpp:407 #, kde-format msgid "17th" msgstr "" #: recurrenceeditwidget.cpp:408 #, kde-format msgid "18th" msgstr "" #: recurrenceeditwidget.cpp:409 #, kde-format msgid "19th" msgstr "" #: recurrenceeditwidget.cpp:410 #, kde-format msgid "20th" msgstr "" #: recurrenceeditwidget.cpp:411 #, kde-format msgid "21st" msgstr "" #: recurrenceeditwidget.cpp:412 #, kde-format msgid "22nd" msgstr "" #: recurrenceeditwidget.cpp:413 #, kde-format msgid "23rd" msgstr "" #: recurrenceeditwidget.cpp:414 #, kde-format msgid "24th" msgstr "" #: recurrenceeditwidget.cpp:415 #, kde-format msgid "25th" msgstr "" #: recurrenceeditwidget.cpp:416 #, kde-format msgid "26th" msgstr "" #: recurrenceeditwidget.cpp:417 #, kde-format msgid "27th" msgstr "" #: recurrenceeditwidget.cpp:418 #, kde-format msgid "28th" msgstr "" #: recurrenceeditwidget.cpp:419 #, kde-format msgid "29th" msgstr "" #: recurrenceeditwidget.cpp:420 #, kde-format msgid "30th" msgstr "" #: recurrenceeditwidget.cpp:421 #, kde-format msgid "31st" msgstr "" #: recurrenceeditwidget.cpp:422 recurrenceeditwidget.cpp:447 #: recurrenceeditwidget.cpp:499 #, kde-format msgid "Last" msgstr "" #: recurrenceeditwidget.cpp:423 recurrenceeditwidget.cpp:448 #: recurrenceeditwidget.cpp:500 #, kde-format msgid "2nd Last" msgstr "" #: recurrenceeditwidget.cpp:424 recurrenceeditwidget.cpp:449 #: recurrenceeditwidget.cpp:501 #, kde-format msgid "3rd Last" msgstr "" #: recurrenceeditwidget.cpp:425 recurrenceeditwidget.cpp:450 #: recurrenceeditwidget.cpp:502 #, kde-format msgid "4th Last" msgstr "" #: recurrenceeditwidget.cpp:426 recurrenceeditwidget.cpp:451 #: recurrenceeditwidget.cpp:503 #, kde-format msgid "5th Last" msgstr "" #: recurrenceeditwidget.cpp:429 #, kde-format msgid "day" msgstr "" #: recurrenceeditwidget.cpp:431 recurrenceeditwidget.cpp:483 #: recurrenceeditwidget.cpp:521 #, kde-format msgid "possibly on weekend" msgstr "" #: recurrenceeditwidget.cpp:432 recurrenceeditwidget.cpp:484 #: recurrenceeditwidget.cpp:522 #, kde-format msgid "but before weekend" msgstr "" #: recurrenceeditwidget.cpp:433 recurrenceeditwidget.cpp:485 #: recurrenceeditwidget.cpp:523 #, kde-format msgid "but after weekend" msgstr "" #: recurrenceeditwidget.cpp:466 #, kde-format msgid "year(s), after the start year" msgstr "" #: recurrenceeditwidget.cpp:471 #, kde-format msgctxt "part before XXX of 'Recur on day XXX of month YYY'" msgid "Recur on day" msgstr "" #: recurrenceeditwidget.cpp:479 #, kde-format msgctxt "part between XXX and YYY of 'Recur on day XXX of month YYY'" msgid "of" msgstr "" #: recurrenceeditwidget.cpp:489 #, fuzzy, kde-format msgctxt "Part before NNN in 'Recur on the NNN. WEEKDAY of MONTH'" msgid "On the" msgstr "Outro" #: recurrenceeditwidget.cpp:507 #, kde-format msgctxt "part between WEEKDAY and MONTH in 'Recur on NNN. WEEKDAY of MONTH'" msgid "of" msgstr "" #: recurrenceeditwidget.cpp:512 #, kde-format msgid "Recur on day #" msgstr "" #: recurrenceeditwidget.cpp:519 #, kde-format msgctxt "part after NNN of 'Recur on day #NNN of the year'" msgid " of the year" msgstr "" #: recurrenceeditwidget.cpp:533 #, kde-format msgid "Range..." msgstr "" #: recurrenceeditwidget.cpp:535 #, kde-format msgid "Exceptions..." msgstr "Excepções..." #: recurrenceeditwidget.cpp:731 #, kde-format msgid "No day of week selected for weekly recurrence." msgstr "" #: recurrenceeditwidget.cpp:745 recurrenceeditwidget.cpp:774 #: recurrenceeditwidget.cpp:791 #, kde-format msgid "Selected day will never occur with selected frequency and start date." msgstr "" #: recurrenceeditwidget.cpp:761 #, kde-format msgid "Selected day does not exist in selected month." msgstr "" #: transaction.cpp:155 transaction.cpp:186 #, kde-format msgid "Dividend: %1" msgstr "" #: transaction.cpp:253 transaction.cpp:256 transaction.cpp:284 #, kde-format msgid "Account balancing" msgstr "" #: transaction.cpp:337 transaction.cpp:352 #, kde-format msgid "Security: %1 (bought)" msgstr "" #: transaction.cpp:375 transaction.cpp:390 #, kde-format msgid "Security: %1 (sold)" msgstr "" #: transactioneditwidget.cpp:125 #, kde-format msgid "Shares bought:" msgstr "" #: transactioneditwidget.cpp:130 #, kde-format msgid "Shares sold:" msgstr "" #: transactioneditwidget.cpp:238 transactioneditwidget.cpp:1144 #: transactionfilterwidget.cpp:140 #, kde-format msgid "Payer:" msgstr "" #: transactioneditwidget.cpp:280 transactioneditwidget.cpp:1145 #: transactionfilterwidget.cpp:141 #, kde-format msgid "Payee:" msgstr "" #: transactioneditwidget.cpp:664 transactioneditwidget.cpp:1262 #, kde-format msgid "No income category available." msgstr "" #: transactioneditwidget.cpp:689 transactioneditwidget.cpp:1270 #, kde-format msgid "No expense category available." msgstr "" #: transactioneditwidget.cpp:720 #, kde-format msgid "Cannot create a regular transfer to/from a securities account." msgstr "" #: transactioneditwidget.cpp:727 #, kde-format msgid "Cannot create a regular income to a securities account." msgstr "" #: transactioneditwidget.cpp:743 #, kde-format msgid "Zero price per share not allowed." msgstr "" #: transactioneditwidget.cpp:755 #, kde-format msgid "Cannot create a regular expense from a securities account." msgstr "" #: transactioneditwidget.cpp:1086 #, kde-format msgid "Modify Transactions" msgstr "" #: transactionfilterwidget.cpp:99 #, kde-format msgid "Min amount:" msgstr "" #: transactionfilterwidget.cpp:100 #, kde-format msgid "Max amount:" msgstr "" #: transactionfilterwidget.cpp:110 #, kde-format msgid "Min income:" msgstr "" #: transactionfilterwidget.cpp:111 #, kde-format msgid "Max income:" msgstr "" #: transactionfilterwidget.cpp:121 #, kde-format msgid "Min cost:" msgstr "" #: transactionfilterwidget.cpp:122 #, kde-format msgid "Max cost:" msgstr "" #: transactionfilterwidget.cpp:148 #, kde-format msgid "Include" msgstr "Incluir" #: transactionfilterwidget.cpp:152 #, kde-format msgid "Exclude" msgstr "Excluir" #: transactionlistwidget.cpp:117 #, kde-format msgid "From Account" msgstr "" #: transactionlistwidget.cpp:128 #, kde-format msgid "To Account" msgstr "" #: transactionlistwidget.cpp:130 #, kde-format msgid "Payer" msgstr "" #: transactionlistwidget.cpp:169 #, kde-format msgid "New/Edit Expense" msgstr "" #: transactionlistwidget.cpp:170 #, kde-format msgid "Filter" msgstr "" #: transactionlistwidget.cpp:209 #, kde-format msgid "Total:" msgstr "" #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:328 #, kde-format msgid "Average:" msgstr "" #: transactionlistwidget.cpp:209 #, kde-format msgid "Monthly:" msgstr "" #: transactionlistwidget.cpp:314 #, kde-format msgid "Total cost:" msgstr "" #: transactionlistwidget.cpp:318 #, kde-format msgid "Total income:" msgstr "" #: transactionlistwidget.cpp:322 #, kde-format msgid "Total amount:" msgstr "" #: transactionlistwidget.cpp:330 #, kde-format msgid "Monthly average:" msgstr "" #: transactionlistwidget.cpp:671 #, kde-format msgid "" "Are you sure you want to delete all (%1) transactions in the selected split " "transaction?" msgstr "" #: transactionlistwidget.cpp:1028 #, kde-format msgid "* Part of split transaction" msgstr "" #: transactionlistwidget.cpp:1029 #, kde-format msgid "* Part of split (%1)" msgstr "" #: transactionlistwidget.cpp:1033 #, kde-format msgid "** Recurring (editing occurrance)" msgstr "" #: transactionlistwidget.cpp:1049 #, kde-format msgid "Modify..." msgstr "Modificar..." eqonomize-0.6/po/pt_BR.po0000644000175000017500000024036711107053374014322 0ustar hannahanna# Brazilian Portuguese translation for eqonomize # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the eqonomize package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: eqonomize\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?" "group_id=173799&atid=866832\n" "POT-Creation-Date: 2008-11-13 14:35+0100\n" "PO-Revision-Date: 2008-11-13 13:27+0000\n" "Last-Translator: Francisco Matelli \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2008-11-13 16:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: budget.cpp:51 editsplitdialog.cpp:118 ledgerdialog.cpp:652 #, kde-format msgid "Balancing" msgstr "balanço" #: budget.cpp:84 #, kde-format msgid "Couldn't open %1 for reading" msgstr "Não foi possível abrir %1 para leitura" #: budget.cpp:95 #, kde-format msgid "" "Not a valid Eqonomize! file (XML parse error: \"%2\" at line %3, col %4)" msgstr "" "Não é um arquivo Eqonomize! válido (XML parse error: \"%2\" at line %3, col %" "4)" #: budget.cpp:98 #, kde-format msgid "Invalid root element %1 in XML document" msgstr "Elemento %1 da raíz inválido no documento XML" #: budget.cpp:363 #, kde-format msgid "Unable to load 1 account." msgid_plural "Unable to load %n accounts." msgstr[0] "Não foi possível carregar 1 conta." msgstr[1] "Impossível carregar %n contas." #: budget.cpp:368 #, kde-format msgid "Unable to load 1 category." msgid_plural "Unable to load %n categories." msgstr[0] "Impossível carregar 1 categoraia." msgstr[1] "Impossível carregar %n categorias." #: budget.cpp:373 #, kde-format msgid "Unable to load 1 security." msgid_plural "Unable to load %n securities." msgstr[0] "Impossível carregar 1 segurança." msgstr[1] "Impossível carrgar %n seguranças." #: budget.cpp:378 #, kde-format msgid "Unable to load 1 transaction." msgid_plural "Unable to load %n transactions." msgstr[0] "Impossível carregar 1 transação." msgstr[1] "Impossível carregar %n transações." #: budget.cpp:389 #, kde-format msgid "File is a directory" msgstr "O arquivo é um diretório." #: budget.cpp:397 #, kde-format msgid "Couldn't open file for writing" msgstr "Impossível abrir o arquivo para editá-lo." #: budget.cpp:547 budget.cpp:551 #, kde-format msgid "Error while writing file; file was not saved" msgstr "Erro gravando o arquivo; arquivo não foi salvo." #: categoriescomparisonchart.cpp:123 categoriescomparisonreport.cpp:164 #: eqonomize.cpp:1797 eqonomize.cpp:1957 eqonomize.cpp:2036 #: transactionlistwidget.cpp:138 #, kde-format msgid "From" msgstr "De" #: categoriescomparisonchart.cpp:130 categoriescomparisonreport.cpp:171 #: eqonomize.cpp:1808 eqonomize.cpp:1969 eqonomize.cpp:2037 #: transactionlistwidget.cpp:139 #, kde-format msgid "To" msgstr "Para" #: categoriescomparisonchart.cpp:147 categoriescomparisonreport.cpp:114 #: overtimechart.cpp:112 overtimechart.cpp.bak:106 overtimereport.cpp:97 #, kde-format msgid "Source:" msgstr "Fonte:" #: categoriescomparisonchart.cpp:150 categoriescomparisonchart.cpp:858 #, kde-format msgid "All Expenses" msgstr "Todos Gastos" #: categoriescomparisonchart.cpp:151 categoriescomparisonchart.cpp:859 #, kde-format msgid "All Incomes" msgstr "Todas Receitas" #: categoriescomparisonchart.cpp:152 categoriescomparisonchart.cpp:860 #, kde-format msgid "All Accounts" msgstr "Todas as Contas" #: categoriescomparisonchart.cpp:155 categoriescomparisonchart.cpp:864 #: categoriescomparisonreport.cpp:122 categoriescomparisonreport.cpp:752 #: categoriescomparisonreport.cpp:1016 overtimereport.cpp:375 #, kde-format msgid "Expenses: %1" msgstr "Desepesas: %1" #: categoriescomparisonchart.cpp:160 categoriescomparisonchart.cpp:871 #: categoriescomparisonreport.cpp:127 categoriescomparisonreport.cpp:756 #: categoriescomparisonreport.cpp:1023 overtimereport.cpp:366 #, kde-format msgid "Incomes: %1" msgstr "Receitas: %1" #: categoriescomparisonchart.cpp:199 categoriescomparisonchart.cpp:225 #: categoriescomparisonreport.cpp:334 categoriescomparisonreport.cpp:360 #: editsplitdialog.cpp:411 eqonomize.cpp:482 eqonomize.cpp:571 #: eqonomize.cpp:741 eqonomize.cpp:848 eqonomize.cpp:870 eqonomize.cpp:2483 #: eqonomize.cpp:3180 eqonomize.cpp:3206 eqonomize.cpp:3326 eqonomize.cpp:3352 #: importcsvdialog.cpp:780 importcsvdialog.cpp:1196 overtimechart.cpp:462 #: overtimechart.cpp:500 overtimechart.cpp:528 overtimechart.cpp:566 #: overtimechart.cpp.bak:455 overtimechart.cpp.bak:493 #: overtimechart.cpp.bak:521 overtimechart.cpp.bak:559 #: recurrenceeditwidget.cpp:156 recurrenceeditwidget.cpp:171 #: recurrenceeditwidget.cpp:293 transactioneditwidget.cpp:707 #: transactioneditwidget.cpp:1281 transactionfilterwidget.cpp:564 #: transactionfilterwidget.cpp:590 #, kde-format msgid "Invalid date." msgstr "Data Inválida" #: categoriescomparisonchart.cpp:204 categoriescomparisonreport.cpp:339 #: eqonomize.cpp:3185 eqonomize.cpp:3331 transactionfilterwidget.cpp:569 #, kde-format msgid "To date is before from date." msgstr "Antes da data." #: categoriescomparisonchart.cpp:229 categoriescomparisonreport.cpp:364 #: eqonomize.cpp:3210 eqonomize.cpp:3356 transactionfilterwidget.cpp:594 #, kde-format msgid "From date is after to date." msgstr "Depois da data." #: categoriescomparisonchart.cpp:340 categoriescomparisonreport.cpp:463 #: eqonomize.cpp:3610 eqonomize.cpp:4252 ledgerdialog.cpp:251 #: overtimechart.cpp:624 overtimechart.cpp.bak:617 overtimereport.cpp:278 #: qifimportexport.cpp:604 #, kde-format msgid "" "The selected file already exists. Would you like to overwrite the old copy?" msgstr "Este arquivo já existe. Deseja substituí-lo?" #: categoriescomparisonchart.cpp:344 categoriescomparisonreport.cpp:467 #: eqonomize.cpp:4257 ledgerdialog.cpp:255 overtimechart.cpp:628 #: overtimechart.cpp.bak:621 overtimereport.cpp:282 qifimportexport.cpp:608 #, kde-format msgid "You selected a directory!" msgstr "Você selecionou um diretório." #: categoriescomparisonchart.cpp:352 categoriescomparisonreport.cpp:475 #: eqonomize.cpp:4264 ledgerdialog.cpp:263 overtimechart.cpp:636 #: overtimechart.cpp.bak:629 overtimereport.cpp:290 qifimportexport.cpp:616 #, kde-format msgid "Couldn't open file for writing." msgstr "Não é possível abrir o arquivo para salvá-lo." #: categoriescomparisonchart.cpp:372 categoriescomparisonreport.cpp:482 #: eqonomize.cpp:4270 ledgerdialog.cpp:269 overtimechart.cpp:656 #: overtimechart.cpp.bak:644 overtimereport.cpp:297 qifimportexport.cpp:622 #, kde-format msgid "Error while writing file; file was not saved." msgstr "Erro durante o salvamento do arquivo; ele não foi salvo." #: categoriescomparisonchart.cpp:728 categoriescomparisonreport.cpp:303 #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:754 #: categoriescomparisonreport.cpp:839 categoriescomparisonreport.cpp:930 #: categoriescomparisonreport.cpp:977 overtimechart.cpp:373 #: overtimechart.cpp:1740 overtimechart.cpp:1746 overtimechart.cpp:1774 #: overtimechart.cpp:1776 overtimechart.cpp:1783 overtimechart.cpp:1785 #: overtimechart.cpp:1821 overtimechart.cpp:1891 overtimechart.cpp.bak:366 #: overtimechart.cpp.bak:1721 overtimechart.cpp.bak:1727 #: overtimechart.cpp.bak:1755 overtimechart.cpp.bak:1757 #: overtimechart.cpp.bak:1764 overtimechart.cpp.bak:1766 #: overtimechart.cpp.bak:1811 overtimechart.cpp.bak:1892 #: overtimereport.cpp:213 overtimereport.cpp:384 overtimereport.cpp:393 #: overtimereport.cpp:732 #, kde-format msgid "No description" msgstr "Nenhuma descrição" #: categoriescomparisonreport.cpp:119 categoriescomparisonreport.cpp:1012 #, kde-format msgid "All Categories" msgstr "Todas categorias" #: categoriescomparisonreport.cpp:138 #, kde-format msgid "Descriptions for" msgstr "Descrições para" #: categoriescomparisonreport.cpp:145 #, kde-format msgid "Payees/payers for" msgstr "Credores/devedores para" #: categoriescomparisonreport.cpp:161 #, kde-format msgid "Period:" msgstr "Período:" #: categoriescomparisonreport.cpp:186 overtimereport.cpp:120 #, kde-format msgid "Columns:" msgstr "Colunas:" #: categoriescomparisonreport.cpp:189 categoriescomparisonreport.cpp:782 #: eqonomize.cpp:1062 eqonomize.cpp:1935 eqonomize.cpp:4142 #: importcsvdialog.cpp:139 importcsvdialog.cpp:157 importcsvdialog.cpp:180 #: importcsvdialog.cpp:197 importcsvdialog.cpp:216 importcsvdialog.cpp:235 #: importcsvdialog.cpp:253 overtimereport.cpp:123 #, kde-format msgid "Value" msgstr "Valor" #: categoriescomparisonreport.cpp:192 overtimereport.cpp:126 #: recurrenceeditwidget.cpp:320 #, kde-format msgid "Daily" msgstr "Diário" #: categoriescomparisonreport.cpp:195 overtimereport.cpp:129 #: recurrenceeditwidget.cpp:322 #, kde-format msgid "Monthly" msgstr "Mensal" #: categoriescomparisonreport.cpp:198 overtimereport.cpp:132 #: recurrenceeditwidget.cpp:323 #, kde-format msgid "Yearly" msgstr "Anualmente" #: categoriescomparisonreport.cpp:201 categoriescomparisonreport.cpp:787 #: overtimechart.cpp:205 overtimechart.cpp:1534 overtimechart.cpp.bak:198 #: overtimechart.cpp.bak:1515 overtimereport.cpp:135 overtimereport.cpp:549 #: transactionlistwidget.cpp:276 transactionlistwidget.cpp:340 #, kde-format msgid "Quantity" msgstr "Quantidade" #: categoriescomparisonreport.cpp:204 overtimechart.cpp:209 #: overtimechart.cpp.bak:202 overtimereport.cpp:138 #, kde-format msgid "Average value" msgstr "valor médio" #: categoriescomparisonreport.cpp:278 categoriescomparisonreport.cpp:947 #, kde-format msgid "All descriptions" msgstr "todas descrições" #: categoriescomparisonreport.cpp:279 categoriescomparisonreport.cpp:948 #, kde-format msgid "All payees" msgstr "Todos Emitentes" #: categoriescomparisonreport.cpp:280 categoriescomparisonreport.cpp:949 #, kde-format msgid "All payers" msgstr "Todos sacados" #: categoriescomparisonreport.cpp:309 categoriescomparisonreport.cpp:751 #: categoriescomparisonreport.cpp:837 categoriescomparisonreport.cpp:932 #: categoriescomparisonreport.cpp:994 overtimechart.cpp:382 #: overtimechart.cpp:1758 overtimechart.cpp:1768 overtimechart.cpp:1823 #: overtimechart.cpp:1908 overtimechart.cpp.bak:375 overtimechart.cpp.bak:1739 #: overtimechart.cpp.bak:1749 overtimechart.cpp.bak:1813 #: overtimechart.cpp.bak:1909 #, kde-format msgid "No payee" msgstr "nenhuem emitente" #: categoriescomparisonreport.cpp:310 categoriescomparisonreport.cpp:755 #: categoriescomparisonreport.cpp:838 categoriescomparisonreport.cpp:933 #: categoriescomparisonreport.cpp:995 overtimechart.cpp:381 #: overtimechart.cpp:1752 overtimechart.cpp:1763 overtimechart.cpp:1825 #: overtimechart.cpp:1907 overtimechart.cpp.bak:374 overtimechart.cpp.bak:1733 #: overtimechart.cpp.bak:1744 overtimechart.cpp.bak:1815 #: overtimechart.cpp.bak:1908 #, kde-format msgid "No payer" msgstr "nehum sacado" #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:751 #: overtimereport.cpp:393 #, kde-format msgid "Expenses: %2, %1" msgstr "Despesas: %2, %1" #: categoriescomparisonreport.cpp:754 categoriescomparisonreport.cpp:755 #: overtimereport.cpp:384 #, kde-format msgid "Incomes: %2, %1" msgstr "Receitas: %2, %1" #: categoriescomparisonreport.cpp:758 #, kde-format msgid "Incomes & Expenses" msgstr "Receitas e Despesas" #: categoriescomparisonreport.cpp:771 #, kde-format msgctxt "html format; %1: title; %2: from date; %3: to date" msgid "%1 (%2–%3)" msgstr "%1 (%2–%3)" #: categoriescomparisonreport.cpp:772 #, kde-format msgctxt "html format; %1: title; %2: to date" msgid "%1 (to %2)" msgstr "%1 (to %2)" #: categoriescomparisonreport.cpp:776 eqonomize.cpp:4046 eqonomize.cpp:4094 #: qifimportexport.cpp:131 transactionlistwidget.cpp:116 #: transactionlistwidget.cpp:127 #, kde-format msgid "Category" msgstr "Categoria" #: categoriescomparisonreport.cpp:778 eqonomize.cpp:1938 #: transactionlistwidget.cpp:115 #, kde-format msgid "Cost" msgstr "Custo" #: categoriescomparisonreport.cpp:780 editscheduledtransactiondialog.cpp:46 #: editsplitdialog.cpp:108 eqonomize.cpp:285 eqonomize.cpp:329 #: ledgerdialog.cpp:647 transactionlistwidget.cpp:126 #, kde-format msgid "Income" msgstr "Renda" #: categoriescomparisonreport.cpp:784 overtimereport.cpp:545 #, kde-format msgid "Daily Average" msgstr "Balanço do DIa" #: categoriescomparisonreport.cpp:785 overtimereport.cpp:546 #, kde-format msgid "Monthly Average" msgstr "Balanço do Mês" #: categoriescomparisonreport.cpp:786 overtimereport.cpp:547 #, kde-format msgid "Yearly Average" msgstr "Balanço Anual" #: categoriescomparisonreport.cpp:789 overtimereport.cpp:358 #: overtimereport.cpp:376 overtimereport.cpp:394 #, kde-format msgid "Average Cost" msgstr "Balanço de custo" #: categoriescomparisonreport.cpp:791 overtimereport.cpp:350 #: overtimereport.cpp:367 overtimereport.cpp:385 #, kde-format msgid "Average Income" msgstr "BAlanço de Receita" #: categoriescomparisonreport.cpp:793 #, kde-format msgid "Average Value" msgstr "Balanço de caixa" #: categoriescomparisonreport.cpp:853 eqonomize.cpp:3932 eqonomize.cpp:4030 #: eqonomize.cpp:4075 eqonomize.cpp:4123 overtimereport.cpp:686 #, kde-format msgid "Total" msgstr "Total" #: categoriescomparisonreport.cpp:878 #, kde-format msgid "Total incomes" msgstr "Receitas Totais" #: categoriescomparisonreport.cpp:902 #, kde-format msgid "Total expenses" msgstr "Gastos Totais" #: categoriescomparisonreport.cpp:912 #, kde-format msgid "Total (Profits)" msgstr "Total (receitas)" #: editscheduledtransactiondialog.cpp:45 editsplitdialog.cpp:111 #: eqonomize.cpp:288 eqonomize.cpp:332 ledgerdialog.cpp:650 #, kde-format msgid "Expense" msgstr "Despesa" #: editscheduledtransactiondialog.cpp:47 editsplitdialog.cpp:120 #: eqonomize.cpp:282 eqonomize.cpp:326 ledgerdialog.cpp:653 #, kde-format msgid "Transfer" msgstr "Transferir" #: editscheduledtransactiondialog.cpp:48 editsplitdialog.cpp:114 #: eqonomize.cpp:289 eqonomize.cpp:333 #, kde-format msgid "Security Buy" msgstr "Compra Segura" #: editscheduledtransactiondialog.cpp:49 editsplitdialog.cpp:116 #: eqonomize.cpp:290 eqonomize.cpp:334 #, kde-format msgid "Security Sell" msgstr "Venda Segura" #: editscheduledtransactiondialog.cpp:56 editscheduledtransactiondialog.cpp:57 #, kde-format msgid "Recurrence" msgstr "Recorrência" #: editscheduledtransactiondialog.cpp:104 #, kde-format msgid "New Expense" msgstr "Nova Despesa" #: editscheduledtransactiondialog.cpp:106 #, kde-format msgid "New Dividend" msgstr "Novo Dividendo" #: editscheduledtransactiondialog.cpp:107 #, kde-format msgid "New Income" msgstr "Nova Receita" #: editscheduledtransactiondialog.cpp:110 #, kde-format msgid "New Transfer" msgstr "Nova Transferência" #: editscheduledtransactiondialog.cpp:111 #, kde-format msgid "New Security Buy" msgstr "Nova compra segura" #: editscheduledtransactiondialog.cpp:113 #, kde-format msgid "New Security Sell" msgstr "Nova venda segura" #: editscheduledtransactiondialog.cpp:128 #: editscheduledtransactiondialog.cpp:149 transactioneditwidget.cpp:1064 #, kde-format msgid "Edit Expense" msgstr "Edite a despesa" #: editscheduledtransactiondialog.cpp:130 #: editscheduledtransactiondialog.cpp:151 transactioneditwidget.cpp:1066 #, kde-format msgid "Edit Dividend" msgstr "Editar Dividendo" #: editscheduledtransactiondialog.cpp:131 #: editscheduledtransactiondialog.cpp:152 transactioneditwidget.cpp:1067 #, kde-format msgid "Edit Income" msgstr "Editar Receita" #: editscheduledtransactiondialog.cpp:134 #: editscheduledtransactiondialog.cpp:155 transactioneditwidget.cpp:1070 #, kde-format msgid "Edit Transfer" msgstr "Editar Transfêrencia" #: editscheduledtransactiondialog.cpp:135 #: editscheduledtransactiondialog.cpp:156 transactioneditwidget.cpp:1071 #, kde-format msgid "Edit Securities Bought" msgstr "Editar seguranças compradas" #: editscheduledtransactiondialog.cpp:136 #: editscheduledtransactiondialog.cpp:157 transactioneditwidget.cpp:1072 #, kde-format msgid "Edit Securities Sold" msgstr "Editar seguranças vendidas" #: editsplitdialog.cpp:107 eqonomize.cpp:284 eqonomize.cpp:328 #: eqonomize.cpp:1167 #, kde-format msgid "Dividend" msgstr "Dividendo" #: editsplitdialog.cpp:109 eqonomize.cpp:403 eqonomize.cpp:445 #: ledgerdialog.cpp:648 #, kde-format msgid "Repayment" msgstr "\"Re-pagamento\"" #: editsplitdialog.cpp:112 eqonomize.cpp:404 eqonomize.cpp:446 #: ledgerdialog.cpp:651 #, kde-format msgid "Refund" msgstr "Reembolso" #: editsplitdialog.cpp:126 ledgerdialog.cpp:638 #, kde-format msgid "Split Transaction" msgstr "Dividir Transação" #: editsplitdialog.cpp:138 eqonomize.cpp:1279 eqonomize.cpp:1379 #: eqonomize.cpp:1473 eqonomize.cpp:1538 importcsvdialog.cpp:129 #: transactioneditwidget.cpp:175 transactioneditwidget.cpp:1099 #: transactionfilterwidget.cpp:135 #, kde-format msgid "Description:" msgstr "Descrição:" #: editsplitdialog.cpp:143 eqonomize.cpp:413 eqonomize.cpp:523 #: eqonomize.cpp:639 eqonomize.cpp:1274 eqonomize.cpp:2476 #: importcsvdialog.cpp:187 transactioneditwidget.cpp:149 #: transactioneditwidget.cpp:199 transactioneditwidget.cpp:1119 #, kde-format msgid "Date:" msgstr "Data:" #: editsplitdialog.cpp:148 eqonomize.cpp:424 eqonomize.cpp:1252 #: importcsvdialog.cpp:388 importcsvdialog.cpp:399 ledgerdialog.cpp:107 #: qifimportexport.cpp:503 #, kde-format msgid "Account:" msgstr "Conta:" #: editsplitdialog.cpp:163 #, kde-format msgid "Transactions:" msgstr "Transações" #: editsplitdialog.cpp:172 eqonomize.cpp:914 eqonomize.cpp:1061 #: eqonomize.cpp:1941 eqonomize.cpp:2033 eqonomize.cpp:3988 #: ledgerdialog.cpp:135 #, kde-format msgid "Type" msgstr "Digitar" #: editsplitdialog.cpp:173 eqonomize.cpp:915 eqonomize.cpp:2034 #: ledgerdialog.cpp:136 qifimportexport.cpp:127 qifimportexport.cpp:139 #: qifimportexport.cpp:149 transactionlistwidget.cpp:111 #, kde-format msgid "Description" msgstr "Descrição" #: editsplitdialog.cpp:174 eqonomize.cpp:4142 ledgerdialog.cpp:137 #, kde-format msgid "Account/Category" msgstr "Conta/Categoria" #: editsplitdialog.cpp:175 #, kde-format msgid "Payment" msgstr "Pagamento" #: editsplitdialog.cpp:176 ledgerdialog.cpp:138 #, kde-format msgid "Deposit" msgstr "Depósito" #: editsplitdialog.cpp:181 ledgerdialog.cpp:151 #, kde-format msgid "New" msgstr "Novo" #: editsplitdialog.cpp:184 eqonomize.cpp:4333 #, kde-format msgid "New Expense..." msgstr "Nova despesa..." #: editsplitdialog.cpp:185 eqonomize.cpp:4334 #, kde-format msgid "New Income..." msgstr "Nova receita..." #: editsplitdialog.cpp:186 #, kde-format msgid "New Deposit..." msgstr "Novo Depósito..." #: editsplitdialog.cpp:187 #, kde-format msgid "New Withdrawal..." msgstr "Novo saque..." #: editsplitdialog.cpp:188 #, kde-format msgid "New Security Shares Bought..." msgstr "" #: editsplitdialog.cpp:189 #, kde-format msgid "Security Shares Sold..." msgstr "Ações de segurança vendidas..." #: editsplitdialog.cpp:190 #, kde-format msgid "New Dividend..." msgstr "Novo Dividendo" #: editsplitdialog.cpp:191 eqonomize.cpp:924 eqonomize.cpp:1071 #: eqonomize.cpp:4328 ledgerdialog.cpp:158 transactionlistwidget.cpp:1051 #, kde-format msgid "Edit..." msgstr "Editar..." #: editsplitdialog.cpp:221 eqonomize.cpp:2325 #, kde-format msgid "Total value:" msgstr "Valor Total:" #: editsplitdialog.cpp:403 transactioneditwidget.cpp:653 #: transactioneditwidget.cpp:657 transactioneditwidget.cpp:668 #: transactioneditwidget.cpp:682 transactioneditwidget.cpp:693 #, kde-format msgid "No suitable account available." msgstr "Nenhuma conta possível avaliável" #: editsplitdialog.cpp:415 #, kde-format msgid "Future dates is not allowed." msgstr "Datas futuras não são permitidas." #: editsplitdialog.cpp:419 #, kde-format msgid "A split must contain at least two transactions." msgstr "Para dividir é nescessário no míninmo duas transações." #: editsplitdialog.cpp:428 transactioneditwidget.cpp:714 #, kde-format msgid "Cannot transfer money to and from the same account." msgstr "Não podemos transferir o mesmo dinheiro para a mesma conta." #: eqonomize.cpp:419 eqonomize.cpp:2325 importcsvdialog.cpp:146 #: importcsvdialog.cpp:169 importcsvdialog.cpp:355 #: transactioneditwidget.cpp:117 transactioneditwidget.cpp:186 #: transactioneditwidget.cpp:1111 #, kde-format msgid "Cost:" msgstr "Custo:" #: eqonomize.cpp:420 importcsvdialog.cpp:364 importcsvdialog.cpp:397 #: transactioneditwidget.cpp:118 transactioneditwidget.cpp:184 #: transactioneditwidget.cpp:1110 #, kde-format msgid "Income:" msgstr "Renda:" #: eqonomize.cpp:439 transactioneditwidget.cpp:193 #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:310 #, kde-format msgid "Quantity:" msgstr "Quantidade" #: eqonomize.cpp:443 importcsvdialog.cpp:243 transactioneditwidget.cpp:288 #, kde-format msgid "Comments:" msgstr "Comentários:" #: eqonomize.cpp:491 eqonomize.cpp:1176 #, kde-format msgid "Reinvested Dividend" msgstr "Dividendo Reaplicado" #: eqonomize.cpp:501 transactioneditwidget.cpp:97 #: transactioneditwidget.cpp:157 #, kde-format msgid "Security:" msgstr "Segurança" #: eqonomize.cpp:518 #, kde-format msgid "Shares added:" msgstr "Ações Adicionadas" #: eqonomize.cpp:579 #, kde-format msgid "Security Trade" msgstr "Negócio Seguro" #: eqonomize.cpp:587 #, kde-format msgid "From security:" msgstr "De segurança." #: eqonomize.cpp:603 #, kde-format msgid "Shares moved:" msgstr "Ações movidas:" #: eqonomize.cpp:608 transactioneditwidget.cpp:135 #: transactionfilterwidget.cpp:167 transactionfilterwidget.cpp:168 #: transactionfilterwidget.cpp:343 transactionfilterwidget.cpp:380 #, kde-format msgid "All" msgstr "Tudo" #: eqonomize.cpp:614 #, kde-format msgid "To security:" msgstr "Para segurança." #: eqonomize.cpp:631 #, kde-format msgid "Shares received:" msgstr "Ações recebidas:" #: eqonomize.cpp:635 importcsvdialog.cpp:386 importcsvdialog.cpp:412 #: overtimechart.cpp:193 overtimechart.cpp.bak:186 #, kde-format msgid "Value:" msgstr "Valor:" #: eqonomize.cpp:725 #, kde-format msgid "No other security available for trade in the account." msgstr "Nenhuma outra segurança avaliável para negociar na conta." #: eqonomize.cpp:737 #, kde-format msgid "Selected to and from securities are the same." msgstr "destino e a origem das seguranças são as mesmas." #: eqonomize.cpp:745 transactioneditwidget.cpp:735 #, kde-format msgid "Zero shares not allowed." msgstr "Nenhuma ação não autorizada." #: eqonomize.cpp:749 transactioneditwidget.cpp:739 #, kde-format msgid "Zero value not allowed." msgstr "Nnehum valor não autorizado." #: eqonomize.cpp:757 eqonomize.cpp:766 #, kde-format msgid "Quotations" msgstr "Cotações" #: eqonomize.cpp:777 eqonomize.cpp:913 eqonomize.cpp:962 eqonomize.cpp:1060 #: ledgerdialog.cpp:134 transactionlistwidget.cpp:110 #, kde-format msgid "Date" msgstr "Data" #: eqonomize.cpp:778 #, kde-format msgid "Price per Share" msgstr "Preço por Ação" #: eqonomize.cpp:820 #, kde-format msgid "Quotations for %1" msgstr "Cotações para %1" #: eqonomize.cpp:904 #, kde-format msgid "" "The following transactions was scheduled to occur today or before today.\n" "Confirm that they have indeed occurred (or will occur today)." msgstr "" "As transações a seguir estavam agendadas para ocorrerem hoje ou ontem.\n" "Confirme se elas realmente ocorreram (ou irão ocorrer hoje)." #: eqonomize.cpp:916 eqonomize.cpp:2035 transactionlistwidget.cpp:137 #, kde-format msgid "Amount" msgstr "Quantia" #: eqonomize.cpp:926 #, kde-format msgid "Postpone..." msgstr "Adiar..." #: eqonomize.cpp:973 #, kde-format msgid "Can only postpone to future dates." msgstr "Só pode ser adiado para datas futuras." #: eqonomize.cpp:1052 ledgerdialog.cpp:299 #, kde-format msgid "Transactions for %1" msgstr "Transações para %1" #: eqonomize.cpp:1063 eqonomize.cpp:1936 #, kde-format msgid "Shares" msgstr "Ações" #: eqonomize.cpp:1160 #, kde-format msgid "Shares Bought" msgstr "Ações compradas" #: eqonomize.cpp:1161 #, kde-format msgid "Shares Sold" msgstr "Ações vendidas" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Sold (Traded)" msgstr "Ações vendidas (Negociada)" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Bought (Traded)" msgstr "Ações compradas (Negociada)" #: eqonomize.cpp:1204 #, kde-format msgid "Shares Bought (Recurring)" msgstr "Ações compradas (Retornando)" #: eqonomize.cpp:1205 #, kde-format msgid "Shares Sold (Recurring)" msgstr "Ações vendidas (Retornando)" #: eqonomize.cpp:1207 #, kde-format msgid "Shares Bought (Scheduled)" msgstr "Ações compradas (Agendadas)" #: eqonomize.cpp:1208 #, kde-format msgid "Shares Sold (Scheduled)" msgstr "Ações vendidads (Agendadas)" #: eqonomize.cpp:1220 #, kde-format msgid "Recurring Dividend" msgstr "Dividendo à ser recorrido" #: eqonomize.cpp:1222 #, kde-format msgid "Scheduled Dividend" msgstr "Dividendo agendado" #: eqonomize.cpp:1240 eqonomize.cpp:1360 #, kde-format msgid "Type:" msgstr "Tipo:" #: eqonomize.cpp:1243 eqonomize.cpp:2600 eqonomize.cpp:2660 #, kde-format msgid "Mutual Fund" msgstr "Fundo Mútuo" #: eqonomize.cpp:1244 eqonomize.cpp:2598 eqonomize.cpp:2658 #, kde-format msgid "Bond" msgstr "Ação" #: eqonomize.cpp:1245 eqonomize.cpp:2599 eqonomize.cpp:2659 #, kde-format msgid "Stock" msgstr "Bolsa" #: eqonomize.cpp:1246 eqonomize.cpp:2601 eqonomize.cpp:2661 eqonomize.cpp:3492 #: eqonomize.cpp:3497 importcsvdialog.cpp:117 qifimportexport.cpp:332 #, kde-format msgid "Other" msgstr "Outro" #: eqonomize.cpp:1249 eqonomize.cpp:1370 eqonomize.cpp:1464 eqonomize.cpp:1529 #, kde-format msgid "Name:" msgstr "Nome:" #: eqonomize.cpp:1264 #, kde-format msgid "Decimals in Shares:" msgstr "Decimais nas ações:" #: eqonomize.cpp:1267 #, kde-format msgid "Initial Shares:" msgstr "Ações inicias:" #: eqonomize.cpp:1270 #, kde-format msgid "Initial quotation:" msgstr "Cotações iniciais:" #: eqonomize.cpp:1289 transactioneditwidget.cpp:675 #, kde-format msgid "No suitable account or income category available." msgstr "Nenhuma conta possível ou categoria de receita disponível." #: eqonomize.cpp:1363 eqonomize.cpp:3488 eqonomize.cpp:4021 #: qifimportexport.cpp:325 #, kde-format msgid "Cash" msgstr "Dinheiro" #: eqonomize.cpp:1364 eqonomize.cpp:4016 #, kde-format msgid "Current Account" msgstr "Conta Atual" #: eqonomize.cpp:1365 eqonomize.cpp:3490 eqonomize.cpp:4017 #, kde-format msgid "Savings Account" msgstr "SAlvando conta" #: eqonomize.cpp:1366 eqonomize.cpp:4018 #, kde-format msgid "Credit Card" msgstr "Cartão de Crédito" #: eqonomize.cpp:1367 eqonomize.cpp:4019 #, kde-format msgid "Liabilities" msgstr "Obrigações" #: eqonomize.cpp:1368 eqonomize.cpp:1731 eqonomize.cpp:1732 eqonomize.cpp:3891 #: eqonomize.cpp:3897 eqonomize.cpp:4020 #, kde-format msgid "Securities" msgstr "Segurança" #: eqonomize.cpp:1373 #, kde-format msgid "Initial balance:" msgstr "Balanço inicial" #: eqonomize.cpp:1376 #, kde-format msgid "Default account for budgeted transactions" msgstr "Conta principal para transações orçamentadas" #: eqonomize.cpp:1441 eqonomize.cpp:1507 eqonomize.cpp:1572 #, kde-format msgid "Empty name." msgstr "Nome em branco." #: eqonomize.cpp:1447 #, kde-format msgid "The entered name is used by another account." msgstr "O nome digitado é usado por uma outra conta." #: eqonomize.cpp:1467 eqonomize.cpp:1532 #, kde-format msgid "Monthly budget:" msgstr "Orçamento mensal." #: eqonomize.cpp:1513 #, kde-format msgid "The entered name is used by another income category." msgstr "O nome digitado já é usado por outra categoria de receita." #: eqonomize.cpp:1578 #, kde-format msgid "The entered name is used by another expense category." msgstr "O nome digitado já é usado por outra categoria de despesa." #: eqonomize.cpp:1711 eqonomize.cpp:1778 eqonomize.cpp:3984 eqonomize.cpp:5970 #: eqonomize.cpp:5976 #, kde-format msgid "Accounts" msgstr "Contas" #: eqonomize.cpp:1712 #, kde-format msgid "Accounts & Categories" msgstr "Contas e Categorias." #: eqonomize.cpp:1716 eqonomize.cpp:1717 eqonomize.cpp:1780 #: importcsvdialog.cpp:70 overtimechart.cpp:126 overtimechart.cpp:1727 #: overtimechart.cpp:1731 overtimechart.cpp.bak:119 overtimechart.cpp.bak:1708 #: overtimechart.cpp.bak:1712 overtimereport.cpp:103 overtimereport.cpp:357 #: overtimereport.cpp:377 overtimereport.cpp:395 transactionlistwidget.cpp:251 #: transactionlistwidget.cpp:263 #, kde-format msgid "Expenses" msgstr "Gastos" #: eqonomize.cpp:1721 eqonomize.cpp:1722 eqonomize.cpp:1779 eqonomize.cpp:4043 #: importcsvdialog.cpp:75 overtimechart.cpp:127 overtimechart.cpp:1726 #: overtimechart.cpp:1730 overtimechart.cpp.bak:120 overtimechart.cpp.bak:1707 #: overtimechart.cpp.bak:1711 overtimereport.cpp:104 overtimereport.cpp:349 #: overtimereport.cpp:368 overtimereport.cpp:386 transactionlistwidget.cpp:252 #: transactionlistwidget.cpp:264 #, kde-format msgid "Incomes" msgstr "Receitas" #: eqonomize.cpp:1726 eqonomize.cpp:1727 importcsvdialog.cpp:78 #: transactionlistwidget.cpp:253 transactionlistwidget.cpp:265 #, kde-format msgid "Transfers" msgstr "Transferências" #: eqonomize.cpp:1736 #, kde-format msgid "Schedule" msgstr "Agenda" #: eqonomize.cpp:1737 #, kde-format msgid "Scheduled Transactions" msgstr "Transações agendadas" #: eqonomize.cpp:1753 eqonomize.cpp:1775 #, kde-format msgid "Account / Category" msgstr "Conta / Categoria" #: eqonomize.cpp:1754 #, kde-format msgid "Remaining Budget (%1)" msgstr "Orçamento restante (%1)" #: eqonomize.cpp:1755 #, kde-format msgid "Change (%1)" msgstr "Change (%1)" #: eqonomize.cpp:1756 #, kde-format msgid "Total (%1)" msgstr "Total(%1)" #: eqonomize.cpp:1769 #, kde-format msgctxt "%2 remains of %1 budget" msgid "%2 of %1" msgstr "%2 de %1" #: eqonomize.cpp:1785 eqonomize.cpp:4002 #, kde-format msgid "Includes budgeted transactions" msgstr "Incluir transações orçamentadas" #: eqonomize.cpp:1793 #, kde-format msgid "Period" msgstr "Período" #: eqonomize.cpp:1825 #, kde-format msgid "Select Period" msgstr "Selecione o período" #: eqonomize.cpp:1827 eqonomize.cpp:4312 #, kde-format msgid "Current Month" msgstr "Mês corrente" #: eqonomize.cpp:1828 eqonomize.cpp:4313 #, kde-format msgid "Current Year" msgstr "Ano corrente" #: eqonomize.cpp:1829 eqonomize.cpp:4314 #, kde-format msgid "Current Whole Month" msgstr "Todo o mês corrente" #: eqonomize.cpp:1830 eqonomize.cpp:4315 #, kde-format msgid "Current Whole Year" msgstr "Todo ano corrente" #: eqonomize.cpp:1831 #, kde-format msgid "Whole Past Month" msgstr "Todo mês passado" #: eqonomize.cpp:1832 #, kde-format msgid "Whole Past Year" msgstr "Todo ano passado" #: eqonomize.cpp:1833 #, kde-format msgid "Previous Month" msgstr "Mês anterior" #: eqonomize.cpp:1834 #, kde-format msgid "Previous Year" msgstr "Ano anterior" #: eqonomize.cpp:1837 #, kde-format msgid "Show partial budget" msgstr "Mostrar orçamento parcial." #: eqonomize.cpp:1842 #, kde-format msgid "Edit Budget" msgstr "Editar Orçamento" #: eqonomize.cpp:1846 #, kde-format msgid "Budget:" msgstr "Orçamento:" #: eqonomize.cpp:1856 #, kde-format msgid "Month:" msgstr "Mês:" #: eqonomize.cpp:1864 #, kde-format msgid "Result previous month:" msgstr "Resultado do mes anterior." #: eqonomize.cpp:1917 eqonomize.cpp:4354 #, kde-format msgid "New Security..." msgstr "Nova securamça..." #: eqonomize.cpp:1919 #, kde-format msgid "New Transaction" msgstr "Nova transação" #: eqonomize.cpp:1922 eqonomize.cpp:4362 #, kde-format msgid "Set Quotation..." msgstr "Definir cotação..." #: eqonomize.cpp:1934 eqonomize.cpp:3987 #, kde-format msgid "Name" msgstr "Nome" #: eqonomize.cpp:1937 #, kde-format msgid "Quotation" msgstr "Cotação" #: eqonomize.cpp:1939 #, kde-format msgid "Profit" msgstr "Lucro" #: eqonomize.cpp:1940 #, kde-format msgid "Yearly Rate" msgstr "Taxa mais recente" #: eqonomize.cpp:1942 qifimportexport.cpp:323 #, kde-format msgid "Account" msgstr "Conta" #: eqonomize.cpp:1953 #, kde-format msgid "Statistics Period" msgstr "Estatísticas do período" #: eqonomize.cpp:2015 #, kde-format msgid "New Schedule" msgstr "Nova agenda" #: eqonomize.cpp:2018 #, kde-format msgid "Edit" msgstr "Editar" #: eqonomize.cpp:2032 #, kde-format msgid "Next Occurrence" msgstr "Próxima Ocorrência" #: eqonomize.cpp:2038 qifimportexport.cpp:152 transactionlistwidget.cpp:144 #, kde-format msgid "Comments" msgstr "Comentários" #: eqonomize.cpp:2291 #, kde-format msgid "New Security" msgstr "Nova securamça..." #: eqonomize.cpp:2306 #, kde-format msgid "Edit Security" msgstr "Editar Segurança" #: eqonomize.cpp:2325 #, kde-format msgid "Profit:" msgstr "Renda:" #: eqonomize.cpp:2325 #, kde-format msgid "Rate:" msgstr "Taxa:" #: eqonomize.cpp:2332 #, kde-format msgid "" "Are you sure you want to delete the security \"%1\" and all associated " "transactions?" msgstr "" "Você tem certeza que deseja deletar a segurança \"%1\" e todas suas " "transações?" #: eqonomize.cpp:2394 transactioneditwidget.cpp:700 #, kde-format msgid "No security available." msgstr "Nenhum asegurança disponível." #: eqonomize.cpp:2466 #, kde-format msgid "Set Quotation (%1)" msgstr "Definir cotação (%1)" #: eqonomize.cpp:2472 transactioneditwidget.cpp:143 #, kde-format msgid "Price per share:" msgstr "Preço por ação:" #: eqonomize.cpp:2485 #, kde-format msgid "Future dates are not allowed." msgstr "Datas futuras não são permitidas" #: eqonomize.cpp:2513 #, kde-format msgid "Security Transactions" msgstr "Transações de segurança" #: eqonomize.cpp:3166 ledgerdialog.cpp:293 #, kde-format msgid "Ledger" msgstr "Alimentador" #: eqonomize.cpp:3475 #, kde-format msgid "Untitled" msgstr "" #: eqonomize.cpp:3489 #, kde-format msgid "Check Account" msgstr "Confirir conta" #: eqonomize.cpp:3491 #, kde-format msgid "Salary" msgstr "Salário" #: eqonomize.cpp:3493 #, kde-format msgid "Bills" msgstr "Contas" #: eqonomize.cpp:3494 #, kde-format msgid "Clothing" msgstr "Vestuário" #: eqonomize.cpp:3495 #, kde-format msgid "Groceries" msgstr "Alimentação" #: eqonomize.cpp:3496 #, kde-format msgid "Leisure" msgstr "Lazer" #: eqonomize.cpp:3561 importcsvdialog.cpp:795 qifimportexport.cpp:280 #: qifimportexport.cpp:444 #, kde-format msgid "Couldn't fetch %1." msgstr "Impossivel realizar %1" #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Error loading %1: %2." msgstr "Erro carregando %1: %2" #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Couldn't open file" msgstr "Não foi possível abrir o arquivo" #: eqonomize.cpp:3627 eqonomize.cpp:3653 #, kde-format msgid "Error saving %1: %2." msgstr "Erro salvando %1: %2" #: eqonomize.cpp:3627 eqonomize.cpp:3653 eqonomize.cpp:3673 #, kde-format msgid "Couldn't save file" msgstr "Não foi possível salvar o arquivo" #: eqonomize.cpp:3673 eqonomize.cpp:4282 ledgerdialog.cpp:281 #: qifimportexport.cpp:634 #, kde-format msgid "Failed to upload file to %1." msgstr "Falhou ao enviar o arquivo para %1" #: eqonomize.cpp:3703 eqonomize.cpp:3728 #, kde-format msgid "Report" msgstr "Relatório" #: eqonomize.cpp:3758 eqonomize.cpp:3783 #, kde-format msgid "Chart" msgstr "Gráfico" #: eqonomize.cpp:3823 eqonomize.cpp:3829 #, kde-format msgid "Transaction Schedule" msgstr "Agenda de transações" #: eqonomize.cpp:3976 #, kde-format msgctxt "html format" msgid "Accounts & Categories" msgstr "Contas & Categorias" #: eqonomize.cpp:3981 #, kde-format msgctxt "html format" msgid "Accounts & Categories (%1–%2)" msgstr "Contas & Categorias (%1–%2)" #: eqonomize.cpp:3982 #, kde-format msgctxt "html format" msgid "Accounts & Categories (to %1)" msgstr "Contas & Categorias (to %1)" #: eqonomize.cpp:3989 eqonomize.cpp:4049 eqonomize.cpp:4097 eqonomize.cpp:4142 #, kde-format msgid "Change" msgstr "Change" #: eqonomize.cpp:3993 ledgerdialog.cpp:140 #, kde-format msgid "Balance" msgstr "Balanço" #: eqonomize.cpp:4047 eqonomize.cpp:4095 #, kde-format msgid "Budget" msgstr "Orçamento" #: eqonomize.cpp:4048 eqonomize.cpp:4096 #, kde-format msgid "Remaining Budget" msgstr "Orçamento restante" #: eqonomize.cpp:4050 #, kde-format msgid "Total Incomes" msgstr "Receitas totais" #: eqonomize.cpp:4091 #, kde-format msgid "Costs" msgstr "Custos" #: eqonomize.cpp:4098 #, kde-format msgid "Total Expenses" msgstr "Despesas totais" #: eqonomize.cpp:4167 eqonomize.cpp:4214 #, kde-format msgid "Empty expenses list." msgstr "Limpar lista de despesas" #: eqonomize.cpp:4172 eqonomize.cpp:4219 #, kde-format msgid "Empty incomes list." msgstr "Limpar lista de receitas" #: eqonomize.cpp:4177 eqonomize.cpp:4224 #, kde-format msgid "Empty transfers list." msgstr "Limpat lista de transferências" #: eqonomize.cpp:4182 eqonomize.cpp:4229 #, kde-format msgid "Empty securities list." msgstr "Lista de seguranças em branco." #: eqonomize.cpp:4187 eqonomize.cpp:4234 #, kde-format msgid "Empty schedule list." msgstr "Lista de agendamentos em branco." #: eqonomize.cpp:4305 #, kde-format msgid "Export View..." msgstr "Exporta vizualização..." #: eqonomize.cpp:4307 #, kde-format msgid "Print View..." msgstr "Ver impressão..." #: eqonomize.cpp:4309 #, kde-format msgid "Initial Period" msgstr "Período Inicial" #: eqonomize.cpp:4316 #, kde-format msgid "Remember Last Dates" msgstr "Lembrar últimas datas" #: eqonomize.cpp:4319 #, kde-format msgid "Import CSV File..." msgstr "Importar arquivo CSV" #: eqonomize.cpp:4320 #, kde-format msgid "Import QIF File..." msgstr "IMportar arquivo QIF..." #: eqonomize.cpp:4321 #, kde-format msgid "Export As QIF File..." msgstr "Exportar como qif..." #: eqonomize.cpp:4323 #, kde-format msgid "Add Account..." msgstr "Adicionar Conta..." #: eqonomize.cpp:4324 #, kde-format msgid "New Account..." msgstr "Nova conta;;;" #: eqonomize.cpp:4325 #, kde-format msgid "New Income Category..." msgstr "Noca categoria de receita..." #: eqonomize.cpp:4326 #, kde-format msgid "New Expense Category..." msgstr "Noca categoria de despesa" #: eqonomize.cpp:4327 #, kde-format msgid "Balance..." msgstr "Balanço" #: eqonomize.cpp:4331 #, kde-format msgid "Show Transactions" msgstr "Exibir transações" #: eqonomize.cpp:4335 #, kde-format msgid "New Transfer..." msgstr "Nova transferência" #: eqonomize.cpp:4336 #, kde-format msgid "New Split Transaction..." msgstr "Nova transação dividída" #: eqonomize.cpp:4337 #, kde-format msgid "Edit Transaction(s) (Occurrence)..." msgstr "Editar Transação(ões) (Ocorrência)" #: eqonomize.cpp:4338 #, kde-format msgid "Edit Occurrence..." msgstr "Editar ocorrência" #: eqonomize.cpp:4339 #, kde-format msgid "Edit Schedule (Recurrence)..." msgstr "Editar agenda (recorrência)" #: eqonomize.cpp:4340 #, kde-format msgid "Edit Schedule..." msgstr "Editar agenda..." #: eqonomize.cpp:4341 #, kde-format msgid "Remove Transaction(s) (Occurrence)" msgstr "Remover Transações (ocorrência)" #: eqonomize.cpp:4342 #, kde-format msgid "Remove Occurrence" msgstr "Remover Pcorrência" #: eqonomize.cpp:4343 #, kde-format msgid "Delete Schedule (Recurrence)" msgstr "Deletar agenda (Reocorrencia)" #: eqonomize.cpp:4344 #, kde-format msgid "Delete Schedule" msgstr "Deletar agenda" #: eqonomize.cpp:4345 #, kde-format msgid "Edit Split Transaction..." msgstr "Editar dividir transação..." #: eqonomize.cpp:4346 #, kde-format msgid "Remove Split Transaction" msgstr "REmover dividir transação" #: eqonomize.cpp:4347 #, kde-format msgid "Join Transactions..." msgstr "Juntar translação..." #: eqonomize.cpp:4348 #, kde-format msgid "Split Up Transaction" msgstr "Dividir transação" #: eqonomize.cpp:4350 #, kde-format msgid "Refund..." msgstr "Fundo renovado..." #: eqonomize.cpp:4351 #, kde-format msgid "Repayment..." msgstr "Pagamento renovado..." #: eqonomize.cpp:4352 #, kde-format msgid "New Refund/Repayment..." msgstr "Fundo/Pagamento renovaso..." #: eqonomize.cpp:4355 #, kde-format msgid "Edit Security..." msgstr "Editar segurança..." #: eqonomize.cpp:4356 #, kde-format msgid "Remove Security" msgstr "Remover Segurança" #: eqonomize.cpp:4357 #, kde-format msgid "Shares Sold..." msgstr "Ações vendidas" #: eqonomize.cpp:4358 #, kde-format msgid "Shares Bought..." msgstr "Ações compradas" #: eqonomize.cpp:4359 #, kde-format msgid "Dividend..." msgstr "Dividendo..." #: eqonomize.cpp:4360 #, kde-format msgid "Reinvested Dividend..." msgstr "Dividendo reinvestido" #: eqonomize.cpp:4361 #, kde-format msgid "Shares Moved..." msgstr "Ações movidas..." #: eqonomize.cpp:4363 #, kde-format msgid "Edit Quotations..." msgstr "Editar cotações..." #: eqonomize.cpp:4364 #, kde-format msgid "Transactions..." msgstr "Transações..." #: eqonomize.cpp:4366 #, kde-format msgid "Development Over Time Report..." msgstr "Relatória de desenvolvimento pelo tempo" #: eqonomize.cpp:4367 #, kde-format msgid "Categories Comparison Report..." msgstr "Relatório de comparação de cateforias" #: eqonomize.cpp:4368 #, kde-format msgid "Categories Comparison Chart..." msgstr "Tabela de comparação de categorias" #: eqonomize.cpp:4369 #, kde-format msgid "Development Over Time Chart..." msgstr "Gráfico de desenvolvimento pelo tempo..." #: eqonomize.cpp:4371 #, kde-format msgid "Use Additional Transaction Properties" msgstr "Usar propriedades adicionais das transações" #: eqonomize.cpp:4413 #, kde-format msgid "" "Eqonomize! exited unexpectedly before the file was saved and data was lost.\n" "Do you want to load the last auto-saved version of the file?" msgstr "Eqonomize!" #: eqonomize.cpp:4413 #, kde-format msgid "Crash Recovery" msgstr "Recuperação de Falhas" #: eqonomize.cpp:4605 eqonomize.cpp:4606 #, kde-format msgid "The current file has been modified. Do you want to save it?" msgstr "O arquivo atual foi modificado. Você gostaria de salvá-lo?" #: eqonomize.cpp:4643 #, kde-format msgid "Confirm Schedule" msgstr "Confirmar agenda" #: eqonomize.cpp:4697 #, kde-format msgid "New Account" msgstr "Nova conta" #: eqonomize.cpp:4712 #, kde-format msgid "New Income Category" msgstr "Nova categoria de Receitas" #: eqonomize.cpp:4725 #, kde-format msgid "New Expense Category" msgstr "Nova gategoria de Despesas" #: eqonomize.cpp:4800 #, kde-format msgid "Balance Account" msgstr "Balanço da Conta" #: eqonomize.cpp:4806 #, kde-format msgid "Book value:" msgstr "Valor contábil" #: eqonomize.cpp:4813 #, kde-format msgid "Real value:" msgstr "Valor real" #: eqonomize.cpp:4836 #, kde-format msgid "Edit Account" msgstr "Editar Conta" #: eqonomize.cpp:4869 #, kde-format msgid "Edit Income Category" msgstr "Editar categoria de receitas" #: eqonomize.cpp:4887 #, kde-format msgid "Edit Expense Category" msgstr "Editar categoria de despesas" #: eqonomize.cpp:4948 #, kde-format msgid "Move transactions?" msgstr "Mover transações?" #: eqonomize.cpp:4958 #, kde-format msgid "Move to:" msgstr "Mover para:" #: eqonomize.cpp:4965 #, kde-format msgid "" "The category contains some expenses.\n" "What do you want to do with them?" msgstr "" "A categoria contém algumas despesas.\n" "O que você gostaria de fazer com elas?" #: eqonomize.cpp:4977 #, kde-format msgid "" "The category contains some incomes.\n" "What do you want to do with them?" msgstr "" "A categoria contém algumas receitas.\n" "O que você gostaria de fazer com elas?" #: eqonomize.cpp:4989 #, kde-format msgid "" "The account contains some transactions.\n" "What do you want to do with them?" msgstr "" "A categoria contém algumas transações.\n" "O que você gostaria de fazer com elas?" #: eqonomize.cpp:5011 #, kde-format msgid "" "The category contains some expenses that will be removed. Do you still want " "to remove the category?" msgstr "" "A categoria contém algumas DESPESAS que serão removidas. Você ainda quer " "remover a categoria?" #: eqonomize.cpp:5011 eqonomize.cpp:5012 #, kde-format msgid "Remove Category?" msgstr "Remover Categoria?" #: eqonomize.cpp:5012 #, kde-format msgid "" "The category contains some incomes that will be removed. Do you still want " "to remove the category?" msgstr "" "A categoria contém algumas RECEITAS que serão removidas. Você ainda quer " "remover a categoria?" #: eqonomize.cpp:5013 #, kde-format msgid "" "The account contains some transactions that will be removed. Do you still " "want to remove the account?" msgstr "" "A categoria contém algumas TRANSAÇÕES que serão removidas. Você ainda quer " "remover a categoria?" #: eqonomize.cpp:5013 #, kde-format msgid "Remove Account?" msgstr "Remover conta?" #: eqonomize.cpp:5531 eqonomize.cpp:5555 eqonomize.cpp:5730 #, kde-format msgctxt "%1: budget; %2: remaining budget" msgid "%2 of %1" msgstr "%2 de %1" #: eqonomize.cpp:5810 eqonomize.cpp:5835 #, kde-format msgid "%1 (with no budget)" msgstr "%1 (sem nhenum orçamento)" #: eqonomize.cpp:5811 eqonomize.cpp:5836 #, kde-format msgid "%1 (with budget %2)" msgstr "%1 (com orçamento %2)" #: importcsvdialog.cpp:60 #, kde-format msgid "Import CSV file" msgstr "Importar arquivo CSV" #: importcsvdialog.cpp:64 #, kde-format msgid "Transaction Type Selection" msgstr "Selecione o tipo da transação" #: importcsvdialog.cpp:81 #, kde-format msgid "Expenses and incomes (negative cost)" msgstr "Despesas e receitas (custo negativo)" #: importcsvdialog.cpp:84 #, kde-format msgid "Expenses and incomes (separate columns)" msgstr "Despesas e receitas (colunas separadas)" #: importcsvdialog.cpp:87 #, kde-format msgid "All types" msgstr "Todos os tipos" #: importcsvdialog.cpp:95 qifimportexport.cpp:62 #, kde-format msgid "File Selection" msgstr "Seleção de Arquivo" #: importcsvdialog.cpp:99 qifimportexport.cpp:66 qifimportexport.cpp:548 #, kde-format msgid "File:" msgstr "Arquivo:" #: importcsvdialog.cpp:104 #, kde-format msgid "First data row:" msgstr "Fila de primero arquivo" #: importcsvdialog.cpp:107 #, kde-format msgid "Auto" msgstr "Auto" #: importcsvdialog.cpp:110 #, kde-format msgid "Column delimiter:" msgstr "Deliitador de coluna:" #: importcsvdialog.cpp:113 #, kde-format msgid "Comma" msgstr "Vírgula" #: importcsvdialog.cpp:114 #, kde-format msgid "Tabulator" msgstr "Tabulação" #: importcsvdialog.cpp:115 #, kde-format msgid "Semicolon" msgstr "Ponto e vírgula" #: importcsvdialog.cpp:116 #, kde-format msgid "Space" msgstr "Espaço" #: importcsvdialog.cpp:125 #, kde-format msgid "Columns Specification" msgstr "ESpecificações das Colunas" #: importcsvdialog.cpp:131 importcsvdialog.cpp:149 importcsvdialog.cpp:172 #: importcsvdialog.cpp:189 importcsvdialog.cpp:208 importcsvdialog.cpp:227 #: importcsvdialog.cpp:245 #, kde-format msgid "Column" msgstr "Coluna" #: importcsvdialog.cpp:205 importcsvdialog.cpp:356 importcsvdialog.cpp:365 #: importcsvdialog.cpp:387 importcsvdialog.cpp:398 #: transactioneditwidget.cpp:225 transactioneditwidget.cpp:267 #: transactioneditwidget.cpp:1130 transactionfilterwidget.cpp:102 #: transactionfilterwidget.cpp:113 #, kde-format msgid "Category:" msgstr "Categoria:" #: importcsvdialog.cpp:224 importcsvdialog.cpp:357 importcsvdialog.cpp:374 #: transactioneditwidget.cpp:248 transactioneditwidget.cpp:273 #: transactionfilterwidget.cpp:117 #, kde-format msgid "From account:" msgstr "Da conta:" #: importcsvdialog.cpp:262 #, kde-format msgid "Create missing categories and accounts" msgstr "Criar categorias e contas que estão faltando." #: importcsvdialog.cpp:354 #, kde-format msgid "" "Imports data as expenses. Costs have positive value. Value is the only " "required column." msgstr "mportar conteúdo como despesas. A única coluna necessária é VALOR." #: importcsvdialog.cpp:363 #, kde-format msgid "Imports data as incomes. Value is the only required column." msgstr "Importar conteúdo como receitas. A única coluna necessária é VALOR." #: importcsvdialog.cpp:366 importcsvdialog.cpp:375 #: transactioneditwidget.cpp:231 transactioneditwidget.cpp:258 #: transactionfilterwidget.cpp:106 #, kde-format msgid "To account:" msgstr "Para conta:" #: importcsvdialog.cpp:372 #, kde-format msgid "Imports data as transfers. Value is the only required column." msgstr "Importar dados como transferâncias. A única coluna necessária é Valor." #: importcsvdialog.cpp:373 transactioneditwidget.cpp:182 #: transactioneditwidget.cpp:1109 #, kde-format msgid "Amount:" msgstr "Quantidade:" #: importcsvdialog.cpp:381 #, kde-format msgid "" "Imports data as expenses and incomes. Costs have negative value. Value and " "category are both required columns." msgstr "" "Importar dados como despesas e receitas. Custos têm valores negaticos. As " "colunas valor e categoria são necessárias." #: importcsvdialog.cpp:392 #, kde-format msgid "" "Imports data as expenses and incomes. Costs and incomes have separate " "columns. Income, cost, and category are all required columns." msgstr "" "Importar dados como despesas e receitas. Custos e receitas têm colunas " "separadas. Receitam custo e categoria são todas colunas requeridas." #: importcsvdialog.cpp:403 #, kde-format msgid "" "Imports data as expenses, incomes, and transfers. Costs have negative or " "positive value. Value, to, and from are all required columns. Accounts and " "categories must be existing." msgstr "" "Importar dados como dspesas, receitas e transferências, Custos têm um valor " "negativo ou positivo. \"Valor\", \"De\" e \"Para\" são todas colunas " "necessárias. Contas e Categorias devem existir." #: importcsvdialog.cpp:413 transactioneditwidget.cpp:209 #: transactionfilterwidget.cpp:74 transactionfilterwidget.cpp:91 #, kde-format msgid "From:" msgstr "De:" #: importcsvdialog.cpp:414 transactioneditwidget.cpp:216 #: transactionfilterwidget.cpp:81 transactionfilterwidget.cpp:95 #, kde-format msgid "To:" msgstr "Para:" #: importcsvdialog.cpp:440 qifimportexport.cpp:258 #, kde-format msgid "A file must be selected." msgstr "Todos arquivos devem ser selecionados." #: importcsvdialog.cpp:446 importcsvdialog.cpp:458 qifimportexport.cpp:265 #: qifimportexport.cpp:595 #, kde-format msgid "Selected file is a directory." msgstr "O arquivo selecionado é uma pasta." #: importcsvdialog.cpp:450 importcsvdialog.cpp:462 qifimportexport.cpp:269 #, kde-format msgid "Selected file does not exist." msgstr "O aquivo não existe!" #: importcsvdialog.cpp:468 #, kde-format msgid "Empty delimiter." msgstr "Limpar delimitador." #: importcsvdialog.cpp:712 #, kde-format msgid "The same column number is selected multiple times." msgstr "O mesmo numero de coluna esta delecionado multíplas vezes." #: importcsvdialog.cpp:772 #, kde-format msgid "Selected from account is the same as the to account." msgstr "A conta de destino e origem são as mesmas" #: importcsvdialog.cpp:803 qifimportexport.cpp:288 qifimportexport.cpp:452 #, kde-format msgid "Couldn't open %1 for reading." msgstr "Não foi possível abrir %1 para ler." #: importcsvdialog.cpp:806 qifimportexport.cpp:291 qifimportexport.cpp:455 #, kde-format msgid "Error reading %1." msgstr "Erro lendo %1." #: importcsvdialog.cpp:1187 qifimportexport.cpp:462 #, kde-format msgid "Successfully imported 1 transaction." msgid_plural "Successfully imported %n transactions." msgstr[0] "1 transação importada com sucesso." msgstr[1] "%n Transações importadas com sucesso." #: importcsvdialog.cpp:1189 #, kde-format msgid "Unable to import any transactions imported." msgstr "Impossível importar uma das transações." #: importcsvdialog.cpp:1193 #, kde-format msgid "Failed to import 1 data row." msgid_plural "Failed to import %n data rows." msgstr[0] "Falhou ao importar 1 linha de dados." msgstr[1] "Falhou ao importar %n linhas de dados." #: importcsvdialog.cpp:1194 #, kde-format msgid "Required columns missing." msgstr "Faltando colunas necessárias" #: importcsvdialog.cpp:1195 #, kde-format msgid "Invalid value." msgstr "Valor inválido." #: importcsvdialog.cpp:1197 #, kde-format msgid "Empty category name." msgstr "Nome de categoria lem branco." #: importcsvdialog.cpp:1197 importcsvdialog.cpp:1198 #, kde-format msgid "Empty account name." msgstr "Nome de conta lem branco." #: importcsvdialog.cpp:1199 #, kde-format msgid "Unknown category found." msgstr "Nenhuma categoria encontrada." #: importcsvdialog.cpp:1199 importcsvdialog.cpp:1200 #, kde-format msgid "Unknown account found." msgstr "Nenhuma conta encontrada." #: importcsvdialog.cpp:1201 #, kde-format msgid "Cannot import security transactions (to/from security accounts)." msgstr "" "Não é possíevl importar transações de segurança (de/para contas de segurança)" #: importcsvdialog.cpp:1202 #, kde-format msgid "Balancing account wrongly used." msgstr "Balanceamento da conta usado errado" #: importcsvdialog.cpp:1203 #, kde-format msgid "Same to and from account/category." msgstr "Meso destino e origem de conta/xategoria" #: importcsvdialog.cpp:1205 #, kde-format msgid "No data found." msgstr "Nenhum arquivo encontrado" #: importcsvdialog.cpp:1219 qifimportexport.cpp:345 #, kde-format msgid "Unrecognized date format." msgstr "Formato de data não reconhecido" #: importcsvdialog.cpp:1224 #, kde-format msgid "Specify Format" msgstr "Especifique o formato" #: importcsvdialog.cpp:1230 #, kde-format msgid "" "The format of dates and/or numbers in the CSV file is ambiguous. Please " "select the correct format." msgstr "" "O formato de dats e/ou numeros neste arquivo CSV é ambíguo. Por favor " "selecione o formato correto." #: importcsvdialog.cpp:1235 qifimportexport.cpp:94 qifimportexport.cpp:533 #, kde-format msgid "Date format:" msgstr "Formato de data:" #: importcsvdialog.cpp:1278 qifimportexport.cpp:541 #, kde-format msgid "Value format:" msgstr "Formato do valor:" #: kdateedit.cpp:366 #, kde-format msgctxt "the day after today" msgid "tomorrow" msgstr "" #: kdateedit.cpp:367 #, kde-format msgctxt "this day" msgid "today" msgstr "" #: kdateedit.cpp:368 #, kde-format msgctxt "the day before today" msgid "yesterday" msgstr "" #: kdatepickerpopup.cpp:94 #, kde-format msgctxt "@option today" msgid "&Today" msgstr "" #: kdatepickerpopup.cpp:95 #, kde-format msgctxt "@option tomorrow" msgid "To&morrow" msgstr "" #: kdatepickerpopup.cpp:96 #, kde-format msgctxt "@option next week" msgid "Next &Week" msgstr "" #: kdatepickerpopup.cpp:97 #, kde-format msgctxt "@option next month" msgid "Next M&onth" msgstr "" #: kdatepickerpopup.cpp:105 #, kde-format msgctxt "@option do not specify a date" msgid "No Date" msgstr "" #: ledgerdialog.cpp:122 #, kde-format msgid "Export..." msgstr "Exportar..." #: ledgerdialog.cpp:123 #, kde-format msgid "Print..." msgstr "Imprimir..." #: ledgerdialog.cpp:139 #, kde-format msgid "Withdrawal" msgstr "Sacar" #: ledgerdialog.cpp:162 #, kde-format msgid "Join..." msgstr "Juntar..." #: ledgerdialog.cpp:164 #, kde-format msgid "Split Up" msgstr "Dividir" #: ledgerdialog.cpp:234 ledgerdialog.cpp:354 #, kde-format msgid "Empty transaction list." msgstr "Lista de transações limpa." #: ledgerdialog.cpp:443 transactionlistwidget.cpp:717 #, kde-format msgid "Are you sure you want to delete all (%1) selected transactions?" msgstr "" "Você tem certeza que deseja deletar todas (%1) transações selecionadas?" #: ledgerdialog.cpp:547 transactionlistwidget.cpp:489 #, kde-format msgid "" "Cannot set the value of security transactions using the dialog for modifying " "multiple transactions." msgstr "" "Impossível mudar o valor das transações de segurança usando o diálogo para " "modificar transações múltiplas." #: ledgerdialog.cpp:553 transactionlistwidget.cpp:495 #, kde-format msgid "Cannot change description of dividends and security transactions." msgstr "Impossível mudar a descrição de dividendos e transações de segurança;" #: ledgerdialog.cpp:559 transactionlistwidget.cpp:501 #, kde-format msgid "Cannot change payer of dividends and security transactions." msgstr "Impossível mudar o sacado de dividendos e transações de segurança;" #: ledgerdialog.cpp:565 transactionlistwidget.cpp:507 #, kde-format msgid "" "Cannot change date of transactions that are part of a split transaction." msgstr "" "Impossível mudar a data das transações que são parte de uma transação " "divídida." #: main.cpp:39 msgid "Eqonomize!" msgstr "Eqonomize!" #: main.cpp:39 msgid "A personal accounting program" msgstr "Um programa de gerenceiamento financeiro pessoal" #: main.cpp:39 msgid "(C) 2008 Hanna K." msgstr "" #: main.cpp:40 msgid "Hanna K." msgstr "" #: main.cpp:44 msgid "Start with expenses list displayed" msgstr "Começar com a lista de despesas exibidas." #: main.cpp:46 msgid "Start with incomes list displayed" msgstr "Começar com a lista de receitas vizualizadas." #: main.cpp:48 msgid "Start with transfers list displayed" msgstr "Começar com a lista de transações vizualizadas." #: main.cpp:49 msgid "Document to open" msgstr "Documento para abrir" #: overtimechart.cpp:124 overtimechart.cpp.bak:117 #, kde-format msgid "Incomes and Expenses" msgstr "Despesas e Receitas" #: overtimechart.cpp:125 overtimechart.cpp:1722 overtimechart.cpp.bak:118 #: overtimechart.cpp.bak:1703 overtimereport.cpp:102 overtimereport.cpp:343 #, kde-format msgid "Profits" msgstr "Rendas" #: overtimechart.cpp:132 overtimechart.cpp:411 overtimechart.cpp:1949 #: overtimechart.cpp.bak:125 overtimechart.cpp.bak:404 #: overtimechart.cpp.bak:1950 overtimereport.cpp:108 overtimereport.cpp:228 #: overtimereport.cpp:753 #, kde-format msgid "All Categories Combined" msgstr "Todas categórias Comibinadas" #: overtimechart.cpp:138 overtimechart.cpp:296 overtimechart.cpp:400 #: overtimechart.cpp:1852 overtimechart.cpp:1973 overtimechart.cpp.bak:131 #: overtimechart.cpp.bak:289 overtimechart.cpp.bak:393 #: overtimechart.cpp.bak:1853 overtimechart.cpp.bak:1974 #: overtimereport.cpp:113 overtimereport.cpp:176 overtimereport.cpp:225 #: overtimereport.cpp:710 overtimereport.cpp:776 #, kde-format msgid "All Descriptions Combined" msgstr "Todas descrições Comibinadas" #: overtimechart.cpp:146 overtimechart.cpp:406 overtimechart.cpp.bak:139 #: overtimechart.cpp.bak:399 #, kde-format msgid "All Payees/Payers Combined" msgstr "Todas emitentes/sacados Comibinadas" #: overtimechart.cpp:155 overtimechart.cpp.bak:148 #, kde-format msgid "Start date:" msgstr "Data de início" #: overtimechart.cpp:178 overtimechart.cpp.bak:171 #, kde-format msgid "End date:" msgstr "Data final:" #: overtimechart.cpp:197 overtimechart.cpp.bak:190 #, kde-format msgid "Monthly total" msgstr "Total mensal" #: overtimechart.cpp:201 overtimechart.cpp.bak:194 #, kde-format msgid "Daily average" msgstr "Média diéria" #: overtimechart.cpp:304 overtimechart.cpp:404 overtimechart.cpp:1855 #: overtimechart.cpp:1978 overtimechart.cpp.bak:297 overtimechart.cpp.bak:397 #: overtimechart.cpp.bak:1856 overtimechart.cpp.bak:1979 #, kde-format msgid "All Payers Combined" msgstr "Todos sacados (pagadores) combinados" #: overtimechart.cpp:305 overtimechart.cpp:405 overtimechart.cpp:1856 #: overtimechart.cpp:1977 overtimechart.cpp.bak:298 overtimechart.cpp.bak:398 #: overtimechart.cpp.bak:1857 overtimechart.cpp.bak:1978 #, kde-format msgid "All Payees Combined" msgstr "Todos emitentes combinados" #: overtimechart.cpp:325 overtimechart.cpp:1853 overtimechart.cpp.bak:318 #: overtimechart.cpp.bak:1854 #, kde-format msgid "All Descriptions Split" msgstr "Todas descrições divídidas" #: overtimechart.cpp:328 overtimechart.cpp:1857 overtimechart.cpp.bak:321 #: overtimechart.cpp.bak:1858 #, kde-format msgid "All Payers Split" msgstr "Todos sacados divídidos" #: overtimechart.cpp:329 overtimechart.cpp:1858 overtimechart.cpp.bak:322 #: overtimechart.cpp.bak:1859 #, kde-format msgid "All Payees Split" msgstr "Todos emitentes divididos" #: overtimechart.cpp:413 overtimechart.cpp:423 overtimechart.cpp:1950 #: overtimechart.cpp.bak:406 overtimechart.cpp.bak:416 #: overtimechart.cpp.bak:1951 #, kde-format msgid "All Categories Split" msgstr "Todas categorias dividídas." #: overtimechart.cpp:1535 overtimechart.cpp.bak:1516 #, kde-format msgid "Value (%1)" msgstr "Valoe (%1)" #: overtimechart.cpp:1536 overtimechart.cpp.bak:1517 #, kde-format msgid "Profit (%1)" msgstr "Renda (%1)" #: overtimechart.cpp:1537 overtimechart.cpp.bak:1518 #, kde-format msgid "Income (%1)" msgstr "Lucro (%1)" #: overtimechart.cpp:1538 overtimechart.cpp.bak:1519 #, kde-format msgid "Cost (%1)" msgstr "Custo (%1)" #: overtimechart.cpp:1579 overtimechart.cpp.bak:1560 #, kde-format msgid "Time" msgstr "Hora" #: overtimechart.cpp:1774 overtimechart.cpp:1775 overtimechart.cpp.bak:1755 #: overtimechart.cpp.bak:1756 #, kde-format msgid "no payer" msgstr "nenhuma devedor" #: overtimechart.cpp:1778 overtimechart.cpp.bak:1759 #, kde-format msgctxt "%1: Description; %2: Payer" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp:1783 overtimechart.cpp:1784 overtimechart.cpp.bak:1764 #: overtimechart.cpp.bak:1765 #, kde-format msgid "no payee" msgstr "nenhum emitente" #: overtimechart.cpp:1787 overtimechart.cpp.bak:1768 #, kde-format msgctxt "%1: Description; %2: Payee" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp.bak:649 #, kde-format msgid "Error after saving file; data may not have been saved." msgstr "Erro depois do salvamento, o conteúdo pode não ter sido salvo." #: overtimereport.cpp:344 #, kde-format msgid "Average Profit" msgstr "Lucro médio" #: overtimereport.cpp:537 #, kde-format msgid "Year" msgstr "Ano" #: overtimereport.cpp:538 #, kde-format msgid "Month" msgstr "Mês" #: overtimereport.cpp:566 #, kde-format msgid "Includes scheduled transactions" msgstr "Incluir transações agendadas." #: overtimereport.cpp:570 #, kde-format msgid "Adjusted for the average month / year (%1 / %2 days)" msgstr "Ajustado para o mês/ano (%1 / %3 dias)" #: overtimereport.cpp:603 overtimereport.cpp:671 #, kde-format msgid "Subtotal" msgstr "Subtotal" #: qifimport.cpp:307 qifimport.cpp:367 qifimportexport.cpp:1259 #: qifimportexport.cpp:1350 qifimportexport.cpp:1470 #, kde-format msgid "Unnamed" msgstr "Sem nome" #: qifimport.cpp:337 qifimportexport.cpp:1299 qifimportexport.cpp:1413 #, kde-format msgid "Uncategorized" msgstr "Não categorizado" #: qifimportexport.cpp:56 #, kde-format msgid "Import QIF file" msgstr "Importar arquivo QIF" #: qifimportexport.cpp:63 #, kde-format msgid "" "Select a QIF file to import. When you click next, the file be analysed and " "you might need to answer some questions about the format of the file." msgstr "" "Selecionar um arquivo QIF para importar. Quando você clicar em próximo, o " "arquivo será analisado e talvez seja necessário responder algumas questões " "sobre o formato do arquivo." #: qifimportexport.cpp:73 #, kde-format msgid "Local Definitions" msgstr "Definições locais," #: qifimportexport.cpp:74 #, kde-format msgid "" "Unknown elements where found in the QIF file. It is possible that this is " "because of localized type names. Please map them to the correct standard " "names." msgstr "" "Elementos desconhecidos foram encontrados no arquivo QIF. Isso é possível " "por arquivos digitados localizados, Por favor mapeiem eles para os padrões " "corretos." #: qifimportexport.cpp:80 #, kde-format msgid "Local Text" msgstr "Texto local" #: qifimportexport.cpp:81 #, kde-format msgid "Standard Text" msgstr "Texto Padrão" #: qifimportexport.cpp:84 #, kde-format msgid "Select standard text:" msgstr "Texto padrão selecionado" #: qifimportexport.cpp:90 #, kde-format msgid "Date Format" msgstr "Formato da Data" #: qifimportexport.cpp:91 #, kde-format msgid "" "The date format in the QIF file is ambiguous. Please select the correct " "format." msgstr "" "O formato de data deste arquivo QIF é ambíguo. Por favor selecione o formato " "correto." #: qifimportexport.cpp:100 #, kde-format msgid "Default Account" msgstr "Conta padrão" #: qifimportexport.cpp:101 #, kde-format msgid "" "Could not find any account definitions in the QIF file. Please select a " "default account. It is also possible that this is caused by a localized " "opening balance text." msgstr "" "Não foi possível achar nenhuma conta definida neste arquivo QIF. Por favor " "selecione a conta padrão. Isso pode ocorrer por causa de um texto de " "abertura de balanço localizado." #: qifimportexport.cpp:104 #, kde-format msgid "Default account:" msgstr "Conta padrão:" #: qifimportexport.cpp:115 #, kde-format msgid "Opening balance text:" msgstr "Texto de abertura de balanço:" #: qifimportexport.cpp:121 #, kde-format msgid "Descriptions" msgstr "Descrições" #: qifimportexport.cpp:122 #, kde-format msgid "" "Transactions in QIF files does not have any specific description property. " "You are therefore given the option to choose how the description of imported " "transactions will be set." msgstr "" "As transações em arquivos QIF não precisam ter nenhuma descrição própria " "específicada. Você, tem, então a opção de como a descrição das transações " "importadas serão definidas." #: qifimportexport.cpp:125 #, kde-format msgid "Subcategories as:" msgstr "Subcategorias como:" #: qifimportexport.cpp:134 #, kde-format msgid "Ignore" msgstr "Ignorar" #: qifimportexport.cpp:137 #, kde-format msgid "Payee as:" msgstr "Credor como:" #: qifimportexport.cpp:142 qifimportexport.cpp:520 #: transactionlistwidget.cpp:119 #, kde-format msgid "Payee" msgstr "Credor" #: qifimportexport.cpp:147 #, kde-format msgid "Memo as:" msgstr "Anotações:" #: qifimportexport.cpp:156 #, kde-format msgid "Priority:" msgstr "Prioridade" #: qifimportexport.cpp:159 #, kde-format msgid "Subcategory/Payee/Comments" msgstr "Subcategoria/Credor/Comentários" #: qifimportexport.cpp:160 #, kde-format msgid "Payee/Subcategory/Comments" msgstr "Credor/subcategoria/Comentários" #: qifimportexport.cpp:161 #, kde-format msgid "Subcategory/Comments/Payee" msgstr "Subcategoria/Comentários/Credor" #: qifimportexport.cpp:162 #, kde-format msgid "Payee/Comments/Subcategory" msgstr "Emitente/Comentários/Subcategorias" #: qifimportexport.cpp:163 #, kde-format msgid "Comments/Subcategory/Payee" msgstr "Comentários/Subcategorias/Emitentes" #: qifimportexport.cpp:164 #, kde-format msgid "Comments/Payee/Subcategory" msgstr "Comentários/Emitentes/Subcategorias" #: qifimportexport.cpp:314 qifimportexport.cpp:322 qifimportexport.cpp:338 #, kde-format msgid "Unknown" msgstr "Disconhecido" #: qifimportexport.cpp:324 #, kde-format msgid "Bank" msgstr "Banco" #: qifimportexport.cpp:326 #, kde-format msgid "Cat (Category)" msgstr "Cat (Categoria)" #: qifimportexport.cpp:327 #, kde-format msgid "CCard (Credit Card)" msgstr "Ccrédito (Cartão de crédito)" #: qifimportexport.cpp:328 #, kde-format msgid "Invst (Investment)" msgstr "Invst (investimento)" #: qifimportexport.cpp:329 #, kde-format msgid "Oth A (Other Assets)" msgstr "Oth A (Outros ativos)" #: qifimportexport.cpp:330 #, kde-format msgid "Oth L (Other Liabilities)" msgstr "Other L (Outros recursos)" #: qifimportexport.cpp:331 #, kde-format msgid "Security" msgstr "Segurança" #: qifimportexport.cpp:465 #, kde-format msgid "Successfully imported 1 account." msgid_plural "Successfully imported %n accounts." msgstr[0] "1 conta importada com sucesso" msgstr[1] "%n contas importadascom sucesso." #: qifimportexport.cpp:469 #, kde-format msgid "Successfully imported 1 category." msgid_plural "Successfully imported %n categories." msgstr[0] "1 categoria importada com sucesso" msgstr[1] "%n categorias importadascom sucesso." #: qifimportexport.cpp:473 #, kde-format msgid "1 duplicate transaction was ignored." msgid_plural "%n duplicate transactions was ignored." msgstr[0] "1 transação duplicada foi ignorada." msgstr[1] "%n transações duplicadas foram ignoradas." #: qifimportexport.cpp:477 #, kde-format msgid "Failed to import 1 transaction." msgid_plural "Failed to import %n transactions." msgstr[0] "1 transação falhou ao importar." msgstr[1] "%n falharam ao importar." #: qifimportexport.cpp:481 #, kde-format msgid "1 security was not imported." msgid_plural "%n securities were not imported." msgstr[0] "1 segurança não foi importada." msgstr[1] "%n seguranças não foram importadas." #: qifimportexport.cpp:485 #, kde-format msgid "1 security transaction was not imported." msgid_plural "%n security transactions were not imported." msgstr[0] "1 transação de segurança não foi importada." msgstr[1] "%n transações de segurança não foram importadas." #: qifimportexport.cpp:494 #, kde-format msgid "Export QIF File" msgstr "Exportar arquivo QIF" #: qifimportexport.cpp:506 #, kde-format msgctxt "All accounts" msgid "All" msgstr "Tudo" #: qifimportexport.cpp:517 #, kde-format msgid "Export transaction description as:" msgstr "Exportar descrição de transações como:" #: qifimportexport.cpp:524 #, kde-format msgid "Memo" msgstr "Memorando" #: qifimportexport.cpp:528 #, kde-format msgid "Subcategory" msgstr "Subcategoria" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 5 #: rc.cpp:3 #, kde-format msgid "&Import" msgstr "&Importar" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 12 #: rc.cpp:6 #, kde-format msgid "&Accounts" msgstr "&Contas" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 24 #: rc.cpp:9 #, kde-format msgid "&Transactions" msgstr "&Transações" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 41 #: rc.cpp:12 #, kde-format msgid "&Securities" msgstr "&Seguranças" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 56 #: rc.cpp:15 #, kde-format msgid "Stat&istics" msgstr "Stat&isticas" #: rc.cpp:16 #, kde-format msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" ",Launchpad Contributions:,Francisco Matelli,Renato Rosa,gabrielgv,,Launchpad " "Contributions:,Francisco Matelli,Renato Rosa,gabrielgv" #: rc.cpp:17 #, kde-format msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" ",,emailqueeuleio@gmail.com,,gabriel.velloso@gmail.com,,,emailqueeuleio@gmail." "com,,gabriel.velloso@gmail.com" #: recurrenceeditwidget.cpp:69 #, kde-format msgid "Edit Exceptions" msgstr "Editar Exceções" #: recurrenceeditwidget.cpp:186 #, kde-format msgid "Edit Recurrence Range" msgstr "Editar Intervalo de Recorrência" #: recurrenceeditwidget.cpp:194 recurrenceeditwidget.cpp:229 #, kde-format msgid "Begins on: %1" msgstr "Começa em: %1" #: recurrenceeditwidget.cpp:199 #, kde-format msgid "No ending date" msgstr "Nenhuma data de término" #: recurrenceeditwidget.cpp:203 #, kde-format msgid "End after" msgstr "Final depois" #: recurrenceeditwidget.cpp:209 #, kde-format msgid "occurrence(s)" msgstr "ocorrência(s)" #: recurrenceeditwidget.cpp:211 #, kde-format msgid "End on" msgstr "Final em" #: recurrenceeditwidget.cpp:298 #, kde-format msgid "End date before start date." msgstr "Data de término antes da data de ínicio" #: recurrenceeditwidget.cpp:312 #, kde-format msgid "Enable recurrance" msgstr "Habilirae Recorrência" #: recurrenceeditwidget.cpp:315 #, kde-format msgid "Recurrence Rule" msgstr "Regra de Recorrência" #: recurrenceeditwidget.cpp:321 #, kde-format msgid "Weekly" msgstr "Semanal" #: recurrenceeditwidget.cpp:341 recurrenceeditwidget.cpp:352 #: recurrenceeditwidget.cpp:376 recurrenceeditwidget.cpp:462 #, kde-format msgid "Recur every" msgstr "Recorrer sempre" #: recurrenceeditwidget.cpp:345 #, kde-format msgid "day(s)" msgstr "dia(s)" #: recurrenceeditwidget.cpp:356 #, kde-format msgid "week(s) on:" msgstr "semana(s) em:" #: recurrenceeditwidget.cpp:380 #, kde-format msgid "month(s), after the start month" msgstr "mês(es), depois do mês de ínicio" #: recurrenceeditwidget.cpp:385 recurrenceeditwidget.cpp:437 #, kde-format msgid "Recur on the" msgstr "Recorrência no" #: recurrenceeditwidget.cpp:391 recurrenceeditwidget.cpp:442 #: recurrenceeditwidget.cpp:494 #, kde-format msgid "1st" msgstr "1º" #: recurrenceeditwidget.cpp:392 recurrenceeditwidget.cpp:443 #: recurrenceeditwidget.cpp:495 #, kde-format msgid "2nd" msgstr "2º" #: recurrenceeditwidget.cpp:393 recurrenceeditwidget.cpp:444 #: recurrenceeditwidget.cpp:496 #, kde-format msgid "3rd" msgstr "3º" #: recurrenceeditwidget.cpp:394 recurrenceeditwidget.cpp:445 #: recurrenceeditwidget.cpp:497 #, kde-format msgid "4th" msgstr "4º" #: recurrenceeditwidget.cpp:395 recurrenceeditwidget.cpp:446 #: recurrenceeditwidget.cpp:498 #, kde-format msgid "5th" msgstr "5º" #: recurrenceeditwidget.cpp:396 #, kde-format msgid "6th" msgstr "6º" #: recurrenceeditwidget.cpp:397 #, kde-format msgid "7th" msgstr "7º" #: recurrenceeditwidget.cpp:398 #, kde-format msgid "8th" msgstr "8º" #: recurrenceeditwidget.cpp:399 #, kde-format msgid "9th" msgstr "9º" #: recurrenceeditwidget.cpp:400 #, kde-format msgid "10th" msgstr "10º" #: recurrenceeditwidget.cpp:401 #, kde-format msgid "11th" msgstr "11º" #: recurrenceeditwidget.cpp:402 #, kde-format msgid "12th" msgstr "12º" #: recurrenceeditwidget.cpp:403 #, kde-format msgid "13th" msgstr "13º" #: recurrenceeditwidget.cpp:404 #, kde-format msgid "14th" msgstr "14º" #: recurrenceeditwidget.cpp:405 #, kde-format msgid "15th" msgstr "15º" #: recurrenceeditwidget.cpp:406 #, kde-format msgid "16th" msgstr "16º" #: recurrenceeditwidget.cpp:407 #, kde-format msgid "17th" msgstr "17º" #: recurrenceeditwidget.cpp:408 #, kde-format msgid "18th" msgstr "18º" #: recurrenceeditwidget.cpp:409 #, kde-format msgid "19th" msgstr "19º" #: recurrenceeditwidget.cpp:410 #, kde-format msgid "20th" msgstr "20º" #: recurrenceeditwidget.cpp:411 #, kde-format msgid "21st" msgstr "21º" #: recurrenceeditwidget.cpp:412 #, kde-format msgid "22nd" msgstr "22º" #: recurrenceeditwidget.cpp:413 #, kde-format msgid "23rd" msgstr "23º" #: recurrenceeditwidget.cpp:414 #, kde-format msgid "24th" msgstr "24º" #: recurrenceeditwidget.cpp:415 #, kde-format msgid "25th" msgstr "25º" #: recurrenceeditwidget.cpp:416 #, kde-format msgid "26th" msgstr "26º" #: recurrenceeditwidget.cpp:417 #, kde-format msgid "27th" msgstr "27º" #: recurrenceeditwidget.cpp:418 #, kde-format msgid "28th" msgstr "28º" #: recurrenceeditwidget.cpp:419 #, kde-format msgid "29th" msgstr "29º" #: recurrenceeditwidget.cpp:420 #, kde-format msgid "30th" msgstr "30º" #: recurrenceeditwidget.cpp:421 #, kde-format msgid "31st" msgstr "31º" #: recurrenceeditwidget.cpp:422 recurrenceeditwidget.cpp:447 #: recurrenceeditwidget.cpp:499 #, kde-format msgid "Last" msgstr "Última" #: recurrenceeditwidget.cpp:423 recurrenceeditwidget.cpp:448 #: recurrenceeditwidget.cpp:500 #, kde-format msgid "2nd Last" msgstr "Penúltima" #: recurrenceeditwidget.cpp:424 recurrenceeditwidget.cpp:449 #: recurrenceeditwidget.cpp:501 #, kde-format msgid "3rd Last" msgstr "Antepenúltima" #: recurrenceeditwidget.cpp:425 recurrenceeditwidget.cpp:450 #: recurrenceeditwidget.cpp:502 #, kde-format msgid "4th Last" msgstr "Antes da antepenúltima" #: recurrenceeditwidget.cpp:426 recurrenceeditwidget.cpp:451 #: recurrenceeditwidget.cpp:503 #, kde-format msgid "5th Last" msgstr "Dois antes da antepenúltima" #: recurrenceeditwidget.cpp:429 #, kde-format msgid "day" msgstr "dia" #: recurrenceeditwidget.cpp:431 recurrenceeditwidget.cpp:483 #: recurrenceeditwidget.cpp:521 #, kde-format msgid "possibly on weekend" msgstr "possívelmente no final de semana" #: recurrenceeditwidget.cpp:432 recurrenceeditwidget.cpp:484 #: recurrenceeditwidget.cpp:522 #, kde-format msgid "but before weekend" msgstr "mas antes do final de semana" #: recurrenceeditwidget.cpp:433 recurrenceeditwidget.cpp:485 #: recurrenceeditwidget.cpp:523 #, kde-format msgid "but after weekend" msgstr "mas depois do final de semana" #: recurrenceeditwidget.cpp:466 #, kde-format msgid "year(s), after the start year" msgstr "ano(s), depois do ano de começo" #: recurrenceeditwidget.cpp:471 #, kde-format msgctxt "part before XXX of 'Recur on day XXX of month YYY'" msgid "Recur on day" msgstr "Recurso no dia" #: recurrenceeditwidget.cpp:479 #, kde-format msgctxt "part between XXX and YYY of 'Recur on day XXX of month YYY'" msgid "of" msgstr "of" #: recurrenceeditwidget.cpp:489 #, kde-format msgctxt "Part before NNN in 'Recur on the NNN. WEEKDAY of MONTH'" msgid "On the" msgstr "Outro" #: recurrenceeditwidget.cpp:507 #, kde-format msgctxt "part between WEEKDAY and MONTH in 'Recur on NNN. WEEKDAY of MONTH'" msgid "of" msgstr "of" #: recurrenceeditwidget.cpp:512 #, kde-format msgid "Recur on day #" msgstr "Recurso no dia#" #: recurrenceeditwidget.cpp:519 #, kde-format msgctxt "part after NNN of 'Recur on day #NNN of the year'" msgid " of the year" msgstr " do ano" #: recurrenceeditwidget.cpp:533 #, kde-format msgid "Range..." msgstr "Distância..." #: recurrenceeditwidget.cpp:535 #, kde-format msgid "Exceptions..." msgstr "Exceções..." #: recurrenceeditwidget.cpp:731 #, kde-format msgid "No day of week selected for weekly recurrence." msgstr "Nenhum dia da semana selecionada para a Recorrência semanal." #: recurrenceeditwidget.cpp:745 recurrenceeditwidget.cpp:774 #: recurrenceeditwidget.cpp:791 #, kde-format msgid "Selected day will never occur with selected frequency and start date." msgstr "O dia selecionado nunca ocorrerá com frequência e data inicial." #: recurrenceeditwidget.cpp:761 #, kde-format msgid "Selected day does not exist in selected month." msgstr "O dia selecionado não existe neste mês." #: transaction.cpp:155 transaction.cpp:186 #, kde-format msgid "Dividend: %1" msgstr "Dividendo: %1" #: transaction.cpp:253 transaction.cpp:256 transaction.cpp:284 #, kde-format msgid "Account balancing" msgstr "Balanceamento da conta" #: transaction.cpp:337 transaction.cpp:352 #, kde-format msgid "Security: %1 (bought)" msgstr "Segurança: %1 (comprado)" #: transaction.cpp:375 transaction.cpp:390 #, kde-format msgid "Security: %1 (sold)" msgstr "Segurança: %1 (vendido)" #: transactioneditwidget.cpp:125 #, kde-format msgid "Shares bought:" msgstr "Ações compradas:" #: transactioneditwidget.cpp:130 #, kde-format msgid "Shares sold:" msgstr "Ações vendidas" #: transactioneditwidget.cpp:238 transactioneditwidget.cpp:1144 #: transactionfilterwidget.cpp:140 #, kde-format msgid "Payer:" msgstr "Devedor:" #: transactioneditwidget.cpp:280 transactioneditwidget.cpp:1145 #: transactionfilterwidget.cpp:141 #, kde-format msgid "Payee:" msgstr "Emitente:" #: transactioneditwidget.cpp:664 transactioneditwidget.cpp:1262 #, kde-format msgid "No income category available." msgstr "Nenhuma categoria de receita avaliável." #: transactioneditwidget.cpp:689 transactioneditwidget.cpp:1270 #, kde-format msgid "No expense category available." msgstr "Nenhuma categoria de despesa avaliável." #: transactioneditwidget.cpp:720 #, kde-format msgid "Cannot create a regular transfer to/from a securities account." msgstr "" "Impossível criar uma transferância regular de/para contas de segurança." #: transactioneditwidget.cpp:727 #, kde-format msgid "Cannot create a regular income to a securities account." msgstr "Impossível crirar receitas regulares em contas de segurança." #: transactioneditwidget.cpp:743 #, kde-format msgid "Zero price per share not allowed." msgstr "Preço zero por ação não é permitido." #: transactioneditwidget.cpp:755 #, kde-format msgid "Cannot create a regular expense from a securities account." msgstr "Impossível crirar despesas regulares em contas de segurança." #: transactioneditwidget.cpp:1086 #, kde-format msgid "Modify Transactions" msgstr "Modificar Transações" #: transactionfilterwidget.cpp:99 #, kde-format msgid "Min amount:" msgstr "Quantia mínima:" #: transactionfilterwidget.cpp:100 #, kde-format msgid "Max amount:" msgstr "Quantia máxima:" #: transactionfilterwidget.cpp:110 #, kde-format msgid "Min income:" msgstr "Receita mínima:" #: transactionfilterwidget.cpp:111 #, kde-format msgid "Max income:" msgstr "Receita máxima:" #: transactionfilterwidget.cpp:121 #, kde-format msgid "Min cost:" msgstr "Custo mínimo:" #: transactionfilterwidget.cpp:122 #, kde-format msgid "Max cost:" msgstr "Receita máximo:" #: transactionfilterwidget.cpp:148 #, kde-format msgid "Include" msgstr "Incluir" #: transactionfilterwidget.cpp:152 #, kde-format msgid "Exclude" msgstr "Excluir" #: transactionlistwidget.cpp:117 #, kde-format msgid "From Account" msgstr "Da Conta" #: transactionlistwidget.cpp:128 #, kde-format msgid "To Account" msgstr "Para Conta" #: transactionlistwidget.cpp:130 #, kde-format msgid "Payer" msgstr "Sacado (devedor)" #: transactionlistwidget.cpp:169 #, kde-format msgid "New/Edit Expense" msgstr "Novo/Editar Despesa" #: transactionlistwidget.cpp:170 #, kde-format msgid "Filter" msgstr "Filtro" #: transactionlistwidget.cpp:209 #, kde-format msgid "Total:" msgstr "Total:" #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:328 #, kde-format msgid "Average:" msgstr "Média:" #: transactionlistwidget.cpp:209 #, kde-format msgid "Monthly:" msgstr "Mensalmente:" #: transactionlistwidget.cpp:314 #, kde-format msgid "Total cost:" msgstr "Custo total:" #: transactionlistwidget.cpp:318 #, kde-format msgid "Total income:" msgstr "Receita total:" #: transactionlistwidget.cpp:322 #, kde-format msgid "Total amount:" msgstr "Total:" #: transactionlistwidget.cpp:330 #, kde-format msgid "Monthly average:" msgstr "Balanço mensal" #: transactionlistwidget.cpp:671 #, kde-format msgid "" "Are you sure you want to delete all (%1) transactions in the selected split " "transaction?" msgstr "" "Você tem certeza que quer deletar todas (%1) transações selecionada dessa " "parcela?" #: transactionlistwidget.cpp:1028 #, kde-format msgid "* Part of split transaction" msgstr "*Parte de parcela de um transação." #: transactionlistwidget.cpp:1029 #, kde-format msgid "* Part of split (%1)" msgstr "Parte da parcela (%1)" #: transactionlistwidget.cpp:1033 #, kde-format msgid "** Recurring (editing occurrance)" msgstr "**Recorrendo (editar ocorrência)" #: transactionlistwidget.cpp:1049 #, kde-format msgid "Modify..." msgstr "Modificar..." eqonomize-0.6/po/ru.po0000644000175000017500000025445711107053374013747 0ustar hannahanna# translation of de.po_[ZeHf9a].po to # translation of de.po to # This file is put in the public domain. # # Elias Probst , 2006. # Martin Hohenberg , 2006. # Elias Probst , 2007. msgid "" msgstr "" "Project-Id-Version: ru.po\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?" "group_id=173799&atid=866832\n" "POT-Creation-Date: 2008-11-13 14:35+0100\n" "PO-Revision-Date: 2008-08-01 15:46+0000\n" "Last-Translator: Vitaliy Berdinskikh \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2008-11-13 13:21+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: RUSSIAN FEDERATION\n" "X-Poedit-Language: Russian\n" "X-Poedit-SourceCharset: utf-8\n" #: budget.cpp:51 editsplitdialog.cpp:118 ledgerdialog.cpp:652 #, kde-format msgid "Balancing" msgstr "Баланс" #: budget.cpp:84 #, kde-format msgid "Couldn't open %1 for reading" msgstr "Не могу открыть %1 для чтения" #: budget.cpp:95 #, kde-format msgid "" "Not a valid Eqonomize! file (XML parse error: \"%2\" at line %3, col %4)" msgstr "" "Не правильный Eqonomize! файл (Ошибка разбора XML: \"%2\" в линии %3, " "позиции %4)" #: budget.cpp:98 #, kde-format msgid "Invalid root element %1 in XML document" msgstr "Неверный корневой элемент %1 в XML документе" #: budget.cpp:363 #, kde-format msgid "Unable to load 1 account." msgid_plural "Unable to load %n accounts." msgstr[0] "_n: Невозможно загрузить 1 счет." msgstr[1] "Невозможно загрузить %n счета." #: budget.cpp:368 #, kde-format msgid "Unable to load 1 category." msgid_plural "Unable to load %n categories." msgstr[0] "_n: Невозможно загрузить 1 категорию." msgstr[1] "Невозможно загрузить %n категорий." #: budget.cpp:373 #, kde-format msgid "Unable to load 1 security." msgid_plural "Unable to load %n securities." msgstr[0] "_n: Невозможно загрузить 1 ценную бумагу" msgstr[1] "Невозможно загрузить %n ценных бумаг." #: budget.cpp:378 #, kde-format msgid "Unable to load 1 transaction." msgid_plural "Unable to load %n transactions." msgstr[0] "_n: Невозможно загрузить 1 транзакцию." msgstr[1] "Невозможно загрузить %n транзакций." #: budget.cpp:389 #, kde-format msgid "File is a directory" msgstr "" #: budget.cpp:397 #, kde-format msgid "Couldn't open file for writing" msgstr "Невозможно открыть файл на запись" #: budget.cpp:547 budget.cpp:551 #, kde-format msgid "Error while writing file; file was not saved" msgstr "Ошибка записи в файл. Файл не сохранен." #: categoriescomparisonchart.cpp:123 categoriescomparisonreport.cpp:164 #: eqonomize.cpp:1797 eqonomize.cpp:1957 eqonomize.cpp:2036 #: transactionlistwidget.cpp:138 #, kde-format msgid "From" msgstr "Из" #: categoriescomparisonchart.cpp:130 categoriescomparisonreport.cpp:171 #: eqonomize.cpp:1808 eqonomize.cpp:1969 eqonomize.cpp:2037 #: transactionlistwidget.cpp:139 #, kde-format msgid "To" msgstr "К" #: categoriescomparisonchart.cpp:147 categoriescomparisonreport.cpp:114 #: overtimechart.cpp:112 overtimechart.cpp.bak:106 overtimereport.cpp:97 #, kde-format msgid "Source:" msgstr "Источник:" #: categoriescomparisonchart.cpp:150 categoriescomparisonchart.cpp:858 #, kde-format msgid "All Expenses" msgstr "" #: categoriescomparisonchart.cpp:151 categoriescomparisonchart.cpp:859 #, kde-format msgid "All Incomes" msgstr "" #: categoriescomparisonchart.cpp:152 categoriescomparisonchart.cpp:860 #, kde-format msgid "All Accounts" msgstr "" #: categoriescomparisonchart.cpp:155 categoriescomparisonchart.cpp:864 #: categoriescomparisonreport.cpp:122 categoriescomparisonreport.cpp:752 #: categoriescomparisonreport.cpp:1016 overtimereport.cpp:375 #, kde-format msgid "Expenses: %1" msgstr "Расходы: %1" #: categoriescomparisonchart.cpp:160 categoriescomparisonchart.cpp:871 #: categoriescomparisonreport.cpp:127 categoriescomparisonreport.cpp:756 #: categoriescomparisonreport.cpp:1023 overtimereport.cpp:366 #, kde-format msgid "Incomes: %1" msgstr "Доходы: %1" #: categoriescomparisonchart.cpp:199 categoriescomparisonchart.cpp:225 #: categoriescomparisonreport.cpp:334 categoriescomparisonreport.cpp:360 #: editsplitdialog.cpp:411 eqonomize.cpp:482 eqonomize.cpp:571 #: eqonomize.cpp:741 eqonomize.cpp:848 eqonomize.cpp:870 eqonomize.cpp:2483 #: eqonomize.cpp:3180 eqonomize.cpp:3206 eqonomize.cpp:3326 eqonomize.cpp:3352 #: importcsvdialog.cpp:780 importcsvdialog.cpp:1196 overtimechart.cpp:462 #: overtimechart.cpp:500 overtimechart.cpp:528 overtimechart.cpp:566 #: overtimechart.cpp.bak:455 overtimechart.cpp.bak:493 #: overtimechart.cpp.bak:521 overtimechart.cpp.bak:559 #: recurrenceeditwidget.cpp:156 recurrenceeditwidget.cpp:171 #: recurrenceeditwidget.cpp:293 transactioneditwidget.cpp:707 #: transactioneditwidget.cpp:1281 transactionfilterwidget.cpp:564 #: transactionfilterwidget.cpp:590 #, kde-format msgid "Invalid date." msgstr "Неверные данные." #: categoriescomparisonchart.cpp:204 categoriescomparisonreport.cpp:339 #: eqonomize.cpp:3185 eqonomize.cpp:3331 transactionfilterwidget.cpp:569 #, kde-format msgid "To date is before from date." msgstr "" #: categoriescomparisonchart.cpp:229 categoriescomparisonreport.cpp:364 #: eqonomize.cpp:3210 eqonomize.cpp:3356 transactionfilterwidget.cpp:594 #, kde-format msgid "From date is after to date." msgstr "" #: categoriescomparisonchart.cpp:340 categoriescomparisonreport.cpp:463 #: eqonomize.cpp:3610 eqonomize.cpp:4252 ledgerdialog.cpp:251 #: overtimechart.cpp:624 overtimechart.cpp.bak:617 overtimereport.cpp:278 #: qifimportexport.cpp:604 #, kde-format msgid "" "The selected file already exists. Would you like to overwrite the old copy?" msgstr "Выбранный файл уже открыт. Хотите перезаписать старую копию?" #: categoriescomparisonchart.cpp:344 categoriescomparisonreport.cpp:467 #: eqonomize.cpp:4257 ledgerdialog.cpp:255 overtimechart.cpp:628 #: overtimechart.cpp.bak:621 overtimereport.cpp:282 qifimportexport.cpp:608 #, kde-format msgid "You selected a directory!" msgstr "Вы выбрали директорию!" #: categoriescomparisonchart.cpp:352 categoriescomparisonreport.cpp:475 #: eqonomize.cpp:4264 ledgerdialog.cpp:263 overtimechart.cpp:636 #: overtimechart.cpp.bak:629 overtimereport.cpp:290 qifimportexport.cpp:616 #, kde-format msgid "Couldn't open file for writing." msgstr "Не могу открыть файл для записи." #: categoriescomparisonchart.cpp:372 categoriescomparisonreport.cpp:482 #: eqonomize.cpp:4270 ledgerdialog.cpp:269 overtimechart.cpp:656 #: overtimechart.cpp.bak:644 overtimereport.cpp:297 qifimportexport.cpp:622 #, kde-format msgid "Error while writing file; file was not saved." msgstr "Ошибка чтения файла; Файл не сохранен" #: categoriescomparisonchart.cpp:728 categoriescomparisonreport.cpp:303 #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:754 #: categoriescomparisonreport.cpp:839 categoriescomparisonreport.cpp:930 #: categoriescomparisonreport.cpp:977 overtimechart.cpp:373 #: overtimechart.cpp:1740 overtimechart.cpp:1746 overtimechart.cpp:1774 #: overtimechart.cpp:1776 overtimechart.cpp:1783 overtimechart.cpp:1785 #: overtimechart.cpp:1821 overtimechart.cpp:1891 overtimechart.cpp.bak:366 #: overtimechart.cpp.bak:1721 overtimechart.cpp.bak:1727 #: overtimechart.cpp.bak:1755 overtimechart.cpp.bak:1757 #: overtimechart.cpp.bak:1764 overtimechart.cpp.bak:1766 #: overtimechart.cpp.bak:1811 overtimechart.cpp.bak:1892 #: overtimereport.cpp:213 overtimereport.cpp:384 overtimereport.cpp:393 #: overtimereport.cpp:732 #, kde-format msgid "No description" msgstr "Без описания" #: categoriescomparisonreport.cpp:119 categoriescomparisonreport.cpp:1012 #, kde-format msgid "All Categories" msgstr "Все категории" #: categoriescomparisonreport.cpp:138 #, kde-format msgid "Descriptions for" msgstr "Описание для" #: categoriescomparisonreport.cpp:145 #, kde-format msgid "Payees/payers for" msgstr "Получатель/платильщик для" #: categoriescomparisonreport.cpp:161 #, kde-format msgid "Period:" msgstr "Период:" #: categoriescomparisonreport.cpp:186 overtimereport.cpp:120 #, kde-format msgid "Columns:" msgstr "Колонки:" #: categoriescomparisonreport.cpp:189 categoriescomparisonreport.cpp:782 #: eqonomize.cpp:1062 eqonomize.cpp:1935 eqonomize.cpp:4142 #: importcsvdialog.cpp:139 importcsvdialog.cpp:157 importcsvdialog.cpp:180 #: importcsvdialog.cpp:197 importcsvdialog.cpp:216 importcsvdialog.cpp:235 #: importcsvdialog.cpp:253 overtimereport.cpp:123 #, kde-format msgid "Value" msgstr "Значение" #: categoriescomparisonreport.cpp:192 overtimereport.cpp:126 #: recurrenceeditwidget.cpp:320 #, kde-format msgid "Daily" msgstr "Ежедневно" #: categoriescomparisonreport.cpp:195 overtimereport.cpp:129 #: recurrenceeditwidget.cpp:322 #, kde-format msgid "Monthly" msgstr "Ежемесячно" #: categoriescomparisonreport.cpp:198 overtimereport.cpp:132 #: recurrenceeditwidget.cpp:323 #, kde-format msgid "Yearly" msgstr "Ежегодно" #: categoriescomparisonreport.cpp:201 categoriescomparisonreport.cpp:787 #: overtimechart.cpp:205 overtimechart.cpp:1534 overtimechart.cpp.bak:198 #: overtimechart.cpp.bak:1515 overtimereport.cpp:135 overtimereport.cpp:549 #: transactionlistwidget.cpp:276 transactionlistwidget.cpp:340 #, kde-format msgid "Quantity" msgstr "Количество" #: categoriescomparisonreport.cpp:204 overtimechart.cpp:209 #: overtimechart.cpp.bak:202 overtimereport.cpp:138 #, kde-format msgid "Average value" msgstr "Среднее значение" #: categoriescomparisonreport.cpp:278 categoriescomparisonreport.cpp:947 #, kde-format msgid "All descriptions" msgstr "Все описания" #: categoriescomparisonreport.cpp:279 categoriescomparisonreport.cpp:948 #, kde-format msgid "All payees" msgstr "Все получатели" #: categoriescomparisonreport.cpp:280 categoriescomparisonreport.cpp:949 #, kde-format msgid "All payers" msgstr "Все платильщики" #: categoriescomparisonreport.cpp:309 categoriescomparisonreport.cpp:751 #: categoriescomparisonreport.cpp:837 categoriescomparisonreport.cpp:932 #: categoriescomparisonreport.cpp:994 overtimechart.cpp:382 #: overtimechart.cpp:1758 overtimechart.cpp:1768 overtimechart.cpp:1823 #: overtimechart.cpp:1908 overtimechart.cpp.bak:375 overtimechart.cpp.bak:1739 #: overtimechart.cpp.bak:1749 overtimechart.cpp.bak:1813 #: overtimechart.cpp.bak:1909 #, kde-format msgid "No payee" msgstr "Без получателя" #: categoriescomparisonreport.cpp:310 categoriescomparisonreport.cpp:755 #: categoriescomparisonreport.cpp:838 categoriescomparisonreport.cpp:933 #: categoriescomparisonreport.cpp:995 overtimechart.cpp:381 #: overtimechart.cpp:1752 overtimechart.cpp:1763 overtimechart.cpp:1825 #: overtimechart.cpp:1907 overtimechart.cpp.bak:374 overtimechart.cpp.bak:1733 #: overtimechart.cpp.bak:1744 overtimechart.cpp.bak:1815 #: overtimechart.cpp.bak:1908 #, kde-format msgid "No payer" msgstr "Без платильщика" #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:751 #: overtimereport.cpp:393 #, kde-format msgid "Expenses: %2, %1" msgstr "Расход: %2, %1" #: categoriescomparisonreport.cpp:754 categoriescomparisonreport.cpp:755 #: overtimereport.cpp:384 #, kde-format msgid "Incomes: %2, %1" msgstr "Доход: %2, %1" #: categoriescomparisonreport.cpp:758 #, kde-format msgid "Incomes & Expenses" msgstr "Расход и Доход" #: categoriescomparisonreport.cpp:771 #, kde-format msgctxt "html format; %1: title; %2: from date; %3: to date" msgid "%1 (%2–%3)" msgstr "%1 с %2 по %3" #: categoriescomparisonreport.cpp:772 #, kde-format msgctxt "html format; %1: title; %2: to date" msgid "%1 (to %2)" msgstr "" #: categoriescomparisonreport.cpp:776 eqonomize.cpp:4046 eqonomize.cpp:4094 #: qifimportexport.cpp:131 transactionlistwidget.cpp:116 #: transactionlistwidget.cpp:127 #, kde-format msgid "Category" msgstr "Категория" #: categoriescomparisonreport.cpp:778 eqonomize.cpp:1938 #: transactionlistwidget.cpp:115 #, kde-format msgid "Cost" msgstr "Цена" #: categoriescomparisonreport.cpp:780 editscheduledtransactiondialog.cpp:46 #: editsplitdialog.cpp:108 eqonomize.cpp:285 eqonomize.cpp:329 #: ledgerdialog.cpp:647 transactionlistwidget.cpp:126 #, kde-format msgid "Income" msgstr "Доход" #: categoriescomparisonreport.cpp:784 overtimereport.cpp:545 #, kde-format msgid "Daily Average" msgstr "Средний ежедневный" #: categoriescomparisonreport.cpp:785 overtimereport.cpp:546 #, kde-format msgid "Monthly Average" msgstr "Средний ежемесячный" #: categoriescomparisonreport.cpp:786 overtimereport.cpp:547 #, kde-format msgid "Yearly Average" msgstr "Средний ежегодный" #: categoriescomparisonreport.cpp:789 overtimereport.cpp:358 #: overtimereport.cpp:376 overtimereport.cpp:394 #, kde-format msgid "Average Cost" msgstr "Средняя цена" #: categoriescomparisonreport.cpp:791 overtimereport.cpp:350 #: overtimereport.cpp:367 overtimereport.cpp:385 #, kde-format msgid "Average Income" msgstr "Средний доход" #: categoriescomparisonreport.cpp:793 #, kde-format msgid "Average Value" msgstr "Среднее значение" #: categoriescomparisonreport.cpp:853 eqonomize.cpp:3932 eqonomize.cpp:4030 #: eqonomize.cpp:4075 eqonomize.cpp:4123 overtimereport.cpp:686 #, kde-format msgid "Total" msgstr "Итог" #: categoriescomparisonreport.cpp:878 #, kde-format msgid "Total incomes" msgstr "Итого доходов" #: categoriescomparisonreport.cpp:902 #, kde-format msgid "Total expenses" msgstr "Итого расходов" #: categoriescomparisonreport.cpp:912 #, kde-format msgid "Total (Profits)" msgstr "Итог (Прибыль)" #: editscheduledtransactiondialog.cpp:45 editsplitdialog.cpp:111 #: eqonomize.cpp:288 eqonomize.cpp:332 ledgerdialog.cpp:650 #, kde-format msgid "Expense" msgstr "Расход" #: editscheduledtransactiondialog.cpp:47 editsplitdialog.cpp:120 #: eqonomize.cpp:282 eqonomize.cpp:326 ledgerdialog.cpp:653 #, kde-format msgid "Transfer" msgstr "Перевод" #: editscheduledtransactiondialog.cpp:48 editsplitdialog.cpp:114 #: eqonomize.cpp:289 eqonomize.cpp:333 #, kde-format msgid "Security Buy" msgstr "Покупки ценных бумаг" #: editscheduledtransactiondialog.cpp:49 editsplitdialog.cpp:116 #: eqonomize.cpp:290 eqonomize.cpp:334 #, kde-format msgid "Security Sell" msgstr "Продажи ценных бумаг" #: editscheduledtransactiondialog.cpp:56 editscheduledtransactiondialog.cpp:57 #, kde-format msgid "Recurrence" msgstr "Повторение" #: editscheduledtransactiondialog.cpp:104 #, kde-format msgid "New Expense" msgstr "Новый расход" #: editscheduledtransactiondialog.cpp:106 #, kde-format msgid "New Dividend" msgstr "Новые дивиденты" #: editscheduledtransactiondialog.cpp:107 #, kde-format msgid "New Income" msgstr "Новый доход" #: editscheduledtransactiondialog.cpp:110 #, kde-format msgid "New Transfer" msgstr "Новый перевод" #: editscheduledtransactiondialog.cpp:111 #, kde-format msgid "New Security Buy" msgstr "Новые покупки ценных бумаг" #: editscheduledtransactiondialog.cpp:113 #, kde-format msgid "New Security Sell" msgstr "Новые продажи ценных бумаг" #: editscheduledtransactiondialog.cpp:128 #: editscheduledtransactiondialog.cpp:149 transactioneditwidget.cpp:1064 #, kde-format msgid "Edit Expense" msgstr "Править расход" #: editscheduledtransactiondialog.cpp:130 #: editscheduledtransactiondialog.cpp:151 transactioneditwidget.cpp:1066 #, kde-format msgid "Edit Dividend" msgstr "Править дивиденты" #: editscheduledtransactiondialog.cpp:131 #: editscheduledtransactiondialog.cpp:152 transactioneditwidget.cpp:1067 #, kde-format msgid "Edit Income" msgstr "Править доход" #: editscheduledtransactiondialog.cpp:134 #: editscheduledtransactiondialog.cpp:155 transactioneditwidget.cpp:1070 #, kde-format msgid "Edit Transfer" msgstr "Править перевод" #: editscheduledtransactiondialog.cpp:135 #: editscheduledtransactiondialog.cpp:156 transactioneditwidget.cpp:1071 #, kde-format msgid "Edit Securities Bought" msgstr "Править ценные покупки" #: editscheduledtransactiondialog.cpp:136 #: editscheduledtransactiondialog.cpp:157 transactioneditwidget.cpp:1072 #, kde-format msgid "Edit Securities Sold" msgstr "Править ценные продажи" #: editsplitdialog.cpp:107 eqonomize.cpp:284 eqonomize.cpp:328 #: eqonomize.cpp:1167 #, kde-format msgid "Dividend" msgstr "Дивидент" #: editsplitdialog.cpp:109 eqonomize.cpp:403 eqonomize.cpp:445 #: ledgerdialog.cpp:648 #, kde-format msgid "Repayment" msgstr "Оплата" #: editsplitdialog.cpp:112 eqonomize.cpp:404 eqonomize.cpp:446 #: ledgerdialog.cpp:651 #, kde-format msgid "Refund" msgstr "Получение оплаты" #: editsplitdialog.cpp:126 ledgerdialog.cpp:638 #, kde-format msgid "Split Transaction" msgstr "Разбить транзацию" #: editsplitdialog.cpp:138 eqonomize.cpp:1279 eqonomize.cpp:1379 #: eqonomize.cpp:1473 eqonomize.cpp:1538 importcsvdialog.cpp:129 #: transactioneditwidget.cpp:175 transactioneditwidget.cpp:1099 #: transactionfilterwidget.cpp:135 #, kde-format msgid "Description:" msgstr "Описание:" #: editsplitdialog.cpp:143 eqonomize.cpp:413 eqonomize.cpp:523 #: eqonomize.cpp:639 eqonomize.cpp:1274 eqonomize.cpp:2476 #: importcsvdialog.cpp:187 transactioneditwidget.cpp:149 #: transactioneditwidget.cpp:199 transactioneditwidget.cpp:1119 #, kde-format msgid "Date:" msgstr "Дата:" #: editsplitdialog.cpp:148 eqonomize.cpp:424 eqonomize.cpp:1252 #: importcsvdialog.cpp:388 importcsvdialog.cpp:399 ledgerdialog.cpp:107 #: qifimportexport.cpp:503 #, kde-format msgid "Account:" msgstr "Счет:" #: editsplitdialog.cpp:163 #, kde-format msgid "Transactions:" msgstr "Транзакция:" #: editsplitdialog.cpp:172 eqonomize.cpp:914 eqonomize.cpp:1061 #: eqonomize.cpp:1941 eqonomize.cpp:2033 eqonomize.cpp:3988 #: ledgerdialog.cpp:135 #, kde-format msgid "Type" msgstr "Тип" #: editsplitdialog.cpp:173 eqonomize.cpp:915 eqonomize.cpp:2034 #: ledgerdialog.cpp:136 qifimportexport.cpp:127 qifimportexport.cpp:139 #: qifimportexport.cpp:149 transactionlistwidget.cpp:111 #, kde-format msgid "Description" msgstr "Описание" #: editsplitdialog.cpp:174 eqonomize.cpp:4142 ledgerdialog.cpp:137 #, kde-format msgid "Account/Category" msgstr "Счет/Категория" #: editsplitdialog.cpp:175 #, kde-format msgid "Payment" msgstr "Платеж" #: editsplitdialog.cpp:176 ledgerdialog.cpp:138 #, kde-format msgid "Deposit" msgstr "Депозит" #: editsplitdialog.cpp:181 ledgerdialog.cpp:151 #, kde-format msgid "New" msgstr "Новый" #: editsplitdialog.cpp:184 eqonomize.cpp:4333 #, kde-format msgid "New Expense..." msgstr "Новый расход..." #: editsplitdialog.cpp:185 eqonomize.cpp:4334 #, kde-format msgid "New Income..." msgstr "Новый доход..." #: editsplitdialog.cpp:186 #, kde-format msgid "New Deposit..." msgstr "Новый депозит..." #: editsplitdialog.cpp:187 #, kde-format msgid "New Withdrawal..." msgstr "Новое изъятие..." #: editsplitdialog.cpp:188 #, kde-format msgid "New Security Shares Bought..." msgstr "" #: editsplitdialog.cpp:189 #, kde-format msgid "Security Shares Sold..." msgstr "Продажи ценных акций..." #: editsplitdialog.cpp:190 #, kde-format msgid "New Dividend..." msgstr "Новые дивиденты..." #: editsplitdialog.cpp:191 eqonomize.cpp:924 eqonomize.cpp:1071 #: eqonomize.cpp:4328 ledgerdialog.cpp:158 transactionlistwidget.cpp:1051 #, kde-format msgid "Edit..." msgstr "Правка..." #: editsplitdialog.cpp:221 eqonomize.cpp:2325 #, kde-format msgid "Total value:" msgstr "Итог:" #: editsplitdialog.cpp:403 transactioneditwidget.cpp:653 #: transactioneditwidget.cpp:657 transactioneditwidget.cpp:668 #: transactioneditwidget.cpp:682 transactioneditwidget.cpp:693 #, kde-format msgid "No suitable account available." msgstr "Имеющийся счет не пригоден" #: editsplitdialog.cpp:415 #, kde-format msgid "Future dates is not allowed." msgstr "Будущие даты не разрешены." #: editsplitdialog.cpp:419 #, kde-format msgid "A split must contain at least two transactions." msgstr "Разделение должно быть ограниченно минимум двумя транзакциями." #: editsplitdialog.cpp:428 transactioneditwidget.cpp:714 #, kde-format msgid "Cannot transfer money to and from the same account." msgstr "Невозможно перевести деньги на тот же самый счет." #: eqonomize.cpp:419 eqonomize.cpp:2325 importcsvdialog.cpp:146 #: importcsvdialog.cpp:169 importcsvdialog.cpp:355 #: transactioneditwidget.cpp:117 transactioneditwidget.cpp:186 #: transactioneditwidget.cpp:1111 #, kde-format msgid "Cost:" msgstr "Цена:" #: eqonomize.cpp:420 importcsvdialog.cpp:364 importcsvdialog.cpp:397 #: transactioneditwidget.cpp:118 transactioneditwidget.cpp:184 #: transactioneditwidget.cpp:1110 #, kde-format msgid "Income:" msgstr "Доход:" #: eqonomize.cpp:439 transactioneditwidget.cpp:193 #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:310 #, kde-format msgid "Quantity:" msgstr "Количество:" #: eqonomize.cpp:443 importcsvdialog.cpp:243 transactioneditwidget.cpp:288 #, kde-format msgid "Comments:" msgstr "Коментарии:" #: eqonomize.cpp:491 eqonomize.cpp:1176 #, kde-format msgid "Reinvested Dividend" msgstr "Вкладываемые дивиденты" #: eqonomize.cpp:501 transactioneditwidget.cpp:97 #: transactioneditwidget.cpp:157 #, kde-format msgid "Security:" msgstr "Ценные бумаги:" #: eqonomize.cpp:518 #, kde-format msgid "Shares added:" msgstr "Добавить акции:" #: eqonomize.cpp:579 #, kde-format msgid "Security Trade" msgstr "Торговля ценными бумагами" #: eqonomize.cpp:587 #, kde-format msgid "From security:" msgstr "К ценным бумагам:" #: eqonomize.cpp:603 #, kde-format msgid "Shares moved:" msgstr "Переместить акции:" #: eqonomize.cpp:608 transactioneditwidget.cpp:135 #: transactionfilterwidget.cpp:167 transactionfilterwidget.cpp:168 #: transactionfilterwidget.cpp:343 transactionfilterwidget.cpp:380 #, kde-format msgid "All" msgstr "Все" #: eqonomize.cpp:614 #, kde-format msgid "To security:" msgstr "К ценным бумагам." #: eqonomize.cpp:631 #, kde-format msgid "Shares received:" msgstr "Полученные акции:" #: eqonomize.cpp:635 importcsvdialog.cpp:386 importcsvdialog.cpp:412 #: overtimechart.cpp:193 overtimechart.cpp.bak:186 #, kde-format msgid "Value:" msgstr "Стоимость:" #: eqonomize.cpp:725 #, kde-format msgid "No other security available for trade in the account." msgstr "Нет других ценных бумаг для торговли в счете." #: eqonomize.cpp:737 #, kde-format msgid "Selected to and from securities are the same." msgstr "Выбранные источник и назначение для ценных бумаг один и тот же." #: eqonomize.cpp:745 transactioneditwidget.cpp:735 #, kde-format msgid "Zero shares not allowed." msgstr "Акции с нулевой стоимостью не разрешены." #: eqonomize.cpp:749 transactioneditwidget.cpp:739 #, kde-format msgid "Zero value not allowed." msgstr "Нулевая стоимость не разрешена." #: eqonomize.cpp:757 eqonomize.cpp:766 #, kde-format msgid "Quotations" msgstr "Котировка" #: eqonomize.cpp:777 eqonomize.cpp:913 eqonomize.cpp:962 eqonomize.cpp:1060 #: ledgerdialog.cpp:134 transactionlistwidget.cpp:110 #, kde-format msgid "Date" msgstr "Дата" # Fuzzy entfernt: Wertpapiere müssen nicht Aktien sein - es gibt Staatsanleihen, Optionen, Genossenschaftsanteile ... Anteile ist da umfassender als das wohl Favorisierte "Aktien" #: eqonomize.cpp:778 #, kde-format msgid "Price per Share" msgstr "Цена через акции" #: eqonomize.cpp:820 #, kde-format msgid "Quotations for %1" msgstr "Курс для %1" #: eqonomize.cpp:904 #, kde-format msgid "" "The following transactions was scheduled to occur today or before today.\n" "Confirm that they have indeed occurred (or will occur today)." msgstr "" "Следующие транзакции по графику были сегодня или в прошлом.\n" "Подтвердите это случилось (или случится сегодня)" #: eqonomize.cpp:916 eqonomize.cpp:2035 transactionlistwidget.cpp:137 #, kde-format msgid "Amount" msgstr "Количество" #: eqonomize.cpp:926 #, kde-format msgid "Postpone..." msgstr "Отложить..." #: eqonomize.cpp:973 #, kde-format msgid "Can only postpone to future dates." msgstr "Могу только отложить до будущего." #: eqonomize.cpp:1052 ledgerdialog.cpp:299 #, kde-format msgid "Transactions for %1" msgstr "Транзакции для %1" #: eqonomize.cpp:1063 eqonomize.cpp:1936 #, kde-format msgid "Shares" msgstr "Акции" #: eqonomize.cpp:1160 #, kde-format msgid "Shares Bought" msgstr "Купленные акции" #: eqonomize.cpp:1161 #, kde-format msgid "Shares Sold" msgstr "Проданные акции" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Sold (Traded)" msgstr "Проданные акции (торгуемые)" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Bought (Traded)" msgstr "Купленные акции (торгуемые)" #: eqonomize.cpp:1204 #, kde-format msgid "Shares Bought (Recurring)" msgstr "Купленные акции(повторно)" #: eqonomize.cpp:1205 #, kde-format msgid "Shares Sold (Recurring)" msgstr "Проданные акции (повторно)" #: eqonomize.cpp:1207 #, kde-format msgid "Shares Bought (Scheduled)" msgstr "Купленные акции (по плану)" #: eqonomize.cpp:1208 #, kde-format msgid "Shares Sold (Scheduled)" msgstr "Проданные акции (по плану)" #: eqonomize.cpp:1220 #, kde-format msgid "Recurring Dividend" msgstr "Повторный дивидент" #: eqonomize.cpp:1222 #, kde-format msgid "Scheduled Dividend" msgstr "Планируемый дивидент" #: eqonomize.cpp:1240 eqonomize.cpp:1360 #, kde-format msgid "Type:" msgstr "Тип:" #: eqonomize.cpp:1243 eqonomize.cpp:2600 eqonomize.cpp:2660 #, kde-format msgid "Mutual Fund" msgstr "Взаимный капитал" #: eqonomize.cpp:1244 eqonomize.cpp:2598 eqonomize.cpp:2658 #, kde-format msgid "Bond" msgstr "Связь" #: eqonomize.cpp:1245 eqonomize.cpp:2599 eqonomize.cpp:2659 #, kde-format msgid "Stock" msgstr "Начало" #: eqonomize.cpp:1246 eqonomize.cpp:2601 eqonomize.cpp:2661 eqonomize.cpp:3492 #: eqonomize.cpp:3497 importcsvdialog.cpp:117 qifimportexport.cpp:332 #, kde-format msgid "Other" msgstr "Другое" #: eqonomize.cpp:1249 eqonomize.cpp:1370 eqonomize.cpp:1464 eqonomize.cpp:1529 #, kde-format msgid "Name:" msgstr "Имя:" # #: eqonomize.cpp:1264 #, kde-format msgid "Decimals in Shares:" msgstr "Десятичные в акциях:" #: eqonomize.cpp:1267 #, kde-format msgid "Initial Shares:" msgstr "Начальные акции:" #: eqonomize.cpp:1270 #, kde-format msgid "Initial quotation:" msgstr "Начальная котировка:" #: eqonomize.cpp:1289 transactioneditwidget.cpp:675 #, kde-format msgid "No suitable account or income category available." msgstr "Не годный счет или категория доходов." #: eqonomize.cpp:1363 eqonomize.cpp:3488 eqonomize.cpp:4021 #: qifimportexport.cpp:325 #, kde-format msgid "Cash" msgstr "Наличные" #: eqonomize.cpp:1364 eqonomize.cpp:4016 #, kde-format msgid "Current Account" msgstr "Текущий счет" #: eqonomize.cpp:1365 eqonomize.cpp:3490 eqonomize.cpp:4017 #, kde-format msgid "Savings Account" msgstr "Сбережения" #: eqonomize.cpp:1366 eqonomize.cpp:4018 #, kde-format msgid "Credit Card" msgstr "Кредитная карта" #: eqonomize.cpp:1367 eqonomize.cpp:4019 #, kde-format msgid "Liabilities" msgstr "Задолженность" #: eqonomize.cpp:1368 eqonomize.cpp:1731 eqonomize.cpp:1732 eqonomize.cpp:3891 #: eqonomize.cpp:3897 eqonomize.cpp:4020 #, kde-format msgid "Securities" msgstr "Ценные бумаги" #: eqonomize.cpp:1373 #, kde-format msgid "Initial balance:" msgstr "Начальный баланс:" #: eqonomize.cpp:1376 #, kde-format msgid "Default account for budgeted transactions" msgstr "Счет по умолчанию для бюджетных транзакций" #: eqonomize.cpp:1441 eqonomize.cpp:1507 eqonomize.cpp:1572 #, kde-format msgid "Empty name." msgstr "Пустое имя." #: eqonomize.cpp:1447 #, kde-format msgid "The entered name is used by another account." msgstr "Введенное имя уже используется в другом бюджете" #: eqonomize.cpp:1467 eqonomize.cpp:1532 #, kde-format msgid "Monthly budget:" msgstr "Месячный бюджет" #: eqonomize.cpp:1513 #, kde-format msgid "The entered name is used by another income category." msgstr "Введенное имя уже используется в другой категории доходов." #: eqonomize.cpp:1578 #, kde-format msgid "The entered name is used by another expense category." msgstr "Введенное имя уже используется в другой категории расходов." #: eqonomize.cpp:1711 eqonomize.cpp:1778 eqonomize.cpp:3984 eqonomize.cpp:5970 #: eqonomize.cpp:5976 #, kde-format msgid "Accounts" msgstr "Счета" #: eqonomize.cpp:1712 #, kde-format msgid "Accounts & Categories" msgstr "Счета и категории" #: eqonomize.cpp:1716 eqonomize.cpp:1717 eqonomize.cpp:1780 #: importcsvdialog.cpp:70 overtimechart.cpp:126 overtimechart.cpp:1727 #: overtimechart.cpp:1731 overtimechart.cpp.bak:119 overtimechart.cpp.bak:1708 #: overtimechart.cpp.bak:1712 overtimereport.cpp:103 overtimereport.cpp:357 #: overtimereport.cpp:377 overtimereport.cpp:395 transactionlistwidget.cpp:251 #: transactionlistwidget.cpp:263 #, kde-format msgid "Expenses" msgstr "Расходы" #: eqonomize.cpp:1721 eqonomize.cpp:1722 eqonomize.cpp:1779 eqonomize.cpp:4043 #: importcsvdialog.cpp:75 overtimechart.cpp:127 overtimechart.cpp:1726 #: overtimechart.cpp:1730 overtimechart.cpp.bak:120 overtimechart.cpp.bak:1707 #: overtimechart.cpp.bak:1711 overtimereport.cpp:104 overtimereport.cpp:349 #: overtimereport.cpp:368 overtimereport.cpp:386 transactionlistwidget.cpp:252 #: transactionlistwidget.cpp:264 #, kde-format msgid "Incomes" msgstr "Доходы" #: eqonomize.cpp:1726 eqonomize.cpp:1727 importcsvdialog.cpp:78 #: transactionlistwidget.cpp:253 transactionlistwidget.cpp:265 #, kde-format msgid "Transfers" msgstr "Трансферы" #: eqonomize.cpp:1736 #, kde-format msgid "Schedule" msgstr "Планировщик" #: eqonomize.cpp:1737 #, kde-format msgid "Scheduled Transactions" msgstr "Запланированные переводы" #: eqonomize.cpp:1753 eqonomize.cpp:1775 #, kde-format msgid "Account / Category" msgstr "Счет / Категория" #: eqonomize.cpp:1754 #, kde-format msgid "Remaining Budget (%1)" msgstr "Оставшийся бюджет(%1)" #: eqonomize.cpp:1755 #, kde-format msgid "Change (%1)" msgstr "Изменение (%1)" #: eqonomize.cpp:1756 #, kde-format msgid "Total (%1)" msgstr "Итог (%1)" #: eqonomize.cpp:1769 #, kde-format msgctxt "%2 remains of %1 budget" msgid "%2 of %1" msgstr "%2 из %1" #: eqonomize.cpp:1785 eqonomize.cpp:4002 #, kde-format msgid "Includes budgeted transactions" msgstr "Включая бюджетные транзакции" #: eqonomize.cpp:1793 #, kde-format msgid "Period" msgstr "Период" #: eqonomize.cpp:1825 #, kde-format msgid "Select Period" msgstr "Выберите период" #: eqonomize.cpp:1827 eqonomize.cpp:4312 #, kde-format msgid "Current Month" msgstr "Текущий месяц" #: eqonomize.cpp:1828 eqonomize.cpp:4313 #, kde-format msgid "Current Year" msgstr "Текущий год" #: eqonomize.cpp:1829 eqonomize.cpp:4314 #, kde-format msgid "Current Whole Month" msgstr "Текущий итог месяца" #: eqonomize.cpp:1830 eqonomize.cpp:4315 #, kde-format msgid "Current Whole Year" msgstr "Текущий итого года" #: eqonomize.cpp:1831 #, kde-format msgid "Whole Past Month" msgstr "Итог прошлого месяца" #: eqonomize.cpp:1832 #, kde-format msgid "Whole Past Year" msgstr "Итог прошлого года" #: eqonomize.cpp:1833 #, kde-format msgid "Previous Month" msgstr "Предыдущий месяц" #: eqonomize.cpp:1834 #, kde-format msgid "Previous Year" msgstr "Предыдущий год" #: eqonomize.cpp:1837 #, kde-format msgid "Show partial budget" msgstr "Показать неполный бюджет" #: eqonomize.cpp:1842 #, kde-format msgid "Edit Budget" msgstr "Править бюджет" #: eqonomize.cpp:1846 #, kde-format msgid "Budget:" msgstr "Бюджет:" #: eqonomize.cpp:1856 #, kde-format msgid "Month:" msgstr "Месяц:" #: eqonomize.cpp:1864 #, kde-format msgid "Result previous month:" msgstr "Результат прошлого месяца" #: eqonomize.cpp:1917 eqonomize.cpp:4354 #, kde-format msgid "New Security..." msgstr "Новые ценные бумаги..." #: eqonomize.cpp:1919 #, kde-format msgid "New Transaction" msgstr "Новая транзакция" #: eqonomize.cpp:1922 eqonomize.cpp:4362 #, kde-format msgid "Set Quotation..." msgstr "Набор котировок..." #: eqonomize.cpp:1934 eqonomize.cpp:3987 #, kde-format msgid "Name" msgstr "Имя" #: eqonomize.cpp:1937 #, kde-format msgid "Quotation" msgstr "Котировка" #: eqonomize.cpp:1939 #, kde-format msgid "Profit" msgstr "Прибыль" #: eqonomize.cpp:1940 #, kde-format msgid "Yearly Rate" msgstr "Ежегодная плата" #: eqonomize.cpp:1942 qifimportexport.cpp:323 #, kde-format msgid "Account" msgstr "Счет" #: eqonomize.cpp:1953 #, kde-format msgid "Statistics Period" msgstr "Статистика периода" #: eqonomize.cpp:2015 #, kde-format msgid "New Schedule" msgstr "Новый план" #: eqonomize.cpp:2018 #, kde-format msgid "Edit" msgstr "Правка" #: eqonomize.cpp:2032 #, kde-format msgid "Next Occurrence" msgstr "Следующее событие" #: eqonomize.cpp:2038 qifimportexport.cpp:152 transactionlistwidget.cpp:144 #, kde-format msgid "Comments" msgstr "Комментарии" #: eqonomize.cpp:2291 #, kde-format msgid "New Security" msgstr "Новая ценная бумага" #: eqonomize.cpp:2306 #, kde-format msgid "Edit Security" msgstr "Редактировать ценную бумагу" #: eqonomize.cpp:2325 #, kde-format msgid "Profit:" msgstr "Прибыль:" #: eqonomize.cpp:2325 #, kde-format msgid "Rate:" msgstr "Ставка:" #: eqonomize.cpp:2332 #, kde-format msgid "" "Are you sure you want to delete the security \"%1\" and all associated " "transactions?" msgstr "" "Вы уверены что хотите удалить ценную бумагу \"%1\" и все связанные с ней " "транзакции?" #: eqonomize.cpp:2394 transactioneditwidget.cpp:700 #, kde-format msgid "No security available." msgstr "Нет имеющихся ценных бумаг." #: eqonomize.cpp:2466 #, kde-format msgid "Set Quotation (%1)" msgstr "Набор котировок (%1)" #: eqonomize.cpp:2472 transactioneditwidget.cpp:143 #, kde-format msgid "Price per share:" msgstr "Стоимость через акции:" #: eqonomize.cpp:2485 #, kde-format msgid "Future dates are not allowed." msgstr "Будущие даты не разрешены." #: eqonomize.cpp:2513 #, kde-format msgid "Security Transactions" msgstr "Транзакции ценных бумаг" #: eqonomize.cpp:3166 ledgerdialog.cpp:293 #, kde-format msgid "Ledger" msgstr "Главная книга" #: eqonomize.cpp:3475 #, kde-format msgid "Untitled" msgstr "" #: eqonomize.cpp:3489 #, kde-format msgid "Check Account" msgstr "Контроль счета" #: eqonomize.cpp:3491 #, kde-format msgid "Salary" msgstr "Жалование" #: eqonomize.cpp:3493 #, kde-format msgid "Bills" msgstr "Счета" #: eqonomize.cpp:3494 #, kde-format msgid "Clothing" msgstr "Одежда" #: eqonomize.cpp:3495 #, kde-format msgid "Groceries" msgstr "Бакалея" #: eqonomize.cpp:3496 #, kde-format msgid "Leisure" msgstr "Досуг" #: eqonomize.cpp:3561 importcsvdialog.cpp:795 qifimportexport.cpp:280 #: qifimportexport.cpp:444 #, kde-format msgid "Couldn't fetch %1." msgstr "Не выбран %1 ." #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Error loading %1: %2." msgstr "Ошибка загруки %1: %2" #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Couldn't open file" msgstr "Невозможно открыть файл" #: eqonomize.cpp:3627 eqonomize.cpp:3653 #, kde-format msgid "Error saving %1: %2." msgstr "Ошибка сохранения %1: %2" #: eqonomize.cpp:3627 eqonomize.cpp:3653 eqonomize.cpp:3673 #, kde-format msgid "Couldn't save file" msgstr "Не сохранен файл" #: eqonomize.cpp:3673 eqonomize.cpp:4282 ledgerdialog.cpp:281 #: qifimportexport.cpp:634 #, kde-format msgid "Failed to upload file to %1." msgstr "Неудачно загружен файл %1" #: eqonomize.cpp:3703 eqonomize.cpp:3728 #, kde-format msgid "Report" msgstr "Отчет" #: eqonomize.cpp:3758 eqonomize.cpp:3783 #, kde-format msgid "Chart" msgstr "Диаграмма" #: eqonomize.cpp:3823 eqonomize.cpp:3829 #, kde-format msgid "Transaction Schedule" msgstr "Расписание транзакций" #: eqonomize.cpp:3976 #, kde-format msgctxt "html format" msgid "Accounts & Categories" msgstr "Бюджет и категории" #: eqonomize.cpp:3981 #, kde-format msgctxt "html format" msgid "Accounts & Categories (%1–%2)" msgstr "Бюджет и категории (%1–%2)" #: eqonomize.cpp:3982 #, kde-format msgctxt "html format" msgid "Accounts & Categories (to %1)" msgstr "Бюджет и категории (к %1)" #: eqonomize.cpp:3989 eqonomize.cpp:4049 eqonomize.cpp:4097 eqonomize.cpp:4142 #, kde-format msgid "Change" msgstr "Изменение" #: eqonomize.cpp:3993 ledgerdialog.cpp:140 #, kde-format msgid "Balance" msgstr "Баланс" #: eqonomize.cpp:4047 eqonomize.cpp:4095 #, kde-format msgid "Budget" msgstr "Бюджет" #: eqonomize.cpp:4048 eqonomize.cpp:4096 #, kde-format msgid "Remaining Budget" msgstr "Оставшийся бюджет" #: eqonomize.cpp:4050 #, kde-format msgid "Total Incomes" msgstr "Итого доходов" #: eqonomize.cpp:4091 #, kde-format msgid "Costs" msgstr "Затраты" #: eqonomize.cpp:4098 #, kde-format msgid "Total Expenses" msgstr "Итого Расходов" #: eqonomize.cpp:4167 eqonomize.cpp:4214 #, kde-format msgid "Empty expenses list." msgstr "Пустой список расходов." #: eqonomize.cpp:4172 eqonomize.cpp:4219 #, kde-format msgid "Empty incomes list." msgstr "Пустой список доходов." #: eqonomize.cpp:4177 eqonomize.cpp:4224 #, kde-format msgid "Empty transfers list." msgstr "Пустой список транзакций." #: eqonomize.cpp:4182 eqonomize.cpp:4229 #, kde-format msgid "Empty securities list." msgstr "Пустой список ценных бумаг." #: eqonomize.cpp:4187 eqonomize.cpp:4234 #, kde-format msgid "Empty schedule list." msgstr "Пустое расписание." #: eqonomize.cpp:4305 #, kde-format msgid "Export View..." msgstr "Просмотр экспорта..." #: eqonomize.cpp:4307 #, kde-format msgid "Print View..." msgstr "Просмотр печати..." #: eqonomize.cpp:4309 #, kde-format msgid "Initial Period" msgstr "Начальный период" #: eqonomize.cpp:4316 #, kde-format msgid "Remember Last Dates" msgstr "Запомнить последнюю дату" #: eqonomize.cpp:4319 #, kde-format msgid "Import CSV File..." msgstr "Импорт CSV-файла..." #: eqonomize.cpp:4320 #, kde-format msgid "Import QIF File..." msgstr "Импорт QIF-файла..." #: eqonomize.cpp:4321 #, kde-format msgid "Export As QIF File..." msgstr "Экспортировать как QIF-файл..." #: eqonomize.cpp:4323 #, kde-format msgid "Add Account..." msgstr "Добавить счет..." #: eqonomize.cpp:4324 #, kde-format msgid "New Account..." msgstr "Новый счет..." #: eqonomize.cpp:4325 #, kde-format msgid "New Income Category..." msgstr "Новая категория доходов" #: eqonomize.cpp:4326 #, kde-format msgid "New Expense Category..." msgstr "Новая категория расходов" #: eqonomize.cpp:4327 #, kde-format msgid "Balance..." msgstr "Баланс..." #: eqonomize.cpp:4331 #, kde-format msgid "Show Transactions" msgstr "Показать транзакция" #: eqonomize.cpp:4335 #, kde-format msgid "New Transfer..." msgstr "Новый трансфер..." #: eqonomize.cpp:4336 #, kde-format msgid "New Split Transaction..." msgstr "Новое разделение транзакции.." #: eqonomize.cpp:4337 #, kde-format msgid "Edit Transaction(s) (Occurrence)..." msgstr "" #: eqonomize.cpp:4338 #, kde-format msgid "Edit Occurrence..." msgstr "Править событие..." #: eqonomize.cpp:4339 #, kde-format msgid "Edit Schedule (Recurrence)..." msgstr "" #: eqonomize.cpp:4340 #, kde-format msgid "Edit Schedule..." msgstr "Редактировать расписание..." #: eqonomize.cpp:4341 #, kde-format msgid "Remove Transaction(s) (Occurrence)" msgstr "" #: eqonomize.cpp:4342 #, kde-format msgid "Remove Occurrence" msgstr "Удалить событие" #: eqonomize.cpp:4343 #, kde-format msgid "Delete Schedule (Recurrence)" msgstr "" #: eqonomize.cpp:4344 #, kde-format msgid "Delete Schedule" msgstr "Удалить план" #: eqonomize.cpp:4345 #, kde-format msgid "Edit Split Transaction..." msgstr "Редактировать разделенные транзакции." #: eqonomize.cpp:4346 #, kde-format msgid "Remove Split Transaction" msgstr "Удалить разделенные транзакции" #: eqonomize.cpp:4347 #, kde-format msgid "Join Transactions..." msgstr "Соединить транзакции" #: eqonomize.cpp:4348 #, kde-format msgid "Split Up Transaction" msgstr "" #: eqonomize.cpp:4350 #, kde-format msgid "Refund..." msgstr "Платеж..." #: eqonomize.cpp:4351 #, kde-format msgid "Repayment..." msgstr "Оплата..." #: eqonomize.cpp:4352 #, kde-format msgid "New Refund/Repayment..." msgstr "Новый платеж/оплата..." #: eqonomize.cpp:4355 #, kde-format msgid "Edit Security..." msgstr "Редактировать ценную бумагу..." #: eqonomize.cpp:4356 #, kde-format msgid "Remove Security" msgstr "Удалить ценную бумагу" #: eqonomize.cpp:4357 #, kde-format msgid "Shares Sold..." msgstr "Общие продажи..." #: eqonomize.cpp:4358 #, kde-format msgid "Shares Bought..." msgstr "Общие покупки..." #: eqonomize.cpp:4359 #, kde-format msgid "Dividend..." msgstr "Дивиденды..." #: eqonomize.cpp:4360 #, kde-format msgid "Reinvested Dividend..." msgstr "Снова инвестированные дивиденды..." #: eqonomize.cpp:4361 #, kde-format msgid "Shares Moved..." msgstr "Общие перемещения..." #: eqonomize.cpp:4363 #, kde-format msgid "Edit Quotations..." msgstr "Редактировать котировки..." #: eqonomize.cpp:4364 #, kde-format msgid "Transactions..." msgstr "Транзакции..." #: eqonomize.cpp:4366 #, kde-format msgid "Development Over Time Report..." msgstr "Отчет по датам." #: eqonomize.cpp:4367 #, kde-format msgid "Categories Comparison Report..." msgstr "Отчет по категориям" #: eqonomize.cpp:4368 #, kde-format msgid "Categories Comparison Chart..." msgstr "Диаграмма сравнения категорий" #: eqonomize.cpp:4369 #, kde-format msgid "Development Over Time Chart..." msgstr "Временная диаграмма" #: eqonomize.cpp:4371 #, kde-format msgid "Use Additional Transaction Properties" msgstr "Использовать свойства добавленной транзакции" #: eqonomize.cpp:4413 #, kde-format msgid "" "Eqonomize! exited unexpectedly before the file was saved and data was lost.\n" "Do you want to load the last auto-saved version of the file?" msgstr "" "Eqonomize! неожиданно завершилась перед сохранением файла и данные " "потеряны.\n" "Хотите загрузить последние авто-сохраненную версию файла?" # Der Begriff ist Müll ... #: eqonomize.cpp:4413 #, kde-format msgid "Crash Recovery" msgstr "Крах восстановления" #: eqonomize.cpp:4605 eqonomize.cpp:4606 #, kde-format msgid "The current file has been modified. Do you want to save it?" msgstr "Текущий файл модифицирован. Желаете сохранить?" #: eqonomize.cpp:4643 #, kde-format msgid "Confirm Schedule" msgstr "Подтвердить расписание" #: eqonomize.cpp:4697 #, kde-format msgid "New Account" msgstr "Новый счет" #: eqonomize.cpp:4712 #, kde-format msgid "New Income Category" msgstr "Новая категория доходов" #: eqonomize.cpp:4725 #, kde-format msgid "New Expense Category" msgstr "Новая категория расходов" #: eqonomize.cpp:4800 #, kde-format msgid "Balance Account" msgstr "Баланс счета" #: eqonomize.cpp:4806 #, kde-format msgid "Book value:" msgstr "Книга ценности:" #: eqonomize.cpp:4813 #, kde-format msgid "Real value:" msgstr "Реальная ценность:" #: eqonomize.cpp:4836 #, kde-format msgid "Edit Account" msgstr "Редактировать счет" #: eqonomize.cpp:4869 #, kde-format msgid "Edit Income Category" msgstr "Редактировать категорию доходов" #: eqonomize.cpp:4887 #, kde-format msgid "Edit Expense Category" msgstr "Редактировать категорию расходов" #: eqonomize.cpp:4948 #, kde-format msgid "Move transactions?" msgstr "Переместить транзакцию?" #: eqonomize.cpp:4958 #, kde-format msgid "Move to:" msgstr "Переместить в:" #: eqonomize.cpp:4965 #, kde-format msgid "" "The category contains some expenses.\n" "What do you want to do with them?" msgstr "" "Категория содержит некоторые расходы.\n" "Что вы хотите с ними сделать?" #: eqonomize.cpp:4977 #, kde-format msgid "" "The category contains some incomes.\n" "What do you want to do with them?" msgstr "" #: eqonomize.cpp:4989 #, kde-format msgid "" "The account contains some transactions.\n" "What do you want to do with them?" msgstr "" #: eqonomize.cpp:5011 #, kde-format msgid "" "The category contains some expenses that will be removed. Do you still want " "to remove the category?" msgstr "" #: eqonomize.cpp:5011 eqonomize.cpp:5012 #, kde-format msgid "Remove Category?" msgstr "Удалить категорию?" #: eqonomize.cpp:5012 #, kde-format msgid "" "The category contains some incomes that will be removed. Do you still want " "to remove the category?" msgstr "Категория содержит некоторые доходы, вы ее хотите удалить?" #: eqonomize.cpp:5013 #, kde-format msgid "" "The account contains some transactions that will be removed. Do you still " "want to remove the account?" msgstr "Счет содержит некоторые транзакции, вы его хотите удалить?" #: eqonomize.cpp:5013 #, kde-format msgid "Remove Account?" msgstr "Удалить счет?" #: eqonomize.cpp:5531 eqonomize.cpp:5555 eqonomize.cpp:5730 #, kde-format msgctxt "%1: budget; %2: remaining budget" msgid "%2 of %1" msgstr "%2 из %1" #: eqonomize.cpp:5810 eqonomize.cpp:5835 #, kde-format msgid "%1 (with no budget)" msgstr "" #: eqonomize.cpp:5811 eqonomize.cpp:5836 #, kde-format msgid "%1 (with budget %2)" msgstr "%1 ( с бюджета %2)" #: importcsvdialog.cpp:60 #, kde-format msgid "Import CSV file" msgstr "Импорт CSV файла" #: importcsvdialog.cpp:64 #, kde-format msgid "Transaction Type Selection" msgstr "Выбор типа транзакции" #: importcsvdialog.cpp:81 #, kde-format msgid "Expenses and incomes (negative cost)" msgstr "Расходы и доходы (отрицательная величина)" #: importcsvdialog.cpp:84 #, kde-format msgid "Expenses and incomes (separate columns)" msgstr "Расходы и доходы (разделенные колонки)" #: importcsvdialog.cpp:87 #, kde-format msgid "All types" msgstr "Все типы" #: importcsvdialog.cpp:95 qifimportexport.cpp:62 #, kde-format msgid "File Selection" msgstr "Выбор файла" #: importcsvdialog.cpp:99 qifimportexport.cpp:66 qifimportexport.cpp:548 #, kde-format msgid "File:" msgstr "Файл:" #: importcsvdialog.cpp:104 #, kde-format msgid "First data row:" msgstr "Первая строка данных:" #: importcsvdialog.cpp:107 #, kde-format msgid "Auto" msgstr "Авто" #: importcsvdialog.cpp:110 #, kde-format msgid "Column delimiter:" msgstr "Разделитель колонок:" #: importcsvdialog.cpp:113 #, kde-format msgid "Comma" msgstr "Запятая" #: importcsvdialog.cpp:114 #, kde-format msgid "Tabulator" msgstr "Табулятор" #: importcsvdialog.cpp:115 #, kde-format msgid "Semicolon" msgstr "Точка с запятой" #: importcsvdialog.cpp:116 #, kde-format msgid "Space" msgstr "Пробел" #: importcsvdialog.cpp:125 #, kde-format msgid "Columns Specification" msgstr "Спецификация колонки" #: importcsvdialog.cpp:131 importcsvdialog.cpp:149 importcsvdialog.cpp:172 #: importcsvdialog.cpp:189 importcsvdialog.cpp:208 importcsvdialog.cpp:227 #: importcsvdialog.cpp:245 #, kde-format msgid "Column" msgstr "Колонка" #: importcsvdialog.cpp:205 importcsvdialog.cpp:356 importcsvdialog.cpp:365 #: importcsvdialog.cpp:387 importcsvdialog.cpp:398 #: transactioneditwidget.cpp:225 transactioneditwidget.cpp:267 #: transactioneditwidget.cpp:1130 transactionfilterwidget.cpp:102 #: transactionfilterwidget.cpp:113 #, kde-format msgid "Category:" msgstr "Категория:" #: importcsvdialog.cpp:224 importcsvdialog.cpp:357 importcsvdialog.cpp:374 #: transactioneditwidget.cpp:248 transactioneditwidget.cpp:273 #: transactionfilterwidget.cpp:117 #, kde-format msgid "From account:" msgstr "Со счета:" #: importcsvdialog.cpp:262 #, kde-format msgid "Create missing categories and accounts" msgstr "Создать найденные категории и счета" #: importcsvdialog.cpp:354 #, kde-format msgid "" "Imports data as expenses. Costs have positive value. Value is the only " "required column." msgstr "" #: importcsvdialog.cpp:363 #, kde-format msgid "Imports data as incomes. Value is the only required column." msgstr "Импортировать данные как доходы." #: importcsvdialog.cpp:366 importcsvdialog.cpp:375 #: transactioneditwidget.cpp:231 transactioneditwidget.cpp:258 #: transactionfilterwidget.cpp:106 #, kde-format msgid "To account:" msgstr "К счету:" #: importcsvdialog.cpp:372 #, kde-format msgid "Imports data as transfers. Value is the only required column." msgstr "Импорт данных как трансферы." #: importcsvdialog.cpp:373 transactioneditwidget.cpp:182 #: transactioneditwidget.cpp:1109 #, kde-format msgid "Amount:" msgstr "Количество:" #: importcsvdialog.cpp:381 #, kde-format msgid "" "Imports data as expenses and incomes. Costs have negative value. Value and " "category are both required columns." msgstr "" #: importcsvdialog.cpp:392 #, kde-format msgid "" "Imports data as expenses and incomes. Costs and incomes have separate " "columns. Income, cost, and category are all required columns." msgstr "" #: importcsvdialog.cpp:403 #, kde-format msgid "" "Imports data as expenses, incomes, and transfers. Costs have negative or " "positive value. Value, to, and from are all required columns. Accounts and " "categories must be existing." msgstr "" #: importcsvdialog.cpp:413 transactioneditwidget.cpp:209 #: transactionfilterwidget.cpp:74 transactionfilterwidget.cpp:91 #, kde-format msgid "From:" msgstr "Из:" #: importcsvdialog.cpp:414 transactioneditwidget.cpp:216 #: transactionfilterwidget.cpp:81 transactionfilterwidget.cpp:95 #, kde-format msgid "To:" msgstr "К:" #: importcsvdialog.cpp:440 qifimportexport.cpp:258 #, kde-format msgid "A file must be selected." msgstr "Файл должен быть выбран" #: importcsvdialog.cpp:446 importcsvdialog.cpp:458 qifimportexport.cpp:265 #: qifimportexport.cpp:595 #, kde-format msgid "Selected file is a directory." msgstr "Выберите файл или директорию." #: importcsvdialog.cpp:450 importcsvdialog.cpp:462 qifimportexport.cpp:269 #, kde-format msgid "Selected file does not exist." msgstr "Выбранный файл не существует." #: importcsvdialog.cpp:468 #, kde-format msgid "Empty delimiter." msgstr "Пустой разделитель." #: importcsvdialog.cpp:712 #, kde-format msgid "The same column number is selected multiple times." msgstr "" #: importcsvdialog.cpp:772 #, kde-format msgid "Selected from account is the same as the to account." msgstr "Выбранный счет тот же самый." #: importcsvdialog.cpp:803 qifimportexport.cpp:288 qifimportexport.cpp:452 #, kde-format msgid "Couldn't open %1 for reading." msgstr "Не могу открыть %1 для чтения." #: importcsvdialog.cpp:806 qifimportexport.cpp:291 qifimportexport.cpp:455 #, kde-format msgid "Error reading %1." msgstr "Ошибка чтения %1." #: importcsvdialog.cpp:1187 qifimportexport.cpp:462 #, kde-format msgid "Successfully imported 1 transaction." msgid_plural "Successfully imported %n transactions." msgstr[0] "_n: Успешный импорт 1 транзакции." msgstr[1] "Успешный импорт %n транзакций." #: importcsvdialog.cpp:1189 #, kde-format msgid "Unable to import any transactions imported." msgstr "Невозможно импортировать любые транзакции." #: importcsvdialog.cpp:1193 #, kde-format msgid "Failed to import 1 data row." msgid_plural "Failed to import %n data rows." msgstr[0] "_n: Ошибка импорта данных из 1 строчки." msgstr[1] "Ошибка импорта данных из %n строчек." #: importcsvdialog.cpp:1194 #, kde-format msgid "Required columns missing." msgstr "Недостает необходимых колонок." #: importcsvdialog.cpp:1195 #, kde-format msgid "Invalid value." msgstr "Неверное значение." #: importcsvdialog.cpp:1197 #, kde-format msgid "Empty category name." msgstr "Пустое имя категории." #: importcsvdialog.cpp:1197 importcsvdialog.cpp:1198 #, kde-format msgid "Empty account name." msgstr "Пустое имя счета." #: importcsvdialog.cpp:1199 #, kde-format msgid "Unknown category found." msgstr "Найдена неизвестная категория." #: importcsvdialog.cpp:1199 importcsvdialog.cpp:1200 #, kde-format msgid "Unknown account found." msgstr "Найден неизвестный счет." # #: importcsvdialog.cpp:1201 #, kde-format msgid "Cannot import security transactions (to/from security accounts)." msgstr "" "Невозможно импортировать транзакции с ценными бумагами (к/из счета ценных " "бумаг)" #: importcsvdialog.cpp:1202 #, kde-format msgid "Balancing account wrongly used." msgstr "Счет баланса неверно используется." #: importcsvdialog.cpp:1203 #, kde-format msgid "Same to and from account/category." msgstr "Категория и счет одинаковы." #: importcsvdialog.cpp:1205 #, kde-format msgid "No data found." msgstr "Данные не найдены." #: importcsvdialog.cpp:1219 qifimportexport.cpp:345 #, kde-format msgid "Unrecognized date format." msgstr "Не распознаваемый формат даты" #: importcsvdialog.cpp:1224 #, kde-format msgid "Specify Format" msgstr "Специфический формат" #: importcsvdialog.cpp:1230 #, kde-format msgid "" "The format of dates and/or numbers in the CSV file is ambiguous. Please " "select the correct format." msgstr "" "Формат дат и/или номеров в CVS файле двусмыслен.Пожалуйста выберите " "корректный формат." #: importcsvdialog.cpp:1235 qifimportexport.cpp:94 qifimportexport.cpp:533 #, kde-format msgid "Date format:" msgstr "формат даты:" #: importcsvdialog.cpp:1278 qifimportexport.cpp:541 #, kde-format msgid "Value format:" msgstr "формат валюты:" #: kdateedit.cpp:366 #, kde-format msgctxt "the day after today" msgid "tomorrow" msgstr "" #: kdateedit.cpp:367 #, kde-format msgctxt "this day" msgid "today" msgstr "" #: kdateedit.cpp:368 #, kde-format msgctxt "the day before today" msgid "yesterday" msgstr "" #: kdatepickerpopup.cpp:94 #, kde-format msgctxt "@option today" msgid "&Today" msgstr "" #: kdatepickerpopup.cpp:95 #, kde-format msgctxt "@option tomorrow" msgid "To&morrow" msgstr "" #: kdatepickerpopup.cpp:96 #, kde-format msgctxt "@option next week" msgid "Next &Week" msgstr "" #: kdatepickerpopup.cpp:97 #, kde-format msgctxt "@option next month" msgid "Next M&onth" msgstr "" #: kdatepickerpopup.cpp:105 #, kde-format msgctxt "@option do not specify a date" msgid "No Date" msgstr "" #: ledgerdialog.cpp:122 #, kde-format msgid "Export..." msgstr "Экспорт..." #: ledgerdialog.cpp:123 #, kde-format msgid "Print..." msgstr "Печать..." #: ledgerdialog.cpp:139 #, kde-format msgid "Withdrawal" msgstr "Отзыв" #: ledgerdialog.cpp:162 #, kde-format msgid "Join..." msgstr "соеденить.." #: ledgerdialog.cpp:164 #, kde-format msgid "Split Up" msgstr "Разделить вдоль" #: ledgerdialog.cpp:234 ledgerdialog.cpp:354 #, kde-format msgid "Empty transaction list." msgstr "Пустой список транзакций." #: ledgerdialog.cpp:443 transactionlistwidget.cpp:717 #, kde-format msgid "Are you sure you want to delete all (%1) selected transactions?" msgstr "Вы уверены что хотите удалить все (%1) выбранные транзакции?" #: ledgerdialog.cpp:547 transactionlistwidget.cpp:489 #, kde-format msgid "" "Cannot set the value of security transactions using the dialog for modifying " "multiple transactions." msgstr "" #: ledgerdialog.cpp:553 transactionlistwidget.cpp:495 #, kde-format msgid "Cannot change description of dividends and security transactions." msgstr "" #: ledgerdialog.cpp:559 transactionlistwidget.cpp:501 #, kde-format msgid "Cannot change payer of dividends and security transactions." msgstr "" #: ledgerdialog.cpp:565 transactionlistwidget.cpp:507 #, kde-format msgid "" "Cannot change date of transactions that are part of a split transaction." msgstr "" #: main.cpp:39 msgid "Eqonomize!" msgstr "Eqonomize!" #: main.cpp:39 msgid "A personal accounting program" msgstr "" #: main.cpp:39 msgid "(C) 2008 Hanna K." msgstr "" #: main.cpp:40 msgid "Hanna K." msgstr "" #: main.cpp:44 msgid "Start with expenses list displayed" msgstr "Старт со списка расходов" #: main.cpp:46 msgid "Start with incomes list displayed" msgstr "Старт со списка доходов" #: main.cpp:48 msgid "Start with transfers list displayed" msgstr "Старт со списка переводов" #: main.cpp:49 msgid "Document to open" msgstr "Документ открыт" #: overtimechart.cpp:124 overtimechart.cpp.bak:117 #, kde-format msgid "Incomes and Expenses" msgstr "Доходы и Расходы" #: overtimechart.cpp:125 overtimechart.cpp:1722 overtimechart.cpp.bak:118 #: overtimechart.cpp.bak:1703 overtimereport.cpp:102 overtimereport.cpp:343 #, kde-format msgid "Profits" msgstr "Прибыль" #: overtimechart.cpp:132 overtimechart.cpp:411 overtimechart.cpp:1949 #: overtimechart.cpp.bak:125 overtimechart.cpp.bak:404 #: overtimechart.cpp.bak:1950 overtimereport.cpp:108 overtimereport.cpp:228 #: overtimereport.cpp:753 #, kde-format msgid "All Categories Combined" msgstr "Объединить все категории" #: overtimechart.cpp:138 overtimechart.cpp:296 overtimechart.cpp:400 #: overtimechart.cpp:1852 overtimechart.cpp:1973 overtimechart.cpp.bak:131 #: overtimechart.cpp.bak:289 overtimechart.cpp.bak:393 #: overtimechart.cpp.bak:1853 overtimechart.cpp.bak:1974 #: overtimereport.cpp:113 overtimereport.cpp:176 overtimereport.cpp:225 #: overtimereport.cpp:710 overtimereport.cpp:776 #, kde-format msgid "All Descriptions Combined" msgstr "Объединить все описания" #: overtimechart.cpp:146 overtimechart.cpp:406 overtimechart.cpp.bak:139 #: overtimechart.cpp.bak:399 #, kde-format msgid "All Payees/Payers Combined" msgstr "Объединить всех получателей/плательщиков." #: overtimechart.cpp:155 overtimechart.cpp.bak:148 #, kde-format msgid "Start date:" msgstr "Дата начала:" #: overtimechart.cpp:178 overtimechart.cpp.bak:171 #, kde-format msgid "End date:" msgstr "Дата конца:" #: overtimechart.cpp:197 overtimechart.cpp.bak:190 #, kde-format msgid "Monthly total" msgstr "Итог месяца" #: overtimechart.cpp:201 overtimechart.cpp.bak:194 #, kde-format msgid "Daily average" msgstr "Среднее еженедельно" #: overtimechart.cpp:304 overtimechart.cpp:404 overtimechart.cpp:1855 #: overtimechart.cpp:1978 overtimechart.cpp.bak:297 overtimechart.cpp.bak:397 #: overtimechart.cpp.bak:1856 overtimechart.cpp.bak:1979 #, kde-format msgid "All Payers Combined" msgstr "Объединить всех плательщиков" #: overtimechart.cpp:305 overtimechart.cpp:405 overtimechart.cpp:1856 #: overtimechart.cpp:1977 overtimechart.cpp.bak:298 overtimechart.cpp.bak:398 #: overtimechart.cpp.bak:1857 overtimechart.cpp.bak:1978 #, kde-format msgid "All Payees Combined" msgstr "Объединить всех получателей." #: overtimechart.cpp:325 overtimechart.cpp:1853 overtimechart.cpp.bak:318 #: overtimechart.cpp.bak:1854 #, kde-format msgid "All Descriptions Split" msgstr "Все описания разбить" #: overtimechart.cpp:328 overtimechart.cpp:1857 overtimechart.cpp.bak:321 #: overtimechart.cpp.bak:1858 #, kde-format msgid "All Payers Split" msgstr "Всех плательщиков разделить" #: overtimechart.cpp:329 overtimechart.cpp:1858 overtimechart.cpp.bak:322 #: overtimechart.cpp.bak:1859 #, kde-format msgid "All Payees Split" msgstr "Всех получателей разделить" #: overtimechart.cpp:413 overtimechart.cpp:423 overtimechart.cpp:1950 #: overtimechart.cpp.bak:406 overtimechart.cpp.bak:416 #: overtimechart.cpp.bak:1951 #, kde-format msgid "All Categories Split" msgstr "Все категории разделить" #: overtimechart.cpp:1535 overtimechart.cpp.bak:1516 #, kde-format msgid "Value (%1)" msgstr "Значение (%1)" #: overtimechart.cpp:1536 overtimechart.cpp.bak:1517 #, kde-format msgid "Profit (%1)" msgstr "Прибыль (%1)" #: overtimechart.cpp:1537 overtimechart.cpp.bak:1518 #, kde-format msgid "Income (%1)" msgstr "Доход (%1)" #: overtimechart.cpp:1538 overtimechart.cpp.bak:1519 #, kde-format msgid "Cost (%1)" msgstr "Цена (%1)" #: overtimechart.cpp:1579 overtimechart.cpp.bak:1560 #, kde-format msgid "Time" msgstr "Время" #: overtimechart.cpp:1774 overtimechart.cpp:1775 overtimechart.cpp.bak:1755 #: overtimechart.cpp.bak:1756 #, kde-format msgid "no payer" msgstr "нет платильщика" #: overtimechart.cpp:1778 overtimechart.cpp.bak:1759 #, kde-format msgctxt "%1: Description; %2: Payer" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp:1783 overtimechart.cpp:1784 overtimechart.cpp.bak:1764 #: overtimechart.cpp.bak:1765 #, kde-format msgid "no payee" msgstr "нет получателя" #: overtimechart.cpp:1787 overtimechart.cpp.bak:1768 #, kde-format msgctxt "%1: Description; %2: Payee" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp.bak:649 #, kde-format msgid "Error after saving file; data may not have been saved." msgstr "Ошибка перед сохранением файла; данные могут быть не сохранены" #: overtimereport.cpp:344 #, kde-format msgid "Average Profit" msgstr "Средняя выгода" #: overtimereport.cpp:537 #, kde-format msgid "Year" msgstr "Год" #: overtimereport.cpp:538 #, kde-format msgid "Month" msgstr "Месяц" #: overtimereport.cpp:566 #, kde-format msgid "Includes scheduled transactions" msgstr "Включая запланированные транзакции" #: overtimereport.cpp:570 #, kde-format msgid "Adjusted for the average month / year (%1 / %2 days)" msgstr "Установлено для среднего месяца / года (%1 / %2 дней)" #: overtimereport.cpp:603 overtimereport.cpp:671 #, kde-format msgid "Subtotal" msgstr "Промежуточная сумма" #: qifimport.cpp:307 qifimport.cpp:367 qifimportexport.cpp:1259 #: qifimportexport.cpp:1350 qifimportexport.cpp:1470 #, kde-format msgid "Unnamed" msgstr "Неназваный" #: qifimport.cpp:337 qifimportexport.cpp:1299 qifimportexport.cpp:1413 #, kde-format msgid "Uncategorized" msgstr "Без категории" #: qifimportexport.cpp:56 #, kde-format msgid "Import QIF file" msgstr "Импорт QIF файла" #: qifimportexport.cpp:63 #, kde-format msgid "" "Select a QIF file to import. When you click next, the file be analysed and " "you might need to answer some questions about the format of the file." msgstr "" #: qifimportexport.cpp:73 #, kde-format msgid "Local Definitions" msgstr "" #: qifimportexport.cpp:74 #, kde-format msgid "" "Unknown elements where found in the QIF file. It is possible that this is " "because of localized type names. Please map them to the correct standard " "names." msgstr "" #: qifimportexport.cpp:80 #, kde-format msgid "Local Text" msgstr "Локальный текст" #: qifimportexport.cpp:81 #, kde-format msgid "Standard Text" msgstr "Стандартный текст" #: qifimportexport.cpp:84 #, kde-format msgid "Select standard text:" msgstr "Выбрать стандартный текст:" #: qifimportexport.cpp:90 #, kde-format msgid "Date Format" msgstr "Формат даты" #: qifimportexport.cpp:91 #, kde-format msgid "" "The date format in the QIF file is ambiguous. Please select the correct " "format." msgstr "" #: qifimportexport.cpp:100 #, kde-format msgid "Default Account" msgstr "Счет по умолчанию" #: qifimportexport.cpp:101 #, kde-format msgid "" "Could not find any account definitions in the QIF file. Please select a " "default account. It is also possible that this is caused by a localized " "opening balance text." msgstr "" #: qifimportexport.cpp:104 #, kde-format msgid "Default account:" msgstr "Счет по умолчанию:" #: qifimportexport.cpp:115 #, kde-format msgid "Opening balance text:" msgstr "Открытый текст баланса:" #: qifimportexport.cpp:121 #, kde-format msgid "Descriptions" msgstr "Описания" #: qifimportexport.cpp:122 #, kde-format msgid "" "Transactions in QIF files does not have any specific description property. " "You are therefore given the option to choose how the description of imported " "transactions will be set." msgstr "" #: qifimportexport.cpp:125 #, kde-format msgid "Subcategories as:" msgstr "Субкатегория как:" #: qifimportexport.cpp:134 #, kde-format msgid "Ignore" msgstr "Игнорировать" #: qifimportexport.cpp:137 #, kde-format msgid "Payee as:" msgstr "Получатель как:" #: qifimportexport.cpp:142 qifimportexport.cpp:520 #: transactionlistwidget.cpp:119 #, kde-format msgid "Payee" msgstr "Получатель" #: qifimportexport.cpp:147 #, kde-format msgid "Memo as:" msgstr "Запомнить как:" #: qifimportexport.cpp:156 #, kde-format msgid "Priority:" msgstr "Приоритет:" #: qifimportexport.cpp:159 #, kde-format msgid "Subcategory/Payee/Comments" msgstr "Субкатегория/Получатель/Комментарии" #: qifimportexport.cpp:160 #, kde-format msgid "Payee/Subcategory/Comments" msgstr "Получатель/Субкатегория/Комментарии" #: qifimportexport.cpp:161 #, kde-format msgid "Subcategory/Comments/Payee" msgstr "Субкатегория/Комментарии/Получатель" #: qifimportexport.cpp:162 #, kde-format msgid "Payee/Comments/Subcategory" msgstr "Получатель/Комментарии/Субкатегория" #: qifimportexport.cpp:163 #, kde-format msgid "Comments/Subcategory/Payee" msgstr "Комментарии/Субкатегория/Получатель" #: qifimportexport.cpp:164 #, kde-format msgid "Comments/Payee/Subcategory" msgstr "Комментарии/Получатель/Субкатегория" #: qifimportexport.cpp:314 qifimportexport.cpp:322 qifimportexport.cpp:338 #, kde-format msgid "Unknown" msgstr "Неизвестно" #: qifimportexport.cpp:324 #, kde-format msgid "Bank" msgstr "Банк" #: qifimportexport.cpp:326 #, kde-format msgid "Cat (Category)" msgstr "Кат. (Категория)" #: qifimportexport.cpp:327 #, kde-format msgid "CCard (Credit Card)" msgstr "Кредитная карта" #: qifimportexport.cpp:328 #, kde-format msgid "Invst (Investment)" msgstr "Инвест. (Инвестиции)" #: qifimportexport.cpp:329 #, kde-format msgid "Oth A (Other Assets)" msgstr "Другие активы" #: qifimportexport.cpp:330 #, kde-format msgid "Oth L (Other Liabilities)" msgstr "Существующие задолжности" #: qifimportexport.cpp:331 #, kde-format msgid "Security" msgstr "Ценные бумаги" #: qifimportexport.cpp:465 #, kde-format msgid "Successfully imported 1 account." msgid_plural "Successfully imported %n accounts." msgstr[0] "_n: Успешно импортирован 1 счет." msgstr[1] "Успешно импортированы %n счета(ов)." #: qifimportexport.cpp:469 #, kde-format msgid "Successfully imported 1 category." msgid_plural "Successfully imported %n categories." msgstr[0] "_n: Успешный импорт 1 категории." msgstr[1] "Успешный импорт %n категорий." #: qifimportexport.cpp:473 #, kde-format msgid "1 duplicate transaction was ignored." msgid_plural "%n duplicate transactions was ignored." msgstr[0] "_n: 1 дубликат транзакции был игнорирован." msgstr[1] "%n дубликатов транзакций было игнорировано." #: qifimportexport.cpp:477 #, kde-format msgid "Failed to import 1 transaction." msgid_plural "Failed to import %n transactions." msgstr[0] "_n: Ошибка импорта 1 транзакции." msgstr[1] "Ошибка импорта %n транзакций." #: qifimportexport.cpp:481 #, kde-format msgid "1 security was not imported." msgid_plural "%n securities were not imported." msgstr[0] "_n: 1 ценная бумага не была импортирована." msgstr[1] "%n ценных бумаг не было импортировано." #: qifimportexport.cpp:485 #, kde-format msgid "1 security transaction was not imported." msgid_plural "%n security transactions were not imported." msgstr[0] "_n: 1 транзакция с ценными бумагами не была импортирована." msgstr[1] "%n транзакций с ценными бумагами не было импортировано." #: qifimportexport.cpp:494 #, kde-format msgid "Export QIF File" msgstr "Экспорт в QIF файл" #: qifimportexport.cpp:506 #, kde-format msgctxt "All accounts" msgid "All" msgstr "Все счета" #: qifimportexport.cpp:517 #, kde-format msgid "Export transaction description as:" msgstr "" #: qifimportexport.cpp:524 #, kde-format msgid "Memo" msgstr "Записка" #: qifimportexport.cpp:528 #, kde-format msgid "Subcategory" msgstr "Субкатегория" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 5 #: rc.cpp:3 #, kde-format msgid "&Import" msgstr "&Импорт" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 12 #: rc.cpp:6 #, kde-format msgid "&Accounts" msgstr "&Счет" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 24 #: rc.cpp:9 #, kde-format msgid "&Transactions" msgstr "&Транзакции" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 41 #: rc.cpp:12 #, kde-format msgid "&Securities" msgstr "&Ценные бумаги" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 56 #: rc.cpp:15 #, kde-format msgid "Stat&istics" msgstr "Стат&истика" #: rc.cpp:16 #, kde-format msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" "Rodion Samusik,,Launchpad Contributions:,Sergey Vostrikov,Vitaliy " "Berdinskikh,rodion" #: rc.cpp:17 #, kde-format msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" "rodion@sbchel.ru,,,s.vostrikov@gmail.com,skipper13@root.ua,rodion@sbchel.ru" #: recurrenceeditwidget.cpp:69 #, kde-format msgid "Edit Exceptions" msgstr "" #: recurrenceeditwidget.cpp:186 #, kde-format msgid "Edit Recurrence Range" msgstr "" #: recurrenceeditwidget.cpp:194 recurrenceeditwidget.cpp:229 #, kde-format msgid "Begins on: %1" msgstr "" #: recurrenceeditwidget.cpp:199 #, kde-format msgid "No ending date" msgstr "" #: recurrenceeditwidget.cpp:203 #, kde-format msgid "End after" msgstr "Закончить после" #: recurrenceeditwidget.cpp:209 #, kde-format msgid "occurrence(s)" msgstr "наличность" #: recurrenceeditwidget.cpp:211 #, kde-format msgid "End on" msgstr "Закончить на" #: recurrenceeditwidget.cpp:298 #, kde-format msgid "End date before start date." msgstr "Дата конца перед датой начала." #: recurrenceeditwidget.cpp:312 #, kde-format msgid "Enable recurrance" msgstr "Разрешить повторение" #: recurrenceeditwidget.cpp:315 #, kde-format msgid "Recurrence Rule" msgstr "Правила повторения" #: recurrenceeditwidget.cpp:321 #, kde-format msgid "Weekly" msgstr "Еженедельно" #: recurrenceeditwidget.cpp:341 recurrenceeditwidget.cpp:352 #: recurrenceeditwidget.cpp:376 recurrenceeditwidget.cpp:462 #, kde-format msgid "Recur every" msgstr "Повторять каждый" #: recurrenceeditwidget.cpp:345 #, kde-format msgid "day(s)" msgstr "день(и)" #: recurrenceeditwidget.cpp:356 #, kde-format msgid "week(s) on:" msgstr "неделю(и):" #: recurrenceeditwidget.cpp:380 #, kde-format msgid "month(s), after the start month" msgstr "месяц(ы), после стартового месяца" #: recurrenceeditwidget.cpp:385 recurrenceeditwidget.cpp:437 #, kde-format msgid "Recur on the" msgstr "Повторять на" #: recurrenceeditwidget.cpp:391 recurrenceeditwidget.cpp:442 #: recurrenceeditwidget.cpp:494 #, kde-format msgid "1st" msgstr "1." #: recurrenceeditwidget.cpp:392 recurrenceeditwidget.cpp:443 #: recurrenceeditwidget.cpp:495 #, kde-format msgid "2nd" msgstr "2." #: recurrenceeditwidget.cpp:393 recurrenceeditwidget.cpp:444 #: recurrenceeditwidget.cpp:496 #, kde-format msgid "3rd" msgstr "3." #: recurrenceeditwidget.cpp:394 recurrenceeditwidget.cpp:445 #: recurrenceeditwidget.cpp:497 #, kde-format msgid "4th" msgstr "4." #: recurrenceeditwidget.cpp:395 recurrenceeditwidget.cpp:446 #: recurrenceeditwidget.cpp:498 #, kde-format msgid "5th" msgstr "5." #: recurrenceeditwidget.cpp:396 #, kde-format msgid "6th" msgstr "6." #: recurrenceeditwidget.cpp:397 #, kde-format msgid "7th" msgstr "7." #: recurrenceeditwidget.cpp:398 #, kde-format msgid "8th" msgstr "8." #: recurrenceeditwidget.cpp:399 #, kde-format msgid "9th" msgstr "9." #: recurrenceeditwidget.cpp:400 #, kde-format msgid "10th" msgstr "10." #: recurrenceeditwidget.cpp:401 #, kde-format msgid "11th" msgstr "11." #: recurrenceeditwidget.cpp:402 #, kde-format msgid "12th" msgstr "12." #: recurrenceeditwidget.cpp:403 #, kde-format msgid "13th" msgstr "13." #: recurrenceeditwidget.cpp:404 #, kde-format msgid "14th" msgstr "14." #: recurrenceeditwidget.cpp:405 #, kde-format msgid "15th" msgstr "15." #: recurrenceeditwidget.cpp:406 #, kde-format msgid "16th" msgstr "16." #: recurrenceeditwidget.cpp:407 #, kde-format msgid "17th" msgstr "17." #: recurrenceeditwidget.cpp:408 #, kde-format msgid "18th" msgstr "18." #: recurrenceeditwidget.cpp:409 #, kde-format msgid "19th" msgstr "19." #: recurrenceeditwidget.cpp:410 #, kde-format msgid "20th" msgstr "20." #: recurrenceeditwidget.cpp:411 #, kde-format msgid "21st" msgstr "21." #: recurrenceeditwidget.cpp:412 #, kde-format msgid "22nd" msgstr "22." #: recurrenceeditwidget.cpp:413 #, kde-format msgid "23rd" msgstr "23." #: recurrenceeditwidget.cpp:414 #, kde-format msgid "24th" msgstr "24." #: recurrenceeditwidget.cpp:415 #, kde-format msgid "25th" msgstr "25." #: recurrenceeditwidget.cpp:416 #, kde-format msgid "26th" msgstr "26." #: recurrenceeditwidget.cpp:417 #, kde-format msgid "27th" msgstr "27." #: recurrenceeditwidget.cpp:418 #, kde-format msgid "28th" msgstr "28." #: recurrenceeditwidget.cpp:419 #, kde-format msgid "29th" msgstr "29." #: recurrenceeditwidget.cpp:420 #, kde-format msgid "30th" msgstr "30." #: recurrenceeditwidget.cpp:421 #, kde-format msgid "31st" msgstr "31." #: recurrenceeditwidget.cpp:422 recurrenceeditwidget.cpp:447 #: recurrenceeditwidget.cpp:499 #, kde-format msgid "Last" msgstr "Последний" #: recurrenceeditwidget.cpp:423 recurrenceeditwidget.cpp:448 #: recurrenceeditwidget.cpp:500 #, kde-format msgid "2nd Last" msgstr "Предпоследний" #: recurrenceeditwidget.cpp:424 recurrenceeditwidget.cpp:449 #: recurrenceeditwidget.cpp:501 #, kde-format msgid "3rd Last" msgstr "3-й с конца" #: recurrenceeditwidget.cpp:425 recurrenceeditwidget.cpp:450 #: recurrenceeditwidget.cpp:502 #, kde-format msgid "4th Last" msgstr "4-й с конца" #: recurrenceeditwidget.cpp:426 recurrenceeditwidget.cpp:451 #: recurrenceeditwidget.cpp:503 #, kde-format msgid "5th Last" msgstr "5-й с конца" #: recurrenceeditwidget.cpp:429 #, kde-format msgid "day" msgstr "День" #: recurrenceeditwidget.cpp:431 recurrenceeditwidget.cpp:483 #: recurrenceeditwidget.cpp:521 #, kde-format msgid "possibly on weekend" msgstr "возможно на выходные" #: recurrenceeditwidget.cpp:432 recurrenceeditwidget.cpp:484 #: recurrenceeditwidget.cpp:522 #, kde-format msgid "but before weekend" msgstr "но перед выходными" #: recurrenceeditwidget.cpp:433 recurrenceeditwidget.cpp:485 #: recurrenceeditwidget.cpp:523 #, kde-format msgid "but after weekend" msgstr "но после выходных" #: recurrenceeditwidget.cpp:466 #, kde-format msgid "year(s), after the start year" msgstr "год(ы), после стартового года." #: recurrenceeditwidget.cpp:471 #, kde-format msgctxt "part before XXX of 'Recur on day XXX of month YYY'" msgid "Recur on day" msgstr "" #: recurrenceeditwidget.cpp:479 #, kde-format msgctxt "part between XXX and YYY of 'Recur on day XXX of month YYY'" msgid "of" msgstr "" #: recurrenceeditwidget.cpp:489 #, kde-format msgctxt "Part before NNN in 'Recur on the NNN. WEEKDAY of MONTH'" msgid "On the" msgstr "" #: recurrenceeditwidget.cpp:507 #, kde-format msgctxt "part between WEEKDAY and MONTH in 'Recur on NNN. WEEKDAY of MONTH'" msgid "of" msgstr "" #: recurrenceeditwidget.cpp:512 #, kde-format msgid "Recur on day #" msgstr "" #: recurrenceeditwidget.cpp:519 #, kde-format msgctxt "part after NNN of 'Recur on day #NNN of the year'" msgid " of the year" msgstr "" #: recurrenceeditwidget.cpp:533 #, kde-format msgid "Range..." msgstr "Диапазон..." #: recurrenceeditwidget.cpp:535 #, kde-format msgid "Exceptions..." msgstr "Исключения..." #: recurrenceeditwidget.cpp:731 #, kde-format msgid "No day of week selected for weekly recurrence." msgstr "Нет дня недели выбранного для недельной рекурсии." #: recurrenceeditwidget.cpp:745 recurrenceeditwidget.cpp:774 #: recurrenceeditwidget.cpp:791 #, kde-format msgid "Selected day will never occur with selected frequency and start date." msgstr "" "Выбранный день никогда не наступит, с выбранной частотой и стартовой датой" #: recurrenceeditwidget.cpp:761 #, kde-format msgid "Selected day does not exist in selected month." msgstr "Выбранный день не существует в выбранном месяце." #: transaction.cpp:155 transaction.cpp:186 #, kde-format msgid "Dividend: %1" msgstr "Дивиденты: %1" #: transaction.cpp:253 transaction.cpp:256 transaction.cpp:284 #, kde-format msgid "Account balancing" msgstr "Баланс счета" #: transaction.cpp:337 transaction.cpp:352 #, kde-format msgid "Security: %1 (bought)" msgstr "Ценные бумаги: %1 (покупка)" #: transaction.cpp:375 transaction.cpp:390 #, kde-format msgid "Security: %1 (sold)" msgstr "Ценные бумаги: %1 (продажа)" #: transactioneditwidget.cpp:125 #, kde-format msgid "Shares bought:" msgstr "Распределенные покупки:" #: transactioneditwidget.cpp:130 #, kde-format msgid "Shares sold:" msgstr "Распределенные продажи:" #: transactioneditwidget.cpp:238 transactioneditwidget.cpp:1144 #: transactionfilterwidget.cpp:140 #, kde-format msgid "Payer:" msgstr "Платильщик:" #: transactioneditwidget.cpp:280 transactioneditwidget.cpp:1145 #: transactionfilterwidget.cpp:141 #, kde-format msgid "Payee:" msgstr "Получатель:" #: transactioneditwidget.cpp:664 transactioneditwidget.cpp:1262 #, kde-format msgid "No income category available." msgstr "Нет доступной категории доходов." #: transactioneditwidget.cpp:689 transactioneditwidget.cpp:1270 #, kde-format msgid "No expense category available." msgstr "Нет доступной категории расходов" #: transactioneditwidget.cpp:720 #, kde-format msgid "Cannot create a regular transfer to/from a securities account." msgstr "Невозможно создать регулярный трансфер в/из счета ценным бумаг." #: transactioneditwidget.cpp:727 #, kde-format msgid "Cannot create a regular income to a securities account." msgstr "Невозможно создать регулярный доход в счете ценных бумаг." #: transactioneditwidget.cpp:743 #, kde-format msgid "Zero price per share not allowed." msgstr "" #: transactioneditwidget.cpp:755 #, kde-format msgid "Cannot create a regular expense from a securities account." msgstr "Невозможно создать регулярный расход с счета ценных бумаг." #: transactioneditwidget.cpp:1086 #, kde-format msgid "Modify Transactions" msgstr "Модифицировать транзакции" #: transactionfilterwidget.cpp:99 #, kde-format msgid "Min amount:" msgstr "Минимальный объем:" #: transactionfilterwidget.cpp:100 #, kde-format msgid "Max amount:" msgstr "Максимальный объем:" #: transactionfilterwidget.cpp:110 #, kde-format msgid "Min income:" msgstr "Минимальный доход:" #: transactionfilterwidget.cpp:111 #, kde-format msgid "Max income:" msgstr "Максимальный доход:" #: transactionfilterwidget.cpp:121 #, kde-format msgid "Min cost:" msgstr "Минимальная цена:" #: transactionfilterwidget.cpp:122 #, kde-format msgid "Max cost:" msgstr "Максимальная ценна:" #: transactionfilterwidget.cpp:148 #, kde-format msgid "Include" msgstr "Включить" #: transactionfilterwidget.cpp:152 #, kde-format msgid "Exclude" msgstr "Исключить" #: transactionlistwidget.cpp:117 #, kde-format msgid "From Account" msgstr "С счета" #: transactionlistwidget.cpp:128 #, kde-format msgid "To Account" msgstr "К счету" #: transactionlistwidget.cpp:130 #, kde-format msgid "Payer" msgstr "Платильщик" #: transactionlistwidget.cpp:169 #, kde-format msgid "New/Edit Expense" msgstr "Новый/Редактировать расход" #: transactionlistwidget.cpp:170 #, kde-format msgid "Filter" msgstr "Фильтр" #: transactionlistwidget.cpp:209 #, kde-format msgid "Total:" msgstr "Итог:" #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:328 #, kde-format msgid "Average:" msgstr "Среднее:" #: transactionlistwidget.cpp:209 #, kde-format msgid "Monthly:" msgstr "Ежемесячно:" #: transactionlistwidget.cpp:314 #, kde-format msgid "Total cost:" msgstr "Итого цена:" #: transactionlistwidget.cpp:318 #, kde-format msgid "Total income:" msgstr "Итого доходов:" #: transactionlistwidget.cpp:322 #, kde-format msgid "Total amount:" msgstr "Итого объем:" #: transactionlistwidget.cpp:330 #, kde-format msgid "Monthly average:" msgstr "Среднее в месяц:" #: transactionlistwidget.cpp:671 #, kde-format msgid "" "Are you sure you want to delete all (%1) transactions in the selected split " "transaction?" msgstr "" "Вы уверены, что хотите удалить все (%1) транзакции в выбранном разбиение " "тразакции?" #: transactionlistwidget.cpp:1028 #, kde-format msgid "* Part of split transaction" msgstr "* Часть разбитой транзакции" #: transactionlistwidget.cpp:1029 #, kde-format msgid "* Part of split (%1)" msgstr "* Часть разбивки (%1)" #: transactionlistwidget.cpp:1033 #, kde-format msgid "** Recurring (editing occurrance)" msgstr "** Периодически (редактирование)" #: transactionlistwidget.cpp:1049 #, kde-format msgid "Modify..." msgstr "Модифицировано..." #~ msgid "Error after saving file; data may not have been saved" #~ msgstr "Ошибка после сохранения файла; данные могут быть не сохранены." #~ msgid "tomorrow" #~ msgstr "завтра" #~ msgid "today" #~ msgstr "сегодня" #~ msgid "yesterday" #~ msgstr "вчера" #~ msgid "Security Shares Bought..." #~ msgstr "Покупки акций..." #~ msgid "&Add Category" #~ msgstr "Добавить категорию" eqonomize-0.6/po/sk.po0000644000175000017500000021564211107053374013727 0ustar hannahanna# Slovak translation for eqonomize # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the eqonomize package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: eqonomize\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?" "group_id=173799&atid=866832\n" "POT-Creation-Date: 2008-11-13 14:35+0100\n" "PO-Revision-Date: 2007-04-09 17:40+0000\n" "Last-Translator: Roman Priesol \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" "X-Launchpad-Export-Date: 2008-11-13 13:21+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: budget.cpp:51 editsplitdialog.cpp:118 ledgerdialog.cpp:652 #, kde-format msgid "Balancing" msgstr "Vyrovnanie" #: budget.cpp:84 #, kde-format msgid "Couldn't open %1 for reading" msgstr "%1 sa nedá čítať" #: budget.cpp:95 #, kde-format msgid "" "Not a valid Eqonomize! file (XML parse error: \"%2\" at line %3, col %4)" msgstr "Nie je Eqonomize! súbor (chyba XML: \"%2\" na riadku %3, stĺpec %4)" #: budget.cpp:98 #, kde-format msgid "Invalid root element %1 in XML document" msgstr "Nesprávny koreňový prvok %1 v XML dokumente" #: budget.cpp:363 #, kde-format msgid "Unable to load 1 account." msgid_plural "Unable to load %n accounts." msgstr[0] "" msgstr[1] "" #: budget.cpp:368 #, kde-format msgid "Unable to load 1 category." msgid_plural "Unable to load %n categories." msgstr[0] "" msgstr[1] "" #: budget.cpp:373 #, kde-format msgid "Unable to load 1 security." msgid_plural "Unable to load %n securities." msgstr[0] "" msgstr[1] "" #: budget.cpp:378 #, kde-format msgid "Unable to load 1 transaction." msgid_plural "Unable to load %n transactions." msgstr[0] "" msgstr[1] "" #: budget.cpp:389 #, kde-format msgid "File is a directory" msgstr "Súbor je adresár" #: budget.cpp:397 #, kde-format msgid "Couldn't open file for writing" msgstr "Nemôžem otvoriť pre zápis" #: budget.cpp:547 budget.cpp:551 #, kde-format msgid "Error while writing file; file was not saved" msgstr "Chyba počas zápisu; súbor nebol uložený" #: categoriescomparisonchart.cpp:123 categoriescomparisonreport.cpp:164 #: eqonomize.cpp:1797 eqonomize.cpp:1957 eqonomize.cpp:2036 #: transactionlistwidget.cpp:138 #, kde-format msgid "From" msgstr "Od" #: categoriescomparisonchart.cpp:130 categoriescomparisonreport.cpp:171 #: eqonomize.cpp:1808 eqonomize.cpp:1969 eqonomize.cpp:2037 #: transactionlistwidget.cpp:139 #, kde-format msgid "To" msgstr "Do" #: categoriescomparisonchart.cpp:147 categoriescomparisonreport.cpp:114 #: overtimechart.cpp:112 overtimechart.cpp.bak:106 overtimereport.cpp:97 #, kde-format msgid "Source:" msgstr "Zdroj" #: categoriescomparisonchart.cpp:150 categoriescomparisonchart.cpp:858 #, kde-format msgid "All Expenses" msgstr "Všetky výdavky" #: categoriescomparisonchart.cpp:151 categoriescomparisonchart.cpp:859 #, kde-format msgid "All Incomes" msgstr "Všetky prijmy" #: categoriescomparisonchart.cpp:152 categoriescomparisonchart.cpp:860 #, kde-format msgid "All Accounts" msgstr "Všetky účty" #: categoriescomparisonchart.cpp:155 categoriescomparisonchart.cpp:864 #: categoriescomparisonreport.cpp:122 categoriescomparisonreport.cpp:752 #: categoriescomparisonreport.cpp:1016 overtimereport.cpp:375 #, kde-format msgid "Expenses: %1" msgstr "Výdavky: %1" #: categoriescomparisonchart.cpp:160 categoriescomparisonchart.cpp:871 #: categoriescomparisonreport.cpp:127 categoriescomparisonreport.cpp:756 #: categoriescomparisonreport.cpp:1023 overtimereport.cpp:366 #, kde-format msgid "Incomes: %1" msgstr "Prijmy: %1" #: categoriescomparisonchart.cpp:199 categoriescomparisonchart.cpp:225 #: categoriescomparisonreport.cpp:334 categoriescomparisonreport.cpp:360 #: editsplitdialog.cpp:411 eqonomize.cpp:482 eqonomize.cpp:571 #: eqonomize.cpp:741 eqonomize.cpp:848 eqonomize.cpp:870 eqonomize.cpp:2483 #: eqonomize.cpp:3180 eqonomize.cpp:3206 eqonomize.cpp:3326 eqonomize.cpp:3352 #: importcsvdialog.cpp:780 importcsvdialog.cpp:1196 overtimechart.cpp:462 #: overtimechart.cpp:500 overtimechart.cpp:528 overtimechart.cpp:566 #: overtimechart.cpp.bak:455 overtimechart.cpp.bak:493 #: overtimechart.cpp.bak:521 overtimechart.cpp.bak:559 #: recurrenceeditwidget.cpp:156 recurrenceeditwidget.cpp:171 #: recurrenceeditwidget.cpp:293 transactioneditwidget.cpp:707 #: transactioneditwidget.cpp:1281 transactionfilterwidget.cpp:564 #: transactionfilterwidget.cpp:590 #, kde-format msgid "Invalid date." msgstr "Nesprávny dátum." #: categoriescomparisonchart.cpp:204 categoriescomparisonreport.cpp:339 #: eqonomize.cpp:3185 eqonomize.cpp:3331 transactionfilterwidget.cpp:569 #, kde-format msgid "To date is before from date." msgstr "Dátum do je pred dátumom od." #: categoriescomparisonchart.cpp:229 categoriescomparisonreport.cpp:364 #: eqonomize.cpp:3210 eqonomize.cpp:3356 transactionfilterwidget.cpp:594 #, kde-format msgid "From date is after to date." msgstr "Dátum od je po dátume do." #: categoriescomparisonchart.cpp:340 categoriescomparisonreport.cpp:463 #: eqonomize.cpp:3610 eqonomize.cpp:4252 ledgerdialog.cpp:251 #: overtimechart.cpp:624 overtimechart.cpp.bak:617 overtimereport.cpp:278 #: qifimportexport.cpp:604 #, kde-format msgid "" "The selected file already exists. Would you like to overwrite the old copy?" msgstr "Vybraný súbor už existuje. Prajete si ho prepísať?" #: categoriescomparisonchart.cpp:344 categoriescomparisonreport.cpp:467 #: eqonomize.cpp:4257 ledgerdialog.cpp:255 overtimechart.cpp:628 #: overtimechart.cpp.bak:621 overtimereport.cpp:282 qifimportexport.cpp:608 #, kde-format msgid "You selected a directory!" msgstr "Vybrali ste adresár." #: categoriescomparisonchart.cpp:352 categoriescomparisonreport.cpp:475 #: eqonomize.cpp:4264 ledgerdialog.cpp:263 overtimechart.cpp:636 #: overtimechart.cpp.bak:629 overtimereport.cpp:290 qifimportexport.cpp:616 #, kde-format msgid "Couldn't open file for writing." msgstr "Do súboru sa nedá zapisovať." #: categoriescomparisonchart.cpp:372 categoriescomparisonreport.cpp:482 #: eqonomize.cpp:4270 ledgerdialog.cpp:269 overtimechart.cpp:656 #: overtimechart.cpp.bak:644 overtimereport.cpp:297 qifimportexport.cpp:622 #, kde-format msgid "Error while writing file; file was not saved." msgstr "Chyba počas zápisu do súboru; súbor nebol uložený." #: categoriescomparisonchart.cpp:728 categoriescomparisonreport.cpp:303 #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:754 #: categoriescomparisonreport.cpp:839 categoriescomparisonreport.cpp:930 #: categoriescomparisonreport.cpp:977 overtimechart.cpp:373 #: overtimechart.cpp:1740 overtimechart.cpp:1746 overtimechart.cpp:1774 #: overtimechart.cpp:1776 overtimechart.cpp:1783 overtimechart.cpp:1785 #: overtimechart.cpp:1821 overtimechart.cpp:1891 overtimechart.cpp.bak:366 #: overtimechart.cpp.bak:1721 overtimechart.cpp.bak:1727 #: overtimechart.cpp.bak:1755 overtimechart.cpp.bak:1757 #: overtimechart.cpp.bak:1764 overtimechart.cpp.bak:1766 #: overtimechart.cpp.bak:1811 overtimechart.cpp.bak:1892 #: overtimereport.cpp:213 overtimereport.cpp:384 overtimereport.cpp:393 #: overtimereport.cpp:732 #, kde-format msgid "No description" msgstr "Bez popisu" #: categoriescomparisonreport.cpp:119 categoriescomparisonreport.cpp:1012 #, kde-format msgid "All Categories" msgstr "Všetky kategórie" #: categoriescomparisonreport.cpp:138 #, kde-format msgid "Descriptions for" msgstr "Popis pre" #: categoriescomparisonreport.cpp:145 #, kde-format msgid "Payees/payers for" msgstr "Príjemca/platca pre" #: categoriescomparisonreport.cpp:161 #, kde-format msgid "Period:" msgstr "Doba:" #: categoriescomparisonreport.cpp:186 overtimereport.cpp:120 #, kde-format msgid "Columns:" msgstr "Stĺpce:" #: categoriescomparisonreport.cpp:189 categoriescomparisonreport.cpp:782 #: eqonomize.cpp:1062 eqonomize.cpp:1935 eqonomize.cpp:4142 #: importcsvdialog.cpp:139 importcsvdialog.cpp:157 importcsvdialog.cpp:180 #: importcsvdialog.cpp:197 importcsvdialog.cpp:216 importcsvdialog.cpp:235 #: importcsvdialog.cpp:253 overtimereport.cpp:123 #, kde-format msgid "Value" msgstr "Hodnota" #: categoriescomparisonreport.cpp:192 overtimereport.cpp:126 #: recurrenceeditwidget.cpp:320 #, kde-format msgid "Daily" msgstr "Denne" #: categoriescomparisonreport.cpp:195 overtimereport.cpp:129 #: recurrenceeditwidget.cpp:322 #, kde-format msgid "Monthly" msgstr "Mesačne" #: categoriescomparisonreport.cpp:198 overtimereport.cpp:132 #: recurrenceeditwidget.cpp:323 #, kde-format msgid "Yearly" msgstr "Ročne" #: categoriescomparisonreport.cpp:201 categoriescomparisonreport.cpp:787 #: overtimechart.cpp:205 overtimechart.cpp:1534 overtimechart.cpp.bak:198 #: overtimechart.cpp.bak:1515 overtimereport.cpp:135 overtimereport.cpp:549 #: transactionlistwidget.cpp:276 transactionlistwidget.cpp:340 #, kde-format msgid "Quantity" msgstr "Množstvo" #: categoriescomparisonreport.cpp:204 overtimechart.cpp:209 #: overtimechart.cpp.bak:202 overtimereport.cpp:138 #, kde-format msgid "Average value" msgstr "Priemerná hodnota" #: categoriescomparisonreport.cpp:278 categoriescomparisonreport.cpp:947 #, kde-format msgid "All descriptions" msgstr "Všetky popisy" #: categoriescomparisonreport.cpp:279 categoriescomparisonreport.cpp:948 #, kde-format msgid "All payees" msgstr "Všetci príjemcovia" #: categoriescomparisonreport.cpp:280 categoriescomparisonreport.cpp:949 #, kde-format msgid "All payers" msgstr "Všetci platitelia" #: categoriescomparisonreport.cpp:309 categoriescomparisonreport.cpp:751 #: categoriescomparisonreport.cpp:837 categoriescomparisonreport.cpp:932 #: categoriescomparisonreport.cpp:994 overtimechart.cpp:382 #: overtimechart.cpp:1758 overtimechart.cpp:1768 overtimechart.cpp:1823 #: overtimechart.cpp:1908 overtimechart.cpp.bak:375 overtimechart.cpp.bak:1739 #: overtimechart.cpp.bak:1749 overtimechart.cpp.bak:1813 #: overtimechart.cpp.bak:1909 #, kde-format msgid "No payee" msgstr "Bez príjemcu" #: categoriescomparisonreport.cpp:310 categoriescomparisonreport.cpp:755 #: categoriescomparisonreport.cpp:838 categoriescomparisonreport.cpp:933 #: categoriescomparisonreport.cpp:995 overtimechart.cpp:381 #: overtimechart.cpp:1752 overtimechart.cpp:1763 overtimechart.cpp:1825 #: overtimechart.cpp:1907 overtimechart.cpp.bak:374 overtimechart.cpp.bak:1733 #: overtimechart.cpp.bak:1744 overtimechart.cpp.bak:1815 #: overtimechart.cpp.bak:1908 #, kde-format msgid "No payer" msgstr "Bez platcu" #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:751 #: overtimereport.cpp:393 #, kde-format msgid "Expenses: %2, %1" msgstr "Výdavky: %2, %1" #: categoriescomparisonreport.cpp:754 categoriescomparisonreport.cpp:755 #: overtimereport.cpp:384 #, kde-format msgid "Incomes: %2, %1" msgstr "Prijmy: %2. %1" #: categoriescomparisonreport.cpp:758 #, kde-format msgid "Incomes & Expenses" msgstr "Prijmy a výdavky" #: categoriescomparisonreport.cpp:771 #, kde-format msgctxt "html format; %1: title; %2: from date; %3: to date" msgid "%1 (%2–%3)" msgstr "%1 (%2–%3)" #: categoriescomparisonreport.cpp:772 #, kde-format msgctxt "html format; %1: title; %2: to date" msgid "%1 (to %2)" msgstr "%1 (do %2)" #: categoriescomparisonreport.cpp:776 eqonomize.cpp:4046 eqonomize.cpp:4094 #: qifimportexport.cpp:131 transactionlistwidget.cpp:116 #: transactionlistwidget.cpp:127 #, kde-format msgid "Category" msgstr "Kategória" #: categoriescomparisonreport.cpp:778 eqonomize.cpp:1938 #: transactionlistwidget.cpp:115 #, kde-format msgid "Cost" msgstr "Cena" #: categoriescomparisonreport.cpp:780 editscheduledtransactiondialog.cpp:46 #: editsplitdialog.cpp:108 eqonomize.cpp:285 eqonomize.cpp:329 #: ledgerdialog.cpp:647 transactionlistwidget.cpp:126 #, kde-format msgid "Income" msgstr "Príjem" #: categoriescomparisonreport.cpp:784 overtimereport.cpp:545 #, kde-format msgid "Daily Average" msgstr "Denný priemer" #: categoriescomparisonreport.cpp:785 overtimereport.cpp:546 #, kde-format msgid "Monthly Average" msgstr "Mesačný priemer" #: categoriescomparisonreport.cpp:786 overtimereport.cpp:547 #, kde-format msgid "Yearly Average" msgstr "Ročný priemer" #: categoriescomparisonreport.cpp:789 overtimereport.cpp:358 #: overtimereport.cpp:376 overtimereport.cpp:394 #, kde-format msgid "Average Cost" msgstr "Priemerná cena" #: categoriescomparisonreport.cpp:791 overtimereport.cpp:350 #: overtimereport.cpp:367 overtimereport.cpp:385 #, kde-format msgid "Average Income" msgstr "Priemerný príjem" #: categoriescomparisonreport.cpp:793 #, kde-format msgid "Average Value" msgstr "Priemerná hodnota" #: categoriescomparisonreport.cpp:853 eqonomize.cpp:3932 eqonomize.cpp:4030 #: eqonomize.cpp:4075 eqonomize.cpp:4123 overtimereport.cpp:686 #, kde-format msgid "Total" msgstr "" #: categoriescomparisonreport.cpp:878 #, kde-format msgid "Total incomes" msgstr "Celkové prijmy" #: categoriescomparisonreport.cpp:902 #, kde-format msgid "Total expenses" msgstr "Celkové výdavky" #: categoriescomparisonreport.cpp:912 #, kde-format msgid "Total (Profits)" msgstr "Spolu (Zisky)" #: editscheduledtransactiondialog.cpp:45 editsplitdialog.cpp:111 #: eqonomize.cpp:288 eqonomize.cpp:332 ledgerdialog.cpp:650 #, kde-format msgid "Expense" msgstr "Výdaj" #: editscheduledtransactiondialog.cpp:47 editsplitdialog.cpp:120 #: eqonomize.cpp:282 eqonomize.cpp:326 ledgerdialog.cpp:653 #, kde-format msgid "Transfer" msgstr "Prevod" #: editscheduledtransactiondialog.cpp:48 editsplitdialog.cpp:114 #: eqonomize.cpp:289 eqonomize.cpp:333 #, kde-format msgid "Security Buy" msgstr "Nákup akcií" #: editscheduledtransactiondialog.cpp:49 editsplitdialog.cpp:116 #: eqonomize.cpp:290 eqonomize.cpp:334 #, kde-format msgid "Security Sell" msgstr "Predaj akcií" #: editscheduledtransactiondialog.cpp:56 editscheduledtransactiondialog.cpp:57 #, kde-format msgid "Recurrence" msgstr "Opakovanie" #: editscheduledtransactiondialog.cpp:104 #, kde-format msgid "New Expense" msgstr "Nový výdavok" #: editscheduledtransactiondialog.cpp:106 #, kde-format msgid "New Dividend" msgstr "Nová dividenda" #: editscheduledtransactiondialog.cpp:107 #, kde-format msgid "New Income" msgstr "Nový príjem" #: editscheduledtransactiondialog.cpp:110 #, kde-format msgid "New Transfer" msgstr "Nový prevod" #: editscheduledtransactiondialog.cpp:111 #, kde-format msgid "New Security Buy" msgstr "Nový nákup akcií" #: editscheduledtransactiondialog.cpp:113 #, kde-format msgid "New Security Sell" msgstr "Nový predaj akcií" #: editscheduledtransactiondialog.cpp:128 #: editscheduledtransactiondialog.cpp:149 transactioneditwidget.cpp:1064 #, kde-format msgid "Edit Expense" msgstr "Uprav vydavok" #: editscheduledtransactiondialog.cpp:130 #: editscheduledtransactiondialog.cpp:151 transactioneditwidget.cpp:1066 #, kde-format msgid "Edit Dividend" msgstr "Uprav dividend" #: editscheduledtransactiondialog.cpp:131 #: editscheduledtransactiondialog.cpp:152 transactioneditwidget.cpp:1067 #, kde-format msgid "Edit Income" msgstr "Uprav prijem" #: editscheduledtransactiondialog.cpp:134 #: editscheduledtransactiondialog.cpp:155 transactioneditwidget.cpp:1070 #, kde-format msgid "Edit Transfer" msgstr "Uprav tranzakciu" #: editscheduledtransactiondialog.cpp:135 #: editscheduledtransactiondialog.cpp:156 transactioneditwidget.cpp:1071 #, kde-format msgid "Edit Securities Bought" msgstr "Uprav nákup akcií" #: editscheduledtransactiondialog.cpp:136 #: editscheduledtransactiondialog.cpp:157 transactioneditwidget.cpp:1072 #, kde-format msgid "Edit Securities Sold" msgstr "Uprav predaj akcií" #: editsplitdialog.cpp:107 eqonomize.cpp:284 eqonomize.cpp:328 #: eqonomize.cpp:1167 #, kde-format msgid "Dividend" msgstr "Dividendy" #: editsplitdialog.cpp:109 eqonomize.cpp:403 eqonomize.cpp:445 #: ledgerdialog.cpp:648 #, kde-format msgid "Repayment" msgstr "Splatenie" #: editsplitdialog.cpp:112 eqonomize.cpp:404 eqonomize.cpp:446 #: ledgerdialog.cpp:651 #, kde-format msgid "Refund" msgstr "Vrátenie" #: editsplitdialog.cpp:126 ledgerdialog.cpp:638 #, kde-format msgid "Split Transaction" msgstr "Rozdeliť prevod" #: editsplitdialog.cpp:138 eqonomize.cpp:1279 eqonomize.cpp:1379 #: eqonomize.cpp:1473 eqonomize.cpp:1538 importcsvdialog.cpp:129 #: transactioneditwidget.cpp:175 transactioneditwidget.cpp:1099 #: transactionfilterwidget.cpp:135 #, kde-format msgid "Description:" msgstr "Popis:" #: editsplitdialog.cpp:143 eqonomize.cpp:413 eqonomize.cpp:523 #: eqonomize.cpp:639 eqonomize.cpp:1274 eqonomize.cpp:2476 #: importcsvdialog.cpp:187 transactioneditwidget.cpp:149 #: transactioneditwidget.cpp:199 transactioneditwidget.cpp:1119 #, kde-format msgid "Date:" msgstr "Dátum:" #: editsplitdialog.cpp:148 eqonomize.cpp:424 eqonomize.cpp:1252 #: importcsvdialog.cpp:388 importcsvdialog.cpp:399 ledgerdialog.cpp:107 #: qifimportexport.cpp:503 #, kde-format msgid "Account:" msgstr "Účet:" #: editsplitdialog.cpp:163 #, kde-format msgid "Transactions:" msgstr "Prevody:" #: editsplitdialog.cpp:172 eqonomize.cpp:914 eqonomize.cpp:1061 #: eqonomize.cpp:1941 eqonomize.cpp:2033 eqonomize.cpp:3988 #: ledgerdialog.cpp:135 #, kde-format msgid "Type" msgstr "Typ" #: editsplitdialog.cpp:173 eqonomize.cpp:915 eqonomize.cpp:2034 #: ledgerdialog.cpp:136 qifimportexport.cpp:127 qifimportexport.cpp:139 #: qifimportexport.cpp:149 transactionlistwidget.cpp:111 #, kde-format msgid "Description" msgstr "Popis" #: editsplitdialog.cpp:174 eqonomize.cpp:4142 ledgerdialog.cpp:137 #, kde-format msgid "Account/Category" msgstr "Účet/Kategória" #: editsplitdialog.cpp:175 #, kde-format msgid "Payment" msgstr "Platba" #: editsplitdialog.cpp:176 ledgerdialog.cpp:138 #, kde-format msgid "Deposit" msgstr "Vklad" #: editsplitdialog.cpp:181 ledgerdialog.cpp:151 #, kde-format msgid "New" msgstr "Nový" #: editsplitdialog.cpp:184 eqonomize.cpp:4333 #, kde-format msgid "New Expense..." msgstr "Nový vydavok..." #: editsplitdialog.cpp:185 eqonomize.cpp:4334 #, kde-format msgid "New Income..." msgstr "Nový príjem..." #: editsplitdialog.cpp:186 #, kde-format msgid "New Deposit..." msgstr "Nová záloha..." #: editsplitdialog.cpp:187 #, kde-format msgid "New Withdrawal..." msgstr "Nový výber..." #: editsplitdialog.cpp:188 #, kde-format msgid "New Security Shares Bought..." msgstr "" #: editsplitdialog.cpp:189 #, kde-format msgid "Security Shares Sold..." msgstr "" #: editsplitdialog.cpp:190 #, kde-format msgid "New Dividend..." msgstr "" #: editsplitdialog.cpp:191 eqonomize.cpp:924 eqonomize.cpp:1071 #: eqonomize.cpp:4328 ledgerdialog.cpp:158 transactionlistwidget.cpp:1051 #, kde-format msgid "Edit..." msgstr "Upraviť..." #: editsplitdialog.cpp:221 eqonomize.cpp:2325 #, kde-format msgid "Total value:" msgstr "Celková hodnota:" #: editsplitdialog.cpp:403 transactioneditwidget.cpp:653 #: transactioneditwidget.cpp:657 transactioneditwidget.cpp:668 #: transactioneditwidget.cpp:682 transactioneditwidget.cpp:693 #, kde-format msgid "No suitable account available." msgstr "Nevhodný účet." #: editsplitdialog.cpp:415 #, kde-format msgid "Future dates is not allowed." msgstr "Budúce dátumy nie sú povolené." #: editsplitdialog.cpp:419 #, kde-format msgid "A split must contain at least two transactions." msgstr "Pre spojenie sú potrebné dva alebo viac prevodov." #: editsplitdialog.cpp:428 transactioneditwidget.cpp:714 #, kde-format msgid "Cannot transfer money to and from the same account." msgstr "Nemôžem preniesť peniaze na a z rovnakého účtu" #: eqonomize.cpp:419 eqonomize.cpp:2325 importcsvdialog.cpp:146 #: importcsvdialog.cpp:169 importcsvdialog.cpp:355 #: transactioneditwidget.cpp:117 transactioneditwidget.cpp:186 #: transactioneditwidget.cpp:1111 #, kde-format msgid "Cost:" msgstr "Cena:" #: eqonomize.cpp:420 importcsvdialog.cpp:364 importcsvdialog.cpp:397 #: transactioneditwidget.cpp:118 transactioneditwidget.cpp:184 #: transactioneditwidget.cpp:1110 #, kde-format msgid "Income:" msgstr "Príjem:" #: eqonomize.cpp:439 transactioneditwidget.cpp:193 #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:310 #, kde-format msgid "Quantity:" msgstr "Množstvo:" #: eqonomize.cpp:443 importcsvdialog.cpp:243 transactioneditwidget.cpp:288 #, kde-format msgid "Comments:" msgstr "Poznámky:" #: eqonomize.cpp:491 eqonomize.cpp:1176 #, kde-format msgid "Reinvested Dividend" msgstr "Znova investované dividendy" #: eqonomize.cpp:501 transactioneditwidget.cpp:97 #: transactioneditwidget.cpp:157 #, kde-format msgid "Security:" msgstr "Zabezpečenie:" #: eqonomize.cpp:518 #, kde-format msgid "Shares added:" msgstr "Podiel pridaný:" #: eqonomize.cpp:579 #, kde-format msgid "Security Trade" msgstr "Obchod akcií" #: eqonomize.cpp:587 #, kde-format msgid "From security:" msgstr "Z akcie:" #: eqonomize.cpp:603 #, kde-format msgid "Shares moved:" msgstr "Podiel presunutý:" #: eqonomize.cpp:608 transactioneditwidget.cpp:135 #: transactionfilterwidget.cpp:167 transactionfilterwidget.cpp:168 #: transactionfilterwidget.cpp:343 transactionfilterwidget.cpp:380 #, kde-format msgid "All" msgstr "Všetky" #: eqonomize.cpp:614 #, kde-format msgid "To security:" msgstr "" #: eqonomize.cpp:631 #, kde-format msgid "Shares received:" msgstr "Podiel pridaný:" #: eqonomize.cpp:635 importcsvdialog.cpp:386 importcsvdialog.cpp:412 #: overtimechart.cpp:193 overtimechart.cpp.bak:186 #, kde-format msgid "Value:" msgstr "Hodnota:" #: eqonomize.cpp:725 #, kde-format msgid "No other security available for trade in the account." msgstr "" #: eqonomize.cpp:737 #, kde-format msgid "Selected to and from securities are the same." msgstr "" #: eqonomize.cpp:745 transactioneditwidget.cpp:735 #, kde-format msgid "Zero shares not allowed." msgstr "Nulový prevod nie je povolený." #: eqonomize.cpp:749 transactioneditwidget.cpp:739 #, kde-format msgid "Zero value not allowed." msgstr "Nie je povolená nulová hodnota." #: eqonomize.cpp:757 eqonomize.cpp:766 #, kde-format msgid "Quotations" msgstr "Predbežný rozpočet" #: eqonomize.cpp:777 eqonomize.cpp:913 eqonomize.cpp:962 eqonomize.cpp:1060 #: ledgerdialog.cpp:134 transactionlistwidget.cpp:110 #, kde-format msgid "Date" msgstr "Dátum" #: eqonomize.cpp:778 #, kde-format msgid "Price per Share" msgstr "Prevodová cena" #: eqonomize.cpp:820 #, kde-format msgid "Quotations for %1" msgstr "Predbežný rozpočet pre %1" #: eqonomize.cpp:904 #, kde-format msgid "" "The following transactions was scheduled to occur today or before today.\n" "Confirm that they have indeed occurred (or will occur today)." msgstr "" "Nasledujúce prevody boli naplánované do dnešného dňa.\n" "Podtvrďte tie, ktoré sa vykonali." #: eqonomize.cpp:916 eqonomize.cpp:2035 transactionlistwidget.cpp:137 #, kde-format msgid "Amount" msgstr "Množstvo" #: eqonomize.cpp:926 #, kde-format msgid "Postpone..." msgstr "Odložiť..." #: eqonomize.cpp:973 #, kde-format msgid "Can only postpone to future dates." msgstr "Je možné odložiť na iný dátum." #: eqonomize.cpp:1052 ledgerdialog.cpp:299 #, kde-format msgid "Transactions for %1" msgstr "Prevody pre %1" #: eqonomize.cpp:1063 eqonomize.cpp:1936 #, kde-format msgid "Shares" msgstr "Podiely" #: eqonomize.cpp:1160 #, kde-format msgid "Shares Bought" msgstr "Nákup podielov" #: eqonomize.cpp:1161 #, kde-format msgid "Shares Sold" msgstr "Predaj podielov" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Sold (Traded)" msgstr "Predaj podielov (uskutočnený)" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Bought (Traded)" msgstr "Nákup podielov (uskutočnený)" #: eqonomize.cpp:1204 #, kde-format msgid "Shares Bought (Recurring)" msgstr "Nákup podielov (opakované)" #: eqonomize.cpp:1205 #, kde-format msgid "Shares Sold (Recurring)" msgstr "Predaj podielov (opakované)" #: eqonomize.cpp:1207 #, kde-format msgid "Shares Bought (Scheduled)" msgstr "Nákup podielov (plánované)" #: eqonomize.cpp:1208 #, kde-format msgid "Shares Sold (Scheduled)" msgstr "Predaj podielov (plánované)" #: eqonomize.cpp:1220 #, kde-format msgid "Recurring Dividend" msgstr "Pravidelné dividendy" #: eqonomize.cpp:1222 #, kde-format msgid "Scheduled Dividend" msgstr "Plánované divodendy" #: eqonomize.cpp:1240 eqonomize.cpp:1360 #, kde-format msgid "Type:" msgstr "Typ:" #: eqonomize.cpp:1243 eqonomize.cpp:2600 eqonomize.cpp:2660 #, kde-format msgid "Mutual Fund" msgstr "Investičný fond" #: eqonomize.cpp:1244 eqonomize.cpp:2598 eqonomize.cpp:2658 #, kde-format msgid "Bond" msgstr "Záväzok" #: eqonomize.cpp:1245 eqonomize.cpp:2599 eqonomize.cpp:2659 #, kde-format msgid "Stock" msgstr "Akcie" #: eqonomize.cpp:1246 eqonomize.cpp:2601 eqonomize.cpp:2661 eqonomize.cpp:3492 #: eqonomize.cpp:3497 importcsvdialog.cpp:117 qifimportexport.cpp:332 #, kde-format msgid "Other" msgstr "Iné" #: eqonomize.cpp:1249 eqonomize.cpp:1370 eqonomize.cpp:1464 eqonomize.cpp:1529 #, kde-format msgid "Name:" msgstr "Názov:" #: eqonomize.cpp:1264 #, kde-format msgid "Decimals in Shares:" msgstr "Desatinné prevody:" #: eqonomize.cpp:1267 #, kde-format msgid "Initial Shares:" msgstr "Prebiehajúce prevody:" #: eqonomize.cpp:1270 #, kde-format msgid "Initial quotation:" msgstr "Prebiehajúce plány rozpočtu:" #: eqonomize.cpp:1289 transactioneditwidget.cpp:675 #, kde-format msgid "No suitable account or income category available." msgstr "" #: eqonomize.cpp:1363 eqonomize.cpp:3488 eqonomize.cpp:4021 #: qifimportexport.cpp:325 #, kde-format msgid "Cash" msgstr "Hotovosť" #: eqonomize.cpp:1364 eqonomize.cpp:4016 #, kde-format msgid "Current Account" msgstr "Aktuálny účet" #: eqonomize.cpp:1365 eqonomize.cpp:3490 eqonomize.cpp:4017 #, kde-format msgid "Savings Account" msgstr "" #: eqonomize.cpp:1366 eqonomize.cpp:4018 #, kde-format msgid "Credit Card" msgstr "Platobná karta" #: eqonomize.cpp:1367 eqonomize.cpp:4019 #, kde-format msgid "Liabilities" msgstr "Dlhy" #: eqonomize.cpp:1368 eqonomize.cpp:1731 eqonomize.cpp:1732 eqonomize.cpp:3891 #: eqonomize.cpp:3897 eqonomize.cpp:4020 #, kde-format msgid "Securities" msgstr "Akcie" #: eqonomize.cpp:1373 #, kde-format msgid "Initial balance:" msgstr "Počiatočné vyrovnanie:" #: eqonomize.cpp:1376 #, kde-format msgid "Default account for budgeted transactions" msgstr "Predvolený účet pre rozpočet" #: eqonomize.cpp:1441 eqonomize.cpp:1507 eqonomize.cpp:1572 #, kde-format msgid "Empty name." msgstr "Chýba názov." #: eqonomize.cpp:1447 #, kde-format msgid "The entered name is used by another account." msgstr "Zadaný názov je už použitý." #: eqonomize.cpp:1467 eqonomize.cpp:1532 #, kde-format msgid "Monthly budget:" msgstr "Mesačný rozpočet:" #: eqonomize.cpp:1513 #, kde-format msgid "The entered name is used by another income category." msgstr "Zadaný názov je už použitý v kategórií prijmov." #: eqonomize.cpp:1578 #, kde-format msgid "The entered name is used by another expense category." msgstr "Zadaný názov je už použitý v kategórií výdavkov." #: eqonomize.cpp:1711 eqonomize.cpp:1778 eqonomize.cpp:3984 eqonomize.cpp:5970 #: eqonomize.cpp:5976 #, kde-format msgid "Accounts" msgstr "Účty" #: eqonomize.cpp:1712 #, kde-format msgid "Accounts & Categories" msgstr "Účty a kategórie" #: eqonomize.cpp:1716 eqonomize.cpp:1717 eqonomize.cpp:1780 #: importcsvdialog.cpp:70 overtimechart.cpp:126 overtimechart.cpp:1727 #: overtimechart.cpp:1731 overtimechart.cpp.bak:119 overtimechart.cpp.bak:1708 #: overtimechart.cpp.bak:1712 overtimereport.cpp:103 overtimereport.cpp:357 #: overtimereport.cpp:377 overtimereport.cpp:395 transactionlistwidget.cpp:251 #: transactionlistwidget.cpp:263 #, kde-format msgid "Expenses" msgstr "Výdavky" #: eqonomize.cpp:1721 eqonomize.cpp:1722 eqonomize.cpp:1779 eqonomize.cpp:4043 #: importcsvdialog.cpp:75 overtimechart.cpp:127 overtimechart.cpp:1726 #: overtimechart.cpp:1730 overtimechart.cpp.bak:120 overtimechart.cpp.bak:1707 #: overtimechart.cpp.bak:1711 overtimereport.cpp:104 overtimereport.cpp:349 #: overtimereport.cpp:368 overtimereport.cpp:386 transactionlistwidget.cpp:252 #: transactionlistwidget.cpp:264 #, kde-format msgid "Incomes" msgstr "Prijmy" #: eqonomize.cpp:1726 eqonomize.cpp:1727 importcsvdialog.cpp:78 #: transactionlistwidget.cpp:253 transactionlistwidget.cpp:265 #, kde-format msgid "Transfers" msgstr "Prevody" #: eqonomize.cpp:1736 #, kde-format msgid "Schedule" msgstr "Plánovať" #: eqonomize.cpp:1737 #, kde-format msgid "Scheduled Transactions" msgstr "Plánované transakcie" #: eqonomize.cpp:1753 eqonomize.cpp:1775 #, kde-format msgid "Account / Category" msgstr "Účet / Kategória" #: eqonomize.cpp:1754 #, kde-format msgid "Remaining Budget (%1)" msgstr "Zostatok rozpočtu (%1)" #: eqonomize.cpp:1755 #, kde-format msgid "Change (%1)" msgstr "Obrat (%1)" #: eqonomize.cpp:1756 #, kde-format msgid "Total (%1)" msgstr "Spolu (%1)" #: eqonomize.cpp:1769 #, kde-format msgctxt "%2 remains of %1 budget" msgid "%2 of %1" msgstr "%2 z %1" #: eqonomize.cpp:1785 eqonomize.cpp:4002 #, kde-format msgid "Includes budgeted transactions" msgstr "Obsahuje prevody rozpočtu" #: eqonomize.cpp:1793 #, kde-format msgid "Period" msgstr "Obdobie" #: eqonomize.cpp:1825 #, kde-format msgid "Select Period" msgstr "Vyberte obdobie" #: eqonomize.cpp:1827 eqonomize.cpp:4312 #, kde-format msgid "Current Month" msgstr "Mesačný obrat" #: eqonomize.cpp:1828 eqonomize.cpp:4313 #, kde-format msgid "Current Year" msgstr "Ročný obrat" #: eqonomize.cpp:1829 eqonomize.cpp:4314 #, kde-format msgid "Current Whole Month" msgstr "Obrat počas mesiaca" #: eqonomize.cpp:1830 eqonomize.cpp:4315 #, kde-format msgid "Current Whole Year" msgstr "Obrat počas roka" #: eqonomize.cpp:1831 #, kde-format msgid "Whole Past Month" msgstr "Počas minulého mesiaca" #: eqonomize.cpp:1832 #, kde-format msgid "Whole Past Year" msgstr "Počas minulého roka" #: eqonomize.cpp:1833 #, kde-format msgid "Previous Month" msgstr "Predchádzajúci mesiac" #: eqonomize.cpp:1834 #, kde-format msgid "Previous Year" msgstr "Predchádzajúci rok" #: eqonomize.cpp:1837 #, kde-format msgid "Show partial budget" msgstr "Zobraz čiastkový rozpočet" #: eqonomize.cpp:1842 #, kde-format msgid "Edit Budget" msgstr "Uprav rozpočet" #: eqonomize.cpp:1846 #, kde-format msgid "Budget:" msgstr "Rozpočet:" #: eqonomize.cpp:1856 #, kde-format msgid "Month:" msgstr "Mesiac:" #: eqonomize.cpp:1864 #, kde-format msgid "Result previous month:" msgstr "Výsledok minulého mesiaca:" #: eqonomize.cpp:1917 eqonomize.cpp:4354 #, kde-format msgid "New Security..." msgstr "Nová akcia..." #: eqonomize.cpp:1919 #, kde-format msgid "New Transaction" msgstr "Nový prevod" #: eqonomize.cpp:1922 eqonomize.cpp:4362 #, kde-format msgid "Set Quotation..." msgstr "Nastav predbežný rozpočet..." #: eqonomize.cpp:1934 eqonomize.cpp:3987 #, kde-format msgid "Name" msgstr "Názov" #: eqonomize.cpp:1937 #, kde-format msgid "Quotation" msgstr "Predbežný rozpočet" #: eqonomize.cpp:1939 #, kde-format msgid "Profit" msgstr "Zisk" #: eqonomize.cpp:1940 #, kde-format msgid "Yearly Rate" msgstr "Ročný kurz" #: eqonomize.cpp:1942 qifimportexport.cpp:323 #, kde-format msgid "Account" msgstr "Účet" #: eqonomize.cpp:1953 #, kde-format msgid "Statistics Period" msgstr "Štatistické obdobie" #: eqonomize.cpp:2015 #, kde-format msgid "New Schedule" msgstr "Nový plán" #: eqonomize.cpp:2018 #, kde-format msgid "Edit" msgstr "Upraviť" #: eqonomize.cpp:2032 #, kde-format msgid "Next Occurrence" msgstr "Ďalšia udalosť" #: eqonomize.cpp:2038 qifimportexport.cpp:152 transactionlistwidget.cpp:144 #, kde-format msgid "Comments" msgstr "Poznámka" #: eqonomize.cpp:2291 #, kde-format msgid "New Security" msgstr "Nová akcia" #: eqonomize.cpp:2306 #, kde-format msgid "Edit Security" msgstr "Uprav akciu" #: eqonomize.cpp:2325 #, kde-format msgid "Profit:" msgstr "Zisk:" #: eqonomize.cpp:2325 #, kde-format msgid "Rate:" msgstr "Kurz:" #: eqonomize.cpp:2332 #, kde-format msgid "" "Are you sure you want to delete the security \"%1\" and all associated " "transactions?" msgstr "Ste si istý, že chceťe odstrániť akciu %1 a všetky priradené prevody?" #: eqonomize.cpp:2394 transactioneditwidget.cpp:700 #, kde-format msgid "No security available." msgstr "" #: eqonomize.cpp:2466 #, kde-format msgid "Set Quotation (%1)" msgstr "Nastav predbežný rozpočet (%1)" #: eqonomize.cpp:2472 transactioneditwidget.cpp:143 #, kde-format msgid "Price per share:" msgstr "Cena na prevod:" #: eqonomize.cpp:2485 #, kde-format msgid "Future dates are not allowed." msgstr "Budúci dátum nie je povolený." #: eqonomize.cpp:2513 #, kde-format msgid "Security Transactions" msgstr "Prevod akcii" #: eqonomize.cpp:3166 ledgerdialog.cpp:293 #, kde-format msgid "Ledger" msgstr "Hlavná kniha" #: eqonomize.cpp:3475 #, kde-format msgid "Untitled" msgstr "" #: eqonomize.cpp:3489 #, kde-format msgid "Check Account" msgstr "Kontrola účtu" #: eqonomize.cpp:3491 #, kde-format msgid "Salary" msgstr "Stály plat" #: eqonomize.cpp:3493 #, kde-format msgid "Bills" msgstr "Účet" #: eqonomize.cpp:3494 #, kde-format msgid "Clothing" msgstr "Oblečenie" #: eqonomize.cpp:3495 #, kde-format msgid "Groceries" msgstr "Potraviny" #: eqonomize.cpp:3496 #, kde-format msgid "Leisure" msgstr "Voľný čas" #: eqonomize.cpp:3561 importcsvdialog.cpp:795 qifimportexport.cpp:280 #: qifimportexport.cpp:444 #, kde-format msgid "Couldn't fetch %1." msgstr "nemôžem preniesť %1." #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Error loading %1: %2." msgstr "Chyba načítania %1: %2." #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Couldn't open file" msgstr "Nemôžem otvoriť súbor" #: eqonomize.cpp:3627 eqonomize.cpp:3653 #, kde-format msgid "Error saving %1: %2." msgstr "Chyba zápisu %1: %2." #: eqonomize.cpp:3627 eqonomize.cpp:3653 eqonomize.cpp:3673 #, kde-format msgid "Couldn't save file" msgstr "Nemôžem uložiť súbor" #: eqonomize.cpp:3673 eqonomize.cpp:4282 ledgerdialog.cpp:281 #: qifimportexport.cpp:634 #, kde-format msgid "Failed to upload file to %1." msgstr "Chyba pri posielaní súboru do %1" #: eqonomize.cpp:3703 eqonomize.cpp:3728 #, kde-format msgid "Report" msgstr "Výkaz" #: eqonomize.cpp:3758 eqonomize.cpp:3783 #, kde-format msgid "Chart" msgstr "Graf" #: eqonomize.cpp:3823 eqonomize.cpp:3829 #, kde-format msgid "Transaction Schedule" msgstr "Plánovanie prevodu" #: eqonomize.cpp:3976 #, kde-format msgctxt "html format" msgid "Accounts & Categories" msgstr "Účty & Kategórie" #: eqonomize.cpp:3981 #, kde-format msgctxt "html format" msgid "Accounts & Categories (%1–%2)" msgstr "Účty & Kategórie (%1–%2)" #: eqonomize.cpp:3982 #, kde-format msgctxt "html format" msgid "Accounts & Categories (to %1)" msgstr "Účty & Kategórie (do %1)" #: eqonomize.cpp:3989 eqonomize.cpp:4049 eqonomize.cpp:4097 eqonomize.cpp:4142 #, kde-format msgid "Change" msgstr "Obrat" #: eqonomize.cpp:3993 ledgerdialog.cpp:140 #, kde-format msgid "Balance" msgstr "Vyváženosť" #: eqonomize.cpp:4047 eqonomize.cpp:4095 #, kde-format msgid "Budget" msgstr "Rozpočet" #: eqonomize.cpp:4048 eqonomize.cpp:4096 #, kde-format msgid "Remaining Budget" msgstr "Zostatok z rozpočtu" #: eqonomize.cpp:4050 #, kde-format msgid "Total Incomes" msgstr "Celkové prijmy" #: eqonomize.cpp:4091 #, kde-format msgid "Costs" msgstr "Náklady" #: eqonomize.cpp:4098 #, kde-format msgid "Total Expenses" msgstr "Celkové výdavky" #: eqonomize.cpp:4167 eqonomize.cpp:4214 #, kde-format msgid "Empty expenses list." msgstr "Prázdny zoznam vydavkov." #: eqonomize.cpp:4172 eqonomize.cpp:4219 #, kde-format msgid "Empty incomes list." msgstr "Prázdny zoznam prijmov." #: eqonomize.cpp:4177 eqonomize.cpp:4224 #, kde-format msgid "Empty transfers list." msgstr "Prázdny zoznam prevodov." #: eqonomize.cpp:4182 eqonomize.cpp:4229 #, kde-format msgid "Empty securities list." msgstr "Prázdny zoznam akcií." #: eqonomize.cpp:4187 eqonomize.cpp:4234 #, kde-format msgid "Empty schedule list." msgstr "Prázdny zoznam plánov." #: eqonomize.cpp:4305 #, kde-format msgid "Export View..." msgstr "Export pohľadu..." #: eqonomize.cpp:4307 #, kde-format msgid "Print View..." msgstr "Vytlač pohľad..." #: eqonomize.cpp:4309 #, kde-format msgid "Initial Period" msgstr "" #: eqonomize.cpp:4316 #, kde-format msgid "Remember Last Dates" msgstr "" #: eqonomize.cpp:4319 #, kde-format msgid "Import CSV File..." msgstr "Importuj CSV súbor..." #: eqonomize.cpp:4320 #, kde-format msgid "Import QIF File..." msgstr "Importuj QIF súbor..." #: eqonomize.cpp:4321 #, kde-format msgid "Export As QIF File..." msgstr "Exportuj ako QIF súbor..." #: eqonomize.cpp:4323 #, kde-format msgid "Add Account..." msgstr "Pridať účet..." #: eqonomize.cpp:4324 #, kde-format msgid "New Account..." msgstr "Nový účet..." #: eqonomize.cpp:4325 #, kde-format msgid "New Income Category..." msgstr "Nová kategória prijmov..." #: eqonomize.cpp:4326 #, kde-format msgid "New Expense Category..." msgstr "Nová kategória vydavkov..." #: eqonomize.cpp:4327 #, kde-format msgid "Balance..." msgstr "Vyrovnanie..." #: eqonomize.cpp:4331 #, kde-format msgid "Show Transactions" msgstr "Zobraz prevody" #: eqonomize.cpp:4335 #, kde-format msgid "New Transfer..." msgstr "Nový prevod..." #: eqonomize.cpp:4336 #, kde-format msgid "New Split Transaction..." msgstr "Nové rozdelenie prevodu..." #: eqonomize.cpp:4337 #, kde-format msgid "Edit Transaction(s) (Occurrence)..." msgstr "Uprav prevod(-y) (udalosť)..." #: eqonomize.cpp:4338 #, kde-format msgid "Edit Occurrence..." msgstr "Uprav udalosť..." #: eqonomize.cpp:4339 #, kde-format msgid "Edit Schedule (Recurrence)..." msgstr "Uprav plán (opakovananý)..." #: eqonomize.cpp:4340 #, kde-format msgid "Edit Schedule..." msgstr "Uprav plán..." #: eqonomize.cpp:4341 #, kde-format msgid "Remove Transaction(s) (Occurrence)" msgstr "Odstrániť prevod(-y) (udalosť)..." #: eqonomize.cpp:4342 #, kde-format msgid "Remove Occurrence" msgstr "Odstrániť udalosť" #: eqonomize.cpp:4343 #, kde-format msgid "Delete Schedule (Recurrence)" msgstr "Vymazať plán (opakovananý)" #: eqonomize.cpp:4344 #, kde-format msgid "Delete Schedule" msgstr "Zmazať plán" #: eqonomize.cpp:4345 #, kde-format msgid "Edit Split Transaction..." msgstr "Uprav rozdelenie prevodov..." #: eqonomize.cpp:4346 #, kde-format msgid "Remove Split Transaction" msgstr "Odstráň rozdelenie prevodov" #: eqonomize.cpp:4347 #, kde-format msgid "Join Transactions..." msgstr "Pripoj prevod..." #: eqonomize.cpp:4348 #, kde-format msgid "Split Up Transaction" msgstr "" #: eqonomize.cpp:4350 #, kde-format msgid "Refund..." msgstr "" #: eqonomize.cpp:4351 #, kde-format msgid "Repayment..." msgstr "" #: eqonomize.cpp:4352 #, kde-format msgid "New Refund/Repayment..." msgstr "" #: eqonomize.cpp:4355 #, kde-format msgid "Edit Security..." msgstr "" #: eqonomize.cpp:4356 #, kde-format msgid "Remove Security" msgstr "" #: eqonomize.cpp:4357 #, kde-format msgid "Shares Sold..." msgstr "" #: eqonomize.cpp:4358 #, kde-format msgid "Shares Bought..." msgstr "" #: eqonomize.cpp:4359 #, kde-format msgid "Dividend..." msgstr "" #: eqonomize.cpp:4360 #, kde-format msgid "Reinvested Dividend..." msgstr "" #: eqonomize.cpp:4361 #, kde-format msgid "Shares Moved..." msgstr "" #: eqonomize.cpp:4363 #, kde-format msgid "Edit Quotations..." msgstr "" #: eqonomize.cpp:4364 #, kde-format msgid "Transactions..." msgstr "" #: eqonomize.cpp:4366 #, kde-format msgid "Development Over Time Report..." msgstr "" #: eqonomize.cpp:4367 #, kde-format msgid "Categories Comparison Report..." msgstr "" #: eqonomize.cpp:4368 #, kde-format msgid "Categories Comparison Chart..." msgstr "" #: eqonomize.cpp:4369 #, kde-format msgid "Development Over Time Chart..." msgstr "" #: eqonomize.cpp:4371 #, kde-format msgid "Use Additional Transaction Properties" msgstr "" #: eqonomize.cpp:4413 #, kde-format msgid "" "Eqonomize! exited unexpectedly before the file was saved and data was lost.\n" "Do you want to load the last auto-saved version of the file?" msgstr "" #: eqonomize.cpp:4413 #, kde-format msgid "Crash Recovery" msgstr "" #: eqonomize.cpp:4605 eqonomize.cpp:4606 #, kde-format msgid "The current file has been modified. Do you want to save it?" msgstr "" #: eqonomize.cpp:4643 #, kde-format msgid "Confirm Schedule" msgstr "" #: eqonomize.cpp:4697 #, kde-format msgid "New Account" msgstr "" #: eqonomize.cpp:4712 #, kde-format msgid "New Income Category" msgstr "" #: eqonomize.cpp:4725 #, kde-format msgid "New Expense Category" msgstr "" #: eqonomize.cpp:4800 #, kde-format msgid "Balance Account" msgstr "" #: eqonomize.cpp:4806 #, kde-format msgid "Book value:" msgstr "" #: eqonomize.cpp:4813 #, kde-format msgid "Real value:" msgstr "" #: eqonomize.cpp:4836 #, kde-format msgid "Edit Account" msgstr "" #: eqonomize.cpp:4869 #, kde-format msgid "Edit Income Category" msgstr "" #: eqonomize.cpp:4887 #, kde-format msgid "Edit Expense Category" msgstr "" #: eqonomize.cpp:4948 #, kde-format msgid "Move transactions?" msgstr "" #: eqonomize.cpp:4958 #, kde-format msgid "Move to:" msgstr "" #: eqonomize.cpp:4965 #, kde-format msgid "" "The category contains some expenses.\n" "What do you want to do with them?" msgstr "" #: eqonomize.cpp:4977 #, kde-format msgid "" "The category contains some incomes.\n" "What do you want to do with them?" msgstr "" #: eqonomize.cpp:4989 #, kde-format msgid "" "The account contains some transactions.\n" "What do you want to do with them?" msgstr "" #: eqonomize.cpp:5011 #, kde-format msgid "" "The category contains some expenses that will be removed. Do you still want " "to remove the category?" msgstr "" #: eqonomize.cpp:5011 eqonomize.cpp:5012 #, kde-format msgid "Remove Category?" msgstr "" #: eqonomize.cpp:5012 #, kde-format msgid "" "The category contains some incomes that will be removed. Do you still want " "to remove the category?" msgstr "" #: eqonomize.cpp:5013 #, kde-format msgid "" "The account contains some transactions that will be removed. Do you still " "want to remove the account?" msgstr "" #: eqonomize.cpp:5013 #, kde-format msgid "Remove Account?" msgstr "" #: eqonomize.cpp:5531 eqonomize.cpp:5555 eqonomize.cpp:5730 #, kde-format msgctxt "%1: budget; %2: remaining budget" msgid "%2 of %1" msgstr "%2 z %1" #: eqonomize.cpp:5810 eqonomize.cpp:5835 #, kde-format msgid "%1 (with no budget)" msgstr "" #: eqonomize.cpp:5811 eqonomize.cpp:5836 #, kde-format msgid "%1 (with budget %2)" msgstr "" #: importcsvdialog.cpp:60 #, kde-format msgid "Import CSV file" msgstr "" #: importcsvdialog.cpp:64 #, kde-format msgid "Transaction Type Selection" msgstr "" #: importcsvdialog.cpp:81 #, kde-format msgid "Expenses and incomes (negative cost)" msgstr "" #: importcsvdialog.cpp:84 #, kde-format msgid "Expenses and incomes (separate columns)" msgstr "" #: importcsvdialog.cpp:87 #, kde-format msgid "All types" msgstr "" #: importcsvdialog.cpp:95 qifimportexport.cpp:62 #, kde-format msgid "File Selection" msgstr "" #: importcsvdialog.cpp:99 qifimportexport.cpp:66 qifimportexport.cpp:548 #, kde-format msgid "File:" msgstr "" #: importcsvdialog.cpp:104 #, kde-format msgid "First data row:" msgstr "" #: importcsvdialog.cpp:107 #, kde-format msgid "Auto" msgstr "" #: importcsvdialog.cpp:110 #, kde-format msgid "Column delimiter:" msgstr "" #: importcsvdialog.cpp:113 #, kde-format msgid "Comma" msgstr "" #: importcsvdialog.cpp:114 #, kde-format msgid "Tabulator" msgstr "" #: importcsvdialog.cpp:115 #, kde-format msgid "Semicolon" msgstr "" #: importcsvdialog.cpp:116 #, kde-format msgid "Space" msgstr "" #: importcsvdialog.cpp:125 #, kde-format msgid "Columns Specification" msgstr "" #: importcsvdialog.cpp:131 importcsvdialog.cpp:149 importcsvdialog.cpp:172 #: importcsvdialog.cpp:189 importcsvdialog.cpp:208 importcsvdialog.cpp:227 #: importcsvdialog.cpp:245 #, kde-format msgid "Column" msgstr "" #: importcsvdialog.cpp:205 importcsvdialog.cpp:356 importcsvdialog.cpp:365 #: importcsvdialog.cpp:387 importcsvdialog.cpp:398 #: transactioneditwidget.cpp:225 transactioneditwidget.cpp:267 #: transactioneditwidget.cpp:1130 transactionfilterwidget.cpp:102 #: transactionfilterwidget.cpp:113 #, kde-format msgid "Category:" msgstr "" #: importcsvdialog.cpp:224 importcsvdialog.cpp:357 importcsvdialog.cpp:374 #: transactioneditwidget.cpp:248 transactioneditwidget.cpp:273 #: transactionfilterwidget.cpp:117 #, kde-format msgid "From account:" msgstr "" #: importcsvdialog.cpp:262 #, kde-format msgid "Create missing categories and accounts" msgstr "" #: importcsvdialog.cpp:354 #, kde-format msgid "" "Imports data as expenses. Costs have positive value. Value is the only " "required column." msgstr "" #: importcsvdialog.cpp:363 #, kde-format msgid "Imports data as incomes. Value is the only required column." msgstr "" #: importcsvdialog.cpp:366 importcsvdialog.cpp:375 #: transactioneditwidget.cpp:231 transactioneditwidget.cpp:258 #: transactionfilterwidget.cpp:106 #, kde-format msgid "To account:" msgstr "" #: importcsvdialog.cpp:372 #, kde-format msgid "Imports data as transfers. Value is the only required column." msgstr "" #: importcsvdialog.cpp:373 transactioneditwidget.cpp:182 #: transactioneditwidget.cpp:1109 #, kde-format msgid "Amount:" msgstr "" #: importcsvdialog.cpp:381 #, kde-format msgid "" "Imports data as expenses and incomes. Costs have negative value. Value and " "category are both required columns." msgstr "" #: importcsvdialog.cpp:392 #, kde-format msgid "" "Imports data as expenses and incomes. Costs and incomes have separate " "columns. Income, cost, and category are all required columns." msgstr "" #: importcsvdialog.cpp:403 #, kde-format msgid "" "Imports data as expenses, incomes, and transfers. Costs have negative or " "positive value. Value, to, and from are all required columns. Accounts and " "categories must be existing." msgstr "" #: importcsvdialog.cpp:413 transactioneditwidget.cpp:209 #: transactionfilterwidget.cpp:74 transactionfilterwidget.cpp:91 #, kde-format msgid "From:" msgstr "" #: importcsvdialog.cpp:414 transactioneditwidget.cpp:216 #: transactionfilterwidget.cpp:81 transactionfilterwidget.cpp:95 #, kde-format msgid "To:" msgstr "" #: importcsvdialog.cpp:440 qifimportexport.cpp:258 #, kde-format msgid "A file must be selected." msgstr "" #: importcsvdialog.cpp:446 importcsvdialog.cpp:458 qifimportexport.cpp:265 #: qifimportexport.cpp:595 #, kde-format msgid "Selected file is a directory." msgstr "" #: importcsvdialog.cpp:450 importcsvdialog.cpp:462 qifimportexport.cpp:269 #, kde-format msgid "Selected file does not exist." msgstr "" #: importcsvdialog.cpp:468 #, kde-format msgid "Empty delimiter." msgstr "" #: importcsvdialog.cpp:712 #, kde-format msgid "The same column number is selected multiple times." msgstr "" #: importcsvdialog.cpp:772 #, kde-format msgid "Selected from account is the same as the to account." msgstr "" #: importcsvdialog.cpp:803 qifimportexport.cpp:288 qifimportexport.cpp:452 #, kde-format msgid "Couldn't open %1 for reading." msgstr "" #: importcsvdialog.cpp:806 qifimportexport.cpp:291 qifimportexport.cpp:455 #, kde-format msgid "Error reading %1." msgstr "" #: importcsvdialog.cpp:1187 qifimportexport.cpp:462 #, kde-format msgid "Successfully imported 1 transaction." msgid_plural "Successfully imported %n transactions." msgstr[0] "" msgstr[1] "" #: importcsvdialog.cpp:1189 #, kde-format msgid "Unable to import any transactions imported." msgstr "" #: importcsvdialog.cpp:1193 #, kde-format msgid "Failed to import 1 data row." msgid_plural "Failed to import %n data rows." msgstr[0] "" msgstr[1] "" #: importcsvdialog.cpp:1194 #, kde-format msgid "Required columns missing." msgstr "" #: importcsvdialog.cpp:1195 #, kde-format msgid "Invalid value." msgstr "" #: importcsvdialog.cpp:1197 #, kde-format msgid "Empty category name." msgstr "" #: importcsvdialog.cpp:1197 importcsvdialog.cpp:1198 #, kde-format msgid "Empty account name." msgstr "" #: importcsvdialog.cpp:1199 #, kde-format msgid "Unknown category found." msgstr "" #: importcsvdialog.cpp:1199 importcsvdialog.cpp:1200 #, kde-format msgid "Unknown account found." msgstr "" #: importcsvdialog.cpp:1201 #, kde-format msgid "Cannot import security transactions (to/from security accounts)." msgstr "" #: importcsvdialog.cpp:1202 #, kde-format msgid "Balancing account wrongly used." msgstr "" #: importcsvdialog.cpp:1203 #, kde-format msgid "Same to and from account/category." msgstr "" #: importcsvdialog.cpp:1205 #, kde-format msgid "No data found." msgstr "" #: importcsvdialog.cpp:1219 qifimportexport.cpp:345 #, kde-format msgid "Unrecognized date format." msgstr "" #: importcsvdialog.cpp:1224 #, kde-format msgid "Specify Format" msgstr "" #: importcsvdialog.cpp:1230 #, kde-format msgid "" "The format of dates and/or numbers in the CSV file is ambiguous. Please " "select the correct format." msgstr "" #: importcsvdialog.cpp:1235 qifimportexport.cpp:94 qifimportexport.cpp:533 #, kde-format msgid "Date format:" msgstr "" #: importcsvdialog.cpp:1278 qifimportexport.cpp:541 #, kde-format msgid "Value format:" msgstr "" #: kdateedit.cpp:366 #, kde-format msgctxt "the day after today" msgid "tomorrow" msgstr "" #: kdateedit.cpp:367 #, kde-format msgctxt "this day" msgid "today" msgstr "" #: kdateedit.cpp:368 #, kde-format msgctxt "the day before today" msgid "yesterday" msgstr "" #: kdatepickerpopup.cpp:94 #, kde-format msgctxt "@option today" msgid "&Today" msgstr "" #: kdatepickerpopup.cpp:95 #, kde-format msgctxt "@option tomorrow" msgid "To&morrow" msgstr "" #: kdatepickerpopup.cpp:96 #, kde-format msgctxt "@option next week" msgid "Next &Week" msgstr "" #: kdatepickerpopup.cpp:97 #, kde-format msgctxt "@option next month" msgid "Next M&onth" msgstr "" #: kdatepickerpopup.cpp:105 #, kde-format msgctxt "@option do not specify a date" msgid "No Date" msgstr "" #: ledgerdialog.cpp:122 #, kde-format msgid "Export..." msgstr "" #: ledgerdialog.cpp:123 #, kde-format msgid "Print..." msgstr "" #: ledgerdialog.cpp:139 #, kde-format msgid "Withdrawal" msgstr "" #: ledgerdialog.cpp:162 #, kde-format msgid "Join..." msgstr "" #: ledgerdialog.cpp:164 #, kde-format msgid "Split Up" msgstr "" #: ledgerdialog.cpp:234 ledgerdialog.cpp:354 #, kde-format msgid "Empty transaction list." msgstr "" #: ledgerdialog.cpp:443 transactionlistwidget.cpp:717 #, kde-format msgid "Are you sure you want to delete all (%1) selected transactions?" msgstr "" #: ledgerdialog.cpp:547 transactionlistwidget.cpp:489 #, kde-format msgid "" "Cannot set the value of security transactions using the dialog for modifying " "multiple transactions." msgstr "" #: ledgerdialog.cpp:553 transactionlistwidget.cpp:495 #, kde-format msgid "Cannot change description of dividends and security transactions." msgstr "" #: ledgerdialog.cpp:559 transactionlistwidget.cpp:501 #, kde-format msgid "Cannot change payer of dividends and security transactions." msgstr "" #: ledgerdialog.cpp:565 transactionlistwidget.cpp:507 #, kde-format msgid "" "Cannot change date of transactions that are part of a split transaction." msgstr "" #: main.cpp:39 msgid "Eqonomize!" msgstr "" #: main.cpp:39 msgid "A personal accounting program" msgstr "" #: main.cpp:39 msgid "(C) 2008 Hanna K." msgstr "" #: main.cpp:40 msgid "Hanna K." msgstr "" #: main.cpp:44 msgid "Start with expenses list displayed" msgstr "" #: main.cpp:46 msgid "Start with incomes list displayed" msgstr "" #: main.cpp:48 msgid "Start with transfers list displayed" msgstr "" #: main.cpp:49 msgid "Document to open" msgstr "" #: overtimechart.cpp:124 overtimechart.cpp.bak:117 #, kde-format msgid "Incomes and Expenses" msgstr "" #: overtimechart.cpp:125 overtimechart.cpp:1722 overtimechart.cpp.bak:118 #: overtimechart.cpp.bak:1703 overtimereport.cpp:102 overtimereport.cpp:343 #, kde-format msgid "Profits" msgstr "" #: overtimechart.cpp:132 overtimechart.cpp:411 overtimechart.cpp:1949 #: overtimechart.cpp.bak:125 overtimechart.cpp.bak:404 #: overtimechart.cpp.bak:1950 overtimereport.cpp:108 overtimereport.cpp:228 #: overtimereport.cpp:753 #, kde-format msgid "All Categories Combined" msgstr "" #: overtimechart.cpp:138 overtimechart.cpp:296 overtimechart.cpp:400 #: overtimechart.cpp:1852 overtimechart.cpp:1973 overtimechart.cpp.bak:131 #: overtimechart.cpp.bak:289 overtimechart.cpp.bak:393 #: overtimechart.cpp.bak:1853 overtimechart.cpp.bak:1974 #: overtimereport.cpp:113 overtimereport.cpp:176 overtimereport.cpp:225 #: overtimereport.cpp:710 overtimereport.cpp:776 #, kde-format msgid "All Descriptions Combined" msgstr "" #: overtimechart.cpp:146 overtimechart.cpp:406 overtimechart.cpp.bak:139 #: overtimechart.cpp.bak:399 #, kde-format msgid "All Payees/Payers Combined" msgstr "" #: overtimechart.cpp:155 overtimechart.cpp.bak:148 #, kde-format msgid "Start date:" msgstr "" #: overtimechart.cpp:178 overtimechart.cpp.bak:171 #, kde-format msgid "End date:" msgstr "" #: overtimechart.cpp:197 overtimechart.cpp.bak:190 #, kde-format msgid "Monthly total" msgstr "" #: overtimechart.cpp:201 overtimechart.cpp.bak:194 #, kde-format msgid "Daily average" msgstr "" #: overtimechart.cpp:304 overtimechart.cpp:404 overtimechart.cpp:1855 #: overtimechart.cpp:1978 overtimechart.cpp.bak:297 overtimechart.cpp.bak:397 #: overtimechart.cpp.bak:1856 overtimechart.cpp.bak:1979 #, kde-format msgid "All Payers Combined" msgstr "" #: overtimechart.cpp:305 overtimechart.cpp:405 overtimechart.cpp:1856 #: overtimechart.cpp:1977 overtimechart.cpp.bak:298 overtimechart.cpp.bak:398 #: overtimechart.cpp.bak:1857 overtimechart.cpp.bak:1978 #, kde-format msgid "All Payees Combined" msgstr "" #: overtimechart.cpp:325 overtimechart.cpp:1853 overtimechart.cpp.bak:318 #: overtimechart.cpp.bak:1854 #, kde-format msgid "All Descriptions Split" msgstr "" #: overtimechart.cpp:328 overtimechart.cpp:1857 overtimechart.cpp.bak:321 #: overtimechart.cpp.bak:1858 #, kde-format msgid "All Payers Split" msgstr "" #: overtimechart.cpp:329 overtimechart.cpp:1858 overtimechart.cpp.bak:322 #: overtimechart.cpp.bak:1859 #, kde-format msgid "All Payees Split" msgstr "" #: overtimechart.cpp:413 overtimechart.cpp:423 overtimechart.cpp:1950 #: overtimechart.cpp.bak:406 overtimechart.cpp.bak:416 #: overtimechart.cpp.bak:1951 #, kde-format msgid "All Categories Split" msgstr "" #: overtimechart.cpp:1535 overtimechart.cpp.bak:1516 #, kde-format msgid "Value (%1)" msgstr "" #: overtimechart.cpp:1536 overtimechart.cpp.bak:1517 #, kde-format msgid "Profit (%1)" msgstr "" #: overtimechart.cpp:1537 overtimechart.cpp.bak:1518 #, kde-format msgid "Income (%1)" msgstr "" #: overtimechart.cpp:1538 overtimechart.cpp.bak:1519 #, kde-format msgid "Cost (%1)" msgstr "" #: overtimechart.cpp:1579 overtimechart.cpp.bak:1560 #, kde-format msgid "Time" msgstr "" #: overtimechart.cpp:1774 overtimechart.cpp:1775 overtimechart.cpp.bak:1755 #: overtimechart.cpp.bak:1756 #, kde-format msgid "no payer" msgstr "" #: overtimechart.cpp:1778 overtimechart.cpp.bak:1759 #, kde-format msgctxt "%1: Description; %2: Payer" msgid "%1/%2" msgstr "" #: overtimechart.cpp:1783 overtimechart.cpp:1784 overtimechart.cpp.bak:1764 #: overtimechart.cpp.bak:1765 #, kde-format msgid "no payee" msgstr "" #: overtimechart.cpp:1787 overtimechart.cpp.bak:1768 #, kde-format msgctxt "%1: Description; %2: Payee" msgid "%1/%2" msgstr "" #: overtimechart.cpp.bak:649 #, kde-format msgid "Error after saving file; data may not have been saved." msgstr "Chyba po zápise do súboru; údaje sa možno nezapísali." #: overtimereport.cpp:344 #, kde-format msgid "Average Profit" msgstr "" #: overtimereport.cpp:537 #, kde-format msgid "Year" msgstr "" #: overtimereport.cpp:538 #, kde-format msgid "Month" msgstr "" #: overtimereport.cpp:566 #, kde-format msgid "Includes scheduled transactions" msgstr "" #: overtimereport.cpp:570 #, kde-format msgid "Adjusted for the average month / year (%1 / %2 days)" msgstr "" #: overtimereport.cpp:603 overtimereport.cpp:671 #, kde-format msgid "Subtotal" msgstr "" #: qifimport.cpp:307 qifimport.cpp:367 qifimportexport.cpp:1259 #: qifimportexport.cpp:1350 qifimportexport.cpp:1470 #, kde-format msgid "Unnamed" msgstr "" #: qifimport.cpp:337 qifimportexport.cpp:1299 qifimportexport.cpp:1413 #, kde-format msgid "Uncategorized" msgstr "" #: qifimportexport.cpp:56 #, kde-format msgid "Import QIF file" msgstr "" #: qifimportexport.cpp:63 #, kde-format msgid "" "Select a QIF file to import. When you click next, the file be analysed and " "you might need to answer some questions about the format of the file." msgstr "" #: qifimportexport.cpp:73 #, kde-format msgid "Local Definitions" msgstr "" #: qifimportexport.cpp:74 #, kde-format msgid "" "Unknown elements where found in the QIF file. It is possible that this is " "because of localized type names. Please map them to the correct standard " "names." msgstr "" #: qifimportexport.cpp:80 #, kde-format msgid "Local Text" msgstr "" #: qifimportexport.cpp:81 #, kde-format msgid "Standard Text" msgstr "" #: qifimportexport.cpp:84 #, kde-format msgid "Select standard text:" msgstr "" #: qifimportexport.cpp:90 #, kde-format msgid "Date Format" msgstr "" #: qifimportexport.cpp:91 #, kde-format msgid "" "The date format in the QIF file is ambiguous. Please select the correct " "format." msgstr "" #: qifimportexport.cpp:100 #, kde-format msgid "Default Account" msgstr "" #: qifimportexport.cpp:101 #, kde-format msgid "" "Could not find any account definitions in the QIF file. Please select a " "default account. It is also possible that this is caused by a localized " "opening balance text." msgstr "" #: qifimportexport.cpp:104 #, kde-format msgid "Default account:" msgstr "" #: qifimportexport.cpp:115 #, kde-format msgid "Opening balance text:" msgstr "" #: qifimportexport.cpp:121 #, kde-format msgid "Descriptions" msgstr "" #: qifimportexport.cpp:122 #, kde-format msgid "" "Transactions in QIF files does not have any specific description property. " "You are therefore given the option to choose how the description of imported " "transactions will be set." msgstr "" #: qifimportexport.cpp:125 #, kde-format msgid "Subcategories as:" msgstr "" #: qifimportexport.cpp:134 #, kde-format msgid "Ignore" msgstr "" #: qifimportexport.cpp:137 #, kde-format msgid "Payee as:" msgstr "" #: qifimportexport.cpp:142 qifimportexport.cpp:520 #: transactionlistwidget.cpp:119 #, kde-format msgid "Payee" msgstr "" #: qifimportexport.cpp:147 #, kde-format msgid "Memo as:" msgstr "" #: qifimportexport.cpp:156 #, kde-format msgid "Priority:" msgstr "" #: qifimportexport.cpp:159 #, kde-format msgid "Subcategory/Payee/Comments" msgstr "" #: qifimportexport.cpp:160 #, kde-format msgid "Payee/Subcategory/Comments" msgstr "" #: qifimportexport.cpp:161 #, kde-format msgid "Subcategory/Comments/Payee" msgstr "" #: qifimportexport.cpp:162 #, kde-format msgid "Payee/Comments/Subcategory" msgstr "" #: qifimportexport.cpp:163 #, kde-format msgid "Comments/Subcategory/Payee" msgstr "" #: qifimportexport.cpp:164 #, kde-format msgid "Comments/Payee/Subcategory" msgstr "" #: qifimportexport.cpp:314 qifimportexport.cpp:322 qifimportexport.cpp:338 #, kde-format msgid "Unknown" msgstr "" #: qifimportexport.cpp:324 #, kde-format msgid "Bank" msgstr "" #: qifimportexport.cpp:326 #, kde-format msgid "Cat (Category)" msgstr "" #: qifimportexport.cpp:327 #, kde-format msgid "CCard (Credit Card)" msgstr "" #: qifimportexport.cpp:328 #, kde-format msgid "Invst (Investment)" msgstr "" #: qifimportexport.cpp:329 #, kde-format msgid "Oth A (Other Assets)" msgstr "" #: qifimportexport.cpp:330 #, kde-format msgid "Oth L (Other Liabilities)" msgstr "" #: qifimportexport.cpp:331 #, kde-format msgid "Security" msgstr "" #: qifimportexport.cpp:465 #, kde-format msgid "Successfully imported 1 account." msgid_plural "Successfully imported %n accounts." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:469 #, kde-format msgid "Successfully imported 1 category." msgid_plural "Successfully imported %n categories." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:473 #, kde-format msgid "1 duplicate transaction was ignored." msgid_plural "%n duplicate transactions was ignored." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:477 #, kde-format msgid "Failed to import 1 transaction." msgid_plural "Failed to import %n transactions." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:481 #, kde-format msgid "1 security was not imported." msgid_plural "%n securities were not imported." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:485 #, kde-format msgid "1 security transaction was not imported." msgid_plural "%n security transactions were not imported." msgstr[0] "" msgstr[1] "" #: qifimportexport.cpp:494 #, kde-format msgid "Export QIF File" msgstr "" #: qifimportexport.cpp:506 #, kde-format msgctxt "All accounts" msgid "All" msgstr "" #: qifimportexport.cpp:517 #, kde-format msgid "Export transaction description as:" msgstr "" #: qifimportexport.cpp:524 #, kde-format msgid "Memo" msgstr "" #: qifimportexport.cpp:528 #, kde-format msgid "Subcategory" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 5 #: rc.cpp:3 #, kde-format msgid "&Import" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 12 #: rc.cpp:6 #, kde-format msgid "&Accounts" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 24 #: rc.cpp:9 #, kde-format msgid "&Transactions" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 41 #: rc.cpp:12 #, kde-format msgid "&Securities" msgstr "" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 56 #: rc.cpp:15 #, kde-format msgid "Stat&istics" msgstr "" #: rc.cpp:16 #, kde-format msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr ",Launchpad Contributions:,Roman Priesol" #: rc.cpp:17 #, kde-format msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr ",,randybb@gmail.com" #: recurrenceeditwidget.cpp:69 #, kde-format msgid "Edit Exceptions" msgstr "" #: recurrenceeditwidget.cpp:186 #, kde-format msgid "Edit Recurrence Range" msgstr "" #: recurrenceeditwidget.cpp:194 recurrenceeditwidget.cpp:229 #, kde-format msgid "Begins on: %1" msgstr "" #: recurrenceeditwidget.cpp:199 #, kde-format msgid "No ending date" msgstr "" #: recurrenceeditwidget.cpp:203 #, kde-format msgid "End after" msgstr "" #: recurrenceeditwidget.cpp:209 #, kde-format msgid "occurrence(s)" msgstr "" #: recurrenceeditwidget.cpp:211 #, kde-format msgid "End on" msgstr "" #: recurrenceeditwidget.cpp:298 #, kde-format msgid "End date before start date." msgstr "" #: recurrenceeditwidget.cpp:312 #, kde-format msgid "Enable recurrance" msgstr "" #: recurrenceeditwidget.cpp:315 #, kde-format msgid "Recurrence Rule" msgstr "" #: recurrenceeditwidget.cpp:321 #, kde-format msgid "Weekly" msgstr "" #: recurrenceeditwidget.cpp:341 recurrenceeditwidget.cpp:352 #: recurrenceeditwidget.cpp:376 recurrenceeditwidget.cpp:462 #, kde-format msgid "Recur every" msgstr "" #: recurrenceeditwidget.cpp:345 #, kde-format msgid "day(s)" msgstr "" #: recurrenceeditwidget.cpp:356 #, kde-format msgid "week(s) on:" msgstr "" #: recurrenceeditwidget.cpp:380 #, kde-format msgid "month(s), after the start month" msgstr "" #: recurrenceeditwidget.cpp:385 recurrenceeditwidget.cpp:437 #, kde-format msgid "Recur on the" msgstr "" #: recurrenceeditwidget.cpp:391 recurrenceeditwidget.cpp:442 #: recurrenceeditwidget.cpp:494 #, kde-format msgid "1st" msgstr "" #: recurrenceeditwidget.cpp:392 recurrenceeditwidget.cpp:443 #: recurrenceeditwidget.cpp:495 #, kde-format msgid "2nd" msgstr "" #: recurrenceeditwidget.cpp:393 recurrenceeditwidget.cpp:444 #: recurrenceeditwidget.cpp:496 #, kde-format msgid "3rd" msgstr "" #: recurrenceeditwidget.cpp:394 recurrenceeditwidget.cpp:445 #: recurrenceeditwidget.cpp:497 #, kde-format msgid "4th" msgstr "" #: recurrenceeditwidget.cpp:395 recurrenceeditwidget.cpp:446 #: recurrenceeditwidget.cpp:498 #, kde-format msgid "5th" msgstr "" #: recurrenceeditwidget.cpp:396 #, kde-format msgid "6th" msgstr "" #: recurrenceeditwidget.cpp:397 #, kde-format msgid "7th" msgstr "" #: recurrenceeditwidget.cpp:398 #, kde-format msgid "8th" msgstr "" #: recurrenceeditwidget.cpp:399 #, kde-format msgid "9th" msgstr "" #: recurrenceeditwidget.cpp:400 #, kde-format msgid "10th" msgstr "" #: recurrenceeditwidget.cpp:401 #, kde-format msgid "11th" msgstr "" #: recurrenceeditwidget.cpp:402 #, kde-format msgid "12th" msgstr "" #: recurrenceeditwidget.cpp:403 #, kde-format msgid "13th" msgstr "" #: recurrenceeditwidget.cpp:404 #, kde-format msgid "14th" msgstr "" #: recurrenceeditwidget.cpp:405 #, kde-format msgid "15th" msgstr "" #: recurrenceeditwidget.cpp:406 #, kde-format msgid "16th" msgstr "" #: recurrenceeditwidget.cpp:407 #, kde-format msgid "17th" msgstr "" #: recurrenceeditwidget.cpp:408 #, kde-format msgid "18th" msgstr "" #: recurrenceeditwidget.cpp:409 #, kde-format msgid "19th" msgstr "" #: recurrenceeditwidget.cpp:410 #, kde-format msgid "20th" msgstr "" #: recurrenceeditwidget.cpp:411 #, kde-format msgid "21st" msgstr "" #: recurrenceeditwidget.cpp:412 #, kde-format msgid "22nd" msgstr "" #: recurrenceeditwidget.cpp:413 #, kde-format msgid "23rd" msgstr "" #: recurrenceeditwidget.cpp:414 #, kde-format msgid "24th" msgstr "" #: recurrenceeditwidget.cpp:415 #, kde-format msgid "25th" msgstr "" #: recurrenceeditwidget.cpp:416 #, kde-format msgid "26th" msgstr "" #: recurrenceeditwidget.cpp:417 #, kde-format msgid "27th" msgstr "" #: recurrenceeditwidget.cpp:418 #, kde-format msgid "28th" msgstr "" #: recurrenceeditwidget.cpp:419 #, kde-format msgid "29th" msgstr "" #: recurrenceeditwidget.cpp:420 #, kde-format msgid "30th" msgstr "" #: recurrenceeditwidget.cpp:421 #, kde-format msgid "31st" msgstr "" #: recurrenceeditwidget.cpp:422 recurrenceeditwidget.cpp:447 #: recurrenceeditwidget.cpp:499 #, kde-format msgid "Last" msgstr "" #: recurrenceeditwidget.cpp:423 recurrenceeditwidget.cpp:448 #: recurrenceeditwidget.cpp:500 #, kde-format msgid "2nd Last" msgstr "" #: recurrenceeditwidget.cpp:424 recurrenceeditwidget.cpp:449 #: recurrenceeditwidget.cpp:501 #, kde-format msgid "3rd Last" msgstr "" #: recurrenceeditwidget.cpp:425 recurrenceeditwidget.cpp:450 #: recurrenceeditwidget.cpp:502 #, kde-format msgid "4th Last" msgstr "" #: recurrenceeditwidget.cpp:426 recurrenceeditwidget.cpp:451 #: recurrenceeditwidget.cpp:503 #, kde-format msgid "5th Last" msgstr "" #: recurrenceeditwidget.cpp:429 #, kde-format msgid "day" msgstr "" #: recurrenceeditwidget.cpp:431 recurrenceeditwidget.cpp:483 #: recurrenceeditwidget.cpp:521 #, kde-format msgid "possibly on weekend" msgstr "" #: recurrenceeditwidget.cpp:432 recurrenceeditwidget.cpp:484 #: recurrenceeditwidget.cpp:522 #, kde-format msgid "but before weekend" msgstr "" #: recurrenceeditwidget.cpp:433 recurrenceeditwidget.cpp:485 #: recurrenceeditwidget.cpp:523 #, kde-format msgid "but after weekend" msgstr "" #: recurrenceeditwidget.cpp:466 #, kde-format msgid "year(s), after the start year" msgstr "" #: recurrenceeditwidget.cpp:471 #, kde-format msgctxt "part before XXX of 'Recur on day XXX of month YYY'" msgid "Recur on day" msgstr "" #: recurrenceeditwidget.cpp:479 #, kde-format msgctxt "part between XXX and YYY of 'Recur on day XXX of month YYY'" msgid "of" msgstr "" #: recurrenceeditwidget.cpp:489 #, kde-format msgctxt "Part before NNN in 'Recur on the NNN. WEEKDAY of MONTH'" msgid "On the" msgstr "" #: recurrenceeditwidget.cpp:507 #, kde-format msgctxt "part between WEEKDAY and MONTH in 'Recur on NNN. WEEKDAY of MONTH'" msgid "of" msgstr "" #: recurrenceeditwidget.cpp:512 #, kde-format msgid "Recur on day #" msgstr "" #: recurrenceeditwidget.cpp:519 #, kde-format msgctxt "part after NNN of 'Recur on day #NNN of the year'" msgid " of the year" msgstr "" #: recurrenceeditwidget.cpp:533 #, kde-format msgid "Range..." msgstr "" #: recurrenceeditwidget.cpp:535 #, kde-format msgid "Exceptions..." msgstr "" #: recurrenceeditwidget.cpp:731 #, kde-format msgid "No day of week selected for weekly recurrence." msgstr "" #: recurrenceeditwidget.cpp:745 recurrenceeditwidget.cpp:774 #: recurrenceeditwidget.cpp:791 #, kde-format msgid "Selected day will never occur with selected frequency and start date." msgstr "" #: recurrenceeditwidget.cpp:761 #, kde-format msgid "Selected day does not exist in selected month." msgstr "" #: transaction.cpp:155 transaction.cpp:186 #, kde-format msgid "Dividend: %1" msgstr "" #: transaction.cpp:253 transaction.cpp:256 transaction.cpp:284 #, kde-format msgid "Account balancing" msgstr "" #: transaction.cpp:337 transaction.cpp:352 #, kde-format msgid "Security: %1 (bought)" msgstr "" #: transaction.cpp:375 transaction.cpp:390 #, kde-format msgid "Security: %1 (sold)" msgstr "" #: transactioneditwidget.cpp:125 #, kde-format msgid "Shares bought:" msgstr "" #: transactioneditwidget.cpp:130 #, kde-format msgid "Shares sold:" msgstr "" #: transactioneditwidget.cpp:238 transactioneditwidget.cpp:1144 #: transactionfilterwidget.cpp:140 #, kde-format msgid "Payer:" msgstr "" #: transactioneditwidget.cpp:280 transactioneditwidget.cpp:1145 #: transactionfilterwidget.cpp:141 #, kde-format msgid "Payee:" msgstr "" #: transactioneditwidget.cpp:664 transactioneditwidget.cpp:1262 #, kde-format msgid "No income category available." msgstr "" #: transactioneditwidget.cpp:689 transactioneditwidget.cpp:1270 #, kde-format msgid "No expense category available." msgstr "" #: transactioneditwidget.cpp:720 #, kde-format msgid "Cannot create a regular transfer to/from a securities account." msgstr "" #: transactioneditwidget.cpp:727 #, kde-format msgid "Cannot create a regular income to a securities account." msgstr "" #: transactioneditwidget.cpp:743 #, kde-format msgid "Zero price per share not allowed." msgstr "" #: transactioneditwidget.cpp:755 #, kde-format msgid "Cannot create a regular expense from a securities account." msgstr "" #: transactioneditwidget.cpp:1086 #, kde-format msgid "Modify Transactions" msgstr "" #: transactionfilterwidget.cpp:99 #, kde-format msgid "Min amount:" msgstr "" #: transactionfilterwidget.cpp:100 #, kde-format msgid "Max amount:" msgstr "" #: transactionfilterwidget.cpp:110 #, kde-format msgid "Min income:" msgstr "" #: transactionfilterwidget.cpp:111 #, kde-format msgid "Max income:" msgstr "" #: transactionfilterwidget.cpp:121 #, kde-format msgid "Min cost:" msgstr "" #: transactionfilterwidget.cpp:122 #, kde-format msgid "Max cost:" msgstr "" #: transactionfilterwidget.cpp:148 #, kde-format msgid "Include" msgstr "" #: transactionfilterwidget.cpp:152 #, kde-format msgid "Exclude" msgstr "" #: transactionlistwidget.cpp:117 #, kde-format msgid "From Account" msgstr "" #: transactionlistwidget.cpp:128 #, kde-format msgid "To Account" msgstr "" #: transactionlistwidget.cpp:130 #, kde-format msgid "Payer" msgstr "" #: transactionlistwidget.cpp:169 #, kde-format msgid "New/Edit Expense" msgstr "" #: transactionlistwidget.cpp:170 #, kde-format msgid "Filter" msgstr "" #: transactionlistwidget.cpp:209 #, kde-format msgid "Total:" msgstr "" #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:328 #, kde-format msgid "Average:" msgstr "" #: transactionlistwidget.cpp:209 #, kde-format msgid "Monthly:" msgstr "" #: transactionlistwidget.cpp:314 #, kde-format msgid "Total cost:" msgstr "" #: transactionlistwidget.cpp:318 #, kde-format msgid "Total income:" msgstr "" #: transactionlistwidget.cpp:322 #, kde-format msgid "Total amount:" msgstr "" #: transactionlistwidget.cpp:330 #, kde-format msgid "Monthly average:" msgstr "" #: transactionlistwidget.cpp:671 #, kde-format msgid "" "Are you sure you want to delete all (%1) transactions in the selected split " "transaction?" msgstr "" #: transactionlistwidget.cpp:1028 #, kde-format msgid "* Part of split transaction" msgstr "" #: transactionlistwidget.cpp:1029 #, kde-format msgid "* Part of split (%1)" msgstr "" #: transactionlistwidget.cpp:1033 #, kde-format msgid "** Recurring (editing occurrance)" msgstr "" #: transactionlistwidget.cpp:1049 #, kde-format msgid "Modify..." msgstr "" eqonomize-0.6/po/sv.po0000644000175000017500000023675711107053374013754 0ustar hannahanna# translation of sv.po to Swedish # Hanna K. , 2007. msgid "" msgstr "" "Project-Id-Version: sv\n" "Report-Msgid-Bugs-To: http://sourceforge.net/tracker/?" "group_id=173799&atid=866832\n" "POT-Creation-Date: 2008-11-13 14:35+0100\n" "PO-Revision-Date: 2007-05-18 11:36+0200\n" "Last-Translator: Hanna K. \n" "Language-Team: Swedish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" #: budget.cpp:51 editsplitdialog.cpp:118 ledgerdialog.cpp:652 #, kde-format msgid "Balancing" msgstr "Balanskonto" #: budget.cpp:84 #, kde-format msgid "Couldn't open %1 for reading" msgstr "Kunde inte öppna och läsa %1" #: budget.cpp:95 #, kde-format msgid "" "Not a valid Eqonomize! file (XML parse error: \"%2\" at line %3, col %4)" msgstr "Inte en korrekt Eqonomize! fil (XML fel: \"%2\" vid rad %3, kolumn %4)" #: budget.cpp:98 #, kde-format msgid "Invalid root element %1 in XML document" msgstr "Felaktigt rotelement %1 in XML dokumentet" #: budget.cpp:363 #, kde-format msgid "Unable to load 1 account." msgid_plural "Unable to load %n accounts." msgstr[0] "Kunde inte läsa in 1 konto." msgstr[1] "Kunde inte läsa in %n konton." #: budget.cpp:368 #, kde-format msgid "Unable to load 1 category." msgid_plural "Unable to load %n categories." msgstr[0] "Kunde inte läsa in 1 kategori." msgstr[1] "Kunde inte läsa in %n kategorier." #: budget.cpp:373 #, kde-format msgid "Unable to load 1 security." msgid_plural "Unable to load %n securities." msgstr[0] "Kunde inte läsa in 1 värdepapper." msgstr[1] "Kunde inte läsa in %n värdepapper." #: budget.cpp:378 #, kde-format msgid "Unable to load 1 transaction." msgid_plural "Unable to load %n transactions." msgstr[0] "Kunde inte läsa in 1 transaktion." msgstr[1] "Kunde inte läsa in %n transaktioner." #: budget.cpp:389 #, kde-format msgid "File is a directory" msgstr "Filen är en mapp" #: budget.cpp:397 #, kde-format msgid "Couldn't open file for writing" msgstr "Kunde öppna och skriva till filen" #: budget.cpp:547 budget.cpp:551 #, kde-format msgid "Error while writing file; file was not saved" msgstr "Fil vid skrivande till fil; filen sparades inte" #: categoriescomparisonchart.cpp:123 categoriescomparisonreport.cpp:164 #: eqonomize.cpp:1797 eqonomize.cpp:1957 eqonomize.cpp:2036 #: transactionlistwidget.cpp:138 #, kde-format msgid "From" msgstr "Från" #: categoriescomparisonchart.cpp:130 categoriescomparisonreport.cpp:171 #: eqonomize.cpp:1808 eqonomize.cpp:1969 eqonomize.cpp:2037 #: transactionlistwidget.cpp:139 #, kde-format msgid "To" msgstr "Till" #: categoriescomparisonchart.cpp:147 categoriescomparisonreport.cpp:114 #: overtimechart.cpp:112 overtimechart.cpp.bak:106 overtimereport.cpp:97 #, kde-format msgid "Source:" msgstr "Källa:" #: categoriescomparisonchart.cpp:150 categoriescomparisonchart.cpp:858 #, kde-format msgid "All Expenses" msgstr "Alla utgifter" #: categoriescomparisonchart.cpp:151 categoriescomparisonchart.cpp:859 #, kde-format msgid "All Incomes" msgstr "Alla inkomster" #: categoriescomparisonchart.cpp:152 categoriescomparisonchart.cpp:860 #, kde-format msgid "All Accounts" msgstr "Alla konton" #: categoriescomparisonchart.cpp:155 categoriescomparisonchart.cpp:864 #: categoriescomparisonreport.cpp:122 categoriescomparisonreport.cpp:752 #: categoriescomparisonreport.cpp:1016 overtimereport.cpp:375 #, kde-format msgid "Expenses: %1" msgstr "Utgifter: %1" #: categoriescomparisonchart.cpp:160 categoriescomparisonchart.cpp:871 #: categoriescomparisonreport.cpp:127 categoriescomparisonreport.cpp:756 #: categoriescomparisonreport.cpp:1023 overtimereport.cpp:366 #, kde-format msgid "Incomes: %1" msgstr "Inkomster: %1" #: categoriescomparisonchart.cpp:199 categoriescomparisonchart.cpp:225 #: categoriescomparisonreport.cpp:334 categoriescomparisonreport.cpp:360 #: editsplitdialog.cpp:411 eqonomize.cpp:482 eqonomize.cpp:571 #: eqonomize.cpp:741 eqonomize.cpp:848 eqonomize.cpp:870 eqonomize.cpp:2483 #: eqonomize.cpp:3180 eqonomize.cpp:3206 eqonomize.cpp:3326 eqonomize.cpp:3352 #: importcsvdialog.cpp:780 importcsvdialog.cpp:1196 overtimechart.cpp:462 #: overtimechart.cpp:500 overtimechart.cpp:528 overtimechart.cpp:566 #: overtimechart.cpp.bak:455 overtimechart.cpp.bak:493 #: overtimechart.cpp.bak:521 overtimechart.cpp.bak:559 #: recurrenceeditwidget.cpp:156 recurrenceeditwidget.cpp:171 #: recurrenceeditwidget.cpp:293 transactioneditwidget.cpp:707 #: transactioneditwidget.cpp:1281 transactionfilterwidget.cpp:564 #: transactionfilterwidget.cpp:590 #, kde-format msgid "Invalid date." msgstr "Felaktigt datum." #: categoriescomparisonchart.cpp:204 categoriescomparisonreport.cpp:339 #: eqonomize.cpp:3185 eqonomize.cpp:3331 transactionfilterwidget.cpp:569 #, kde-format msgid "To date is before from date." msgstr "Slutdatum är före startdatum." #: categoriescomparisonchart.cpp:229 categoriescomparisonreport.cpp:364 #: eqonomize.cpp:3210 eqonomize.cpp:3356 transactionfilterwidget.cpp:594 #, kde-format msgid "From date is after to date." msgstr "Startdatum är efter slutdatum." #: categoriescomparisonchart.cpp:340 categoriescomparisonreport.cpp:463 #: eqonomize.cpp:3610 eqonomize.cpp:4252 ledgerdialog.cpp:251 #: overtimechart.cpp:624 overtimechart.cpp.bak:617 overtimereport.cpp:278 #: qifimportexport.cpp:604 #, kde-format msgid "" "The selected file already exists. Would you like to overwrite the old copy?" msgstr "Filen existerar redan. Vill du skriva över den gamla kopian?" #: categoriescomparisonchart.cpp:344 categoriescomparisonreport.cpp:467 #: eqonomize.cpp:4257 ledgerdialog.cpp:255 overtimechart.cpp:628 #: overtimechart.cpp.bak:621 overtimereport.cpp:282 qifimportexport.cpp:608 #, kde-format msgid "You selected a directory!" msgstr "Du valde en mapp!" #: categoriescomparisonchart.cpp:352 categoriescomparisonreport.cpp:475 #: eqonomize.cpp:4264 ledgerdialog.cpp:263 overtimechart.cpp:636 #: overtimechart.cpp.bak:629 overtimereport.cpp:290 qifimportexport.cpp:616 #, kde-format msgid "Couldn't open file for writing." msgstr "Kunde inte öppna och skriva till filen" #: categoriescomparisonchart.cpp:372 categoriescomparisonreport.cpp:482 #: eqonomize.cpp:4270 ledgerdialog.cpp:269 overtimechart.cpp:656 #: overtimechart.cpp.bak:644 overtimereport.cpp:297 qifimportexport.cpp:622 #, kde-format msgid "Error while writing file; file was not saved." msgstr "Fel vid skrivande av fil; filen sparades inte." #: categoriescomparisonchart.cpp:728 categoriescomparisonreport.cpp:303 #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:754 #: categoriescomparisonreport.cpp:839 categoriescomparisonreport.cpp:930 #: categoriescomparisonreport.cpp:977 overtimechart.cpp:373 #: overtimechart.cpp:1740 overtimechart.cpp:1746 overtimechart.cpp:1774 #: overtimechart.cpp:1776 overtimechart.cpp:1783 overtimechart.cpp:1785 #: overtimechart.cpp:1821 overtimechart.cpp:1891 overtimechart.cpp.bak:366 #: overtimechart.cpp.bak:1721 overtimechart.cpp.bak:1727 #: overtimechart.cpp.bak:1755 overtimechart.cpp.bak:1757 #: overtimechart.cpp.bak:1764 overtimechart.cpp.bak:1766 #: overtimechart.cpp.bak:1811 overtimechart.cpp.bak:1892 #: overtimereport.cpp:213 overtimereport.cpp:384 overtimereport.cpp:393 #: overtimereport.cpp:732 #, kde-format msgid "No description" msgstr "Ingen beskrivning" #: categoriescomparisonreport.cpp:119 categoriescomparisonreport.cpp:1012 #, kde-format msgid "All Categories" msgstr "Alla kategorier" #: categoriescomparisonreport.cpp:138 #, kde-format msgid "Descriptions for" msgstr "Beskrivningar för" #: categoriescomparisonreport.cpp:145 #, kde-format msgid "Payees/payers for" msgstr "Mottagare/utbetalare för" #: categoriescomparisonreport.cpp:161 #, kde-format msgid "Period:" msgstr "Period:" #: categoriescomparisonreport.cpp:186 overtimereport.cpp:120 #, kde-format msgid "Columns:" msgstr "Kolumner:" #: categoriescomparisonreport.cpp:189 categoriescomparisonreport.cpp:782 #: eqonomize.cpp:1062 eqonomize.cpp:1935 eqonomize.cpp:4142 #: importcsvdialog.cpp:139 importcsvdialog.cpp:157 importcsvdialog.cpp:180 #: importcsvdialog.cpp:197 importcsvdialog.cpp:216 importcsvdialog.cpp:235 #: importcsvdialog.cpp:253 overtimereport.cpp:123 #, kde-format msgid "Value" msgstr "Värde" #: categoriescomparisonreport.cpp:192 overtimereport.cpp:126 #: recurrenceeditwidget.cpp:320 #, kde-format msgid "Daily" msgstr "Dagligen" #: categoriescomparisonreport.cpp:195 overtimereport.cpp:129 #: recurrenceeditwidget.cpp:322 #, kde-format msgid "Monthly" msgstr "Månadsvis" #: categoriescomparisonreport.cpp:198 overtimereport.cpp:132 #: recurrenceeditwidget.cpp:323 #, kde-format msgid "Yearly" msgstr "Årligen" #: categoriescomparisonreport.cpp:201 categoriescomparisonreport.cpp:787 #: overtimechart.cpp:205 overtimechart.cpp:1534 overtimechart.cpp.bak:198 #: overtimechart.cpp.bak:1515 overtimereport.cpp:135 overtimereport.cpp:549 #: transactionlistwidget.cpp:276 transactionlistwidget.cpp:340 #, kde-format msgid "Quantity" msgstr "Kvantitet" #: categoriescomparisonreport.cpp:204 overtimechart.cpp:209 #: overtimechart.cpp.bak:202 overtimereport.cpp:138 #, kde-format msgid "Average value" msgstr "Genomsnittligt värde" #: categoriescomparisonreport.cpp:278 categoriescomparisonreport.cpp:947 #, kde-format msgid "All descriptions" msgstr "Alla beskrivningar" #: categoriescomparisonreport.cpp:279 categoriescomparisonreport.cpp:948 #, kde-format msgid "All payees" msgstr "Alla mottagare" #: categoriescomparisonreport.cpp:280 categoriescomparisonreport.cpp:949 #, kde-format msgid "All payers" msgstr "Alla utbetalare" #: categoriescomparisonreport.cpp:309 categoriescomparisonreport.cpp:751 #: categoriescomparisonreport.cpp:837 categoriescomparisonreport.cpp:932 #: categoriescomparisonreport.cpp:994 overtimechart.cpp:382 #: overtimechart.cpp:1758 overtimechart.cpp:1768 overtimechart.cpp:1823 #: overtimechart.cpp:1908 overtimechart.cpp.bak:375 overtimechart.cpp.bak:1739 #: overtimechart.cpp.bak:1749 overtimechart.cpp.bak:1813 #: overtimechart.cpp.bak:1909 #, kde-format msgid "No payee" msgstr "Ingen mottagare" #: categoriescomparisonreport.cpp:310 categoriescomparisonreport.cpp:755 #: categoriescomparisonreport.cpp:838 categoriescomparisonreport.cpp:933 #: categoriescomparisonreport.cpp:995 overtimechart.cpp:381 #: overtimechart.cpp:1752 overtimechart.cpp:1763 overtimechart.cpp:1825 #: overtimechart.cpp:1907 overtimechart.cpp.bak:374 overtimechart.cpp.bak:1733 #: overtimechart.cpp.bak:1744 overtimechart.cpp.bak:1815 #: overtimechart.cpp.bak:1908 #, kde-format msgid "No payer" msgstr "Ingen utbetalare" #: categoriescomparisonreport.cpp:750 categoriescomparisonreport.cpp:751 #: overtimereport.cpp:393 #, kde-format msgid "Expenses: %2, %1" msgstr "Utgifter: %2, %1" #: categoriescomparisonreport.cpp:754 categoriescomparisonreport.cpp:755 #: overtimereport.cpp:384 #, kde-format msgid "Incomes: %2, %1" msgstr "Inkomster: %2, %1" #: categoriescomparisonreport.cpp:758 #, kde-format msgid "Incomes & Expenses" msgstr "Inkomster & Utgifter" #: categoriescomparisonreport.cpp:771 #, kde-format msgctxt "html format; %1: title; %2: from date; %3: to date" msgid "%1 (%2–%3)" msgstr "%1 (%2 – %3)" #: categoriescomparisonreport.cpp:772 #, kde-format msgctxt "html format; %1: title; %2: to date" msgid "%1 (to %2)" msgstr "%1 (till %2)" #: categoriescomparisonreport.cpp:776 eqonomize.cpp:4046 eqonomize.cpp:4094 #: qifimportexport.cpp:131 transactionlistwidget.cpp:116 #: transactionlistwidget.cpp:127 #, kde-format msgid "Category" msgstr "Kategori" #: categoriescomparisonreport.cpp:778 eqonomize.cpp:1938 #: transactionlistwidget.cpp:115 #, kde-format msgid "Cost" msgstr "Kostnad" #: categoriescomparisonreport.cpp:780 editscheduledtransactiondialog.cpp:46 #: editsplitdialog.cpp:108 eqonomize.cpp:285 eqonomize.cpp:329 #: ledgerdialog.cpp:647 transactionlistwidget.cpp:126 #, kde-format msgid "Income" msgstr "Inkomst" #: categoriescomparisonreport.cpp:784 overtimereport.cpp:545 #, kde-format msgid "Daily Average" msgstr "Dagligt genomsnitt" #: categoriescomparisonreport.cpp:785 overtimereport.cpp:546 #, kde-format msgid "Monthly Average" msgstr "Månatligt genomsnitt" #: categoriescomparisonreport.cpp:786 overtimereport.cpp:547 #, kde-format msgid "Yearly Average" msgstr "Årligt genomsnitt" #: categoriescomparisonreport.cpp:789 overtimereport.cpp:358 #: overtimereport.cpp:376 overtimereport.cpp:394 #, kde-format msgid "Average Cost" msgstr "Genomsnittlig kostnad" #: categoriescomparisonreport.cpp:791 overtimereport.cpp:350 #: overtimereport.cpp:367 overtimereport.cpp:385 #, kde-format msgid "Average Income" msgstr "Genomsnittlig inkomst" #: categoriescomparisonreport.cpp:793 #, kde-format msgid "Average Value" msgstr "Genomsnittligt värde" #: categoriescomparisonreport.cpp:853 eqonomize.cpp:3932 eqonomize.cpp:4030 #: eqonomize.cpp:4075 eqonomize.cpp:4123 overtimereport.cpp:686 #, kde-format msgid "Total" msgstr "Summa" #: categoriescomparisonreport.cpp:878 #, kde-format msgid "Total incomes" msgstr "Totalt inkomster" #: categoriescomparisonreport.cpp:902 #, kde-format msgid "Total expenses" msgstr "Totalt utgifter" #: categoriescomparisonreport.cpp:912 #, kde-format msgid "Total (Profits)" msgstr "Totalt (Förtjänster)" #: editscheduledtransactiondialog.cpp:45 editsplitdialog.cpp:111 #: eqonomize.cpp:288 eqonomize.cpp:332 ledgerdialog.cpp:650 #, kde-format msgid "Expense" msgstr "Utgift" #: editscheduledtransactiondialog.cpp:47 editsplitdialog.cpp:120 #: eqonomize.cpp:282 eqonomize.cpp:326 ledgerdialog.cpp:653 #, kde-format msgid "Transfer" msgstr "Överföring" #: editscheduledtransactiondialog.cpp:48 editsplitdialog.cpp:114 #: eqonomize.cpp:289 eqonomize.cpp:333 #, kde-format msgid "Security Buy" msgstr "Köp" #: editscheduledtransactiondialog.cpp:49 editsplitdialog.cpp:116 #: eqonomize.cpp:290 eqonomize.cpp:334 #, kde-format msgid "Security Sell" msgstr "Försäljning" #: editscheduledtransactiondialog.cpp:56 editscheduledtransactiondialog.cpp:57 #, kde-format msgid "Recurrence" msgstr "Återkomst" #: editscheduledtransactiondialog.cpp:104 #, kde-format msgid "New Expense" msgstr "Ny utgift" #: editscheduledtransactiondialog.cpp:106 #, kde-format msgid "New Dividend" msgstr "Ny utdelning" #: editscheduledtransactiondialog.cpp:107 #, kde-format msgid "New Income" msgstr "Ny inkomst" #: editscheduledtransactiondialog.cpp:110 #, kde-format msgid "New Transfer" msgstr "Ny överföring" #: editscheduledtransactiondialog.cpp:111 #, kde-format msgid "New Security Buy" msgstr "Nytt köp" #: editscheduledtransactiondialog.cpp:113 #, kde-format msgid "New Security Sell" msgstr "Ny försäljning" #: editscheduledtransactiondialog.cpp:128 #: editscheduledtransactiondialog.cpp:149 transactioneditwidget.cpp:1064 #, kde-format msgid "Edit Expense" msgstr "Redigera utgift" #: editscheduledtransactiondialog.cpp:130 #: editscheduledtransactiondialog.cpp:151 transactioneditwidget.cpp:1066 #, kde-format msgid "Edit Dividend" msgstr "Redigera utdelning" #: editscheduledtransactiondialog.cpp:131 #: editscheduledtransactiondialog.cpp:152 transactioneditwidget.cpp:1067 #, kde-format msgid "Edit Income" msgstr "Redigera inkomst" #: editscheduledtransactiondialog.cpp:134 #: editscheduledtransactiondialog.cpp:155 transactioneditwidget.cpp:1070 #, kde-format msgid "Edit Transfer" msgstr "Redigera överföring" #: editscheduledtransactiondialog.cpp:135 #: editscheduledtransactiondialog.cpp:156 transactioneditwidget.cpp:1071 #, kde-format msgid "Edit Securities Bought" msgstr "Redigera köp" #: editscheduledtransactiondialog.cpp:136 #: editscheduledtransactiondialog.cpp:157 transactioneditwidget.cpp:1072 #, kde-format msgid "Edit Securities Sold" msgstr "Redigera försäljning" #: editsplitdialog.cpp:107 eqonomize.cpp:284 eqonomize.cpp:328 #: eqonomize.cpp:1167 #, kde-format msgid "Dividend" msgstr "Utdelning" #: editsplitdialog.cpp:109 eqonomize.cpp:403 eqonomize.cpp:445 #: ledgerdialog.cpp:648 #, kde-format msgid "Repayment" msgstr "Återbetalning" #: editsplitdialog.cpp:112 eqonomize.cpp:404 eqonomize.cpp:446 #: ledgerdialog.cpp:651 #, kde-format msgid "Refund" msgstr "Återbetalning" #: editsplitdialog.cpp:126 ledgerdialog.cpp:638 #, kde-format msgid "Split Transaction" msgstr "Delad transaktion" #: editsplitdialog.cpp:138 eqonomize.cpp:1279 eqonomize.cpp:1379 #: eqonomize.cpp:1473 eqonomize.cpp:1538 importcsvdialog.cpp:129 #: transactioneditwidget.cpp:175 transactioneditwidget.cpp:1099 #: transactionfilterwidget.cpp:135 #, kde-format msgid "Description:" msgstr "Beskrivning:" #: editsplitdialog.cpp:143 eqonomize.cpp:413 eqonomize.cpp:523 #: eqonomize.cpp:639 eqonomize.cpp:1274 eqonomize.cpp:2476 #: importcsvdialog.cpp:187 transactioneditwidget.cpp:149 #: transactioneditwidget.cpp:199 transactioneditwidget.cpp:1119 #, kde-format msgid "Date:" msgstr "Datum:" #: editsplitdialog.cpp:148 eqonomize.cpp:424 eqonomize.cpp:1252 #: importcsvdialog.cpp:388 importcsvdialog.cpp:399 ledgerdialog.cpp:107 #: qifimportexport.cpp:503 #, kde-format msgid "Account:" msgstr "Konto:" #: editsplitdialog.cpp:163 #, kde-format msgid "Transactions:" msgstr "Transaktioner:" #: editsplitdialog.cpp:172 eqonomize.cpp:914 eqonomize.cpp:1061 #: eqonomize.cpp:1941 eqonomize.cpp:2033 eqonomize.cpp:3988 #: ledgerdialog.cpp:135 #, kde-format msgid "Type" msgstr "Typ" #: editsplitdialog.cpp:173 eqonomize.cpp:915 eqonomize.cpp:2034 #: ledgerdialog.cpp:136 qifimportexport.cpp:127 qifimportexport.cpp:139 #: qifimportexport.cpp:149 transactionlistwidget.cpp:111 #, kde-format msgid "Description" msgstr "Beskrivning" #: editsplitdialog.cpp:174 eqonomize.cpp:4142 ledgerdialog.cpp:137 #, kde-format msgid "Account/Category" msgstr "Konto/kategori" #: editsplitdialog.cpp:175 #, kde-format msgid "Payment" msgstr "Betalning" #: editsplitdialog.cpp:176 ledgerdialog.cpp:138 #, kde-format msgid "Deposit" msgstr "Insättning" #: editsplitdialog.cpp:181 ledgerdialog.cpp:151 #, kde-format msgid "New" msgstr "Ny" #: editsplitdialog.cpp:184 eqonomize.cpp:4333 #, kde-format msgid "New Expense..." msgstr "Ny utgift..." #: editsplitdialog.cpp:185 eqonomize.cpp:4334 #, kde-format msgid "New Income..." msgstr "Ny inkomst..." #: editsplitdialog.cpp:186 #, kde-format msgid "New Deposit..." msgstr "Ny insättning..." #: editsplitdialog.cpp:187 #, kde-format msgid "New Withdrawal..." msgstr "Nytt uttag..." #: editsplitdialog.cpp:188 #, kde-format msgid "New Security Shares Bought..." msgstr "Nya andelar köpta..." #: editsplitdialog.cpp:189 #, kde-format msgid "Security Shares Sold..." msgstr "Andelar sålda..." #: editsplitdialog.cpp:190 #, kde-format msgid "New Dividend..." msgstr "Ny utdelning..." #: editsplitdialog.cpp:191 eqonomize.cpp:924 eqonomize.cpp:1071 #: eqonomize.cpp:4328 ledgerdialog.cpp:158 transactionlistwidget.cpp:1051 #, kde-format msgid "Edit..." msgstr "Modifiera..." #: editsplitdialog.cpp:221 eqonomize.cpp:2325 #, kde-format msgid "Total value:" msgstr "Totalt värde:" #: editsplitdialog.cpp:403 transactioneditwidget.cpp:653 #: transactioneditwidget.cpp:657 transactioneditwidget.cpp:668 #: transactioneditwidget.cpp:682 transactioneditwidget.cpp:693 #, kde-format msgid "No suitable account available." msgstr "Inget lämpligt konto finns tillgängligt." #: editsplitdialog.cpp:415 #, kde-format msgid "Future dates is not allowed." msgstr "Framtida datum är inte tillåtna." #: editsplitdialog.cpp:419 #, kde-format msgid "A split must contain at least two transactions." msgstr "En delad transaktion måste innehålla minst två transaktioner." #: editsplitdialog.cpp:428 transactioneditwidget.cpp:714 #, kde-format msgid "Cannot transfer money to and from the same account." msgstr "Kan inte överföra pengar till och från samma konto." #: eqonomize.cpp:419 eqonomize.cpp:2325 importcsvdialog.cpp:146 #: importcsvdialog.cpp:169 importcsvdialog.cpp:355 #: transactioneditwidget.cpp:117 transactioneditwidget.cpp:186 #: transactioneditwidget.cpp:1111 #, kde-format msgid "Cost:" msgstr "Kostnad:" #: eqonomize.cpp:420 importcsvdialog.cpp:364 importcsvdialog.cpp:397 #: transactioneditwidget.cpp:118 transactioneditwidget.cpp:184 #: transactioneditwidget.cpp:1110 #, kde-format msgid "Income:" msgstr "Inkomst:" #: eqonomize.cpp:439 transactioneditwidget.cpp:193 #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:310 #, kde-format msgid "Quantity:" msgstr "Kvantitet:" #: eqonomize.cpp:443 importcsvdialog.cpp:243 transactioneditwidget.cpp:288 #, kde-format msgid "Comments:" msgstr "Kommentarer:" #: eqonomize.cpp:491 eqonomize.cpp:1176 #, kde-format msgid "Reinvested Dividend" msgstr "Reinvesterad utdelning" #: eqonomize.cpp:501 transactioneditwidget.cpp:97 #: transactioneditwidget.cpp:157 #, kde-format msgid "Security:" msgstr "Värdepapper:" #: eqonomize.cpp:518 #, kde-format msgid "Shares added:" msgstr "Andelning tillkomna:" #: eqonomize.cpp:579 #, kde-format msgid "Security Trade" msgstr "Byte" #: eqonomize.cpp:587 #, kde-format msgid "From security:" msgstr "Från värdepapper:" #: eqonomize.cpp:603 #, kde-format msgid "Shares moved:" msgstr "Andelar flyttade:" #: eqonomize.cpp:608 transactioneditwidget.cpp:135 #: transactionfilterwidget.cpp:167 transactionfilterwidget.cpp:168 #: transactionfilterwidget.cpp:343 transactionfilterwidget.cpp:380 #, kde-format msgid "All" msgstr "Allt" #: eqonomize.cpp:614 #, kde-format msgid "To security:" msgstr "Till värdepapper:" #: eqonomize.cpp:631 #, kde-format msgid "Shares received:" msgstr "Andelar tillkomna:" #: eqonomize.cpp:635 importcsvdialog.cpp:386 importcsvdialog.cpp:412 #: overtimechart.cpp:193 overtimechart.cpp.bak:186 #, kde-format msgid "Value:" msgstr "Värde:" #: eqonomize.cpp:725 #, kde-format msgid "No other security available for trade in the account." msgstr "Inget annat värdepapper finns tillgängligt för byte i kontot." #: eqonomize.cpp:737 #, kde-format msgid "Selected to and from securities are the same." msgstr "Valda värdepapper måste vara olika." #: eqonomize.cpp:745 transactioneditwidget.cpp:735 #, kde-format msgid "Zero shares not allowed." msgstr "Noll andelar är inte tillåtet." #: eqonomize.cpp:749 transactioneditwidget.cpp:739 #, kde-format msgid "Zero value not allowed." msgstr "Noll värde är inte tillåtet." #: eqonomize.cpp:757 eqonomize.cpp:766 #, kde-format msgid "Quotations" msgstr "Kurser" #: eqonomize.cpp:777 eqonomize.cpp:913 eqonomize.cpp:962 eqonomize.cpp:1060 #: ledgerdialog.cpp:134 transactionlistwidget.cpp:110 #, kde-format msgid "Date" msgstr "Datum" #: eqonomize.cpp:778 #, kde-format msgid "Price per Share" msgstr "Pris per andel" #: eqonomize.cpp:820 #, kde-format msgid "Quotations for %1" msgstr "Kurser för %1" #: eqonomize.cpp:904 #, kde-format msgid "" "The following transactions was scheduled to occur today or before today.\n" "Confirm that they have indeed occurred (or will occur today)." msgstr "" "Följande transaktioner var planerade att infalla idag eller tidigare.\n" "Bekräfta att de faktiskt genomfördes (eller kommer att genomföras idag):" #: eqonomize.cpp:916 eqonomize.cpp:2035 transactionlistwidget.cpp:137 #, kde-format msgid "Amount" msgstr "Värde" #: eqonomize.cpp:926 #, kde-format msgid "Postpone..." msgstr "Senarelägg..." #: eqonomize.cpp:973 #, kde-format msgid "Can only postpone to future dates." msgstr "Kan enbart senarelägga till framtida datum." #: eqonomize.cpp:1052 ledgerdialog.cpp:299 #, kde-format msgid "Transactions for %1" msgstr "Transaktioner för %1" #: eqonomize.cpp:1063 eqonomize.cpp:1936 #, kde-format msgid "Shares" msgstr "Andelar" #: eqonomize.cpp:1160 #, kde-format msgid "Shares Bought" msgstr "Andelar köpta" #: eqonomize.cpp:1161 #, kde-format msgid "Shares Sold" msgstr "Andelar sålda" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Sold (Traded)" msgstr "Andelar sålda (flyttade)" #: eqonomize.cpp:1188 #, kde-format msgid "Shares Bought (Traded)" msgstr "Andelar köpta (flyttade)" #: eqonomize.cpp:1204 #, kde-format msgid "Shares Bought (Recurring)" msgstr "Andelar köpta (återkommande)" #: eqonomize.cpp:1205 #, kde-format msgid "Shares Sold (Recurring)" msgstr "Andelar sålda (återkommande)" #: eqonomize.cpp:1207 #, kde-format msgid "Shares Bought (Scheduled)" msgstr "Andelar köpta (planerad)" #: eqonomize.cpp:1208 #, kde-format msgid "Shares Sold (Scheduled)" msgstr "Andelar sålda (planderad)" #: eqonomize.cpp:1220 #, kde-format msgid "Recurring Dividend" msgstr "Återkommande utdelning" #: eqonomize.cpp:1222 #, kde-format msgid "Scheduled Dividend" msgstr "Planerad utdelning" #: eqonomize.cpp:1240 eqonomize.cpp:1360 #, kde-format msgid "Type:" msgstr "Typ:" #: eqonomize.cpp:1243 eqonomize.cpp:2600 eqonomize.cpp:2660 #, kde-format msgid "Mutual Fund" msgstr "Fond" #: eqonomize.cpp:1244 eqonomize.cpp:2598 eqonomize.cpp:2658 #, kde-format msgid "Bond" msgstr "Obligation" #: eqonomize.cpp:1245 eqonomize.cpp:2599 eqonomize.cpp:2659 #, kde-format msgid "Stock" msgstr "Aktie" #: eqonomize.cpp:1246 eqonomize.cpp:2601 eqonomize.cpp:2661 eqonomize.cpp:3492 #: eqonomize.cpp:3497 importcsvdialog.cpp:117 qifimportexport.cpp:332 #, kde-format msgid "Other" msgstr "Övrigt" #: eqonomize.cpp:1249 eqonomize.cpp:1370 eqonomize.cpp:1464 eqonomize.cpp:1529 #, kde-format msgid "Name:" msgstr "Namn:" #: eqonomize.cpp:1264 #, kde-format msgid "Decimals in Shares:" msgstr "Decimaler i andelar:" #: eqonomize.cpp:1267 #, kde-format msgid "Initial Shares:" msgstr "Initiala andelar:" #: eqonomize.cpp:1270 #, kde-format msgid "Initial quotation:" msgstr "Initial kurs:" #: eqonomize.cpp:1289 transactioneditwidget.cpp:675 #, kde-format msgid "No suitable account or income category available." msgstr "Inga lämpliga konton eller inkomstkategorier finns tillgängliga." #: eqonomize.cpp:1363 eqonomize.cpp:3488 eqonomize.cpp:4021 #: qifimportexport.cpp:325 #, kde-format msgid "Cash" msgstr "Kontanter" #: eqonomize.cpp:1364 eqonomize.cpp:4016 #, kde-format msgid "Current Account" msgstr "Transaktionskonto" #: eqonomize.cpp:1365 eqonomize.cpp:3490 eqonomize.cpp:4017 #, kde-format msgid "Savings Account" msgstr "Sparkonto" #: eqonomize.cpp:1366 eqonomize.cpp:4018 #, kde-format msgid "Credit Card" msgstr "Kreditkort" #: eqonomize.cpp:1367 eqonomize.cpp:4019 #, kde-format msgid "Liabilities" msgstr "Skulder" #: eqonomize.cpp:1368 eqonomize.cpp:1731 eqonomize.cpp:1732 eqonomize.cpp:3891 #: eqonomize.cpp:3897 eqonomize.cpp:4020 #, kde-format msgid "Securities" msgstr "Värdepapper" #: eqonomize.cpp:1373 #, kde-format msgid "Initial balance:" msgstr "Startvärde:" #: eqonomize.cpp:1376 #, kde-format msgid "Default account for budgeted transactions" msgstr "Förvalt konto för budgeterade transaktioner" #: eqonomize.cpp:1441 eqonomize.cpp:1507 eqonomize.cpp:1572 #, kde-format msgid "Empty name." msgstr "Tomt namn." #: eqonomize.cpp:1447 #, kde-format msgid "The entered name is used by another account." msgstr "Namnet används av ett annat konto." #: eqonomize.cpp:1467 eqonomize.cpp:1532 #, kde-format msgid "Monthly budget:" msgstr "Månatlig budget:" #: eqonomize.cpp:1513 #, kde-format msgid "The entered name is used by another income category." msgstr "Namnet används av en annan inkomstkategori." #: eqonomize.cpp:1578 #, kde-format msgid "The entered name is used by another expense category." msgstr "Namnet används av en annan utgiftskategori." #: eqonomize.cpp:1711 eqonomize.cpp:1778 eqonomize.cpp:3984 eqonomize.cpp:5970 #: eqonomize.cpp:5976 #, kde-format msgid "Accounts" msgstr "Konton" #: eqonomize.cpp:1712 #, kde-format msgid "Accounts & Categories" msgstr "Konton och kategorier" #: eqonomize.cpp:1716 eqonomize.cpp:1717 eqonomize.cpp:1780 #: importcsvdialog.cpp:70 overtimechart.cpp:126 overtimechart.cpp:1727 #: overtimechart.cpp:1731 overtimechart.cpp.bak:119 overtimechart.cpp.bak:1708 #: overtimechart.cpp.bak:1712 overtimereport.cpp:103 overtimereport.cpp:357 #: overtimereport.cpp:377 overtimereport.cpp:395 transactionlistwidget.cpp:251 #: transactionlistwidget.cpp:263 #, kde-format msgid "Expenses" msgstr "Utgifter" #: eqonomize.cpp:1721 eqonomize.cpp:1722 eqonomize.cpp:1779 eqonomize.cpp:4043 #: importcsvdialog.cpp:75 overtimechart.cpp:127 overtimechart.cpp:1726 #: overtimechart.cpp:1730 overtimechart.cpp.bak:120 overtimechart.cpp.bak:1707 #: overtimechart.cpp.bak:1711 overtimereport.cpp:104 overtimereport.cpp:349 #: overtimereport.cpp:368 overtimereport.cpp:386 transactionlistwidget.cpp:252 #: transactionlistwidget.cpp:264 #, kde-format msgid "Incomes" msgstr "Inkomster" #: eqonomize.cpp:1726 eqonomize.cpp:1727 importcsvdialog.cpp:78 #: transactionlistwidget.cpp:253 transactionlistwidget.cpp:265 #, kde-format msgid "Transfers" msgstr "Överföringar" #: eqonomize.cpp:1736 #, kde-format msgid "Schedule" msgstr "Planering" #: eqonomize.cpp:1737 #, kde-format msgid "Scheduled Transactions" msgstr "Planerade transaktioner" #: eqonomize.cpp:1753 eqonomize.cpp:1775 #, kde-format msgid "Account / Category" msgstr "Konto / kategori" #: eqonomize.cpp:1754 #, kde-format msgid "Remaining Budget (%1)" msgstr "Återstående budget (%1)" #: eqonomize.cpp:1755 #, kde-format msgid "Change (%1)" msgstr "Förändring (%1)" #: eqonomize.cpp:1756 #, kde-format msgid "Total (%1)" msgstr "Totalvärde (%1)" #: eqonomize.cpp:1769 #, kde-format msgctxt "%2 remains of %1 budget" msgid "%2 of %1" msgstr "%2 av %1" #: eqonomize.cpp:1785 eqonomize.cpp:4002 #, kde-format msgid "Includes budgeted transactions" msgstr "Inkluderar budgeterade transaktioner" #: eqonomize.cpp:1793 #, kde-format msgid "Period" msgstr "Period" #: eqonomize.cpp:1825 #, kde-format msgid "Select Period" msgstr "Välj period" #: eqonomize.cpp:1827 eqonomize.cpp:4312 #, kde-format msgid "Current Month" msgstr "Innevarande månad" #: eqonomize.cpp:1828 eqonomize.cpp:4313 #, kde-format msgid "Current Year" msgstr "Innevarande år" #: eqonomize.cpp:1829 eqonomize.cpp:4314 #, kde-format msgid "Current Whole Month" msgstr "Hela innevarande månad" #: eqonomize.cpp:1830 eqonomize.cpp:4315 #, kde-format msgid "Current Whole Year" msgstr "Hela innevarande år" #: eqonomize.cpp:1831 #, kde-format msgid "Whole Past Month" msgstr "Hela det gångna året" #: eqonomize.cpp:1832 #, kde-format msgid "Whole Past Year" msgstr "Hela det gångna året" #: eqonomize.cpp:1833 #, kde-format msgid "Previous Month" msgstr "Föregående månad" #: eqonomize.cpp:1834 #, kde-format msgid "Previous Year" msgstr "Föregående år" #: eqonomize.cpp:1837 #, kde-format msgid "Show partial budget" msgstr "Visa partiell budget" #: eqonomize.cpp:1842 #, kde-format msgid "Edit Budget" msgstr "Modifiera budget" #: eqonomize.cpp:1846 #, kde-format msgid "Budget:" msgstr "Budget:" #: eqonomize.cpp:1856 #, kde-format msgid "Month:" msgstr "Månad:" #: eqonomize.cpp:1864 #, kde-format msgid "Result previous month:" msgstr "Resultat föregående månad:" #: eqonomize.cpp:1917 eqonomize.cpp:4354 #, kde-format msgid "New Security..." msgstr "Nytt värdepapper..." #: eqonomize.cpp:1919 #, kde-format msgid "New Transaction" msgstr "Ny transaktion" #: eqonomize.cpp:1922 eqonomize.cpp:4362 #, kde-format msgid "Set Quotation..." msgstr "Ange kurs..." #: eqonomize.cpp:1934 eqonomize.cpp:3987 #, kde-format msgid "Name" msgstr "Namn" #: eqonomize.cpp:1937 #, kde-format msgid "Quotation" msgstr "Kurs" #: eqonomize.cpp:1939 #, kde-format msgid "Profit" msgstr "Förtjänst" #: eqonomize.cpp:1940 #, kde-format msgid "Yearly Rate" msgstr "Årlig ränta" #: eqonomize.cpp:1942 qifimportexport.cpp:323 #, kde-format msgid "Account" msgstr "Konto" #: eqonomize.cpp:1953 #, kde-format msgid "Statistics Period" msgstr "Statistikperiod" #: eqonomize.cpp:2015 #, kde-format msgid "New Schedule" msgstr "Ny planering" #: eqonomize.cpp:2018 #, kde-format msgid "Edit" msgstr "Modifiera" #: eqonomize.cpp:2032 #, kde-format msgid "Next Occurrence" msgstr "Nästa tillfälle" #: eqonomize.cpp:2038 qifimportexport.cpp:152 transactionlistwidget.cpp:144 #, kde-format msgid "Comments" msgstr "Kommentarer" #: eqonomize.cpp:2291 #, kde-format msgid "New Security" msgstr "Nytt värdepapper" #: eqonomize.cpp:2306 #, kde-format msgid "Edit Security" msgstr "Modifiera värdepapper" #: eqonomize.cpp:2325 #, kde-format msgid "Profit:" msgstr "Förtjänst:" #: eqonomize.cpp:2325 #, kde-format msgid "Rate:" msgstr "Ränta:" #: eqonomize.cpp:2332 #, kde-format msgid "" "Are you sure you want to delete the security \"%1\" and all associated " "transactions?" msgstr "" "Är du säker på att vill ta bort värdepappret \"%1\" och alla tillhörande " "transaktioner?" #: eqonomize.cpp:2394 transactioneditwidget.cpp:700 #, kde-format msgid "No security available." msgstr "Inget värdepapper o finns tillgängligt." #: eqonomize.cpp:2466 #, kde-format msgid "Set Quotation (%1)" msgstr "Ange kurs (%1)" #: eqonomize.cpp:2472 transactioneditwidget.cpp:143 #, kde-format msgid "Price per share:" msgstr "Pris per andel:" #: eqonomize.cpp:2485 #, kde-format msgid "Future dates are not allowed." msgstr "Framtida datum är inte tillåtna." #: eqonomize.cpp:2513 #, kde-format msgid "Security Transactions" msgstr "Värdepapperstransaktioner" #: eqonomize.cpp:3166 ledgerdialog.cpp:293 #, kde-format msgid "Ledger" msgstr "Liggare" #: eqonomize.cpp:3475 #, kde-format msgid "Untitled" msgstr "Namnlös" #: eqonomize.cpp:3489 #, kde-format msgid "Check Account" msgstr "Transaktionskonto" #: eqonomize.cpp:3491 #, kde-format msgid "Salary" msgstr "Lön" #: eqonomize.cpp:3493 #, kde-format msgid "Bills" msgstr "Räkningar" #: eqonomize.cpp:3494 #, kde-format msgid "Clothing" msgstr "Kläder" #: eqonomize.cpp:3495 #, kde-format msgid "Groceries" msgstr "Livsmedel" #: eqonomize.cpp:3496 #, kde-format msgid "Leisure" msgstr "Nöje" #: eqonomize.cpp:3561 importcsvdialog.cpp:795 qifimportexport.cpp:280 #: qifimportexport.cpp:444 #, kde-format msgid "Couldn't fetch %1." msgstr "Kunde inte hämta %1." #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Error loading %1: %2." msgstr "Fel vid läsande av %1: %2." #: eqonomize.cpp:3573 eqonomize.cpp:4417 #, kde-format msgid "Couldn't open file" msgstr "Kunde inte öppna fil" #: eqonomize.cpp:3627 eqonomize.cpp:3653 #, kde-format msgid "Error saving %1: %2." msgstr "Fel vid sparande av %1: %2." #: eqonomize.cpp:3627 eqonomize.cpp:3653 eqonomize.cpp:3673 #, kde-format msgid "Couldn't save file" msgstr "Kunde inte spara fil" #: eqonomize.cpp:3673 eqonomize.cpp:4282 ledgerdialog.cpp:281 #: qifimportexport.cpp:634 #, kde-format msgid "Failed to upload file to %1." msgstr "Misslyckades med att ladda upp fil till %1." #: eqonomize.cpp:3703 eqonomize.cpp:3728 #, kde-format msgid "Report" msgstr "Rapport" #: eqonomize.cpp:3758 eqonomize.cpp:3783 #, kde-format msgid "Chart" msgstr "Diagram" #: eqonomize.cpp:3823 eqonomize.cpp:3829 #, kde-format msgid "Transaction Schedule" msgstr "Planerade transaktioner" #: eqonomize.cpp:3976 #, kde-format msgctxt "html format" msgid "Accounts & Categories" msgstr "Konton & kategorier" #: eqonomize.cpp:3981 #, kde-format msgctxt "html format" msgid "Accounts & Categories (%1–%2)" msgstr "Konton & kategorier (%1 – %2)" #: eqonomize.cpp:3982 #, kde-format msgctxt "html format" msgid "Accounts & Categories (to %1)" msgstr "Konton & kategorier (till %1)" #: eqonomize.cpp:3989 eqonomize.cpp:4049 eqonomize.cpp:4097 eqonomize.cpp:4142 #, kde-format msgid "Change" msgstr "Ändra" #: eqonomize.cpp:3993 ledgerdialog.cpp:140 #, kde-format msgid "Balance" msgstr "Balans" #: eqonomize.cpp:4047 eqonomize.cpp:4095 #, kde-format msgid "Budget" msgstr "Budget" #: eqonomize.cpp:4048 eqonomize.cpp:4096 #, kde-format msgid "Remaining Budget" msgstr "Återstående budget" #: eqonomize.cpp:4050 #, kde-format msgid "Total Incomes" msgstr "Totala inkomster" #: eqonomize.cpp:4091 #, kde-format msgid "Costs" msgstr "Kostnader" #: eqonomize.cpp:4098 #, kde-format msgid "Total Expenses" msgstr "Totala utgifter" #: eqonomize.cpp:4167 eqonomize.cpp:4214 #, kde-format msgid "Empty expenses list." msgstr "Tom utgiftslista." #: eqonomize.cpp:4172 eqonomize.cpp:4219 #, kde-format msgid "Empty incomes list." msgstr "Tom inkomstlista." #: eqonomize.cpp:4177 eqonomize.cpp:4224 #, kde-format msgid "Empty transfers list." msgstr "Tom överföringslista." #: eqonomize.cpp:4182 eqonomize.cpp:4229 #, kde-format msgid "Empty securities list." msgstr "Tom värdepapperslista." #: eqonomize.cpp:4187 eqonomize.cpp:4234 #, kde-format msgid "Empty schedule list." msgstr "Inga planerade transaktioner i listan." #: eqonomize.cpp:4305 #, kde-format msgid "Export View..." msgstr "Exportera visning" #: eqonomize.cpp:4307 #, kde-format msgid "Print View..." msgstr "Skriv ut visning..." #: eqonomize.cpp:4309 #, kde-format msgid "Initial Period" msgstr "Initialt vald period" #: eqonomize.cpp:4316 #, kde-format msgid "Remember Last Dates" msgstr "Kom ihåg senaste datum" #: eqonomize.cpp:4319 #, kde-format msgid "Import CSV File..." msgstr "Importera CSV-fil..." #: eqonomize.cpp:4320 #, kde-format msgid "Import QIF File..." msgstr "Importera QIF-fil..." #: eqonomize.cpp:4321 #, kde-format msgid "Export As QIF File..." msgstr "Exportera QIF-fil..." #: eqonomize.cpp:4323 #, kde-format msgid "Add Account..." msgstr "Lägg till konto..." #: eqonomize.cpp:4324 #, kde-format msgid "New Account..." msgstr "Nytt konto..." #: eqonomize.cpp:4325 #, kde-format msgid "New Income Category..." msgstr "Ny inkomstkategori..." #: eqonomize.cpp:4326 #, kde-format msgid "New Expense Category..." msgstr "Ny utgiftskategori..." #: eqonomize.cpp:4327 #, kde-format msgid "Balance..." msgstr "Balansera..." #: eqonomize.cpp:4331 #, kde-format msgid "Show Transactions" msgstr "Visa transaktioner" #: eqonomize.cpp:4335 #, kde-format msgid "New Transfer..." msgstr "Ny överföring..." #: eqonomize.cpp:4336 #, kde-format msgid "New Split Transaction..." msgstr "Ny delad transaktion..." #: eqonomize.cpp:4337 #, kde-format msgid "Edit Transaction(s) (Occurrence)..." msgstr "Modifiera transaktion(er) (tillfälle)..." #: eqonomize.cpp:4338 #, kde-format msgid "Edit Occurrence..." msgstr "Modifiera tillfället..." #: eqonomize.cpp:4339 #, kde-format msgid "Edit Schedule (Recurrence)..." msgstr "Modifiera planering (återkomster)..." #: eqonomize.cpp:4340 #, kde-format msgid "Edit Schedule..." msgstr "Modifiera planering..." #: eqonomize.cpp:4341 #, kde-format msgid "Remove Transaction(s) (Occurrence)" msgstr "Ta bort transaktion(er) (tillfälle)" #: eqonomize.cpp:4342 #, kde-format msgid "Remove Occurrence" msgstr "Ta bort tillfället" #: eqonomize.cpp:4343 #, kde-format msgid "Delete Schedule (Recurrence)" msgstr "Ta bort planering (återkomster)" #: eqonomize.cpp:4344 #, kde-format msgid "Delete Schedule" msgstr "Avlägsna planering" #: eqonomize.cpp:4345 #, kde-format msgid "Edit Split Transaction..." msgstr "Redigera delad transaktion..." #: eqonomize.cpp:4346 #, kde-format msgid "Remove Split Transaction" msgstr "Ta bort delad transaktion..." #: eqonomize.cpp:4347 #, kde-format msgid "Join Transactions..." msgstr "Sammanslå transaktioner..." #: eqonomize.cpp:4348 #, kde-format msgid "Split Up Transaction" msgstr "Dela upp transaktionen..." #: eqonomize.cpp:4350 #, kde-format msgid "Refund..." msgstr "Återbetalning..." #: eqonomize.cpp:4351 #, kde-format msgid "Repayment..." msgstr "Återbetalning..." #: eqonomize.cpp:4352 #, kde-format msgid "New Refund/Repayment..." msgstr "Ny återbetalning..." #: eqonomize.cpp:4355 #, kde-format msgid "Edit Security..." msgstr "Modifiera värdepappret..." #: eqonomize.cpp:4356 #, kde-format msgid "Remove Security" msgstr "Avlägsna värdepappret" #: eqonomize.cpp:4357 #, kde-format msgid "Shares Sold..." msgstr "Andelar sålda..." #: eqonomize.cpp:4358 #, kde-format msgid "Shares Bought..." msgstr "Andelar köpta..." #: eqonomize.cpp:4359 #, kde-format msgid "Dividend..." msgstr "Utdelning..." #: eqonomize.cpp:4360 #, kde-format msgid "Reinvested Dividend..." msgstr "Återinvesterad utdelning..." #: eqonomize.cpp:4361 #, kde-format msgid "Shares Moved..." msgstr "Andelar flyttade..." #: eqonomize.cpp:4363 #, kde-format msgid "Edit Quotations..." msgstr "Modifiera kursangivelser..." #: eqonomize.cpp:4364 #, kde-format msgid "Transactions..." msgstr "Transaktioner..." #: eqonomize.cpp:4366 #, kde-format msgid "Development Over Time Report..." msgstr "Rapport med utveckling över tid..." #: eqonomize.cpp:4367 #, kde-format msgid "Categories Comparison Report..." msgstr "Rapport för jämförelse av kategorier..." #: eqonomize.cpp:4368 #, kde-format msgid "Categories Comparison Chart..." msgstr "Diagram för jämförelse av kategorier..." #: eqonomize.cpp:4369 #, kde-format msgid "Development Over Time Chart..." msgstr "Diagram med utveckling över tid..." #: eqonomize.cpp:4371 #, kde-format msgid "Use Additional Transaction Properties" msgstr "Använd ytterligare egenskaper för transaktioner" #: eqonomize.cpp:4413 #, kde-format msgid "" "Eqonomize! exited unexpectedly before the file was saved and data was lost.\n" "Do you want to load the last auto-saved version of the file?" msgstr "" "Eqonomize! avslutades oväntat innan filen sparades och data förlorades.\n" "Vill du öppna den senast automatiskt sparade versionen av filen?" #: eqonomize.cpp:4413 #, kde-format msgid "Crash Recovery" msgstr "Krashåterhämtning" #: eqonomize.cpp:4605 eqonomize.cpp:4606 #, kde-format msgid "The current file has been modified. Do you want to save it?" msgstr "Den nuvarande filen har ändrats. Vill du spara den?" #: eqonomize.cpp:4643 #, kde-format msgid "Confirm Schedule" msgstr "Bekräfta planerade transaktioner" #: eqonomize.cpp:4697 #, kde-format msgid "New Account" msgstr "Nytt konto" #: eqonomize.cpp:4712 #, kde-format msgid "New Income Category" msgstr "Ny inkomstkategori" #: eqonomize.cpp:4725 #, kde-format msgid "New Expense Category" msgstr "Ny utgiftskategori" #: eqonomize.cpp:4800 #, kde-format msgid "Balance Account" msgstr "Balansera konto" #: eqonomize.cpp:4806 #, kde-format msgid "Book value:" msgstr "Bokfört värde:" #: eqonomize.cpp:4813 #, kde-format msgid "Real value:" msgstr "Verkligt värde:" #: eqonomize.cpp:4836 #, kde-format msgid "Edit Account" msgstr "Modifiera konto" #: eqonomize.cpp:4869 #, kde-format msgid "Edit Income Category" msgstr "Modifiera inkomstkategori" #: eqonomize.cpp:4887 #, kde-format msgid "Edit Expense Category" msgstr "Modifiera utgiftskategori" #: eqonomize.cpp:4948 #, kde-format msgid "Move transactions?" msgstr "Flytta transaktioner?" #: eqonomize.cpp:4958 #, kde-format msgid "Move to:" msgstr "Flytta till:" #: eqonomize.cpp:4965 #, kde-format msgid "" "The category contains some expenses.\n" "What do you want to do with them?" msgstr "" "Kategorin innehåller en del utgifter.\n" "Vad vill du göra med dem?" #: eqonomize.cpp:4977 #, kde-format msgid "" "The category contains some incomes.\n" "What do you want to do with them?" msgstr "" "Kategorin innehåller en del inkomster.\n" "Vad vill du göra med dem?" #: eqonomize.cpp:4989 #, kde-format msgid "" "The account contains some transactions.\n" "What do you want to do with them?" msgstr "" "Kategorin innehåller en del transaktioner.\n" "Vad vill du göra med dem?" #: eqonomize.cpp:5011 #, kde-format msgid "" "The category contains some expenses that will be removed. Do you still want " "to remove the category?" msgstr "" "Kategorin innehåller en del utgifter som kommer att avlägsnas. Vill du ändå " "ta bort kategorin?" #: eqonomize.cpp:5011 eqonomize.cpp:5012 #, kde-format msgid "Remove Category?" msgstr "Ta bort kategorin?" #: eqonomize.cpp:5012 #, kde-format msgid "" "The category contains some incomes that will be removed. Do you still want " "to remove the category?" msgstr "" "Kategorin innehåller en del inkomster som kommer att avlägsnas. Vill du ändå " "ta bort kategorin?" #: eqonomize.cpp:5013 #, kde-format msgid "" "The account contains some transactions that will be removed. Do you still " "want to remove the account?" msgstr "" "Kontot innehåller en del transaktioner som kommer att avlägsnas. Vill du " "ändå ta bort kontot?" #: eqonomize.cpp:5013 #, kde-format msgid "Remove Account?" msgstr "Ta bort kontot?" #: eqonomize.cpp:5531 eqonomize.cpp:5555 eqonomize.cpp:5730 #, kde-format msgctxt "%1: budget; %2: remaining budget" msgid "%2 of %1" msgstr "%2 av %1" #: eqonomize.cpp:5810 eqonomize.cpp:5835 #, kde-format msgid "%1 (with no budget)" msgstr "%1 (utan någon budget)" #: eqonomize.cpp:5811 eqonomize.cpp:5836 #, kde-format msgid "%1 (with budget %2)" msgstr "%1 (med budget %2)" #: importcsvdialog.cpp:60 #, kde-format msgid "Import CSV file" msgstr "Importera CSV-fil" #: importcsvdialog.cpp:64 #, kde-format msgid "Transaction Type Selection" msgstr "Val av transaktionstyp" #: importcsvdialog.cpp:81 #, kde-format msgid "Expenses and incomes (negative cost)" msgstr "Utgifter och inkomster (negativa kostnad)" #: importcsvdialog.cpp:84 #, kde-format msgid "Expenses and incomes (separate columns)" msgstr "Utgifter och inkomster (separata kolumner)" #: importcsvdialog.cpp:87 #, kde-format msgid "All types" msgstr "Alla typer" #: importcsvdialog.cpp:95 qifimportexport.cpp:62 #, kde-format msgid "File Selection" msgstr "Filval" #: importcsvdialog.cpp:99 qifimportexport.cpp:66 qifimportexport.cpp:548 #, kde-format msgid "File:" msgstr "Fil:" #: importcsvdialog.cpp:104 #, kde-format msgid "First data row:" msgstr "Första dataraden:" #: importcsvdialog.cpp:107 #, kde-format msgid "Auto" msgstr "Auto" #: importcsvdialog.cpp:110 #, kde-format msgid "Column delimiter:" msgstr "Kolumnavgränsare:" #: importcsvdialog.cpp:113 #, kde-format msgid "Comma" msgstr "Komma" #: importcsvdialog.cpp:114 #, kde-format msgid "Tabulator" msgstr "Tabulator" #: importcsvdialog.cpp:115 #, kde-format msgid "Semicolon" msgstr "Semikolon" #: importcsvdialog.cpp:116 #, kde-format msgid "Space" msgstr "Mellanslag" #: importcsvdialog.cpp:125 #, kde-format msgid "Columns Specification" msgstr "Kolumnspecificering" #: importcsvdialog.cpp:131 importcsvdialog.cpp:149 importcsvdialog.cpp:172 #: importcsvdialog.cpp:189 importcsvdialog.cpp:208 importcsvdialog.cpp:227 #: importcsvdialog.cpp:245 #, kde-format msgid "Column" msgstr "Kolumn" #: importcsvdialog.cpp:205 importcsvdialog.cpp:356 importcsvdialog.cpp:365 #: importcsvdialog.cpp:387 importcsvdialog.cpp:398 #: transactioneditwidget.cpp:225 transactioneditwidget.cpp:267 #: transactioneditwidget.cpp:1130 transactionfilterwidget.cpp:102 #: transactionfilterwidget.cpp:113 #, kde-format msgid "Category:" msgstr "Kategori:" #: importcsvdialog.cpp:224 importcsvdialog.cpp:357 importcsvdialog.cpp:374 #: transactioneditwidget.cpp:248 transactioneditwidget.cpp:273 #: transactionfilterwidget.cpp:117 #, kde-format msgid "From account:" msgstr "Från konto:" #: importcsvdialog.cpp:262 #, kde-format msgid "Create missing categories and accounts" msgstr "Skapa saknade kategorier och konton" #: importcsvdialog.cpp:354 #, kde-format msgid "" "Imports data as expenses. Costs have positive value. Value is the only " "required column." msgstr "" "Importerar data som utgifter. Kostnader har positivt värde. Värde är enda " "nödvändiga kolumn." #: importcsvdialog.cpp:363 #, kde-format msgid "Imports data as incomes. Value is the only required column." msgstr "Importerar data som inkomster. Värde är enda nödvändiga kolumn." #: importcsvdialog.cpp:366 importcsvdialog.cpp:375 #: transactioneditwidget.cpp:231 transactioneditwidget.cpp:258 #: transactionfilterwidget.cpp:106 #, kde-format msgid "To account:" msgstr "Till konto:" #: importcsvdialog.cpp:372 #, kde-format msgid "Imports data as transfers. Value is the only required column." msgstr "Importerar data som överföringar. Värde är enda nödvändiga kolumn." #: importcsvdialog.cpp:373 transactioneditwidget.cpp:182 #: transactioneditwidget.cpp:1109 #, kde-format msgid "Amount:" msgstr "Värde:" #: importcsvdialog.cpp:381 #, kde-format msgid "" "Imports data as expenses and incomes. Costs have negative value. Value and " "category are both required columns." msgstr "" "Importerar data som utgifter och inkomster. Kostnader har negativt värde." "Värde och kategori är både nödvändiga kolumner." #: importcsvdialog.cpp:392 #, kde-format msgid "" "Imports data as expenses and incomes. Costs and incomes have separate " "columns. Income, cost, and category are all required columns." msgstr "" "Importerar data som utgifter och inkomster. Kostnader och inkomster har " "separata kolumner.Kostnad, inkomst och kategori är alla nödvändiga kolumner." #: importcsvdialog.cpp:403 #, kde-format msgid "" "Imports data as expenses, incomes, and transfers. Costs have negative or " "positive value. Value, to, and from are all required columns. Accounts and " "categories must be existing." msgstr "" "Importerar data som utgifter, inkomster och överföringar. Kostnader har " "negativt eller positivt värde. Värde, till och från är alla nödvändinga " "kolumner. Konton och kategorier måste existera." #: importcsvdialog.cpp:413 transactioneditwidget.cpp:209 #: transactionfilterwidget.cpp:74 transactionfilterwidget.cpp:91 #, kde-format msgid "From:" msgstr "Från:" #: importcsvdialog.cpp:414 transactioneditwidget.cpp:216 #: transactionfilterwidget.cpp:81 transactionfilterwidget.cpp:95 #, kde-format msgid "To:" msgstr "Till:" #: importcsvdialog.cpp:440 qifimportexport.cpp:258 #, kde-format msgid "A file must be selected." msgstr "En fil måste väljas." #: importcsvdialog.cpp:446 importcsvdialog.cpp:458 qifimportexport.cpp:265 #: qifimportexport.cpp:595 #, kde-format msgid "Selected file is a directory." msgstr "Vald fil är en mapp." #: importcsvdialog.cpp:450 importcsvdialog.cpp:462 qifimportexport.cpp:269 #, kde-format msgid "Selected file does not exist." msgstr "Vald fil existerar inte." #: importcsvdialog.cpp:468 #, kde-format msgid "Empty delimiter." msgstr "Tom avgränsare." #: importcsvdialog.cpp:712 #, kde-format msgid "The same column number is selected multiple times." msgstr "Samma kolumnnummer är vald flera gånger." #: importcsvdialog.cpp:772 #, kde-format msgid "Selected from account is the same as the to account." msgstr "Valt från-konto är det samma som till-kontot." #: importcsvdialog.cpp:803 qifimportexport.cpp:288 qifimportexport.cpp:452 #, kde-format msgid "Couldn't open %1 for reading." msgstr "Kunde inte öppna och läsa %1." #: importcsvdialog.cpp:806 qifimportexport.cpp:291 qifimportexport.cpp:455 #, kde-format msgid "Error reading %1." msgstr "Fel vid läsande av %1." #: importcsvdialog.cpp:1187 qifimportexport.cpp:462 #, kde-format msgid "Successfully imported 1 transaction." msgid_plural "Successfully imported %n transactions." msgstr[0] "Lyckades importera 1 transaktion." msgstr[1] "Lyckades importera %n transaktioner." #: importcsvdialog.cpp:1189 #, kde-format msgid "Unable to import any transactions imported." msgstr "Lyckades inte importera några transaktioner." #: importcsvdialog.cpp:1193 #, kde-format msgid "Failed to import 1 data row." msgid_plural "Failed to import %n data rows." msgstr[0] "Misslyckades att importera 1 datarad." msgstr[1] "Misslyckades att importera %n datarader." #: importcsvdialog.cpp:1194 #, kde-format msgid "Required columns missing." msgstr "Nödvändig kolumn fattas." #: importcsvdialog.cpp:1195 #, kde-format msgid "Invalid value." msgstr "Ogiltigt värde." #: importcsvdialog.cpp:1197 #, kde-format msgid "Empty category name." msgstr "Tomt kategorinamn." #: importcsvdialog.cpp:1197 importcsvdialog.cpp:1198 #, kde-format msgid "Empty account name." msgstr "Tomt kontonamn." #: importcsvdialog.cpp:1199 #, kde-format msgid "Unknown category found." msgstr "Okänd kategory funnen." #: importcsvdialog.cpp:1199 importcsvdialog.cpp:1200 #, kde-format msgid "Unknown account found." msgstr "Okänt konto funnet." #: importcsvdialog.cpp:1201 #, kde-format msgid "Cannot import security transactions (to/from security accounts)." msgstr "" "Kan inte importera värdepapperstransaktioner (till/från konto för " "värdepapper)." #: importcsvdialog.cpp:1202 #, kde-format msgid "Balancing account wrongly used." msgstr "Balanseringskonto felaktigt använt." #: importcsvdialog.cpp:1203 #, kde-format msgid "Same to and from account/category." msgstr "Samma konto/kategori till och från." #: importcsvdialog.cpp:1205 #, kde-format msgid "No data found." msgstr "Ingen data funnen." #: importcsvdialog.cpp:1219 qifimportexport.cpp:345 #, kde-format msgid "Unrecognized date format." msgstr "Obekant datum format." #: importcsvdialog.cpp:1224 #, kde-format msgid "Specify Format" msgstr "Ange format" #: importcsvdialog.cpp:1230 #, kde-format msgid "" "The format of dates and/or numbers in the CSV file is ambiguous. Please " "select the correct format." msgstr "" "Formatet på datum och/eller nummer i CSV-filen är tvetydiga. Var vänlig välj " "det korrekta formatet." #: importcsvdialog.cpp:1235 qifimportexport.cpp:94 qifimportexport.cpp:533 #, kde-format msgid "Date format:" msgstr "Datumformat:" #: importcsvdialog.cpp:1278 qifimportexport.cpp:541 #, kde-format msgid "Value format:" msgstr "Värdeformat:" #: kdateedit.cpp:366 #, kde-format msgctxt "the day after today" msgid "tomorrow" msgstr "imorgon" #: kdateedit.cpp:367 #, kde-format msgctxt "this day" msgid "today" msgstr "idag" #: kdateedit.cpp:368 #, kde-format msgctxt "the day before today" msgid "yesterday" msgstr "igår" #: kdatepickerpopup.cpp:94 #, kde-format msgctxt "@option today" msgid "&Today" msgstr "Idag" #: kdatepickerpopup.cpp:95 #, kde-format msgctxt "@option tomorrow" msgid "To&morrow" msgstr "Imorgon" #: kdatepickerpopup.cpp:96 #, kde-format msgctxt "@option next week" msgid "Next &Week" msgstr "Nästa vecka" #: kdatepickerpopup.cpp:97 #, kde-format msgctxt "@option next month" msgid "Next M&onth" msgstr "Nästa månad" #: kdatepickerpopup.cpp:105 #, kde-format msgctxt "@option do not specify a date" msgid "No Date" msgstr "Inget datum" #: ledgerdialog.cpp:122 #, kde-format msgid "Export..." msgstr "Exportera..." #: ledgerdialog.cpp:123 #, kde-format msgid "Print..." msgstr "Skriv ut..." #: ledgerdialog.cpp:139 #, kde-format msgid "Withdrawal" msgstr "Uttag" #: ledgerdialog.cpp:162 #, kde-format msgid "Join..." msgstr "Sammanslå..." #: ledgerdialog.cpp:164 #, kde-format msgid "Split Up" msgstr "Dela upp" #: ledgerdialog.cpp:234 ledgerdialog.cpp:354 #, kde-format msgid "Empty transaction list." msgstr "Tom transaktionslista." #: ledgerdialog.cpp:443 transactionlistwidget.cpp:717 #, kde-format msgid "Are you sure you want to delete all (%1) selected transactions?" msgstr "Vill du verkligen ta bort alla (%1) valda transaktioner?" #: ledgerdialog.cpp:547 transactionlistwidget.cpp:489 #, kde-format msgid "" "Cannot set the value of security transactions using the dialog for modifying " "multiple transactions." msgstr "" "Kan inte ange värde för värdepapperstransaktioner med dialogen för att " "modifier flera transaktioner." #: ledgerdialog.cpp:553 transactionlistwidget.cpp:495 #, kde-format msgid "Cannot change description of dividends and security transactions." msgstr "" "Kan inte ändra beskrivning för utdelningar och värdepapperstransaktioner." #: ledgerdialog.cpp:559 transactionlistwidget.cpp:501 #, kde-format msgid "Cannot change payer of dividends and security transactions." msgstr "" "Kan inte ändra utbetalare för utdelningar och värdepapperstransaktioner." #: ledgerdialog.cpp:565 transactionlistwidget.cpp:507 #, kde-format msgid "" "Cannot change date of transactions that are part of a split transaction." msgstr "" "Kan inte ändra datum på transaktioner som ingår i en delad transaktion." #: main.cpp:39 msgid "Eqonomize!" msgstr "Eqonomize!" #: main.cpp:39 msgid "A personal accounting program" msgstr "Ett bokföringsprogram" #: main.cpp:39 msgid "(C) 2008 Hanna K." msgstr "(C) 2008 Hanna K." #: main.cpp:40 msgid "Hanna K." msgstr "Hanna K." #: main.cpp:44 msgid "Start with expenses list displayed" msgstr "Starta med utgiftslistan visad" #: main.cpp:46 msgid "Start with incomes list displayed" msgstr "Starta med inkomstslistan visad" #: main.cpp:48 msgid "Start with transfers list displayed" msgstr "Starta med överföringslistan visad" #: main.cpp:49 msgid "Document to open" msgstr "Dokument att öppna" #: overtimechart.cpp:124 overtimechart.cpp.bak:117 #, kde-format msgid "Incomes and Expenses" msgstr "Inkomster och utgifter" #: overtimechart.cpp:125 overtimechart.cpp:1722 overtimechart.cpp.bak:118 #: overtimechart.cpp.bak:1703 overtimereport.cpp:102 overtimereport.cpp:343 #, kde-format msgid "Profits" msgstr "Förtjänst" #: overtimechart.cpp:132 overtimechart.cpp:411 overtimechart.cpp:1949 #: overtimechart.cpp.bak:125 overtimechart.cpp.bak:404 #: overtimechart.cpp.bak:1950 overtimereport.cpp:108 overtimereport.cpp:228 #: overtimereport.cpp:753 #, kde-format msgid "All Categories Combined" msgstr "Alla kategorier kombinerade" #: overtimechart.cpp:138 overtimechart.cpp:296 overtimechart.cpp:400 #: overtimechart.cpp:1852 overtimechart.cpp:1973 overtimechart.cpp.bak:131 #: overtimechart.cpp.bak:289 overtimechart.cpp.bak:393 #: overtimechart.cpp.bak:1853 overtimechart.cpp.bak:1974 #: overtimereport.cpp:113 overtimereport.cpp:176 overtimereport.cpp:225 #: overtimereport.cpp:710 overtimereport.cpp:776 #, kde-format msgid "All Descriptions Combined" msgstr "Alla beskrivningar kombinerade" #: overtimechart.cpp:146 overtimechart.cpp:406 overtimechart.cpp.bak:139 #: overtimechart.cpp.bak:399 #, kde-format msgid "All Payees/Payers Combined" msgstr "Alla mottagare/utbetalare kombinerade" #: overtimechart.cpp:155 overtimechart.cpp.bak:148 #, kde-format msgid "Start date:" msgstr "Startdatum:" #: overtimechart.cpp:178 overtimechart.cpp.bak:171 #, kde-format msgid "End date:" msgstr "Slutdatum:" #: overtimechart.cpp:197 overtimechart.cpp.bak:190 #, kde-format msgid "Monthly total" msgstr "Månatlig summa" #: overtimechart.cpp:201 overtimechart.cpp.bak:194 #, kde-format msgid "Daily average" msgstr "Dagligt genomsnitt" #: overtimechart.cpp:304 overtimechart.cpp:404 overtimechart.cpp:1855 #: overtimechart.cpp:1978 overtimechart.cpp.bak:297 overtimechart.cpp.bak:397 #: overtimechart.cpp.bak:1856 overtimechart.cpp.bak:1979 #, kde-format msgid "All Payers Combined" msgstr "Alla utbetalare kombinerade" #: overtimechart.cpp:305 overtimechart.cpp:405 overtimechart.cpp:1856 #: overtimechart.cpp:1977 overtimechart.cpp.bak:298 overtimechart.cpp.bak:398 #: overtimechart.cpp.bak:1857 overtimechart.cpp.bak:1978 #, kde-format msgid "All Payees Combined" msgstr "Alla mottagare kombinerade" #: overtimechart.cpp:325 overtimechart.cpp:1853 overtimechart.cpp.bak:318 #: overtimechart.cpp.bak:1854 #, kde-format msgid "All Descriptions Split" msgstr "Alla beskrivningar uppdelade" #: overtimechart.cpp:328 overtimechart.cpp:1857 overtimechart.cpp.bak:321 #: overtimechart.cpp.bak:1858 #, kde-format msgid "All Payers Split" msgstr "Alla utbetalare uppdelade" #: overtimechart.cpp:329 overtimechart.cpp:1858 overtimechart.cpp.bak:322 #: overtimechart.cpp.bak:1859 #, kde-format msgid "All Payees Split" msgstr "Alla mottagare uppdelade" #: overtimechart.cpp:413 overtimechart.cpp:423 overtimechart.cpp:1950 #: overtimechart.cpp.bak:406 overtimechart.cpp.bak:416 #: overtimechart.cpp.bak:1951 #, kde-format msgid "All Categories Split" msgstr "Alla kategorier uppdelade" #: overtimechart.cpp:1535 overtimechart.cpp.bak:1516 #, kde-format msgid "Value (%1)" msgstr "Värde (%1)" #: overtimechart.cpp:1536 overtimechart.cpp.bak:1517 #, kde-format msgid "Profit (%1)" msgstr "Förtjänst (%1)" #: overtimechart.cpp:1537 overtimechart.cpp.bak:1518 #, kde-format msgid "Income (%1)" msgstr "Inkomst (%1)" #: overtimechart.cpp:1538 overtimechart.cpp.bak:1519 #, kde-format msgid "Cost (%1)" msgstr "Kostnad (%1)" #: overtimechart.cpp:1579 overtimechart.cpp.bak:1560 #, kde-format msgid "Time" msgstr "Tid" #: overtimechart.cpp:1774 overtimechart.cpp:1775 overtimechart.cpp.bak:1755 #: overtimechart.cpp.bak:1756 #, kde-format msgid "no payer" msgstr "ingen utbetalare" #: overtimechart.cpp:1778 overtimechart.cpp.bak:1759 #, kde-format msgctxt "%1: Description; %2: Payer" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp:1783 overtimechart.cpp:1784 overtimechart.cpp.bak:1764 #: overtimechart.cpp.bak:1765 #, kde-format msgid "no payee" msgstr "ingen mottagare" #: overtimechart.cpp:1787 overtimechart.cpp.bak:1768 #, kde-format msgctxt "%1: Description; %2: Payee" msgid "%1/%2" msgstr "%1/%2" #: overtimechart.cpp.bak:649 #, kde-format msgid "Error after saving file; data may not have been saved." msgstr "Fel efter sparande av fil; data har möjligen inte sparats." #: overtimereport.cpp:344 #, kde-format msgid "Average Profit" msgstr "Genomsnittlig förtjänst" #: overtimereport.cpp:537 #, kde-format msgid "Year" msgstr "År" #: overtimereport.cpp:538 #, kde-format msgid "Month" msgstr "Månad" #: overtimereport.cpp:566 #, kde-format msgid "Includes scheduled transactions" msgstr "Inkluderar planerade transaktioner" #: overtimereport.cpp:570 #, kde-format msgid "Adjusted for the average month / year (%1 / %2 days)" msgstr "Justerad för den genomsnittliga månaden / året (%1 / %2 dagar)" #: overtimereport.cpp:603 overtimereport.cpp:671 #, kde-format msgid "Subtotal" msgstr "Delsumma" #: qifimport.cpp:307 qifimport.cpp:367 qifimportexport.cpp:1259 #: qifimportexport.cpp:1350 qifimportexport.cpp:1470 #, kde-format msgid "Unnamed" msgstr "Namnlöst" #: qifimport.cpp:337 qifimportexport.cpp:1299 qifimportexport.cpp:1413 #, kde-format msgid "Uncategorized" msgstr "Okategoriserade" #: qifimportexport.cpp:56 #, kde-format msgid "Import QIF file" msgstr "Importera QIF-fil" #: qifimportexport.cpp:63 #, kde-format msgid "" "Select a QIF file to import. When you click next, the file be analysed and " "you might need to answer some questions about the format of the file." msgstr "" "Välj en QIF-fil att importera. När du klickar nästa kommer filen att " "analyseras och du kanske behöver svara på några frågor om format på filen." #: qifimportexport.cpp:73 #, kde-format msgid "Local Definitions" msgstr "Lokala definitioner" #: qifimportexport.cpp:74 #, kde-format msgid "" "Unknown elements where found in the QIF file. It is possible that this is " "because of localized type names. Please map them to the correct standard " "names." msgstr "" "Programmet fann okända element i QIF-filen. Det är möjligt att det beror på " "användande av översatta typnamn. Var vänliga passa ihop dessa med de " "korrekta standardnamnen." #: qifimportexport.cpp:80 #, kde-format msgid "Local Text" msgstr "Lokal text" #: qifimportexport.cpp:81 #, kde-format msgid "Standard Text" msgstr "Standardtext" #: qifimportexport.cpp:84 #, kde-format msgid "Select standard text:" msgstr "Välj standardtext:" #: qifimportexport.cpp:90 #, kde-format msgid "Date Format" msgstr "Datumformat" #: qifimportexport.cpp:91 #, kde-format msgid "" "The date format in the QIF file is ambiguous. Please select the correct " "format." msgstr "" "Datumformatet i QIF-filen är tvetydigt. Var vänlig välj det korrekta " "formatet." #: qifimportexport.cpp:100 #, kde-format msgid "Default Account" msgstr "Förvalt konto" #: qifimportexport.cpp:101 #, kde-format msgid "" "Could not find any account definitions in the QIF file. Please select a " "default account. It is also possible that this is caused by a localized " "opening balance text." msgstr "" "Programmet fann inga kontodefinitioner i QIF-filen. Var vänlig välj ett " "förvalt konto. Det är möjligt att detta beror på en översatt " "öppningsbalanstext." #: qifimportexport.cpp:104 #, kde-format msgid "Default account:" msgstr "Förvalt konto:" #: qifimportexport.cpp:115 #, kde-format msgid "Opening balance text:" msgstr "Öppningsbalanstext:" #: qifimportexport.cpp:121 #, kde-format msgid "Descriptions" msgstr "Beskrivningar" #: qifimportexport.cpp:122 #, kde-format msgid "" "Transactions in QIF files does not have any specific description property. " "You are therefore given the option to choose how the description of imported " "transactions will be set." msgstr "" "Transaktioner i QIF-filer har inte någon specifik beskrivningsegenskap.Du " "har därför möjligheten att välj hur beskrivningen för importerade " "transaktioner skall anges." #: qifimportexport.cpp:125 #, kde-format msgid "Subcategories as:" msgstr "Underkategorier som:" #: qifimportexport.cpp:134 #, kde-format msgid "Ignore" msgstr "Ignorera" #: qifimportexport.cpp:137 #, kde-format msgid "Payee as:" msgstr "Mottagare som:" #: qifimportexport.cpp:142 qifimportexport.cpp:520 #: transactionlistwidget.cpp:119 #, kde-format msgid "Payee" msgstr "Mottagare" #: qifimportexport.cpp:147 #, kde-format msgid "Memo as:" msgstr "Memo som:" #: qifimportexport.cpp:156 #, kde-format msgid "Priority:" msgstr "Prioritet:" #: qifimportexport.cpp:159 #, kde-format msgid "Subcategory/Payee/Comments" msgstr "Subkategori/betalningsmottagare/kommentarer" #: qifimportexport.cpp:160 #, kde-format msgid "Payee/Subcategory/Comments" msgstr "Betalningsmottagare/subkategori/kommentarer" #: qifimportexport.cpp:161 #, kde-format msgid "Subcategory/Comments/Payee" msgstr "Subkategori/kommentarer/betalningsmottagare" #: qifimportexport.cpp:162 #, kde-format msgid "Payee/Comments/Subcategory" msgstr "Betalningsmottagare/kommentarer/subkategori" #: qifimportexport.cpp:163 #, kde-format msgid "Comments/Subcategory/Payee" msgstr "Kommentarer/subkategori/betalningsmottagare" #: qifimportexport.cpp:164 #, kde-format msgid "Comments/Payee/Subcategory" msgstr "Kommentarer/betalningsmottagare/subkategori" #: qifimportexport.cpp:314 qifimportexport.cpp:322 qifimportexport.cpp:338 #, kde-format msgid "Unknown" msgstr "Okänd" #: qifimportexport.cpp:324 #, kde-format msgid "Bank" msgstr "Bank" #: qifimportexport.cpp:326 #, kde-format msgid "Cat (Category)" msgstr "Cat (Kategori)" #: qifimportexport.cpp:327 #, kde-format msgid "CCard (Credit Card)" msgstr "CCard (Kreditkort)" #: qifimportexport.cpp:328 #, kde-format msgid "Invst (Investment)" msgstr "Invst (Investering)" #: qifimportexport.cpp:329 #, kde-format msgid "Oth A (Other Assets)" msgstr "Oth A (Andra tillgångar)" #: qifimportexport.cpp:330 #, kde-format msgid "Oth L (Other Liabilities)" msgstr "Oth L (Andra skulder)" #: qifimportexport.cpp:331 #, kde-format msgid "Security" msgstr "Security (Värdepapper)" #: qifimportexport.cpp:465 #, kde-format msgid "Successfully imported 1 account." msgid_plural "Successfully imported %n accounts." msgstr[0] "Lyckades importera 1 konto." msgstr[1] "Lyckades importera %n konton." #: qifimportexport.cpp:469 #, kde-format msgid "Successfully imported 1 category." msgid_plural "Successfully imported %n categories." msgstr[0] "Lyckades importera 1 kategori." msgstr[1] "Lyckades importera %n kategorier." #: qifimportexport.cpp:473 #, kde-format msgid "1 duplicate transaction was ignored." msgid_plural "%n duplicate transactions was ignored." msgstr[0] "1 transaktionskopia ignorerades." msgstr[1] "%n transaktionskopior ignorerades." #: qifimportexport.cpp:477 #, kde-format msgid "Failed to import 1 transaction." msgid_plural "Failed to import %n transactions." msgstr[0] "Misslyckades att importera 1 transaktion." msgstr[1] "Misslyckades att importera %n transaktioner." #: qifimportexport.cpp:481 #, kde-format msgid "1 security was not imported." msgid_plural "%n securities were not imported." msgstr[0] "1 värdepapper importerades inte." msgstr[1] "%n värdepapper importerades inte." #: qifimportexport.cpp:485 #, kde-format msgid "1 security transaction was not imported." msgid_plural "%n security transactions were not imported." msgstr[0] "1 värdepapperstransaktion importerades inte." msgstr[1] "%n värdepapperstransaktioner importerades inte." #: qifimportexport.cpp:494 #, kde-format msgid "Export QIF File" msgstr "Exportera QIF-fil" #: qifimportexport.cpp:506 #, kde-format msgctxt "All accounts" msgid "All" msgstr "Alla" #: qifimportexport.cpp:517 #, kde-format msgid "Export transaction description as:" msgstr "Exportera transaktionsbeskrivningar som:" #: qifimportexport.cpp:524 #, kde-format msgid "Memo" msgstr "Memo" #: qifimportexport.cpp:528 #, kde-format msgid "Subcategory" msgstr "Underkategori" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 5 #: rc.cpp:3 #, kde-format msgid "&Import" msgstr "&Importera" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 12 #: rc.cpp:6 #, kde-format msgid "&Accounts" msgstr "&Konton" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 24 #: rc.cpp:9 #, kde-format msgid "&Transactions" msgstr "&Transaktioner" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 41 #: rc.cpp:12 #, kde-format msgid "&Securities" msgstr "&Värdepapper" #. i18n: tag text #. i18n: file ./eqonomizeui.rc line 56 #: rc.cpp:15 #, kde-format msgid "Stat&istics" msgstr "Stat&istik" #: rc.cpp:16 #, kde-format msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Hanna K." #: rc.cpp:17 #, kde-format msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "hanna_k@fmgirl.com" #: recurrenceeditwidget.cpp:69 #, kde-format msgid "Edit Exceptions" msgstr "Modifiera undantag" #: recurrenceeditwidget.cpp:186 #, kde-format msgid "Edit Recurrence Range" msgstr "Modifiera återkomstomfånget" #: recurrenceeditwidget.cpp:194 recurrenceeditwidget.cpp:229 #, kde-format msgid "Begins on: %1" msgstr "Börjar på: %1" #: recurrenceeditwidget.cpp:199 #, kde-format msgid "No ending date" msgstr "Inget slutdatum" #: recurrenceeditwidget.cpp:203 #, kde-format msgid "End after" msgstr "Sluta efter" #: recurrenceeditwidget.cpp:209 #, kde-format msgid "occurrence(s)" msgstr "förekomst(er)" #: recurrenceeditwidget.cpp:211 #, kde-format msgid "End on" msgstr "Sluta på" #: recurrenceeditwidget.cpp:298 #, kde-format msgid "End date before start date." msgstr "Slutdatum är efter startdatum." #: recurrenceeditwidget.cpp:312 #, kde-format msgid "Enable recurrance" msgstr "Aktivera återkomst" #: recurrenceeditwidget.cpp:315 #, kde-format msgid "Recurrence Rule" msgstr "Regler för återkommande" #: recurrenceeditwidget.cpp:321 #, kde-format msgid "Weekly" msgstr "Veckovis" #: recurrenceeditwidget.cpp:341 recurrenceeditwidget.cpp:352 #: recurrenceeditwidget.cpp:376 recurrenceeditwidget.cpp:462 #, kde-format msgid "Recur every" msgstr "Återkom efter" #: recurrenceeditwidget.cpp:345 #, kde-format msgid "day(s)" msgstr "dag(ar)" #: recurrenceeditwidget.cpp:356 #, kde-format msgid "week(s) on:" msgstr "vecka/veckor på:" #: recurrenceeditwidget.cpp:380 #, kde-format msgid "month(s), after the start month" msgstr "månad(er), efter startdatum" #: recurrenceeditwidget.cpp:385 recurrenceeditwidget.cpp:437 #, kde-format msgid "Recur on the" msgstr "Återkom den" #: recurrenceeditwidget.cpp:391 recurrenceeditwidget.cpp:442 #: recurrenceeditwidget.cpp:494 #, kde-format msgid "1st" msgstr "1:a" #: recurrenceeditwidget.cpp:392 recurrenceeditwidget.cpp:443 #: recurrenceeditwidget.cpp:495 #, kde-format msgid "2nd" msgstr "2:a" #: recurrenceeditwidget.cpp:393 recurrenceeditwidget.cpp:444 #: recurrenceeditwidget.cpp:496 #, kde-format msgid "3rd" msgstr "3:e" #: recurrenceeditwidget.cpp:394 recurrenceeditwidget.cpp:445 #: recurrenceeditwidget.cpp:497 #, kde-format msgid "4th" msgstr "4:e" #: recurrenceeditwidget.cpp:395 recurrenceeditwidget.cpp:446 #: recurrenceeditwidget.cpp:498 #, kde-format msgid "5th" msgstr "5:e" #: recurrenceeditwidget.cpp:396 #, kde-format msgid "6th" msgstr "6:e" #: recurrenceeditwidget.cpp:397 #, kde-format msgid "7th" msgstr "7:e" #: recurrenceeditwidget.cpp:398 #, kde-format msgid "8th" msgstr "8:e" #: recurrenceeditwidget.cpp:399 #, kde-format msgid "9th" msgstr "9:e" #: recurrenceeditwidget.cpp:400 #, kde-format msgid "10th" msgstr "10:e" #: recurrenceeditwidget.cpp:401 #, kde-format msgid "11th" msgstr "11:e" #: recurrenceeditwidget.cpp:402 #, kde-format msgid "12th" msgstr "12:e" #: recurrenceeditwidget.cpp:403 #, kde-format msgid "13th" msgstr "13:e" #: recurrenceeditwidget.cpp:404 #, kde-format msgid "14th" msgstr "14:e" #: recurrenceeditwidget.cpp:405 #, kde-format msgid "15th" msgstr "15:e" #: recurrenceeditwidget.cpp:406 #, kde-format msgid "16th" msgstr "16:e" #: recurrenceeditwidget.cpp:407 #, kde-format msgid "17th" msgstr "17:e" #: recurrenceeditwidget.cpp:408 #, kde-format msgid "18th" msgstr "18:e" #: recurrenceeditwidget.cpp:409 #, kde-format msgid "19th" msgstr "19:e" #: recurrenceeditwidget.cpp:410 #, kde-format msgid "20th" msgstr "20:e" #: recurrenceeditwidget.cpp:411 #, kde-format msgid "21st" msgstr "21:a" #: recurrenceeditwidget.cpp:412 #, kde-format msgid "22nd" msgstr "22:a" #: recurrenceeditwidget.cpp:413 #, kde-format msgid "23rd" msgstr "23:e" #: recurrenceeditwidget.cpp:414 #, kde-format msgid "24th" msgstr "24:e" #: recurrenceeditwidget.cpp:415 #, kde-format msgid "25th" msgstr "25:e" #: recurrenceeditwidget.cpp:416 #, kde-format msgid "26th" msgstr "26:e" #: recurrenceeditwidget.cpp:417 #, kde-format msgid "27th" msgstr "27:e" #: recurrenceeditwidget.cpp:418 #, kde-format msgid "28th" msgstr "28:e" #: recurrenceeditwidget.cpp:419 #, kde-format msgid "29th" msgstr "29:e" #: recurrenceeditwidget.cpp:420 #, kde-format msgid "30th" msgstr "30:e" #: recurrenceeditwidget.cpp:421 #, kde-format msgid "31st" msgstr "31:a" #: recurrenceeditwidget.cpp:422 recurrenceeditwidget.cpp:447 #: recurrenceeditwidget.cpp:499 #, kde-format msgid "Last" msgstr "Sista" #: recurrenceeditwidget.cpp:423 recurrenceeditwidget.cpp:448 #: recurrenceeditwidget.cpp:500 #, kde-format msgid "2nd Last" msgstr "Näst sista" #: recurrenceeditwidget.cpp:424 recurrenceeditwidget.cpp:449 #: recurrenceeditwidget.cpp:501 #, kde-format msgid "3rd Last" msgstr "3:e sista" #: recurrenceeditwidget.cpp:425 recurrenceeditwidget.cpp:450 #: recurrenceeditwidget.cpp:502 #, kde-format msgid "4th Last" msgstr "4:e sista" #: recurrenceeditwidget.cpp:426 recurrenceeditwidget.cpp:451 #: recurrenceeditwidget.cpp:503 #, kde-format msgid "5th Last" msgstr "5:e sista" #: recurrenceeditwidget.cpp:429 #, kde-format msgid "day" msgstr "dagen" #: recurrenceeditwidget.cpp:431 recurrenceeditwidget.cpp:483 #: recurrenceeditwidget.cpp:521 #, kde-format msgid "possibly on weekend" msgstr "möjligen på helgen" #: recurrenceeditwidget.cpp:432 recurrenceeditwidget.cpp:484 #: recurrenceeditwidget.cpp:522 #, kde-format msgid "but before weekend" msgstr "men före helgen" #: recurrenceeditwidget.cpp:433 recurrenceeditwidget.cpp:485 #: recurrenceeditwidget.cpp:523 #, kde-format msgid "but after weekend" msgstr "men efter helgen" #: recurrenceeditwidget.cpp:466 #, kde-format msgid "year(s), after the start year" msgstr "år, efter startåret" #: recurrenceeditwidget.cpp:471 #, kde-format msgctxt "part before XXX of 'Recur on day XXX of month YYY'" msgid "Recur on day" msgstr "Återkom dag" #: recurrenceeditwidget.cpp:479 #, kde-format msgctxt "part between XXX and YYY of 'Recur on day XXX of month YYY'" msgid "of" msgstr "i" #: recurrenceeditwidget.cpp:489 #, kde-format msgctxt "Part before NNN in 'Recur on the NNN. WEEKDAY of MONTH'" msgid "On the" msgstr "På den" #: recurrenceeditwidget.cpp:507 #, kde-format msgctxt "part between WEEKDAY and MONTH in 'Recur on NNN. WEEKDAY of MONTH'" msgid "of" msgstr "i" #: recurrenceeditwidget.cpp:512 #, kde-format msgid "Recur on day #" msgstr "Återkom på dag #" #: recurrenceeditwidget.cpp:519 #, kde-format msgctxt "part after NNN of 'Recur on day #NNN of the year'" msgid " of the year" msgstr "av året" #: recurrenceeditwidget.cpp:533 #, kde-format msgid "Range..." msgstr "Omfång..." #: recurrenceeditwidget.cpp:535 #, kde-format msgid "Exceptions..." msgstr "Undantag..." #: recurrenceeditwidget.cpp:731 #, kde-format msgid "No day of week selected for weekly recurrence." msgstr "Ingen veckodag vald för upprepning." #: recurrenceeditwidget.cpp:745 recurrenceeditwidget.cpp:774 #: recurrenceeditwidget.cpp:791 #, kde-format msgid "Selected day will never occur with selected frequency and start date." msgstr "Vald dag kommer aldrig att inträffa med vald frekvens och startdatum." #: recurrenceeditwidget.cpp:761 #, kde-format msgid "Selected day does not exist in selected month." msgstr "Vald dag existerar inte i vald månad." #: transaction.cpp:155 transaction.cpp:186 #, kde-format msgid "Dividend: %1" msgstr "Utdelning: %1" #: transaction.cpp:253 transaction.cpp:256 transaction.cpp:284 #, kde-format msgid "Account balancing" msgstr "Balansering av konto" #: transaction.cpp:337 transaction.cpp:352 #, kde-format msgid "Security: %1 (bought)" msgstr "Värdepapper: %1 (köpt)" #: transaction.cpp:375 transaction.cpp:390 #, kde-format msgid "Security: %1 (sold)" msgstr "Värdepapper: %1 (sålt)" #: transactioneditwidget.cpp:125 #, kde-format msgid "Shares bought:" msgstr "Köpta andelar:" #: transactioneditwidget.cpp:130 #, kde-format msgid "Shares sold:" msgstr "Sålda andelar:" #: transactioneditwidget.cpp:238 transactioneditwidget.cpp:1144 #: transactionfilterwidget.cpp:140 #, kde-format msgid "Payer:" msgstr "Utbetalare:" #: transactioneditwidget.cpp:280 transactioneditwidget.cpp:1145 #: transactionfilterwidget.cpp:141 #, kde-format msgid "Payee:" msgstr "Mottagare:" #: transactioneditwidget.cpp:664 transactioneditwidget.cpp:1262 #, kde-format msgid "No income category available." msgstr "Ingen inkomstkategory finns tillgänglig." #: transactioneditwidget.cpp:689 transactioneditwidget.cpp:1270 #, kde-format msgid "No expense category available." msgstr "Ingen utgiftskategory finns tillänglig." #: transactioneditwidget.cpp:720 #, kde-format msgid "Cannot create a regular transfer to/from a securities account." msgstr "" "Kan inte skapa en vanlig överföring till/från ett konto för värdepapper." #: transactioneditwidget.cpp:727 #, kde-format msgid "Cannot create a regular income to a securities account." msgstr "Kan inte skapa en vanlig inkomst till ett konto för värdepapper." #: transactioneditwidget.cpp:743 #, kde-format msgid "Zero price per share not allowed." msgstr "Noll pris per andel är inte tillåtet." #: transactioneditwidget.cpp:755 #, kde-format msgid "Cannot create a regular expense from a securities account." msgstr "Kan inte skapa en normal utgift från ett konto för värdepapper." #: transactioneditwidget.cpp:1086 #, kde-format msgid "Modify Transactions" msgstr "Modifiera transaktioner" #: transactionfilterwidget.cpp:99 #, kde-format msgid "Min amount:" msgstr "Lägsta värde:" #: transactionfilterwidget.cpp:100 #, kde-format msgid "Max amount:" msgstr "Högsta värde:" #: transactionfilterwidget.cpp:110 #, kde-format msgid "Min income:" msgstr "Lägsta inkomst:" #: transactionfilterwidget.cpp:111 #, kde-format msgid "Max income:" msgstr "Högsta inkomst:" #: transactionfilterwidget.cpp:121 #, kde-format msgid "Min cost:" msgstr "Lägsta kostnad:" #: transactionfilterwidget.cpp:122 #, kde-format msgid "Max cost:" msgstr "Högsta kostnad:" #: transactionfilterwidget.cpp:148 #, kde-format msgid "Include" msgstr "Inkludera" #: transactionfilterwidget.cpp:152 #, kde-format msgid "Exclude" msgstr "Exkludera" #: transactionlistwidget.cpp:117 #, kde-format msgid "From Account" msgstr "Från konto" #: transactionlistwidget.cpp:128 #, kde-format msgid "To Account" msgstr "Till konto" #: transactionlistwidget.cpp:130 #, kde-format msgid "Payer" msgstr "Utbetalare" #: transactionlistwidget.cpp:169 #, kde-format msgid "New/Edit Expense" msgstr "Ny/ändra utgift" #: transactionlistwidget.cpp:170 #, kde-format msgid "Filter" msgstr "Filter" #: transactionlistwidget.cpp:209 #, kde-format msgid "Total:" msgstr "Summa:" #: transactionlistwidget.cpp:209 transactionlistwidget.cpp:328 #, kde-format msgid "Average:" msgstr "Genomsnitt:" #: transactionlistwidget.cpp:209 #, kde-format msgid "Monthly:" msgstr "Månadsvis:" #: transactionlistwidget.cpp:314 #, kde-format msgid "Total cost:" msgstr "Total kostnad:" #: transactionlistwidget.cpp:318 #, kde-format msgid "Total income:" msgstr "Total inkomst:" #: transactionlistwidget.cpp:322 #, kde-format msgid "Total amount:" msgstr "Totalt värde:" #: transactionlistwidget.cpp:330 #, kde-format msgid "Monthly average:" msgstr "Månatligt genomsnitt:" #: transactionlistwidget.cpp:671 #, kde-format msgid "" "Are you sure you want to delete all (%1) transactions in the selected split " "transaction?" msgstr "" "Vill du verkligen ta bort alla (%1) transaktioner i den valda delade " "transaktionen?" #: transactionlistwidget.cpp:1028 #, kde-format msgid "* Part of split transaction" msgstr "* Del av delad transaktion" #: transactionlistwidget.cpp:1029 #, kde-format msgid "* Part of split (%1)" msgstr "* Del av delad transaktion (%1)" #: transactionlistwidget.cpp:1033 #, kde-format msgid "** Recurring (editing occurrance)" msgstr "** Återkommande (modifierar tillfälle)" #: transactionlistwidget.cpp:1049 #, kde-format msgid "Modify..." msgstr "Ändra..." eqonomize-0.6/src/0000755000175000017500000000000011107050565013110 5ustar hannahannaeqonomize-0.6/src/CMakeLists.txt0000644000175000017500000000240611107071570015651 0ustar hannahanna include_directories(${KDE4_INCLUDES}) ########### next target ############### set(eqonomize_SRCS main.cpp eqonomize.cpp account.cpp transaction.cpp budget.cpp recurrence.cpp security.cpp kdateedit.cpp kdatepickerpopup.cpp eqonomizemonthselector.cpp eqonomizevalueedit.cpp categoriescomparisonchart.cpp overtimechart.cpp categoriescomparisonreport.cpp importcsvdialog.cpp overtimereport.cpp editscheduledtransactiondialog.cpp editsplitdialog.cpp ledgerdialog.cpp recurrenceeditwidget.cpp transactioneditwidget.cpp transactionfilterwidget.cpp transactionlistwidget.cpp qifimportexport.cpp) kde4_add_app_icon(eqonomize_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/hi*-app-eqonomize.png") kde4_add_executable(eqonomize ${eqonomize_SRCS}) target_link_libraries(eqonomize ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBS} ${KDE4_KHTML_LIBS}) install(TARGETS eqonomize ${INSTALL_TARGETS_DEFAULT_ARGS}) ########### install files ############### install(FILES eqonomizeui.rc DESTINATION ${DATA_INSTALL_DIR}/eqonomize) install(FILES eqonomize.desktop DESTINATION ${XDG_APPS_INSTALL_DIR}) install(FILES x-eqonomize.desktop DESTINATION ${MIME_INSTALL_DIR}/application) kde4_install_icons(${ICON_INSTALL_DIR}) eqonomize-0.6/src/account.cpp0000644000175000017500000002416711106576617015274 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "account.h" #include "budget.h" #include #include #include #include Account::Account(Budget *parent_budget, QString initial_name, QString initial_description) : o_budget(parent_budget), i_id(-1), s_name(initial_name.trimmed()), s_description(initial_description) {} Account::Account(Budget *parent_budget, QDomElement *e, bool *valid) : o_budget(parent_budget) { i_id = e->attribute("id").toInt(); s_name = e->attribute("name").trimmed(); s_description = e->attribute("description"); if(valid) *valid = true; } Account::Account() : o_budget(NULL), i_id(-1) {} Account::Account(const Account *account) : o_budget(account->budget()), i_id(account->id()), s_name(account->name()), s_description(account->description()) {} Account::~Account() {} const QString &Account::name() const {return s_name;} void Account::setName(QString new_name) {s_name = new_name.trimmed(); o_budget->accountNameModified(this);} const QString &Account::description() const {return s_description;} void Account::setDescription(QString new_description) {s_description = new_description;} Budget *Account::budget() const {return o_budget;} int Account::id() const {return i_id;} void Account::setId(int new_id) {i_id = new_id;} void Account::save(QDomElement *e) const { e->setAttribute("name", s_name); e->setAttribute("id", i_id); if(!s_description.isEmpty()) e->setAttribute("description", s_description); } AssetsAccount::AssetsAccount(Budget *parent_budget, AssetsType initial_type, QString initial_name, double initial_balance, QString initial_description) : Account(parent_budget, initial_name, initial_description), at_type(initial_type), d_initbal(initial_type == ASSETS_TYPE_SECURITIES ? 0.0 : initial_balance) {} AssetsAccount::AssetsAccount(Budget *parent_budget, QDomElement *e, bool *valid) : Account(parent_budget, e, valid) { QString type = e->attribute("type"); if(type == "current") { at_type = ASSETS_TYPE_CURRENT; } else if(type == "savings") { at_type = ASSETS_TYPE_SAVINGS; } else if(type == "credit card") { at_type = ASSETS_TYPE_CREDIT_CARD; } else if(type == "liabilities") { at_type = ASSETS_TYPE_LIABILITIES; } else if(type == "securities") { at_type = ASSETS_TYPE_SECURITIES; } else if(type == "balancing") { at_type = ASSETS_TYPE_BALANCING; } else { at_type = ASSETS_TYPE_CASH; } if(at_type != ASSETS_TYPE_SECURITIES) { d_initbal = e->attribute("initialbalance").toDouble(); if(e->hasAttribute("budgetaccount")) { bool b_budget = e->attribute("budgetaccount").toInt(); if(b_budget) { o_budget->budgetAccount = this; } } else if(at_type == ASSETS_TYPE_CURRENT && !o_budget->budgetAccount) { o_budget->budgetAccount = this; } } } AssetsAccount::AssetsAccount() : Account(), at_type(ASSETS_TYPE_CASH), d_initbal(0.0) {} AssetsAccount::AssetsAccount(const AssetsAccount *account) : Account(account), at_type(account->accountType()), d_initbal(account->initialBalance()) {} AssetsAccount::~AssetsAccount() {if(o_budget->budgetAccount == this) o_budget->budgetAccount = NULL;} bool AssetsAccount::isBudgetAccount() const { return o_budget->budgetAccount == this; } void AssetsAccount::setAsBudgetAccount(bool will_be) { if(will_be) { o_budget->budgetAccount = this; } else if(o_budget->budgetAccount == this) { o_budget->budgetAccount = NULL; } } double AssetsAccount::initialBalance() const { if(at_type == ASSETS_TYPE_SECURITIES) { double d = 0.0; Security *sec = o_budget->securities.first(); while(sec) { if(sec->account() == this) { d += sec->initialBalance(); } sec = o_budget->securities.next(); } return d; } return d_initbal; } void AssetsAccount::setInitialBalance(double new_initial_balance) {if(at_type != ASSETS_TYPE_SECURITIES) d_initbal = new_initial_balance;} AccountType AssetsAccount::type() const {return ACCOUNT_TYPE_ASSETS;} void AssetsAccount::save(QDomElement *e) const { Account::save(e); if(at_type != ASSETS_TYPE_SECURITIES) { e->setAttribute("initialbalance", QString::number(d_initbal, 'f', KGlobal::locale()->fracDigits())); if(at_type == ASSETS_TYPE_CURRENT || o_budget->budgetAccount == this) { e->setAttribute("budgetaccount", o_budget->budgetAccount == this); } } switch(at_type) { case ASSETS_TYPE_CURRENT: {e->setAttribute("type", "current"); break;} case ASSETS_TYPE_SAVINGS: {e->setAttribute("type", "savings"); break;} case ASSETS_TYPE_CREDIT_CARD: {e->setAttribute("type", "credit card"); break;} case ASSETS_TYPE_LIABILITIES: {e->setAttribute("type", "liabilities"); break;} case ASSETS_TYPE_SECURITIES: {e->setAttribute("type", "securities"); break;} case ASSETS_TYPE_BALANCING: {e->setAttribute("type", "balancing"); break;} case ASSETS_TYPE_CASH: {e->setAttribute("type", "cash"); break;} } } void AssetsAccount::setAccountType(AssetsType new_type) { at_type = new_type; if(at_type == ASSETS_TYPE_SECURITIES) d_initbal = 0.0; } AssetsType AssetsAccount::accountType() const {return at_type;} CategoryAccount::CategoryAccount(Budget *parent_budget, QString initial_name, QString initial_description) : Account(parent_budget, initial_name, initial_description) {} CategoryAccount::CategoryAccount(Budget *parent_budget, QDomElement *e, bool *valid) : Account(parent_budget, e, valid) { if(e->hasAttribute("monthlybudget")) { double d_mbudget = e->attribute("monthlybudget").toDouble(); if(d_mbudget >= 0.0) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); QDate date = QDate::currentDate(); calSys->setYMD(date, calSys->year(date), calSys->month(date), 1); mbudgets[date] = d_mbudget; } } for(QDomNode n = e->firstChild(); !n.isNull(); n = n.nextSibling()) { if(n.isElement()) { QDomElement e2 = n.toElement(); if(e2.tagName() == "budget") { QDate date = QDate::fromString(e2.attribute("date"), Qt::ISODate); mbudgets[date] = e2.attribute("value").toDouble(); } } } } CategoryAccount::CategoryAccount() : Account() {} CategoryAccount::CategoryAccount(const CategoryAccount *account) : Account(account) {} CategoryAccount::~CategoryAccount() {} double CategoryAccount::monthlyBudget(int year, int month, bool no_default) const { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); QDate date; calSys->setYMD(date, year, month, 1); return monthlyBudget(date, no_default); } void CategoryAccount::setMonthlyBudget(int year, int month, double new_monthly_budget) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); QDate date; calSys->setYMD(date, year, month, 1); return setMonthlyBudget(date, new_monthly_budget); } double CategoryAccount::monthlyBudget(const QDate &date, bool no_default) const { if(mbudgets.isEmpty()) return -1.0; QMap::const_iterator it = mbudgets.find(date); if(it != mbudgets.end()) { return it.value(); } if(no_default) return -1.0; it = mbudgets.begin(); if(it.key() > date) return -1.0; QMap::const_iterator it_e = mbudgets.end(); --it_e; while(it_e != it) { if(date > it_e.key()) return it_e.value(); --it_e; } return it.value(); } void CategoryAccount::setMonthlyBudget(const QDate &date, double new_monthly_budget) { mbudgets[date] = new_monthly_budget; } void CategoryAccount::save(QDomElement *e) const { Account::save(e); QMap::const_iterator it_end = mbudgets.end(); for(QMap::const_iterator it = mbudgets.begin(); it != it_end; ++it) { QDomElement e2 = e->ownerDocument().createElement("budget"); e2.setAttribute("value", QString::number(it.value(), 'f', KGlobal::locale()->fracDigits())); e2.setAttribute("date", it.key().toString(Qt::ISODate)); e->appendChild(e2); } } IncomesAccount::IncomesAccount(Budget *parent_budget, QString initial_name, QString initial_description) : CategoryAccount(parent_budget, initial_name, initial_description) {} IncomesAccount::IncomesAccount(Budget *parent_budget, QDomElement *e, bool *valid) : CategoryAccount(parent_budget, e, valid) {} IncomesAccount::IncomesAccount() : CategoryAccount() {} IncomesAccount::IncomesAccount(const IncomesAccount *account) : CategoryAccount(account) {} IncomesAccount::~IncomesAccount() {} AccountType IncomesAccount::type() const {return ACCOUNT_TYPE_INCOMES;} ExpensesAccount::ExpensesAccount(Budget *parent_budget, QString initial_name, QString initial_description) : CategoryAccount(parent_budget, initial_name, initial_description) {} ExpensesAccount::ExpensesAccount(Budget *parent_budget, QDomElement *e, bool *valid) : CategoryAccount(parent_budget, e, valid) {} ExpensesAccount::ExpensesAccount() : CategoryAccount() {} ExpensesAccount::ExpensesAccount(const ExpensesAccount *account) : CategoryAccount(account) {} ExpensesAccount::~ExpensesAccount() {} AccountType ExpensesAccount::type() const {return ACCOUNT_TYPE_EXPENSES;} eqonomize-0.6/src/account.h0000644000175000017500000001131211106576635014725 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef ACCOUNT_H #define ACCOUNT_H #include #include #include class Budget; class QDomElement; typedef enum { ACCOUNT_TYPE_INCOMES, ACCOUNT_TYPE_ASSETS, ACCOUNT_TYPE_EXPENSES } AccountType; typedef enum { ASSETS_TYPE_CASH, ASSETS_TYPE_CURRENT, ASSETS_TYPE_SAVINGS, ASSETS_TYPE_CREDIT_CARD, ASSETS_TYPE_LIABILITIES, ASSETS_TYPE_SECURITIES, ASSETS_TYPE_BALANCING } AssetsType; class Account { protected: Budget *o_budget; int i_id; QString s_name, s_description; public: Account(Budget *parent_budget, QString initial_name, QString initial_description); Account(Budget *parent_budget, QDomElement *e, bool *valid); Account(); Account(const Account *account); virtual ~Account(); const QString &name() const; void setName(QString new_name); const QString &description() const; void setDescription(QString new_description); Budget *budget() const; int id() const; void setId(int new_id); virtual AccountType type() const = 0; virtual void save(QDomElement *e) const; }; class AssetsAccount : public Account { protected: AssetsType at_type; double d_initbal; public: AssetsAccount(Budget *parent_budget, AssetsType initial_type, QString initial_name, double initial_balance = 0.0, QString initial_description = QString::null); AssetsAccount(Budget *parent_budget, QDomElement *e, bool *valid); AssetsAccount(); AssetsAccount(const AssetsAccount *account); virtual ~AssetsAccount(); bool isBudgetAccount() const; void setAsBudgetAccount(bool will_be = true); double initialBalance() const; void setInitialBalance(double new_initial_balance); virtual AccountType type() const; void setAccountType(AssetsType new_type); virtual AssetsType accountType() const; void save(QDomElement *e) const; }; class CategoryAccount : public Account { public: CategoryAccount(Budget *parent_budget, QString initial_name, QString initial_description = QString::null); CategoryAccount(Budget *parent_budget, QDomElement *e, bool *valid); CategoryAccount(); CategoryAccount(const CategoryAccount *account); virtual ~CategoryAccount(); QMap mbudgets; double monthlyBudget(int year, int month, bool no_default = false) const; void setMonthlyBudget(int year, int month, double new_monthly_budget); double monthlyBudget(const QDate &date, bool no_default = false) const; void setMonthlyBudget(const QDate &date, double new_monthly_budget); virtual AccountType type() const = 0; virtual void save(QDomElement *e) const; }; class IncomesAccount : public CategoryAccount { public: IncomesAccount(Budget *parent_budget, QString initial_name, QString initial_description = QString::null); IncomesAccount(Budget *parent_budget, QDomElement *e, bool *valid); IncomesAccount(); IncomesAccount(const IncomesAccount *account); virtual ~IncomesAccount(); virtual AccountType type() const; }; class ExpensesAccount : public CategoryAccount { public: ExpensesAccount(Budget *parent_budget, QString initial_name, QString initial_description = QString::null); ExpensesAccount(Budget *parent_budget, QDomElement *e, bool *valid); ExpensesAccount(); ExpensesAccount(const ExpensesAccount *account); virtual ~ExpensesAccount(); virtual AccountType type() const; }; #endif eqonomize-0.6/src/budget.cpp0000644000175000017500000010414611106576567015112 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "budget.h" #include #include #include #include #include #include #include #include #include "recurrence.h" Budget::Budget() { expenses.setAutoDelete(true); incomes.setAutoDelete(true); transfers.setAutoDelete(true); securityTransactions.setAutoDelete(true); transactions.setAutoDelete(false); scheduledTransactions.setAutoDelete(true); splitTransactions.setAutoDelete(true); securities.setAutoDelete(true); expensesAccounts.setAutoDelete(true); incomesAccounts.setAutoDelete(true); assetsAccounts.setAutoDelete(true); securityTrades.setAutoDelete(true); accounts.setAutoDelete(false); balancingAccount = new AssetsAccount(this, ASSETS_TYPE_BALANCING, i18n("Balancing"), 0.0); balancingAccount->setId(0); assetsAccounts.append(balancingAccount); accounts.append(balancingAccount); budgetAccount = NULL; } Budget::~Budget() {} void Budget::clear() { transactions.clear(); scheduledTransactions.clear(); splitTransactions.clear(); securities.clear(); expenses.clear(); incomes.clear(); transfers.clear(); securityTransactions.clear(); securities.clear(); accounts.clear(); securityTrades.clear(); assetsAccounts.setAutoDelete(false); assetsAccounts.removeRef(balancingAccount); assetsAccounts.setAutoDelete(true); incomesAccounts.clear(); expensesAccounts.clear(); assetsAccounts.clear(); assetsAccounts.append(balancingAccount); accounts.append(balancingAccount); budgetAccount = NULL; } QString Budget::loadFile(QString filename, QString &errors) { QFile file(filename); if(!file.open(QIODevice::ReadOnly) ) { return i18n("Couldn't open %1 for reading").arg(filename); } else if(!file.size()) { return QString::null; } QTextStream fstream(&file); fstream.setCodec("UTF-8"); QDomDocument doc; QString errorMsg; int errorLine = 0, errorCol; doc.setContent(&file, &errorMsg, &errorLine, &errorCol); if(errorLine){ return i18n("Not a valid Eqonomize! file (XML parse error: \"%2\" at line %3, col %4)").arg(errorMsg).arg(errorLine).arg(errorCol); } QDomElement root = doc.documentElement(); if(root.tagName() != "EqonomizeDoc" && root.tagName() != "EconomizeDoc") return i18n("Invalid root element %1 in XML document").arg(root.tagName()); clear(); errors = ""; int category_errors = 0, account_errors = 0, transaction_errors = 0, security_errors = 0; /*QDomAttr v = root.attributeNode("version"); bool ok = true; float version = v.value().toFloat(&ok); if(v.isNull()) return i18n("root element has no version attribute"); if(!ok) return i18n("root element has invalid version attribute");*/ assetsAccounts_id[balancingAccount->id()] = balancingAccount; for(QDomNode n = root.firstChild(); !n.isNull(); n = n.nextSibling()) { if(n.isElement()) { QDomElement e = n.toElement(); if(e.tagName() == "schedule") { bool valid = true; ScheduledTransaction *strans = new ScheduledTransaction(this, &e, &valid); if(valid) { scheduledTransactions.append(strans); if(strans->transaction()) { if(strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) { ((SecurityTransaction*) strans->transaction())->security()->scheduledTransactions.append(strans); } else if(strans->transaction()->type() == TRANSACTION_TYPE_INCOME && ((Income*) strans->transaction())->security()) { ((Income*) strans->transaction())->security()->scheduledDividends.append(strans); } } } else { transaction_errors++; delete strans; } } else if(e.tagName() == "transaction") { QString type = e.attribute("type"); bool valid = true; if(type == "expense" || type == "refund") { Expense *expense = new Expense(this, &e, &valid); if(valid) { expenses.append(expense); transactions.append(expense); } else { transaction_errors++; delete expense; } } else if(type == "income" || type == "repayment") { Income *income = new Income(this, &e, &valid); if(valid) { incomes.append(income); transactions.append(income); } else { transaction_errors++; delete income; } } else if(type == "dividend") { Income *income = new Income(this, &e, &valid); if(valid && income->security()) { incomes.append(income); transactions.append(income); income->security()->dividends.append(income); } else { transaction_errors++; delete income; } } else if(type == "reinvested_dividend") { QDate date = QDate::fromString(e.attribute("date"), Qt::ISODate); double shares = e.attribute("shares").toDouble(); int id = e.attribute("security").toInt(); Security *security; if(securities_id.contains(id)) { security = securities_id[id]; } else { security = NULL; } if(date.isValid() && security) { security->reinvestedDividends.append(new ReinvestedDividend(date, shares)); } else { transaction_errors++; } } else if(type == "security_trade") { QDate date = QDate::fromString(e.attribute("date"), Qt::ISODate); double value = e.attribute("value").toDouble(); double from_shares = e.attribute("from_shares").toDouble(); double to_shares = e.attribute("to_shares").toDouble(); int from_id = e.attribute("from_security").toInt(); int to_id = e.attribute("to_security").toInt(); Security *from_security; if(securities_id.contains(from_id)) { from_security = securities_id[from_id]; } else { from_security = NULL; } Security *to_security; if(securities_id.contains(to_id)) { to_security = securities_id[to_id]; } else { to_security = NULL; } if(date.isValid() && from_security && to_security && from_security != to_security) { SecurityTrade *ts = new SecurityTrade(date, value, from_shares, from_security, to_shares, to_security); securityTrades.append(ts); from_security->tradedShares.append(ts); to_security->tradedShares.append(ts); } else { transaction_errors++; } } else if(type == "transfer") { Transfer *transfer = new Transfer(this, &e, &valid); if(valid) { transfers.append(transfer); transactions.append(transfer); } else { transaction_errors++; delete transfer; } } else if(type == "balancing") { Transfer *transfer = new Balancing(this, &e, &valid); if(valid) { transfers.append(transfer); transactions.append(transfer); } else { transaction_errors++; delete transfer; } } else if(type == "security_buy") { SecurityBuy *trans = new SecurityBuy(this, &e, &valid); if(valid) { securityTransactions.append(trans); trans->security()->transactions.append(trans); transactions.append(trans); } else { transaction_errors++; delete trans; } } else if(type == "security_sell") { SecuritySell *trans = new SecuritySell(this, &e, &valid); if(valid) { securityTransactions.append(trans); trans->security()->transactions.append(trans); transactions.append(trans); } else { transaction_errors++; delete trans; } } else if(type == "split") { SplitTransaction *split = new SplitTransaction(this, &e, &valid); if(valid) { splitTransactions.append(split); QVector::size_type c = split->splits.count(); for(QVector::size_type i = 0; i < c; i++) { Transaction *trans = split->splits[i]; switch(trans->type()) { case TRANSACTION_TYPE_TRANSFER: { transfers.append((Transfer*) trans); break; } case TRANSACTION_TYPE_INCOME: { incomes.append((Income*) trans); if(((Income*) trans)->security()) ((Income*) trans)->security()->dividends.append((Income*) trans); break; } case TRANSACTION_TYPE_EXPENSE: { expenses.append((Expense*) trans); break; } case TRANSACTION_TYPE_SECURITY_BUY: { securityTransactions.append((SecurityBuy*) trans); ((SecurityBuy*) trans)->security()->transactions.append((SecurityBuy*) trans); break; } case TRANSACTION_TYPE_SECURITY_SELL: { securityTransactions.append((SecuritySell*) trans); ((SecuritySell*) trans)->security()->transactions.append((SecuritySell*) trans); break; } default: {} } transactions.append(trans); } } else { transaction_errors++; delete split; } } } else if(e.tagName() == "category") { QString type = e.attribute("type"); bool valid = true; if(type == "expenses") { ExpensesAccount *account = new ExpensesAccount(this, &e, &valid); if(valid) { expensesAccounts_id[account->id()] = account; expensesAccounts.append(account); accounts.append(account); } else { category_errors++; delete account; } } else if(type == "incomes") { IncomesAccount *account = new IncomesAccount(this, &e, &valid); if(valid) { incomesAccounts_id[account->id()] = account; incomesAccounts.append(account); accounts.append(account); } else { category_errors++; delete account; } } } else if(e.tagName() == "account") { bool valid = true; AssetsAccount *account = new AssetsAccount(this, &e, &valid); if(valid) { assetsAccounts_id[account->id()] = account; assetsAccounts.append(account); accounts.append(account); } else { account_errors++; delete account; } } else if(e.tagName() == "security") { bool valid = true; Security *security = new Security(this, &e, &valid); if(valid) { securities_id[security->id()] = security; securities.append(security); } else { security_errors++; delete security; } } } } incomesAccounts_id.clear(); expensesAccounts_id.clear(); assetsAccounts_id.clear(); securities_id.clear(); expenses.sort(); incomes.sort(); transfers.sort(); securityTransactions.sort(); securityTrades.sort(); Security *security = securities.first(); while(security) { security->dividends.sort(); security->transactions.sort(); security->scheduledTransactions.sort(); security->scheduledDividends.sort(); security->reinvestedDividends.sort(); security->tradedShares.sort(); security = securities.next(); } transactions.sort(); scheduledTransactions.sort(); splitTransactions.sort(); expensesAccounts.sort(); incomesAccounts.sort(); assetsAccounts.sort(); accounts.sort(); securities.sort(); bool had_line = false; if(account_errors > 0) { errors += i18np("Unable to load 1 account.", "Unable to load %n accounts.", account_errors); had_line = true; } if(category_errors > 0) { if(had_line) errors += "\n"; errors += i18np("Unable to load 1 category.", "Unable to load %n categories.", category_errors); had_line = true; } if(security_errors > 0) { if(had_line) errors += "\n"; errors += i18np("Unable to load 1 security.", "Unable to load %n securities.", security_errors); had_line = true; } if(transaction_errors > 0) { if(had_line) errors += "\n"; errors += i18np("Unable to load 1 transaction.", "Unable to load %n transactions.", transaction_errors); had_line = true; } file.close(); return QString::null; } QString Budget::saveFile(QString filename, mode_t) { QFileInfo info(filename); if(info.isDir()) { return i18n("File is a directory"); } KSaveFile ofile(filename); ofile.open(); ofile.setPermissions((QFile::Permissions) 0x0600); if(!ofile.isOpen()) { ofile.abort(); return i18n("Couldn't open file for writing"); } QTextStream outf(&ofile); outf.setCodec("UTF-8"); QDomDocument doc("EqonomizeDoc"); doc.appendChild(doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"")); QDomElement root = doc.createElement("EqonomizeDoc"); root.setAttribute("version", "0.5"); doc.appendChild(root); int id = 1; Account *account = accounts.first(); while(account) { if(account != balancingAccount) { account->setId(id); id++; } account = accounts.next(); } Security *security = securities.first(); while(security) { security->setId(id); id++; security = securities.next(); } account = accounts.first(); while(account) { if(account != balancingAccount) { switch(account->type()) { case ACCOUNT_TYPE_ASSETS: { QDomElement e = doc.createElement("account"); account->save(&e); root.appendChild(e); break; } case ACCOUNT_TYPE_INCOMES: { QDomElement e = doc.createElement("category"); e.setAttribute("type", "incomes"); account->save(&e); root.appendChild(e); break; } case ACCOUNT_TYPE_EXPENSES: { QDomElement e = doc.createElement("category"); e.setAttribute("type", "expenses"); account->save(&e); root.appendChild(e); break; } } } account = accounts.next(); } security = securities.first(); while(security) { QDomElement e = doc.createElement("security"); security->save(&e); root.appendChild(e); security = securities.next(); } ScheduledTransaction *strans = scheduledTransactions.first(); while(strans) { QDomElement e = doc.createElement("schedule"); strans->save(&e); root.appendChild(e); strans = scheduledTransactions.next(); } SplitTransaction *split = splitTransactions.first(); while(split) { QDomElement e = doc.createElement("transaction"); e.setAttribute("type", "split"); split->save(&e); root.appendChild(e); split = splitTransactions.next(); } security = securities.first(); while(security) { ReinvestedDividend *rediv = security->reinvestedDividends.first(); while(rediv) { QDomElement e = doc.createElement("transaction"); e.setAttribute("type", "reinvested_dividend"); e.setAttribute("security", security->id()); e.setAttribute("date", rediv->date.toString(Qt::ISODate)); e.setAttribute("shares", QString::number(rediv->shares, 'f', security->decimals())); root.appendChild(e); rediv = security->reinvestedDividends.next(); } security = securities.next(); } SecurityTrade *ts = securityTrades.first(); while(ts) { QDomElement e = doc.createElement("transaction"); e.setAttribute("type", "security_trade"); e.setAttribute("from_security", ts->from_security->id()); e.setAttribute("to_security", ts->to_security->id()); e.setAttribute("date", ts->date.toString(Qt::ISODate)); e.setAttribute("value", QString::number(ts->value, 'f', KGlobal::locale()->fracDigits())); e.setAttribute("from_shares", QString::number(ts->from_shares, 'f', ts->from_security->decimals())); e.setAttribute("to_shares", QString::number(ts->to_shares, 'f', ts->to_security->decimals())); root.appendChild(e); ts = securityTrades.next(); } Transaction *trans = transactions.first(); while(trans) { if(!trans->parentSplit()) { QDomElement e = doc.createElement("transaction"); switch(trans->type()) { case TRANSACTION_TYPE_TRANSFER: { if(trans->fromAccount() == balancingAccount || trans->toAccount() == balancingAccount) e.setAttribute("type", "balancing"); else e.setAttribute("type", "transfer"); break; } case TRANSACTION_TYPE_INCOME: { if(((Income*) trans)->security()) e.setAttribute("type", "dividend"); else if(trans->value() < 0.0) e.setAttribute("type", "repayment"); else e.setAttribute("type", "income"); break; } case TRANSACTION_TYPE_EXPENSE: { if(trans->value() < 0.0) e.setAttribute("type", "refund"); else e.setAttribute("type", "expense"); break; } case TRANSACTION_TYPE_SECURITY_BUY: { e.setAttribute("type", "security_buy"); break; } case TRANSACTION_TYPE_SECURITY_SELL: { e.setAttribute("type", "security_sell"); break; } } trans->save(&e); root.appendChild(e); } trans = transactions.next(); } outf << doc.toString(); if(ofile.error() != QFile::NoError) { ofile.abort(); return i18n("Error while writing file; file was not saved"); } if(!ofile.finalize()) { return i18n("Error while writing file; file was not saved"); } return QString::null; } void Budget::addTransaction(Transaction *trans) { switch(trans->type()) { case TRANSACTION_TYPE_EXPENSE: {expenses.inSort((Expense*) trans); break;} case TRANSACTION_TYPE_INCOME: { incomes.inSort((Income*) trans); if(((Income*) trans)->security()) { ((Income*) trans)->security()->dividends.inSort((Income*) trans); } break; } case TRANSACTION_TYPE_TRANSFER: {transfers.inSort((Transfer*) trans); break;} case TRANSACTION_TYPE_SECURITY_BUY: {} case TRANSACTION_TYPE_SECURITY_SELL: { SecurityTransaction *sectrans = (SecurityTransaction*) trans; securityTransactions.inSort(sectrans); sectrans->security()->transactions.inSort(sectrans); sectrans->security()->setQuotation(sectrans->date(), sectrans->shareValue(), true); break; } } transactions.inSort(trans); } void Budget::removeTransaction(Transaction *trans, bool keep) { if(trans->parentSplit()) { trans->parentSplit()->removeTransaction(trans, keep); return; } transactions.removeRef(trans); switch(trans->type()) { case TRANSACTION_TYPE_EXPENSE: { if(keep) expenses.setAutoDelete(false); expenses.removeRef((Expense*) trans); if(keep) expenses.setAutoDelete(true); break; } case TRANSACTION_TYPE_INCOME: { if(keep) incomes.setAutoDelete(false); if(((Income*) trans)->security()) { ((Income*) trans)->security()->dividends.removeRef((Income*) trans); } incomes.removeRef((Income*) trans); if(keep) incomes.setAutoDelete(true); break; } case TRANSACTION_TYPE_TRANSFER: { if(keep) transfers.setAutoDelete(false); transfers.removeRef((Transfer*) trans); if(keep) transfers.setAutoDelete(true); break; } case TRANSACTION_TYPE_SECURITY_BUY: {} case TRANSACTION_TYPE_SECURITY_SELL: { SecurityTransaction *sectrans = (SecurityTransaction*) trans; sectrans->security()->removeQuotation(sectrans->date(), true); if(keep) securityTransactions.setAutoDelete(false); sectrans->security()->transactions.removeRef(sectrans); securityTransactions.removeRef(sectrans); if(keep) securityTransactions.setAutoDelete(true); break; } } } void Budget::addSplitTransaction(SplitTransaction *split) { splitTransactions.inSort(split); QVector::size_type c = split->splits.count(); for(QVector::size_type i = 0; i < c; i++) { addTransaction(split->splits[i]); } } void Budget::removeSplitTransaction(SplitTransaction *split, bool keep) { QVector::size_type c = split->splits.count(); for(QVector::size_type i = 0; i < c; i++) { Transaction *trans = split->splits[i]; transactions.removeRef(trans); switch(trans->type()) { case TRANSACTION_TYPE_EXPENSE: { expenses.setAutoDelete(false); expenses.removeRef((Expense*) trans); expenses.setAutoDelete(true); break; } case TRANSACTION_TYPE_INCOME: { incomes.setAutoDelete(false); incomes.removeRef((Income*) trans); if(((Income*) trans)->security()) ((Income*) trans)->security()->dividends.removeRef((Income*) trans); incomes.setAutoDelete(true); break; } case TRANSACTION_TYPE_TRANSFER: { transfers.setAutoDelete(false); transfers.removeRef((Transfer*) trans); transfers.setAutoDelete(true); break; } case TRANSACTION_TYPE_SECURITY_BUY: {} case TRANSACTION_TYPE_SECURITY_SELL: { SecurityTransaction *sectrans = (SecurityTransaction*) trans; sectrans->security()->removeQuotation(sectrans->date(), true); securityTransactions.setAutoDelete(false); sectrans->security()->transactions.removeRef(sectrans); securityTransactions.removeRef(sectrans); securityTransactions.setAutoDelete(true); break; } } } if(keep) splitTransactions.setAutoDelete(false); splitTransactions.removeRef(split); if(keep) splitTransactions.setAutoDelete(true); } void Budget::addScheduledTransaction(ScheduledTransaction *strans) { scheduledTransactions.inSort(strans); if(strans->transaction()) { if(strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) { ((SecurityTransaction*) strans->transaction())->security()->scheduledTransactions.inSort(strans); } else if(strans->transaction()->type() == TRANSACTION_TYPE_INCOME && ((Income*) strans->transaction())->security()) { ((Income*) strans->transaction())->security()->scheduledDividends.inSort(strans); } } } void Budget::removeScheduledTransaction(ScheduledTransaction *strans, bool keep) { if(strans->transaction()) { if(strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) { ((SecurityTransaction*) strans->transaction())->security()->scheduledTransactions.removeRef(strans); } else if(strans->transaction()->type() == TRANSACTION_TYPE_INCOME && ((Income*) strans->transaction())->security()) { ((Income*) strans->transaction())->security()->scheduledDividends.removeRef(strans); } } if(keep) scheduledTransactions.setAutoDelete(false); scheduledTransactions.removeRef(strans); if(keep) scheduledTransactions.setAutoDelete(true); } void Budget::addAccount(Account *account) { switch(account->type()) { case ACCOUNT_TYPE_EXPENSES: {expensesAccounts.inSort((ExpensesAccount*) account); break;} case ACCOUNT_TYPE_INCOMES: {incomesAccounts.inSort((IncomesAccount*) account); break;} case ACCOUNT_TYPE_ASSETS: {assetsAccounts.inSort((AssetsAccount*) account); break;} } accounts.inSort(account); } void Budget::removeAccount(Account *account, bool keep) { if(accountHasTransactions(account)) { Security *security = securities.first(); while(security) { if(security->account() == account) { removeSecurity(security); security = securities.current(); } else { security = securities.next(); } } SplitTransaction *split = splitTransactions.first(); while(split) { if(split->account() == account) { removeSplitTransaction(split); split = splitTransactions.current(); } split = splitTransactions.next(); } Transaction *trans = transactions.first(); while(trans) { if(trans->fromAccount() == account || trans->toAccount() == account) { removeTransaction(trans); trans = transactions.current(); } else { trans = transactions.next(); } } ScheduledTransaction *strans = scheduledTransactions.first(); while(strans) { if(strans->transaction()->fromAccount() == account || strans->transaction()->toAccount() == account) { removeScheduledTransaction(strans); strans = scheduledTransactions.current(); } else { strans = scheduledTransactions.next(); } } } accounts.removeRef(account); switch(account->type()) { case ACCOUNT_TYPE_EXPENSES: { if(keep) expensesAccounts.setAutoDelete(false); expensesAccounts.removeRef((ExpensesAccount*) account); if(keep) expensesAccounts.setAutoDelete(true); break; } case ACCOUNT_TYPE_INCOMES: { if(keep) incomesAccounts.setAutoDelete(false); incomesAccounts.removeRef((IncomesAccount*) account); if(keep) incomesAccounts.setAutoDelete(true); break; } case ACCOUNT_TYPE_ASSETS: { if(keep) assetsAccounts.setAutoDelete(false); assetsAccounts.removeRef((AssetsAccount*) account); if(keep) assetsAccounts.setAutoDelete(true); break; } } } bool Budget::accountHasTransactions(Account *account) { Security *security = securities.first(); while(security) { if(security->account() == account) return true; security = securities.next(); } SplitTransaction *split = splitTransactions.first(); while(split) { if(split->account() == account) return true; split = splitTransactions.next(); } Transaction *trans = transactions.first(); while(trans) { if(trans->fromAccount() == account || trans->toAccount() == account) return true; trans = transactions.next(); } ScheduledTransaction *strans = scheduledTransactions.first(); while(strans) { if(strans->transaction()->fromAccount() == account || strans->transaction()->toAccount() == account) return true; strans = scheduledTransactions.next(); } return false; } void Budget::moveTransactions(Account *account, Account *new_account) { if(account->type() == ACCOUNT_TYPE_ASSETS && new_account->type() == ACCOUNT_TYPE_ASSETS) { Security *security = securities.first(); while(security) { if(security->account() == account) security->setAccount((AssetsAccount*) new_account); security = securities.next(); } } SplitTransaction *split = splitTransactions.first(); while(split) { if(split->account() == account) split->setAccount((AssetsAccount*) new_account); split = splitTransactions.next(); } Transaction *trans = transactions.first(); while(trans) { if(trans->fromAccount() == account) trans->setFromAccount(new_account); if(trans->toAccount() == account) trans->setToAccount(new_account); trans = transactions.next(); } ScheduledTransaction *strans = scheduledTransactions.first(); while(strans) { if(strans->transaction()->fromAccount() == account) strans->transaction()->setFromAccount(new_account); if(strans->transaction()->toAccount() == account) strans->transaction()->setToAccount(new_account); strans = scheduledTransactions.next(); } } void Budget::transactionDateModified(Transaction *t, const QDate &olddate) { if(transactions.removeRef(t)) transactions.inSort(t); switch(t->type()) { case TRANSACTION_TYPE_EXPENSE: { Expense *e = (Expense*) t; expenses.setAutoDelete(false); if(expenses.removeRef(e)) expenses.inSort(e); expenses.setAutoDelete(true); break; } case TRANSACTION_TYPE_INCOME: { Income *i = (Income*) t; if(i->security()) { if(i->security()->dividends.removeRef(i)) i->security()->dividends.inSort(i); } incomes.setAutoDelete(false); if(incomes.removeRef(i)) incomes.inSort(i); incomes.setAutoDelete(true); break; } case TRANSACTION_TYPE_TRANSFER: { Transfer *tr = (Transfer*) t; transfers.setAutoDelete(false); if(transfers.removeRef(tr)) transfers.inSort(tr); transfers.setAutoDelete(true); break; } case TRANSACTION_TYPE_SECURITY_BUY: {} case TRANSACTION_TYPE_SECURITY_SELL: { SecurityTransaction *tr = (SecurityTransaction*) t; if(tr->security()->transactions.removeRef(tr)) tr->security()->transactions.inSort(tr); securityTransactions.setAutoDelete(false); if(securityTransactions.removeRef(tr)) securityTransactions.inSort(tr); securityTransactions.setAutoDelete(true); tr->security()->removeQuotation(olddate, true); tr->security()->setQuotation(tr->date(), tr->shareValue(), true); break; } } } void Budget::scheduledTransactionDateModified(ScheduledTransaction *strans) { if(strans->transaction()) { if(strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) { if(((SecurityTransaction*) strans->transaction())->security()->scheduledTransactions.removeRef(strans)) ((SecurityTransaction*) strans->transaction())->security()->scheduledTransactions.inSort(strans); } else if(strans->transaction()->type() == TRANSACTION_TYPE_INCOME && ((Income*) strans->transaction())->security()) { if(((Income*) strans->transaction())->security()->scheduledDividends.removeRef(strans)) ((Income*) strans->transaction())->security()->scheduledDividends.inSort(strans); } } scheduledTransactions.setAutoDelete(false); if(scheduledTransactions.removeRef(strans)) scheduledTransactions.inSort(strans); scheduledTransactions.setAutoDelete(true); } void Budget::splitTransactionDateModified(SplitTransaction *split, const QDate&) { splitTransactions.setAutoDelete(false); if(splitTransactions.removeRef(split)) splitTransactions.inSort(split); splitTransactions.setAutoDelete(true); } void Budget::accountNameModified(Account *account) { if(accounts.removeRef(account)) accounts.inSort(account); switch(account->type()) { case ACCOUNT_TYPE_EXPENSES: { ExpensesAccount *eaccount = (ExpensesAccount*) account; expensesAccounts.setAutoDelete(false); if(expensesAccounts.removeRef(eaccount)) expensesAccounts.inSort(eaccount); expensesAccounts.setAutoDelete(true); break; } case ACCOUNT_TYPE_INCOMES: { IncomesAccount *iaccount = (IncomesAccount*) account; incomesAccounts.setAutoDelete(false); if(incomesAccounts.removeRef(iaccount)) incomesAccounts.inSort(iaccount); incomesAccounts.setAutoDelete(true); break; } case ACCOUNT_TYPE_ASSETS: { AssetsAccount *aaccount = (AssetsAccount*) account; assetsAccounts.setAutoDelete(false); if(assetsAccounts.removeRef(aaccount)) assetsAccounts.inSort(aaccount); assetsAccounts.setAutoDelete(true); break; } } } void Budget::addSecurity(Security *security) { securities.inSort(security); } void Budget::removeSecurity(Security *security, bool keep) { if(securityHasTransactions(security)) { SecurityTransaction *trans = security->transactions.first(); while(trans) { transactions.removeRef(trans); securityTransactions.removeRef(trans); trans = security->transactions.next(); } Income *i = security->dividends.first(); while(i) { transactions.removeRef(i); incomes.removeRef(i); i = security->dividends.next(); } ScheduledTransaction *strans = security->scheduledTransactions.first(); while(strans) { scheduledTransactions.removeRef(strans); strans = security->scheduledTransactions.next(); } strans = security->scheduledDividends.first(); while(strans) { scheduledTransactions.removeRef(strans); strans = security->scheduledDividends.next(); } SecurityTrade *ts = security->tradedShares.first(); while(ts) { ts->from_security->tradedShares.removeRef(ts); ts->to_security->tradedShares.removeRef(ts); securityTrades.removeRef(ts); ts = security->tradedShares.next(); } } if(keep) securities.setAutoDelete(false); securities.removeRef(security); if(keep) securities.setAutoDelete(true); } bool Budget::securityHasTransactions(Security *security) { return security->reinvestedDividends.count() > 0 || security->tradedShares.count() > 0 || security->transactions.count() > 0 || security->dividends.count() > 0 || security->scheduledTransactions.count() > 0 || security->scheduledDividends.count() > 0; } void Budget::securityNameModified(Security *security) { securities.setAutoDelete(false); if(securities.removeRef(security)) { securities.inSort(security); } securities.setAutoDelete(true); } Security *Budget::findSecurity(QString name) { Security *sec = securities.first(); while(sec) { if(sec->name() == name) return sec; sec = securities.next(); } return NULL; } void Budget::addSecurityTrade(SecurityTrade *ts) { securityTrades.inSort(ts); ts->from_security->tradedShares.inSort(ts); ts->to_security->tradedShares.inSort(ts); ts->from_security->setQuotation(ts->date, ts->value / ts->from_shares, true); ts->to_security->setQuotation(ts->date, ts->value / ts->to_shares, true); } void Budget::removeSecurityTrade(SecurityTrade *ts, bool keep) { ts->from_security->tradedShares.removeRef(ts); ts->to_security->tradedShares.removeRef(ts); ts->from_security->removeQuotation(ts->date, true); ts->to_security->removeQuotation(ts->date, true); if(keep) securityTrades.setAutoDelete(false); securityTrades.removeRef(ts); if(keep) securityTrades.setAutoDelete(true); } void Budget::securityTradeDateModified(SecurityTrade *ts, const QDate &olddate) { securityTrades.setAutoDelete(false); if(securityTrades.removeRef(ts)) { securityTrades.inSort(ts); } securityTrades.setAutoDelete(true); if(ts->from_security->tradedShares.removeRef(ts)) { ts->from_security->tradedShares.inSort(ts); } if(ts->to_security->tradedShares.removeRef(ts)) { ts->to_security->tradedShares.inSort(ts); } ts->from_security->removeQuotation(olddate, true); ts->to_security->removeQuotation(olddate, true); ts->from_security->setQuotation(ts->date, ts->value / ts->from_shares, true); ts->to_security->setQuotation(ts->date, ts->value / ts->to_shares, true); } Account *Budget::findAccount(QString name) { Account *account = accounts.first(); while(account) { if(account->name() == name) return account; account = accounts.next(); } return NULL; } AssetsAccount *Budget::findAssetsAccount(QString name) { AssetsAccount *account = assetsAccounts.first(); while(account) { if(account->name() == name) return account; account = assetsAccounts.next(); } return NULL; } IncomesAccount *Budget::findIncomesAccount(QString name) { IncomesAccount *account = incomesAccounts.first(); while(account) { if(account->name() == name) return account; account = incomesAccounts.next(); } return NULL; } ExpensesAccount *Budget::findExpensesAccount(QString name) { ExpensesAccount *account = expensesAccounts.first(); while(account) { if(account->name() == name) return account; account = expensesAccounts.next(); } return NULL; } eqonomize-0.6/src/budget.h0000644000175000017500000001474111106576652014553 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef BUDGET_H #define BUDGET_H #include #include #include #include "account.h" #include "transaction.h" #include "security.h" static bool transaction_list_less_than(Transaction *t1, Transaction *t2) { return t1->date() < t2->date(); } static bool split_list_less_than(SplitTransaction *t1, SplitTransaction *t2) { return t1->date() < t2->date(); } static bool schedule_list_less_than(ScheduledTransaction *t1, ScheduledTransaction *t2) { return t1->transaction()->date() < t2->transaction()->date(); } static bool trade_list_less_than(SecurityTrade *t1, SecurityTrade *t2) { return t1->date < t2->date; } static bool security_list_less_than(Security *t1, Security *t2) { return QString::localeAwareCompare(t1->name(), t2->name()) < 0; } static bool account_list_less_than(Account *t1, Account *t2) { return QString::localeAwareCompare(t1->name(), t2->name()) < 0; } template class TransactionList : public EqonomizeList { public: TransactionList() : EqonomizeList() {}; void sort() { qSort(QList::begin(), QList::end(), transaction_list_less_than); } void inSort(type value) { QList::append(value); sort(); } }; template class SplitTransactionList : public EqonomizeList { public: SplitTransactionList() : EqonomizeList() {}; void sort() { qSort(QList::begin(), QList::end(), split_list_less_than); } void inSort(type value) { QList::append(value); sort(); } }; template class ScheduledTransactionList : public EqonomizeList { public: ScheduledTransactionList() : EqonomizeList() {}; void sort() { qSort(QList::begin(), QList::end(), schedule_list_less_than); } void inSort(type value) { QList::append(value); sort(); } }; template class AccountList : public EqonomizeList { public: AccountList() : EqonomizeList() {}; void sort() { qSort(QList::begin(), QList::end(), account_list_less_than); } void inSort(type value) { QList::append(value); sort(); } }; template class SecurityList : public EqonomizeList { public: SecurityList() : EqonomizeList() {}; void sort() { qSort(QList::begin(), QList::end(), security_list_less_than); } void inSort(type value) { QList::append(value); sort(); } }; template class SecurityTradeList : public EqonomizeList { public: SecurityTradeList() : EqonomizeList() {}; void sort() { qSort(QList::begin(), QList::end(), trade_list_less_than); } void inSort(type value) { QList::append(value); sort(); } }; class Budget { public: Budget(); ~Budget(); QString loadFile(QString filename, QString &errors); QString saveFile(QString filename, mode_t perms = 0600); void clear(); void addTransaction(Transaction*); void removeTransaction(Transaction*, bool keep = false); void addScheduledTransaction(ScheduledTransaction*); void removeScheduledTransaction(ScheduledTransaction*, bool keep = false); void addSplitTransaction(SplitTransaction*); void removeSplitTransaction(SplitTransaction*, bool keep = false); void addAccount(Account*); void removeAccount(Account*, bool keep = false); bool accountHasTransactions(Account*); void moveTransactions(Account*, Account*); void addSecurity(Security*); void removeSecurity(Security*, bool keep = false); Security *findSecurity(QString name); bool securityHasTransactions(Security*); void scheduledTransactionDateModified(ScheduledTransaction*); void transactionDateModified(Transaction*, const QDate &olddate); void splitTransactionDateModified(SplitTransaction*, const QDate &olddate); void accountNameModified(Account*); void securityNameModified(Security*); void securityTradeDateModified(SecurityTrade*, const QDate &olddate); void addSecurityTrade(SecurityTrade*); void removeSecurityTrade(SecurityTrade*, bool keep = false); Account *findAccount(QString name); AssetsAccount *findAssetsAccount(QString name); IncomesAccount *findIncomesAccount(QString name); ExpensesAccount *findExpensesAccount(QString name); AccountList incomesAccounts; AccountList expensesAccounts; AccountList assetsAccounts; AccountList accounts; AssetsAccount *balancingAccount, *budgetAccount; TransactionList expenses; TransactionList incomes; TransactionList transfers; TransactionList transactions; TransactionList securityTransactions; ScheduledTransactionList scheduledTransactions; SplitTransactionList splitTransactions; SecurityList securities; SecurityTradeList securityTrades; QMap incomesAccounts_id; QMap expensesAccounts_id; QMap assetsAccounts_id; QMap securities_id; }; #endif eqonomize-0.6/src/categoriescomparisonchart.cpp0000644000175000017500000007721111106576657021104 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "categoriescomparisonchart.h" #include "budget.h" #include "account.h" #include "transaction.h" #include "recurrence.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern double monthsBetweenDates(const QDate &date1, const QDate &date2); CategoriesComparisonChart::CategoriesComparisonChart(Budget *budg, QWidget *parent) : QWidget(parent), budget(budg) { setAttribute(Qt::WA_DeleteOnClose, true); const KCalendarSystem *calSys = KGlobal::locale()->calendar(); QDate first_date; Transaction *trans = budget->transactions.first(); while(trans) { if(trans->fromAccount()->type() != ACCOUNT_TYPE_ASSETS || trans->toAccount()->type() != ACCOUNT_TYPE_ASSETS) { first_date = trans->date(); break; } trans = budget->transactions.next(); } to_date = QDate::currentDate(); from_date = calSys->addDays(calSys->addYears(to_date, -1), 1); if(first_date.isNull()) { from_date = to_date; } else if(from_date < first_date) { from_date = first_date; } QVBoxLayout *layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); KDialogButtonBox *buttons = new KDialogButtonBox(this); saveButton = buttons->addButton(KStandardGuiItem::saveAs(), QDialogButtonBox::ActionRole); printButton = buttons->addButton(KStandardGuiItem::print(), QDialogButtonBox::ActionRole); layout->addWidget(buttons); scene = NULL; view = new QGraphicsView(this); view->setRenderHint(QPainter::Antialiasing, true); view->setRenderHint(QPainter::HighQualityAntialiasing, true); layout->addWidget(view); QGroupBox *settingsWidget = new QGroupBox(i18n("Options"), this); QVBoxLayout *settingsLayout = new QVBoxLayout(settingsWidget); QHBoxLayout *choicesLayout = new QHBoxLayout(); settingsLayout->addLayout(choicesLayout); fromButton = new QCheckBox(i18n("From"), settingsWidget); fromButton->setChecked(true); choicesLayout->addWidget(fromButton); fromEdit = new KDateEdit(settingsWidget); fromEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); fromEdit->setDate(from_date); choicesLayout->addWidget(fromEdit); choicesLayout->addWidget(new QLabel(i18n("To"), settingsWidget)); toEdit = new KDateEdit(settingsWidget); toEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); toEdit->setDate(to_date); choicesLayout->addWidget(toEdit); prevYearButton = new KPushButton(KIcon("arrow-left-double"), "", settingsWidget); choicesLayout->addWidget(prevYearButton); prevMonthButton = new KPushButton(KIcon("arrow-left"), "", settingsWidget); choicesLayout->addWidget(prevMonthButton); nextMonthButton = new KPushButton(KIcon("arrow-right"), "", settingsWidget); choicesLayout->addWidget(nextMonthButton); nextYearButton = new KPushButton(KIcon("arrow-right-double"), "", settingsWidget); choicesLayout->addWidget(nextYearButton); choicesLayout->addStretch(1); QHBoxLayout *typeLayout = new QHBoxLayout(); settingsLayout->addLayout(typeLayout); typeLayout->addWidget(new QLabel(i18n("Source:"), settingsWidget)); sourceCombo = new KComboBox(settingsWidget); sourceCombo->setEditable(false); sourceCombo->addItem(i18n("All Expenses")); sourceCombo->addItem(i18n("All Incomes")); sourceCombo->addItem(i18n("All Accounts")); Account *account = budget->expensesAccounts.first(); while(account) { sourceCombo->addItem(i18n("Expenses: %1").arg(account->name())); account = budget->expensesAccounts.next(); } account = budget->incomesAccounts.first(); while(account) { sourceCombo->addItem(i18n("Incomes: %1").arg(account->name())); account = budget->incomesAccounts.next(); } typeLayout->addWidget(sourceCombo); typeLayout->addStretch(1); current_account = NULL; layout->addWidget(settingsWidget); connect(sourceCombo, SIGNAL(activated(int)), this, SLOT(sourceChanged(int))); connect(prevMonthButton, SIGNAL(clicked()), this, SLOT(prevMonth())); connect(nextMonthButton, SIGNAL(clicked()), this, SLOT(nextMonth())); connect(prevYearButton, SIGNAL(clicked()), this, SLOT(prevYear())); connect(nextYearButton, SIGNAL(clicked()), this, SLOT(nextYear())); connect(fromButton, SIGNAL(toggled(bool)), fromEdit, SLOT(setEnabled(bool))); connect(fromButton, SIGNAL(toggled(bool)), this, SLOT(updateDisplay())); connect(fromEdit, SIGNAL(dateChanged(const QDate&)), this, SLOT(fromChanged(const QDate&))); connect(toEdit, SIGNAL(dateChanged(const QDate&)), this, SLOT(toChanged(const QDate&))); connect(saveButton, SIGNAL(clicked()), this, SLOT(save())); connect(printButton, SIGNAL(clicked()), this, SLOT(print())); } CategoriesComparisonChart::~CategoriesComparisonChart() { } void CategoriesComparisonChart::sourceChanged(int index) { fromButton->setEnabled(index != 2); fromEdit->setEnabled(index != 2); updateDisplay(); } void CategoriesComparisonChart::saveConfig() { KConfigGroup config = KGlobal::config()->group("Categories Comparison Chart"); ((KDialog*) parent())->saveDialogSize(config); } void CategoriesComparisonChart::toChanged(const QDate &date) { bool error = false; if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); error = true; } if(!error && fromEdit->date() > date) { if(fromButton->isChecked() && fromButton->isEnabled()) { KMessageBox::error(this, i18n("To date is before from date.")); } from_date = date; fromEdit->blockSignals(true); fromEdit->setDate(from_date); fromEdit->blockSignals(false); } if(error) { toEdit->setFocus(); toEdit->blockSignals(true); toEdit->setDate(to_date); toEdit->blockSignals(false); toEdit->lineEdit()->selectAll(); return; } to_date = date; updateDisplay(); } void CategoriesComparisonChart::fromChanged(const QDate &date) { bool error = false; if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); error = true; } if(!error && date > toEdit->date()) { KMessageBox::error(this, i18n("From date is after to date.")); to_date = date; toEdit->blockSignals(true); toEdit->setDate(to_date); toEdit->blockSignals(false); } if(error) { fromEdit->setFocus(); fromEdit->blockSignals(true); fromEdit->setDate(from_date); fromEdit->blockSignals(false); fromEdit->lineEdit()->selectAll(); return; } from_date = date; if(fromButton->isChecked()) updateDisplay(); } void CategoriesComparisonChart::prevMonth() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); fromEdit->blockSignals(true); toEdit->blockSignals(true); from_date = calSys->addMonths(from_date, -1); fromEdit->setDate(from_date); if(calSys->day(to_date) == calSys->daysInMonth(to_date)) { to_date = calSys->addMonths(to_date, -1); calSys->setYMD(to_date, calSys->year(to_date), calSys->month(to_date), calSys->daysInMonth(to_date)); } else { to_date = calSys->addMonths(to_date, -1); } toEdit->setDate(to_date); fromEdit->blockSignals(false); toEdit->blockSignals(false); updateDisplay(); } void CategoriesComparisonChart::nextMonth() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); fromEdit->blockSignals(true); toEdit->blockSignals(true); from_date = calSys->addMonths(from_date, 1); fromEdit->setDate(from_date); if(calSys->day(to_date) == calSys->daysInMonth(to_date)) { to_date = calSys->addMonths(to_date, 1); calSys->setYMD(to_date, calSys->year(to_date), calSys->month(to_date), calSys->daysInMonth(to_date)); } else { to_date = calSys->addMonths(to_date, 1); } toEdit->setDate(to_date); fromEdit->blockSignals(false); toEdit->blockSignals(false); updateDisplay(); } void CategoriesComparisonChart::prevYear() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); fromEdit->blockSignals(true); toEdit->blockSignals(true); from_date = calSys->addYears(from_date, -1); fromEdit->setDate(from_date); if(calSys->day(to_date) == calSys->daysInMonth(to_date)) { to_date = calSys->addYears(to_date, -1); calSys->setYMD(to_date, calSys->year(to_date), calSys->month(to_date), calSys->daysInMonth(to_date)); } else { to_date = calSys->addYears(to_date, -1); } toEdit->setDate(to_date); fromEdit->blockSignals(false); toEdit->blockSignals(false); updateDisplay(); } void CategoriesComparisonChart::nextYear() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); fromEdit->blockSignals(true); toEdit->blockSignals(true); from_date = calSys->addYears(from_date, 1); fromEdit->setDate(from_date); if(calSys->day(to_date) == calSys->daysInMonth(to_date)) { to_date = calSys->addYears(to_date, 1); calSys->setYMD(to_date, calSys->year(to_date), calSys->month(to_date), calSys->daysInMonth(to_date)); } else { to_date = calSys->addYears(to_date, 1); } toEdit->setDate(to_date); fromEdit->blockSignals(false); toEdit->blockSignals(false); updateDisplay(); } void CategoriesComparisonChart::save() { if(!scene) return; KFileDialog *dialog = new KFileDialog(KUrl(), QString::null, this); QStringList filter; filter << "image/png"; if(QImageWriter::supportedImageFormats().contains("GIF")) { filter << "image/gif"; } if(QImageWriter::supportedImageFormats().contains("JPEG")) { filter << "image/jpeg"; } filter << "image/x-bmp"; filter << "image/x-xbm"; filter << "image/x-xpm"; filter << "image/x-portable-pixmap"; dialog->setMimeFilter(filter, "image/png"); dialog->setOperationMode(KFileDialog::Saving); dialog->setMode(KFile::File); if(dialog->exec() != QDialog::Accepted) {dialog->deleteLater(); return;} KUrl url = dialog->selectedUrl(); QString current_filter = dialog->currentFilter(); dialog->deleteLater(); if(url.isEmpty() && url.isValid()) return; if(url.isLocalFile()) { if(QFile::exists(url.path())) { if(KMessageBox::warningYesNo(this, i18n("The selected file already exists. Would you like to overwrite the old copy?")) != KMessageBox::Yes) return; } QFileInfo info(url.path()); if(info.isDir()) { KMessageBox::error(this, i18n("You selected a directory!")); return; } KSaveFile ofile(url.path()); ofile.open(); ofile.setPermissions((QFile::Permissions) 0x0660); if(!ofile.isOpen()) { ofile.abort(); KMessageBox::error(this, i18n("Couldn't open file for writing.")); return; } QRectF rect = scene->sceneRect(); rect.setX(0); rect.setY(0); rect.setRight(rect.right() + 20); rect.setBottom(rect.bottom() + 20); QPixmap pixmap((int) ceil(rect.width()), (int) ceil(rect.height())); QPainter p(&pixmap); p.setRenderHint(QPainter::Antialiasing, true); scene->render(&p, QRectF(), rect); if(current_filter == "image/png") {pixmap.save(&ofile, "PNG");} else if(current_filter == "image/x-bmp") {pixmap.save(&ofile, "BMP");} else if(current_filter == "image/x-xbm") {pixmap.save(&ofile, "XBM");} else if(current_filter == "image/x-xpm") {pixmap.save(&ofile, "XPM");} else if(current_filter == "image/x-portable-pixmap") {pixmap.save(&ofile, "PPM");} else if(current_filter == "image/gif") {pixmap.save(&ofile, "GIF");} else if(current_filter == "image/jpeg") {pixmap.save(&ofile, "JPEG");} if(!ofile.finalize()) { KMessageBox::error(this, i18n("Error while writing file; file was not saved.")); return; } return; } KTemporaryFile tf; tf.open(); tf.setAutoRemove(true); QRectF rect = scene->sceneRect(); rect.setX(0); rect.setY(0); rect.setRight(rect.right() + 20); rect.setBottom(rect.bottom() + 20); QPixmap pixmap((int) ceil(rect.width()), (int) ceil(rect.height())); QPainter p(&pixmap); p.setRenderHint(QPainter::Antialiasing, true); scene->render(&p, QRectF(), rect); if(current_filter == "image/png") {pixmap.save(&tf, "PNG");} else if(current_filter == "image/x-bmp") {pixmap.save(&tf, "BMP");} else if(current_filter == "image/x-xbm") {pixmap.save(&tf, "XBM");} else if(current_filter == "image/x-xpm") {pixmap.save(&tf, "XPM");} else if(current_filter == "image/x-portable-pixmap") {pixmap.save(&tf, "PPM");} else if(current_filter == "image/gif") {pixmap.save(&tf, "GIF");} else if(current_filter == "image/jpeg") {pixmap.save(&tf, "JPEG");} KIO::NetAccess::upload(tf.fileName(), url, this); } void CategoriesComparisonChart::print() { if(!scene) return; QPrinter pr; QPrintDialog *dialog = new QPrintDialog(&pr, this); if(dialog->exec() == QDialog::Accepted) { QPainter p(&pr); p.setRenderHint(QPainter::Antialiasing, true); QRectF rect = scene->sceneRect(); rect.setX(0); rect.setY(0); rect.setRight(rect.right() + 20); rect.setBottom(rect.bottom() + 20); scene->render(&p, QRectF(), rect); p.end(); } } QColor getColor(int index) { switch(index) { case 0: {return Qt::red;} case 1: {return Qt::green;} case 2: {return Qt::blue;} case 3: {return Qt::cyan;} case 4: {return Qt::magenta;} case 5: {return Qt::yellow;} case 6: {return Qt::darkRed;} case 7: {return Qt::darkGreen;} case 8: {return Qt::darkBlue;} case 9: {return Qt::darkCyan;} case 10: {return Qt::darkMagenta;} case 11: {return Qt::darkYellow;} default: {return Qt::gray;} } } QBrush getBrush(int index) { QBrush brush; switch(index / 12) { case 0: {brush.setStyle(Qt::SolidPattern); break;} case 1: {brush.setStyle(Qt::HorPattern); break;} case 2: {brush.setStyle(Qt::VerPattern); break;} case 3: {brush.setStyle(Qt::Dense5Pattern); break;} case 4: {brush.setStyle(Qt::CrossPattern); break;} default: {} } brush.setColor(getColor(index % 12)); return brush; } void CategoriesComparisonChart::updateDisplay() { QMap values; QMap counts; QMap desc_values; QMap desc_counts; double value_count = 0.0; double value = 0.0; current_account = NULL; AccountType type; switch(sourceCombo->currentIndex()) { case 0: { type = ACCOUNT_TYPE_EXPENSES; Account *account = budget->expensesAccounts.first(); while(account) { values[account] = 0.0; counts[account] = 0.0; account = budget->expensesAccounts.next(); } break; } case 1: { type = ACCOUNT_TYPE_INCOMES; Account *account = budget->incomesAccounts.first(); while(account) { values[account] = 0.0; counts[account] = 0.0; account = budget->incomesAccounts.next(); } break; } case 2: { type = ACCOUNT_TYPE_ASSETS; AssetsAccount *account = budget->assetsAccounts.first(); while(account) { if(account != budget->balancingAccount) { if(account->accountType() == ASSETS_TYPE_SECURITIES) { values[account] = 0.0; } else { values[account] = account->initialBalance(); value += account->initialBalance(); } counts[account] = 0.0; } account = budget->assetsAccounts.next(); } break; } default: { type = ACCOUNT_TYPE_EXPENSES; int i = sourceCombo->currentIndex() - 3; if(i < (int) budget->expensesAccounts.count()) current_account = budget->expensesAccounts.at(i); else current_account = budget->incomesAccounts.at(i - budget->expensesAccounts.count()); if(current_account) { type = current_account->type(); Transaction *trans = budget->transactions.first(); while(trans) { if((trans->fromAccount() == current_account || trans->toAccount() == current_account)) { desc_values[trans->description()] = 0.0; desc_counts[trans->description()] = 0.0; } trans = budget->transactions.next(); } } } } QDate first_date; bool first_date_reached = false; if(type == ACCOUNT_TYPE_ASSETS) { first_date_reached = true; } else if(fromButton->isChecked()) { first_date = from_date; } else { Transaction *trans = budget->transactions.first(); while(trans) { if(trans->fromAccount()->type() != ACCOUNT_TYPE_ASSETS || trans->toAccount()->type() != ACCOUNT_TYPE_ASSETS) { first_date = trans->date(); break; } trans = budget->transactions.next(); } if(first_date.isNull()) first_date = QDate::currentDate(); if(first_date > to_date) first_date = to_date; } Transaction *trans = budget->transactions.first(); while(trans) { if(!first_date_reached && trans->date() >= first_date) first_date_reached = true; else if(first_date_reached && trans->date() > to_date) break; if(first_date_reached) { if(current_account) { if(trans->fromAccount() == current_account) { if(type == ACCOUNT_TYPE_EXPENSES) {desc_values[trans->description()] -= trans->value(); value -= trans->value();} else {desc_values[trans->description()] += trans->value(); value += trans->value();} desc_counts[trans->description()] += trans->quantity(); value_count += trans->quantity(); } else if(trans->toAccount() == current_account) { if(type == ACCOUNT_TYPE_EXPENSES) {desc_values[trans->description()] += trans->value(); value += trans->value();} else {desc_values[trans->description()] -= trans->value(); value -= trans->value();} desc_counts[trans->description()] += trans->quantity(); value_count += trans->quantity(); } } else if(type == ACCOUNT_TYPE_ASSETS) { if(trans->fromAccount()->type() == ACCOUNT_TYPE_ASSETS && trans->fromAccount() != budget->balancingAccount) { if(((AssetsAccount*) trans->fromAccount())->accountType() != ASSETS_TYPE_SECURITIES) { values[trans->fromAccount()] -= trans->value(); value -= trans->value(); } if(trans->toAccount() != budget->balancingAccount) { counts[trans->fromAccount()] += trans->quantity(); value_count += trans->quantity(); } } if(trans->toAccount()->type() == ACCOUNT_TYPE_ASSETS && trans->toAccount() != budget->balancingAccount) { if(((AssetsAccount*) trans->toAccount())->accountType() != ASSETS_TYPE_SECURITIES) { values[trans->toAccount()] += trans->value(); value += trans->value(); } if(trans->fromAccount() != budget->balancingAccount) { counts[trans->toAccount()] += trans->quantity(); value_count += trans->quantity(); } } } else if(type == ACCOUNT_TYPE_EXPENSES) { if(trans->fromAccount()->type() == ACCOUNT_TYPE_EXPENSES) { values[trans->fromAccount()] -= trans->value(); value -= trans->value(); counts[trans->fromAccount()] += trans->quantity(); value_count += trans->quantity(); } else if(trans->toAccount()->type() == ACCOUNT_TYPE_EXPENSES) { values[trans->toAccount()] += trans->value(); value += trans->value(); counts[trans->toAccount()] += trans->quantity(); value_count += trans->quantity(); } } else { if(trans->fromAccount()->type() == ACCOUNT_TYPE_INCOMES) { values[trans->fromAccount()] += trans->value(); value += trans->value(); counts[trans->fromAccount()] += trans->quantity(); value_count += trans->quantity(); } else if(trans->toAccount()->type() == ACCOUNT_TYPE_INCOMES) { values[trans->toAccount()] -= trans->value(); value -= trans->value(); counts[trans->toAccount()] += trans->quantity(); value_count += trans->quantity(); } } } trans = budget->transactions.next(); } first_date_reached = false; ScheduledTransaction *strans = budget->scheduledTransactions.first(); while(strans) { trans = strans->transaction(); if(!first_date_reached && trans->date() >= first_date) first_date_reached = true; else if(first_date_reached && trans->date() > to_date) break; if(first_date_reached) { if(current_account) { if(trans->fromAccount() == current_account) { int count = strans->recurrence() ? strans->recurrence()->countOccurrences(first_date, to_date) : 1; if(type == ACCOUNT_TYPE_EXPENSES) {desc_values[trans->description()] -= trans->value() * count; value -= trans->value() * count;} else {desc_values[trans->description()] += trans->value() * count; value += trans->value() * count;} desc_counts[trans->description()] += count * trans->quantity(); value_count += count * trans->quantity(); } else if(trans->toAccount() == current_account) { int count = strans->recurrence() ? strans->recurrence()->countOccurrences(first_date, to_date) : 1; if(type == ACCOUNT_TYPE_EXPENSES) {desc_values[trans->description()] += trans->value() * count; value += trans->value() * count;} else {desc_values[trans->description()] -= trans->value() * count; value -= trans->value() * count;} desc_counts[trans->description()] += count * trans->quantity(); value_count += count * trans->quantity(); } } else if(type == ACCOUNT_TYPE_ASSETS) { if(trans->fromAccount()->type() == ACCOUNT_TYPE_ASSETS && trans->fromAccount() != budget->balancingAccount) { int count = strans->recurrence() ? strans->recurrence()->countOccurrences(to_date) : 1; if(trans->toAccount() != budget->balancingAccount) { counts[trans->fromAccount()] += count * trans->quantity(); value_count += count * trans->quantity(); } if(((AssetsAccount*) trans->fromAccount())->accountType() != ASSETS_TYPE_SECURITIES) { values[trans->fromAccount()] -= trans->value() * count; value -= trans->value() * count; } } if(trans->toAccount()->type() == ACCOUNT_TYPE_ASSETS && trans->toAccount() != budget->balancingAccount) { int count = strans->recurrence() ? strans->recurrence()->countOccurrences(to_date) : 1; if(trans->fromAccount() != budget->balancingAccount) { counts[trans->toAccount()] += count * trans->quantity(); value_count += count * trans->quantity(); } if(((AssetsAccount*) trans->toAccount())->accountType() != ASSETS_TYPE_SECURITIES) { values[trans->toAccount()] += trans->value() * count; value += trans->value() * count; } } } else if(type == ACCOUNT_TYPE_EXPENSES) { if(trans->fromAccount()->type() == ACCOUNT_TYPE_EXPENSES) { int count = strans->recurrence() ? strans->recurrence()->countOccurrences(first_date, to_date) : 1; counts[trans->fromAccount()] += count * trans->quantity(); values[trans->fromAccount()] -= trans->value() * count; value_count += count * trans->quantity(); value -= trans->value() * count; } else if(trans->toAccount()->type() == ACCOUNT_TYPE_EXPENSES) { int count = strans->recurrence() ? strans->recurrence()->countOccurrences(first_date, to_date) : 1; counts[trans->toAccount()] += count * trans->quantity(); values[trans->toAccount()] += trans->value() * count; value_count += count * trans->quantity(); value += trans->value() * count; } } else { if(trans->fromAccount()->type() == ACCOUNT_TYPE_INCOMES) { int count = strans->recurrence() ? strans->recurrence()->countOccurrences(first_date, to_date) : 1; counts[trans->fromAccount()] += count; values[trans->fromAccount()] += trans->value() * count; value_count += count; value += trans->value() * count; } else if(trans->toAccount()->type() == ACCOUNT_TYPE_INCOMES) { int count = strans->recurrence() ? strans->recurrence()->countOccurrences(first_date, to_date) : 1; counts[trans->toAccount()] += count; values[trans->toAccount()] -= trans->value() * count; value_count += count; value -= trans->value() * count; } } } strans = budget->scheduledTransactions.next(); } if(type == ACCOUNT_TYPE_ASSETS) { Security *security = budget->securities.first(); while(security) { double val = security->value(to_date); values[security->account()] += val; value += val; security = budget->securities.next(); } } /*int days = first_date.daysTo(to_date) + 1; double months = monthsBetweenDates(first_date, to_date), years = yearsBetweenDates(first_date, to_date);*/ QGraphicsScene *oldscene = scene; scene = new QGraphicsScene(this); scene->setBackgroundBrush(Qt::white); QFont legend_font = font(); QFontMetrics fm(legend_font); int fh = fm.height(); int diameter = 430; int margin = 35; int legend_x = diameter + margin * 2; Account *account = NULL; QMap::iterator it_desc = desc_values.begin(); QMap::iterator it_desc_end = desc_values.end(); int n = 0; if(current_account) { n = desc_values.count(); } else if(type == ACCOUNT_TYPE_ASSETS) { account = budget->assetsAccounts.first(); if(account == budget->balancingAccount) account = budget->assetsAccounts.next(); n = budget->assetsAccounts.count() - 1; } else if(type == ACCOUNT_TYPE_EXPENSES) { account = budget->expensesAccounts.first(); n = budget->expensesAccounts.count(); } else { account = budget->incomesAccounts.first(); n = budget->incomesAccounts.count(); } int index = 0; int text_width = 0; double value_bak = value; while((current_account && it_desc != it_desc_end) || account) { bool b_empty = false; QString legend_string; double legend_value = 0.0; if(current_account) { if(it_desc.key().isEmpty()) { legend_string = i18n("No description"); } else { legend_string = it_desc.key(); } legend_value = it_desc.value(); } else { legend_string = account->name(); legend_value = values[account]; } legend_value = (legend_value * 100) / value_bak; int deci = 0; if(legend_value < 10.0 && legend_value > -10.0) { legend_value = round(legend_value * 10.0) / 10.0; deci = 1; } else { legend_value = round(legend_value); } QGraphicsSimpleTextItem *legend_text = new QGraphicsSimpleTextItem(QString("%1 (%2\%)").arg(legend_string).arg(KGlobal::locale()->formatNumber(legend_value, deci))); int index_bak = index; if(b_empty) index = n - 1; if(legend_text->boundingRect().width() > text_width) text_width = legend_text->boundingRect().width(); legend_text->setFont(legend_font); legend_text->setBrush(Qt::black); legend_text->setPos(legend_x + 10 + fh + 5, margin + 10 + (fh + 5) * index); scene->addItem(legend_text); if(current_account) { if(it_desc.value() < 0.0) { value -= it_desc.value(); *it_desc = 0.0; } } else { if(values[account] < 0.0) { value -= values[account]; values[account] = 0.0; } } if(current_account) { ++it_desc; } else if(type == ACCOUNT_TYPE_ASSETS) { account = budget->assetsAccounts.next(); if(account == budget->balancingAccount) account = budget->assetsAccounts.next(); } else if(type == ACCOUNT_TYPE_EXPENSES) account = budget->expensesAccounts.next(); else account = budget->incomesAccounts.next(); if(b_empty) index = index_bak; else index++; } if(current_account) { } else if(type == ACCOUNT_TYPE_ASSETS) { account = budget->assetsAccounts.first(); if(account == budget->balancingAccount) account = budget->assetsAccounts.next(); } else if(type == ACCOUNT_TYPE_EXPENSES) { account = budget->expensesAccounts.first(); } else { account = budget->incomesAccounts.first(); } it_desc = desc_values.begin(); it_desc_end = desc_values.end(); index = 0; double current_value = 0.0; int prev_end = 0; while((current_account && it_desc != it_desc_end) || account) { if(current_account) current_value += it_desc.value(); else current_value += values[account]; int next_end = (int) lround((current_value * 360 * 16) / value); int length = (next_end - prev_end); QGraphicsEllipseItem *ellipse = new QGraphicsEllipseItem(-diameter/ 2.0, -diameter/ 2.0, diameter, diameter); ellipse->setStartAngle(prev_end); ellipse->setSpanAngle(length); prev_end = next_end; bool b_empty = false; if(current_account && it_desc.key().isEmpty()) {b_empty = true;} int index_bak = index; if(b_empty) index = n - 1; ellipse->setPen(Qt::NoPen); ellipse->setBrush(getBrush(index)); ellipse->setPos(diameter / 2 + margin, diameter / 2 + margin); scene->addItem(ellipse); QGraphicsRectItem *legend_box = new QGraphicsRectItem(legend_x + 10, margin + 10 + (fh + 5) * index, fh, fh); legend_box->setPen(QPen(Qt::black)); legend_box->setBrush(getBrush(index)); scene->addItem(legend_box); if(current_account) { ++it_desc; } else if(type == ACCOUNT_TYPE_ASSETS) { account = budget->assetsAccounts.next(); if(account == budget->balancingAccount) account = budget->assetsAccounts.next(); } else if(type == ACCOUNT_TYPE_EXPENSES) account = budget->expensesAccounts.next(); else account = budget->incomesAccounts.next(); if(b_empty) index = index_bak; else index++; } QGraphicsRectItem *legend_outline = new QGraphicsRectItem(legend_x, margin, 10 + fh + 5 + text_width + 10, 10 + ((fh + 5) * n) + 5); legend_outline->setPen(QPen(Qt::black)); scene->addItem(legend_outline); QRectF rect = scene->sceneRect(); rect.setX(0); rect.setY(0); rect.setRight(rect.right() + 20); rect.setBottom(rect.bottom() + 20); scene->setSceneRect(rect); scene->update(); view->setScene(scene); view->fitInView(scene->sceneRect(), Qt::KeepAspectRatio); if(oldscene) { delete oldscene; } } void CategoriesComparisonChart::resizeEvent(QResizeEvent *e) { QWidget::resizeEvent(e); if(scene) { view->fitInView(scene->sceneRect(), Qt::KeepAspectRatio); } } void CategoriesComparisonChart::updateTransactions() { updateDisplay(); } void CategoriesComparisonChart::updateAccounts() { int curindex = sourceCombo->currentIndex(); if(curindex > 2) { curindex = 0; } sourceCombo->blockSignals(true); sourceCombo->clear(); sourceCombo->addItem(i18n("All Expenses")); sourceCombo->addItem(i18n("All Incomes")); sourceCombo->addItem(i18n("All Accounts")); int i = 3; Account *account = budget->expensesAccounts.first(); while(account) { sourceCombo->addItem(i18n("Expenses: %1").arg(account->name())); if(account == current_account) curindex = i; account = budget->expensesAccounts.next(); i++; } account = budget->incomesAccounts.first(); while(account) { sourceCombo->addItem(i18n("Incomes: %1").arg(account->name())); if(account == current_account) curindex = i; account = budget->incomesAccounts.next(); i++; } if(curindex < sourceCombo->count()) sourceCombo->setCurrentIndex(curindex); sourceCombo->blockSignals(false); updateDisplay(); } #include "categoriescomparisonchart.moc" eqonomize-0.6/src/categoriescomparisonchart.h0000644000175000017500000000516711106576664020550 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef CATEGORIES_COMPARISON_CHART_H #define CATEGORIES_COMPARISON_CHART_H #include #include #include class Budget; class Account; class QPushButton; class KDateEdit; class QCheckBox; class QGraphicsScene; class QGraphicsView; class QButtonGroup; class QComboBox; class CategoriesComparisonChart : public QWidget { Q_OBJECT public: CategoriesComparisonChart(Budget *budg, QWidget *parent); ~CategoriesComparisonChart(); protected: Budget *budget; QDate from_date, to_date; Account *current_account; QCheckBox *fromButton; KDateEdit *fromEdit, *toEdit; QPushButton *nextYearButton, *prevYearButton, *nextMonthButton, *prevMonthButton; QPushButton *saveButton, *printButton; QGraphicsScene *scene; QGraphicsView *view; QButtonGroup *typeGroup; QComboBox *sourceCombo; void resizeEvent(QResizeEvent*); public slots: void updateTransactions(); void updateAccounts(); void updateDisplay(); void save(); void print(); void saveConfig(); void fromChanged(const QDate&); void toChanged(const QDate&); void prevMonth(); void nextMonth(); void prevYear(); void nextYear(); void sourceChanged(int); }; #endif eqonomize-0.6/src/categoriescomparisonreport.cpp0000644000175000017500000013776011106576671021320 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "categoriescomparisonreport.h" #include "budget.h" #include "account.h" #include "transaction.h" #include "recurrence.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern QString htmlize_string(QString str); extern double monthsBetweenDates(const QDate &date1, const QDate &date2); extern double yearsBetweenDates(const QDate &date1, const QDate &date2); CategoriesComparisonReport::CategoriesComparisonReport(Budget *budg, QWidget *parent, bool extra_parameters) : QWidget(parent), budget(budg), b_extra(extra_parameters) { setAttribute(Qt::WA_DeleteOnClose, true); const KCalendarSystem *calSys = KGlobal::locale()->calendar(); QDate first_date; Transaction *trans = budget->transactions.first(); while(trans) { if(trans->fromAccount()->type() != ACCOUNT_TYPE_ASSETS || trans->toAccount()->type() != ACCOUNT_TYPE_ASSETS) { first_date = trans->date(); break; } trans = budget->transactions.next(); } to_date = QDate::currentDate(); from_date = calSys->addDays(calSys->addYears(to_date, -1), 1); if(first_date.isNull()) { from_date = to_date; } else if(from_date < first_date) { from_date = first_date; } QVBoxLayout *layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); KDialogButtonBox *buttons = new KDialogButtonBox(this); saveButton = buttons->addButton(KStandardGuiItem::saveAs(), QDialogButtonBox::ActionRole); printButton = buttons->addButton(KStandardGuiItem::print(), QDialogButtonBox::ActionRole); layout->addWidget(buttons); htmlpart = new KHTMLPart(this); layout->addWidget(htmlpart->view()); KConfigGroup config = KGlobal::config()->group("Categories Comparison Report"); QGroupBox *settingsWidget = new QGroupBox(i18n("Options"), this); QGridLayout *settingsLayout = new QGridLayout(settingsWidget); settingsLayout->addWidget(new QLabel(i18n("Source:"), settingsWidget), 0, 0); QHBoxLayout *sourceLayout = new QHBoxLayout(); settingsLayout->addLayout(sourceLayout, 0, 1); sourceCombo = new KComboBox(settingsWidget); sourceCombo->setEditable(false); sourceCombo->addItem(i18n("All Categories")); Account *account = budget->expensesAccounts.first(); while(account) { sourceCombo->addItem(i18n("Expenses: %1").arg(account->name())); account = budget->expensesAccounts.next(); } account = budget->incomesAccounts.first(); while(account) { sourceCombo->addItem(i18n("Incomes: %1").arg(account->name())); account = budget->incomesAccounts.next(); } sourceLayout->addWidget(sourceCombo); payeeDescriptionWidget = NULL; if(b_extra) { payeeDescriptionWidget = new QWidget(settingsWidget); QHBoxLayout *payeeLayout = new QHBoxLayout(payeeDescriptionWidget); //payeeLayout->addWidget(new QLabel(i18n("Divide on:"), payeeDescriptionWidget)); QButtonGroup *group = new QButtonGroup(this); descriptionButton = new QRadioButton(i18n("Descriptions for"), payeeDescriptionWidget); descriptionButton->setChecked(true); group->addButton(descriptionButton); payeeLayout->addWidget(descriptionButton); payeeCombo = new KComboBox(payeeDescriptionWidget); payeeCombo->setEditable(false); payeeLayout->addWidget(payeeCombo); payeeButton = new QRadioButton(i18n("Payees/payers for"), payeeDescriptionWidget); group->addButton(payeeButton); payeeLayout->addWidget(payeeButton); descriptionCombo = new KComboBox(payeeDescriptionWidget); descriptionCombo->setEditable(false); payeeLayout->addWidget(descriptionCombo); sourceLayout->addWidget(payeeDescriptionWidget); payeeDescriptionWidget->setEnabled(false); } else { sourceLayout->addStretch(1); } current_account = NULL; has_empty_description = false; has_empty_payee = false; settingsLayout->addWidget(new QLabel(i18n("Period:"), settingsWidget), 1, 0); QHBoxLayout *choicesLayout = new QHBoxLayout(); settingsLayout->addLayout(choicesLayout, 1, 1); fromButton = new QCheckBox(i18n("From"), settingsWidget); fromButton->setChecked(true); choicesLayout->addWidget(fromButton); fromEdit = new KDateEdit(settingsWidget); fromEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); fromEdit->setDate(from_date); choicesLayout->addWidget(fromEdit); choicesLayout->addWidget(new QLabel(i18n("To"), settingsWidget)); toEdit = new KDateEdit(settingsWidget); toEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); toEdit->setDate(to_date); choicesLayout->addWidget(toEdit); prevYearButton = new KPushButton(KIcon("arrow-left-double"), "", settingsWidget); choicesLayout->addWidget(prevYearButton); prevMonthButton = new KPushButton(KIcon("arrow-left"), "", settingsWidget); choicesLayout->addWidget(prevMonthButton); nextMonthButton = new KPushButton(KIcon("arrow-right"), "", settingsWidget); choicesLayout->addWidget(nextMonthButton); nextYearButton = new KPushButton(KIcon("arrow-right-double"), "", settingsWidget); choicesLayout->addWidget(nextYearButton); choicesLayout->addStretch(1); settingsLayout->addWidget(new QLabel(i18n("Columns:"), settingsWidget), 2, 0); QHBoxLayout *enabledLayout = new QHBoxLayout(); settingsLayout->addLayout(enabledLayout, 2, 1); valueButton = new QCheckBox(i18n("Value"), settingsWidget); valueButton->setChecked(config.readEntry("valueEnabled", true)); enabledLayout->addWidget(valueButton); dailyButton = new QCheckBox(i18n("Daily"), settingsWidget); dailyButton->setChecked(config.readEntry("dailyAverageEnabled", true)); enabledLayout->addWidget(dailyButton); monthlyButton = new QCheckBox(i18n("Monthly"), settingsWidget); monthlyButton->setChecked(config.readEntry("monthlyAverageEnabled", true)); enabledLayout->addWidget(monthlyButton); yearlyButton = new QCheckBox(i18n("Yearly"), settingsWidget); yearlyButton->setChecked(config.readEntry("yearlyEnabled", false)); enabledLayout->addWidget(yearlyButton); countButton = new QCheckBox(i18n("Quantity"), settingsWidget); countButton->setChecked(config.readEntry("transactionCountEnabled", true)); enabledLayout->addWidget(countButton); perButton = new QCheckBox(i18n("Average value"), settingsWidget); perButton->setChecked(config.readEntry("valuePerTransactionEnabled", false)); enabledLayout->addWidget(perButton); enabledLayout->addStretch(1); layout->addWidget(settingsWidget); if(b_extra) { connect(payeeButton, SIGNAL(toggled(bool)), this, SLOT(payeeToggled(bool))); connect(descriptionButton, SIGNAL(toggled(bool)), this, SLOT(descriptionToggled(bool))); connect(payeeCombo, SIGNAL(activated(int)), this, SLOT(payeeChanged(int))); connect(descriptionCombo, SIGNAL(activated(int)), this, SLOT(descriptionChanged(int))); } connect(sourceCombo, SIGNAL(activated(int)), this, SLOT(sourceChanged(int))); connect(valueButton, SIGNAL(toggled(bool)), this, SLOT(updateDisplay())); connect(dailyButton, SIGNAL(toggled(bool)), this, SLOT(updateDisplay())); connect(monthlyButton, SIGNAL(toggled(bool)), this, SLOT(updateDisplay())); connect(yearlyButton, SIGNAL(toggled(bool)), this, SLOT(updateDisplay())); connect(countButton, SIGNAL(toggled(bool)), this, SLOT(updateDisplay())); connect(perButton, SIGNAL(toggled(bool)), this, SLOT(updateDisplay())); connect(prevMonthButton, SIGNAL(clicked()), this, SLOT(prevMonth())); connect(nextMonthButton, SIGNAL(clicked()), this, SLOT(nextMonth())); connect(prevYearButton, SIGNAL(clicked()), this, SLOT(prevYear())); connect(nextYearButton, SIGNAL(clicked()), this, SLOT(nextYear())); connect(fromButton, SIGNAL(toggled(bool)), fromEdit, SLOT(setEnabled(bool))); connect(fromButton, SIGNAL(toggled(bool)), this, SLOT(updateDisplay())); connect(fromEdit, SIGNAL(dateChanged(const QDate&)), this, SLOT(fromChanged(const QDate&))); connect(toEdit, SIGNAL(dateChanged(const QDate&)), this, SLOT(toChanged(const QDate&))); connect(saveButton, SIGNAL(clicked()), this, SLOT(save())); connect(printButton, SIGNAL(clicked()), this, SLOT(print())); } void CategoriesComparisonReport::payeeToggled(bool b) { if(b) updateDisplay(); } void CategoriesComparisonReport::descriptionToggled(bool b) { if(b) updateDisplay(); } void CategoriesComparisonReport::payeeChanged(int) { payeeButton->blockSignals(true); descriptionButton->blockSignals(true); descriptionButton->setChecked(true); payeeButton->setChecked(false); payeeButton->blockSignals(false); descriptionButton->blockSignals(false); updateDisplay(); } void CategoriesComparisonReport::descriptionChanged(int) { payeeButton->blockSignals(true); descriptionButton->blockSignals(true); payeeButton->setChecked(true); descriptionButton->setChecked(false); payeeButton->blockSignals(false); descriptionButton->blockSignals(false); updateDisplay(); } void CategoriesComparisonReport::sourceChanged(int i) { if(b_extra) { payeeCombo->blockSignals(true); descriptionCombo->blockSignals(true); payeeCombo->clear(); descriptionCombo->clear(); if(i == 0) { current_account = NULL; has_empty_description = false; has_empty_payee = false; payeeDescriptionWidget->setEnabled(false); } else { payeeDescriptionWidget->setEnabled(true); i--; if(i < (int) budget->expensesAccounts.count()) current_account = budget->expensesAccounts.at(i); else current_account = budget->incomesAccounts.at(i - budget->expensesAccounts.count()); if(current_account) { descriptionCombo->addItem(i18n("All descriptions")); if(current_account->type() == ACCOUNT_TYPE_EXPENSES) payeeCombo->addItem(i18n("All payees")); else payeeCombo->addItem(i18n("All payers")); has_empty_description = false; has_empty_payee = false; QMap descriptions, payees; Transaction *trans = budget->transactions.first(); while(trans) { if((trans->fromAccount() == current_account || trans->toAccount() == current_account)) { if(trans->description().isEmpty()) has_empty_description = true; else descriptions[trans->description()] = true; if(trans->type() == TRANSACTION_TYPE_EXPENSE) { if(((Expense*) trans)->payee().isEmpty()) has_empty_payee = true; else payees[((Expense*) trans)->payee()] = true; } else if(trans->type() == TRANSACTION_TYPE_INCOME) { if(((Income*) trans)->payer().isEmpty()) has_empty_payee = true; else payees[((Income*) trans)->payer()] = true; } } trans = budget->transactions.next(); } QMap::iterator it_e = descriptions.end(); for(QMap::iterator it = descriptions.begin(); it != it_e; ++it) { descriptionCombo->addItem(it.key()); } if(has_empty_description) descriptionCombo->addItem(i18n("No description")); QMap::iterator it2_e = payees.end(); for(QMap::iterator it2 = payees.begin(); it2 != it2_e; ++it2) { payeeCombo->addItem(it2.key()); } if(has_empty_payee) { if(current_account->type() == ACCOUNT_TYPE_EXPENSES) payeeCombo->addItem(i18n("No payee")); else payeeCombo->addItem(i18n("No payer")); } } else { payeeDescriptionWidget->setEnabled(false); } } payeeCombo->blockSignals(false); descriptionCombo->blockSignals(false); } updateDisplay(); } void CategoriesComparisonReport::saveConfig() { KConfigGroup config = KGlobal::config()->group("Categories Comparison Report"); ((KDialog*) parent())->saveDialogSize(config); config.writeEntry("valueEnabled", valueButton->isChecked()); config.writeEntry("dailyAverageEnabled", dailyButton->isChecked()); config.writeEntry("monthlyAverageEnabled", monthlyButton->isChecked()); config.writeEntry("yearlyAverageEnabled", yearlyButton->isChecked()); config.writeEntry("transactionCountEnabled", countButton->isChecked()); config.writeEntry("valuePerTransactionEnabled", perButton->isChecked()); } void CategoriesComparisonReport::toChanged(const QDate &date) { bool error = false; if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); error = true; } if(!error && fromEdit->date() > date) { if(fromButton->isChecked()) { KMessageBox::error(this, i18n("To date is before from date.")); } from_date = date; fromEdit->blockSignals(true); fromEdit->setDate(from_date); fromEdit->blockSignals(false); } if(error) { toEdit->setFocus(); toEdit->blockSignals(true); toEdit->setDate(to_date); toEdit->blockSignals(false); toEdit->lineEdit()->selectAll(); return; } to_date = date; updateDisplay(); } void CategoriesComparisonReport::fromChanged(const QDate &date) { bool error = false; if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); error = true; } if(!error && date > toEdit->date()) { KMessageBox::error(this, i18n("From date is after to date.")); to_date = date; toEdit->blockSignals(true); toEdit->setDate(to_date); toEdit->blockSignals(false); } if(error) { fromEdit->setFocus(); fromEdit->blockSignals(true); fromEdit->setDate(from_date); fromEdit->blockSignals(false); fromEdit->lineEdit()->selectAll(); return; } from_date = date; if(fromButton->isChecked()) updateDisplay(); } void CategoriesComparisonReport::prevMonth() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); fromEdit->blockSignals(true); toEdit->blockSignals(true); from_date = calSys->addMonths(from_date, -1); fromEdit->setDate(from_date); if(calSys->day(to_date) == calSys->daysInMonth(to_date)) { to_date = calSys->addMonths(to_date, -1); calSys->setYMD(to_date, calSys->year(to_date), calSys->month(to_date), calSys->daysInMonth(to_date)); } else { to_date = calSys->addMonths(to_date, -1); } toEdit->setDate(to_date); fromEdit->blockSignals(false); toEdit->blockSignals(false); updateDisplay(); } void CategoriesComparisonReport::nextMonth() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); fromEdit->blockSignals(true); toEdit->blockSignals(true); from_date = calSys->addMonths(from_date, 1); fromEdit->setDate(from_date); if(calSys->day(to_date) == calSys->daysInMonth(to_date)) { to_date = calSys->addMonths(to_date, 1); calSys->setYMD(to_date, calSys->year(to_date), calSys->month(to_date), calSys->daysInMonth(to_date)); } else { to_date = calSys->addMonths(to_date, 1); } toEdit->setDate(to_date); fromEdit->blockSignals(false); toEdit->blockSignals(false); updateDisplay(); } void CategoriesComparisonReport::prevYear() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); fromEdit->blockSignals(true); toEdit->blockSignals(true); from_date = calSys->addYears(from_date, -1); fromEdit->setDate(from_date); if(calSys->day(to_date) == calSys->daysInMonth(to_date)) { to_date = calSys->addYears(to_date, -1); calSys->setYMD(to_date, calSys->year(to_date), calSys->month(to_date), calSys->daysInMonth(to_date)); } else { to_date = calSys->addYears(to_date, -1); } toEdit->setDate(to_date); fromEdit->blockSignals(false); toEdit->blockSignals(false); updateDisplay(); } void CategoriesComparisonReport::nextYear() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); fromEdit->blockSignals(true); toEdit->blockSignals(true); from_date = calSys->addYears(from_date, 1); fromEdit->setDate(from_date); if(calSys->day(to_date) == calSys->daysInMonth(to_date)) { to_date = calSys->addYears(to_date, 1); calSys->setYMD(to_date, calSys->year(to_date), calSys->month(to_date), calSys->daysInMonth(to_date)); } else { to_date = calSys->addYears(to_date, 1); } toEdit->setDate(to_date); fromEdit->blockSignals(false); toEdit->blockSignals(false); updateDisplay(); } void CategoriesComparisonReport::save() { KFileDialog *dialog = new KFileDialog(KUrl(), QString::null, this); QStringList filter; filter << "text/html"; dialog->setMimeFilter(filter, "text/html"); dialog->setOperationMode(KFileDialog::Saving); dialog->setMode(KFile::File); if(dialog->exec() != QDialog::Accepted) {dialog->deleteLater(); return;} KUrl url = dialog->selectedUrl(); dialog->deleteLater(); if(url.isEmpty() && url.isValid()) return; if(url.isLocalFile()) { if(QFile::exists(url.path())) { if(KMessageBox::warningYesNo(this, i18n("The selected file already exists. Would you like to overwrite the old copy?")) != KMessageBox::Yes) return; } QFileInfo info(url.path()); if(info.isDir()) { KMessageBox::error(this, i18n("You selected a directory!")); return; } KSaveFile ofile(url.path()); ofile.open(); ofile.setPermissions((QFile::Permissions) 0x0660); if(!ofile.isOpen()) { ofile.abort(); KMessageBox::error(this, i18n("Couldn't open file for writing.")); return; } QTextStream outf(&ofile); outf.setCodec("UTF-8"); outf << source; if(!ofile.finalize()) { KMessageBox::error(this, i18n("Error while writing file; file was not saved.")); return; } return; } KTemporaryFile tf; tf.open(); tf.setAutoRemove(true); QTextStream outf(&tf); outf.setCodec("UTF-8"); outf << source; KIO::NetAccess::upload(tf.fileName(), url, this); } void CategoriesComparisonReport::print() { htmlpart->view()->print(); } void CategoriesComparisonReport::updateDisplay() { int columns = 2; bool enabled[6]; enabled[0] = valueButton->isChecked(); enabled[1] = dailyButton->isChecked(); enabled[2] = monthlyButton->isChecked(); enabled[3] = yearlyButton->isChecked(); enabled[4] = countButton->isChecked(); enabled[5] = perButton->isChecked(); for(size_t i = 0; i < 6; i++) { if(enabled[i]) columns++; } QMap values; QMap counts; QMap desc_values; QMap desc_counts; double incomes = 0.0, costs = 0.0; double incomes_count = 0.0, costs_count = 0.0; double value_count = 0.0; double value = 0.0; current_account = NULL; current_description = ""; current_payee = ""; int i_source = 0; AccountType type = ACCOUNT_TYPE_EXPENSES; switch(sourceCombo->currentIndex()) { case 0: { Account *account = budget->expensesAccounts.first(); while(account) { values[account] = 0.0; counts[account] = 0.0; account = budget->expensesAccounts.next(); } account = budget->incomesAccounts.first(); while(account) { values[account] = 0.0; counts[account] = 0.0; account = budget->incomesAccounts.next(); } break; } default: { int i = sourceCombo->currentIndex() - 1; if(i < (int) budget->expensesAccounts.count()) current_account = budget->expensesAccounts.at(i); else current_account = budget->incomesAccounts.at(i - budget->expensesAccounts.count()); if(current_account) { type = current_account->type(); if(b_extra) { if(has_empty_description) descriptionCombo->setItemText(descriptionCombo->count() - 1, ""); if(has_empty_payee) payeeCombo->setItemText(payeeCombo->count() - 1, ""); if(descriptionButton->isChecked()) { int p_index = payeeCombo->currentIndex(); if(p_index == 0) { i_source = 1; } else { current_payee = payeeCombo->itemText(p_index); i_source = 3; } } else { int d_index = descriptionCombo->currentIndex(); if(d_index == 0) { i_source = 2; } else { current_description = descriptionCombo->itemText(d_index); i_source = 4; } } } else { i_source = 1; } Transaction *trans = budget->transactions.first(); while(trans) { if((trans->fromAccount() == current_account || trans->toAccount() == current_account) && (i_source <= 2 || (i_source == 4 && trans->description() == current_description) || (i_source == 3 && ((trans->type() == TRANSACTION_TYPE_EXPENSE && ((Expense*) trans)->payee() == current_payee) || (trans->type() == TRANSACTION_TYPE_INCOME && ((Income*) trans)->payer() == current_payee))))) { if(i_source == 2 || i_source == 4) { if(trans->type() == TRANSACTION_TYPE_EXPENSE) { desc_values[((Expense*) trans)->payee()] = 0.0; desc_counts[((Expense*) trans)->payee()] = 0.0; } else if(trans->type() == TRANSACTION_TYPE_INCOME) { desc_values[((Income*) trans)->payer()] = 0.0; desc_counts[((Income*) trans)->payer()] = 0.0; } } else { desc_values[trans->description()] = 0.0; desc_counts[trans->description()] = 0.0; } } trans = budget->transactions.next(); } } } } QDate first_date; if(fromButton->isChecked()) { first_date = from_date; } else { Transaction *trans = budget->transactions.first(); while(trans) { if(trans->fromAccount()->type() != ACCOUNT_TYPE_ASSETS || trans->toAccount()->type() != ACCOUNT_TYPE_ASSETS) { first_date = trans->date(); break; } trans = budget->transactions.next(); } if(first_date.isNull()) first_date = QDate::currentDate(); if(first_date > to_date) first_date = to_date; } Transaction *trans = budget->transactions.first(); bool first_date_reached = false; while(trans) { if(!first_date_reached && trans->date() >= first_date) first_date_reached = true; else if(first_date_reached && trans->date() > to_date) break; if(first_date_reached) { if(current_account) { int sign = 1; bool include = false; if(trans->fromAccount() == current_account && (i_source <= 2 || (i_source == 4 && trans->description() == current_description) || (i_source == 3 && ((trans->type() == TRANSACTION_TYPE_EXPENSE && ((Expense*) trans)->payee() == current_payee) || (trans->type() == TRANSACTION_TYPE_INCOME && ((Income*) trans)->payer() == current_payee))))) { include = true; if(type == ACCOUNT_TYPE_INCOMES) sign = 1; else sign = -1; } else if(trans->toAccount() == current_account && (i_source <= 2 || (i_source == 4 && trans->description() == current_description) || (i_source == 3 && ((trans->type() == TRANSACTION_TYPE_EXPENSE && ((Expense*) trans)->payee() == current_payee) || (trans->type() == TRANSACTION_TYPE_INCOME && ((Income*) trans)->payer() == current_payee))))) { include = true; if(type == ACCOUNT_TYPE_EXPENSES) sign = 1; else sign = -1; } if(include) { if(i_source == 2 || i_source == 4) { if(trans->type() == TRANSACTION_TYPE_EXPENSE) { desc_values[((Expense*) trans)->payee()] += trans->value() * sign; value += trans->value() * sign; desc_counts[((Expense*) trans)->payee()] += trans->quantity(); value_count += trans->quantity(); } else if(trans->type() == TRANSACTION_TYPE_INCOME) { desc_values[((Income*) trans)->payer()] += trans->value() * sign; value += trans->value() * sign; desc_counts[((Income*) trans)->payer()] += trans->quantity(); value_count += trans->quantity(); } } else { desc_values[trans->description()] += trans->value() * sign; value += trans->value() * sign; desc_counts[trans->description()] += trans->quantity(); value_count += trans->quantity(); } } } else { if(trans->fromAccount()->type() == ACCOUNT_TYPE_EXPENSES) { values[trans->fromAccount()] -= trans->value(); costs -= trans->value(); counts[trans->fromAccount()] += trans->quantity(); costs_count += trans->quantity(); } else if(trans->fromAccount()->type() == ACCOUNT_TYPE_INCOMES) { values[trans->fromAccount()] += trans->value(); incomes += trans->value(); counts[trans->fromAccount()] += trans->quantity(); incomes_count += trans->quantity(); } else if(trans->toAccount()->type() == ACCOUNT_TYPE_EXPENSES) { values[trans->toAccount()] += trans->value(); costs += trans->value(); counts[trans->toAccount()] += trans->quantity(); costs_count += trans->quantity(); } else if(trans->toAccount()->type() == ACCOUNT_TYPE_INCOMES) { values[trans->toAccount()] -= trans->value(); incomes -= trans->value(); counts[trans->toAccount()] += trans->quantity(); incomes_count += trans->quantity(); } } } trans = budget->transactions.next(); } first_date_reached = false; ScheduledTransaction *strans = budget->scheduledTransactions.first(); while(strans) { trans = strans->transaction(); if(!first_date_reached && trans->date() >= first_date) first_date_reached = true; else if(first_date_reached && trans->date() > to_date) break; if(first_date_reached) { if(current_account) { int sign = 1; bool include = false; if(trans->fromAccount() == current_account && (i_source <= 2 || (i_source == 4 && trans->description() == current_description) || (i_source == 3 && ((trans->type() == TRANSACTION_TYPE_EXPENSE && ((Expense*) trans)->payee() == current_payee) || (trans->type() == TRANSACTION_TYPE_INCOME && ((Income*) trans)->payer() == current_payee))))) { include = true; if(type == ACCOUNT_TYPE_INCOMES) sign = 1; else sign = -1; } else if(trans->toAccount() == current_account && (i_source <= 2 || (i_source == 4 && trans->description() == current_description) || (i_source == 3 && ((trans->type() == TRANSACTION_TYPE_EXPENSE && ((Expense*) trans)->payee() == current_payee) || (trans->type() == TRANSACTION_TYPE_INCOME && ((Income*) trans)->payer() == current_payee))))) { include = true; if(type == ACCOUNT_TYPE_EXPENSES) sign = 1; else sign = -1; } if(include) { int count = strans->recurrence() ? strans->recurrence()->countOccurrences(first_date, to_date) : 1; if(i_source == 2 || i_source == 4) { if(trans->type() == TRANSACTION_TYPE_EXPENSE) { desc_values[((Expense*) trans)->payee()] += trans->value() * count * sign; value += trans->value() * count * sign; desc_counts[((Expense*) trans)->payee()] += count * trans->quantity(); value_count += count * trans->quantity(); } else if(trans->type() == TRANSACTION_TYPE_INCOME) { desc_values[((Income*) trans)->payer()] += trans->value() * count * sign; value += trans->value() * count * sign; desc_counts[((Income*) trans)->payer()] += count * trans->quantity(); value_count += count * trans->quantity(); } } else { desc_values[trans->description()] += trans->value() * count * sign; value += trans->value() * count * sign; desc_counts[trans->description()] += count * trans->quantity(); value_count += count * trans->quantity(); } } } else { if(trans->fromAccount()->type() == ACCOUNT_TYPE_EXPENSES) { int count = strans->recurrence() ? strans->recurrence()->countOccurrences(first_date, to_date) : 1; counts[trans->fromAccount()] += count * trans->quantity(); values[trans->fromAccount()] -= trans->value() * count; costs_count += count * trans->quantity(); costs -= trans->value() * count; } else if(trans->fromAccount()->type() == ACCOUNT_TYPE_INCOMES) { int count = strans->recurrence() ? strans->recurrence()->countOccurrences(first_date, to_date) : 1; counts[trans->fromAccount()] += count * trans->quantity(); values[trans->fromAccount()] += trans->value() * count; incomes_count += count * trans->quantity(); incomes += trans->value() * count; } else if(trans->toAccount()->type() == ACCOUNT_TYPE_EXPENSES) { int count = strans->recurrence() ? strans->recurrence()->countOccurrences(first_date, to_date) : 1; counts[trans->toAccount()] += count * trans->quantity(); values[trans->toAccount()] += trans->value() * count; costs_count += count * trans->quantity(); costs += trans->value() * count; } else if(trans->toAccount()->type() == ACCOUNT_TYPE_INCOMES) { int count = strans->recurrence() ? strans->recurrence()->countOccurrences(first_date, to_date) : 1; counts[trans->toAccount()] += count * trans->quantity(); values[trans->toAccount()] -= trans->value() * count; incomes_count += count * trans->quantity(); incomes -= trans->value() * count; } } } strans = budget->scheduledTransactions.next(); } source = ""; QString title; if(current_account && type == ACCOUNT_TYPE_EXPENSES) { if(i_source == 4) title = i18n("Expenses: %2, %1").arg(current_account->name()).arg(current_description.isEmpty() ? i18n("No description") : current_description); else if(i_source == 3) title = i18n("Expenses: %2, %1").arg(current_account->name()).arg(current_payee.isEmpty() ? i18n("No payee") : current_payee); else title = i18n("Expenses: %1").arg(current_account->name()); } else if(current_account && type == ACCOUNT_TYPE_INCOMES) { if(i_source == 4) title = i18n("Incomes: %2, %1").arg(current_account->name()).arg(current_description.isEmpty() ? i18n("No description") : current_description); else if(i_source == 3) title = i18n("Incomes: %2, %1").arg(current_account->name()).arg(current_payee.isEmpty() ? i18n("No payer") : current_payee); else title = i18n("Incomes: %1").arg(current_account->name()); } else { title = i18n("Incomes & Expenses"); } QTextStream outf(&source, QIODevice::WriteOnly); outf << "" << '\n'; outf << "" << '\n'; outf << "\t" << '\n'; outf << "\t\t"; outf << htmlize_string(title); outf << "" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t" << '\n'; outf << "\t" << '\n'; outf << "\t" << '\n'; if(fromButton->isChecked()) outf << "\t\t

" << i18nc("html format; %1: title; %2: from date; %3: to date", "%1 (%2–%3)").arg(htmlize_string(title)).arg(htmlize_string(KGlobal::locale()->formatDate(first_date, KLocale::ShortDate))).arg(htmlize_string(KGlobal::locale()->formatDate(to_date, KLocale::ShortDate))) << "

" << '\n'; else outf << "\t\t

" << i18nc("html format; %1: title; %2: to date", "%1 (to %2)").arg(htmlize_string(title)).arg(htmlize_string(KGlobal::locale()->formatDate(to_date, KLocale::ShortDate))) << "

" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; if(current_account && type == ACCOUNT_TYPE_EXPENSES) { if(enabled[0]) outf << "\t\t\t\t\t"; } else if(current_account && type == ACCOUNT_TYPE_INCOMES) { if(enabled[0]) outf << "\t\t\t\t\t"; } else { if(enabled[0]) outf << "\t\t\t\t\t"; } if(enabled[1]) outf << "\t\t\t\t\t"; if(enabled[2]) outf << "\t\t\t\t\t"; if(enabled[3]) outf << "\t\t\t\t\t"; if(enabled[4]) outf << "\t\t\t\t\t"; if(current_account && type == ACCOUNT_TYPE_EXPENSES) { if(enabled[5]) outf << "\t\t\t\t\t"; } else if(current_account && type == ACCOUNT_TYPE_INCOMES) { if(enabled[5]) outf << "\t\t\t\t\t"; } else { if(enabled[5]) outf << "\t\t\t\t\t"; } outf << "\t\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; int days = first_date.daysTo(to_date) + 1; double months = monthsBetweenDates(first_date, to_date), years = yearsBetweenDates(first_date, to_date); int i_count_frac = 0; double intpart = 0.0; if(current_account) { QMap::iterator it_e = desc_counts.end(); for(QMap::iterator it = desc_counts.begin(); it != it_e; ++it) { if(modf(it.value(), &intpart) != 0.0) { i_count_frac = 2; break; } } } else { Account *account = budget->incomesAccounts.first(); while(account) { if(modf(counts[account], &intpart) != 0.0) { i_count_frac = 2; break; } account = budget->incomesAccounts.next(); } if(i_count_frac == 0) { account = budget->expensesAccounts.first(); while(account) { if(modf(counts[account], &intpart) != 0.0) { i_count_frac = 2; break; } account = budget->expensesAccounts.next(); } } } if(current_account) { QMap::iterator it_e = desc_values.end(); QMap::iterator itc = desc_counts.begin(); QMap::iterator it = desc_values.begin(); for(; it != it_e; ++it, ++itc) { outf << "\t\t\t\t" << '\n'; if(it.key().isEmpty()) { if((i_source == 4 || i_source == 2) && type == ACCOUNT_TYPE_EXPENSES) outf << "\t\t\t\t\t"; else if(i_source == 4 || i_source == 2) outf << "\t\t\t\t\t"; else outf << "\t\t\t\t\t"; } else { outf << "\t\t\t\t\t"; } if(enabled[0]) outf << ""; if(enabled[1]) outf << ""; if(enabled[2]) outf << ""; if(enabled[3]) outf << ""; if(enabled[4]) outf << ""; if(enabled[5]) outf << ""; outf << "\n"; outf << "\t\t\t\t" << '\n'; } outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; if(enabled[0]) outf << ""; if(enabled[1]) outf << ""; if(enabled[2]) outf << ""; if(enabled[3]) outf << ""; if(enabled[4]) outf << ""; if(enabled[5]) outf << ""; outf << "\n"; outf << "\t\t\t\t" << '\n'; } else { Account *account = budget->incomesAccounts.first(); while(account) { outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; if(enabled[0]) outf << ""; if(enabled[1]) outf << ""; if(enabled[2]) outf << ""; if(enabled[3]) outf << ""; if(enabled[4]) outf << ""; if(enabled[5]) outf << ""; outf << "\n"; outf << "\t\t\t\t" << '\n'; account = budget->incomesAccounts.next(); } outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; if(enabled[0]) outf << ""; if(enabled[1]) outf << ""; if(enabled[2]) outf << ""; if(enabled[3]) outf << ""; if(enabled[4]) outf << ""; if(enabled[5]) outf << ""; outf << "\n"; outf << "\t\t\t\t" << '\n'; account = budget->expensesAccounts.first(); while(account) { outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; if(enabled[0]) outf << ""; if(enabled[1]) outf << ""; if(enabled[2]) outf << ""; if(enabled[3]) outf << ""; if(enabled[4]) outf << ""; if(enabled[5]) outf << ""; outf << "\n"; outf << "\t\t\t\t" << '\n'; account = budget->expensesAccounts.next(); } outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; if(enabled[0]) outf << ""; if(enabled[1]) outf << ""; if(enabled[2]) outf << ""; if(enabled[3]) outf << ""; if(enabled[4]) outf << ""; if(enabled[5]) outf << ""; outf << "\n"; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; if(enabled[0]) outf << ""; if(enabled[1]) outf << ""; if(enabled[2]) outf << ""; if(enabled[3]) outf << ""; if(enabled[4]) outf << ""; if(enabled[5]) outf << ""; outf << "\n"; outf << "\t\t\t\t" << '\n'; } outf << "\t\t\t" << '\n'; outf << "\t\t
" << htmlize_string(i18n("Category")) << "" << htmlize_string(i18n("Cost")) << "" << htmlize_string(i18n("Income")) << "" << htmlize_string(i18n("Value")) << "" << htmlize_string(i18n("Daily Average")) << "" << htmlize_string(i18n("Monthly Average")) << "" << htmlize_string(i18n("Yearly Average")) << "" << htmlize_string(i18n("Quantity")) << "" << htmlize_string(i18n("Average Cost")) << "" << htmlize_string(i18n("Average Income")) << "" << htmlize_string(i18n("Average Value")) << "
" << htmlize_string(i18n("No payee")) << "" << htmlize_string(i18n("No payer")) << "" << htmlize_string(i18n("No description")) << "" << htmlize_string(it.key()) << "" << htmlize_string(KGlobal::locale()->formatMoney(it.value())) << "" << htmlize_string(KGlobal::locale()->formatMoney(it.value() / days)) << "" << htmlize_string(KGlobal::locale()->formatMoney(it.value() / months)) << "" << htmlize_string(KGlobal::locale()->formatMoney(it.value() / years)) << "" << htmlize_string(KGlobal::locale()->formatNumber(itc.value(), i_count_frac)) << "" << htmlize_string(KGlobal::locale()->formatMoney(itc.value() == 0.0 ? 0.0 : (it.value() / itc.value()))) << "
" << htmlize_string(i18n("Total")) << "" << htmlize_string(KGlobal::locale()->formatMoney(value)) << "" << htmlize_string(KGlobal::locale()->formatMoney(value / days)) << "" << htmlize_string(KGlobal::locale()->formatMoney(value / months)) << "" << htmlize_string(KGlobal::locale()->formatMoney(value / years)) << "" << htmlize_string(KGlobal::locale()->formatNumber(value_count, i_count_frac)) << "" << htmlize_string(KGlobal::locale()->formatMoney(value_count == 0.0 ? 0.0 : (value / value_count))) << "
" << htmlize_string(account->name()) << "" << htmlize_string(KGlobal::locale()->formatMoney(values[account])) << "" << htmlize_string(KGlobal::locale()->formatMoney(values[account] / days)) << "" << htmlize_string(KGlobal::locale()->formatMoney(values[account] / months)) << "" << htmlize_string(KGlobal::locale()->formatMoney(values[account] / years)) << "" << htmlize_string(KGlobal::locale()->formatNumber(counts[account], i_count_frac)) << "" << htmlize_string(KGlobal::locale()->formatMoney(counts[account] == 0.0 ? 0.0 : (values[account] / counts[account]))) << "
" << htmlize_string(i18n("Total incomes")) << "" << htmlize_string(KGlobal::locale()->formatMoney(incomes)) << "" << htmlize_string(KGlobal::locale()->formatMoney(incomes / days)) << "" << htmlize_string(KGlobal::locale()->formatMoney(incomes / months)) << "" << htmlize_string(KGlobal::locale()->formatMoney(incomes / years)) << "" << htmlize_string(KGlobal::locale()->formatNumber(incomes_count, i_count_frac)) << "" << htmlize_string(KGlobal::locale()->formatMoney(incomes_count == 0.0 ? 0.0 : (incomes / incomes_count))) << "
" << htmlize_string(account->name()) << "" << htmlize_string(KGlobal::locale()->formatMoney(-values[account])) << "" << htmlize_string(KGlobal::locale()->formatMoney(-values[account] / days)) << "" << htmlize_string(KGlobal::locale()->formatMoney(-values[account] / months)) << "" << htmlize_string(KGlobal::locale()->formatMoney(-values[account] / years)) << "" << htmlize_string(KGlobal::locale()->formatNumber(counts[account], i_count_frac)) << "" << htmlize_string(KGlobal::locale()->formatMoney(counts[account] == 0.0 ? 0.0 : (-values[account] / counts[account]))) << "
" << htmlize_string(i18n("Total expenses")) << "" << htmlize_string(KGlobal::locale()->formatMoney(-costs)) << "" << htmlize_string(KGlobal::locale()->formatMoney(-costs / days)) << "" << htmlize_string(KGlobal::locale()->formatMoney(-costs / months)) << "" << htmlize_string(KGlobal::locale()->formatMoney(-costs / years)) << "" << htmlize_string(KGlobal::locale()->formatNumber(costs_count, i_count_frac)) << "" << htmlize_string(KGlobal::locale()->formatMoney(costs_count == 0.0 ? 0.0 : (-costs / costs_count))) << "
" << htmlize_string(i18n("Total (Profits)")) << "" << htmlize_string(KGlobal::locale()->formatMoney(incomes - costs)) << "" << htmlize_string(KGlobal::locale()->formatMoney((incomes - costs) / days)) << "" << htmlize_string(KGlobal::locale()->formatMoney((incomes - costs) / months)) << "" << htmlize_string(KGlobal::locale()->formatMoney((incomes - costs) / years)) << "" << htmlize_string(KGlobal::locale()->formatNumber(incomes_count + costs_count, i_count_frac)) << "" << htmlize_string(KGlobal::locale()->formatMoney((incomes_count + costs_count) == 0.0 ? 0.0 : ((incomes - costs) / (incomes_count + costs_count)))) << "
" << '\n'; outf << "\t" << '\n'; outf << "" << '\n'; htmlpart->begin(); htmlpart->write(source); htmlpart->end(); if(current_account && b_extra) { if(has_empty_description) descriptionCombo->setItemText(descriptionCombo->count() - 1, i18n("No description")); if(has_empty_payee) { if(current_account->type() == ACCOUNT_TYPE_EXPENSES) payeeCombo->setItemText(payeeCombo->count() - 1, i18n("No payee")); else payeeCombo->setItemText(payeeCombo->count() - 1, i18n("No payer")); } } } void CategoriesComparisonReport::updateTransactions() { if(b_extra && current_account) { int curindex_d = 0, curindex_p = 0; bool restore_d = (descriptionCombo->currentIndex() > 0); bool restore_p = (payeeCombo->currentIndex() > 0); payeeCombo->blockSignals(true); descriptionCombo->blockSignals(true); payeeCombo->clear(); descriptionCombo->clear(); descriptionCombo->addItem(i18n("All descriptions")); if(current_account->type() == ACCOUNT_TYPE_EXPENSES) payeeCombo->addItem(i18n("All payees")); else payeeCombo->addItem(i18n("All payers")); has_empty_description = false; has_empty_payee = false; QMap descriptions, payees; Transaction *trans = budget->transactions.first(); while(trans) { if((trans->fromAccount() == current_account || trans->toAccount() == current_account)) { if(trans->description().isEmpty()) has_empty_description = true; else descriptions[trans->description()] = true; if(trans->type() == TRANSACTION_TYPE_EXPENSE) { if(((Expense*) trans)->payee().isEmpty()) has_empty_payee = true; else payees[((Expense*) trans)->payee()] = true; } else if(trans->type() == TRANSACTION_TYPE_INCOME) { if(((Income*) trans)->payer().isEmpty()) has_empty_payee = true; else payees[((Income*) trans)->payer()] = true; } } trans = budget->transactions.next(); } int i = 1; QMap::iterator it_e = descriptions.end(); for(QMap::iterator it = descriptions.begin(); it != it_e; ++it) { if(restore_d && it.key() == current_description) {curindex_d = i;} descriptionCombo->addItem(it.key()); i++; } if(has_empty_description) { if(restore_d && current_description.isEmpty()) curindex_d = i; descriptionCombo->addItem(i18n("No description")); } if(curindex_d < descriptionCombo->count()) { descriptionCombo->setCurrentIndex(curindex_d); } if(descriptionCombo->currentIndex() == 0) { current_description = ""; } i = 1; QMap::iterator it2_e = payees.end(); for(QMap::iterator it2 = payees.begin(); it2 != it2_e; ++it2) { if(restore_p && it2.key() == current_payee) {curindex_p = i;} payeeCombo->addItem(it2.key()); i++; } if(has_empty_payee) { if(restore_p && current_payee.isEmpty()) curindex_p = i; if(current_account->type() == ACCOUNT_TYPE_EXPENSES) payeeCombo->addItem(i18n("No payee")); else payeeCombo->addItem(i18n("No payer")); } if(curindex_p < payeeCombo->count()) { payeeCombo->setCurrentIndex(curindex_d); } if(payeeCombo->currentIndex() == 0) { current_payee = ""; } payeeCombo->blockSignals(false); descriptionCombo->blockSignals(false); } updateDisplay(); } void CategoriesComparisonReport::updateAccounts() { int curindex = 0; sourceCombo->blockSignals(true); sourceCombo->clear(); sourceCombo->addItem(i18n("All Categories")); int i = 1; Account *account = budget->expensesAccounts.first(); while(account) { sourceCombo->addItem(i18n("Expenses: %1").arg(account->name())); if(account == current_account) curindex = i; account = budget->expensesAccounts.next(); i++; } account = budget->incomesAccounts.first(); while(account) { sourceCombo->addItem(i18n("Incomes: %1").arg(account->name())); if(account == current_account) curindex = i; account = budget->incomesAccounts.next(); i++; } if(curindex < sourceCombo->count()) sourceCombo->setCurrentIndex(curindex); sourceCombo->blockSignals(false); if(curindex == 0 && b_extra) { sourceChanged(curindex); } else { updateDisplay(); } } #include "categoriescomparisonreport.moc" eqonomize-0.6/src/categoriescomparisonreport.h0000644000175000017500000000566211106576676020765 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef CATEGORIES_COMPARISON_REPORT_H #define CATEGORIES_COMPARISON_REPORT_H #include #include class Budget; class KHTMLPart; class QPushButton; class KDateEdit; class QCheckBox; class QComboBox; class Account; class QRadioButton; class CategoriesComparisonReport : public QWidget { Q_OBJECT public: CategoriesComparisonReport(Budget *budg, QWidget *parent, bool extra_parameters); protected: Budget *budget; QString source; QDate from_date, to_date; Account *current_account; QString current_description, current_payee; bool has_empty_description, has_empty_payee; bool b_extra; KHTMLPart *htmlpart; QCheckBox *fromButton; KDateEdit *fromEdit, *toEdit; QPushButton *nextYearButton, *prevYearButton, *nextMonthButton, *prevMonthButton; QPushButton *saveButton, *printButton; QCheckBox *valueButton, *dailyButton, *monthlyButton, *yearlyButton, *countButton, *perButton; QComboBox *sourceCombo, *descriptionCombo, *payeeCombo; QRadioButton *descriptionButton, *payeeButton; QWidget *payeeDescriptionWidget; public slots: void updateTransactions(); void updateAccounts(); void updateDisplay(); void save(); void print(); void saveConfig(); void fromChanged(const QDate&); void toChanged(const QDate&); void prevMonth(); void nextMonth(); void prevYear(); void nextYear(); void sourceChanged(int); void descriptionChanged(int); void payeeChanged(int); void descriptionToggled(bool); void payeeToggled(bool); }; #endif eqonomize-0.6/src/editscheduledtransactiondialog.cpp0000600000175000017500000002642011106576703022052 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "editscheduledtransactiondialog.h" #include "transactioneditwidget.h" #include "recurrenceeditwidget.h" #include "budget.h" #include "recurrence.h" #include #include EditScheduledTransactionDialog::EditScheduledTransactionDialog(bool extra_parameters, int transaction_type, Security *security, bool select_security, Budget *budg, QWidget *parent, QString title, Account *account) : KPageDialog(parent), budget(budg), b_extra(extra_parameters) { setFaceType(KPageDialog::Tabbed); setCaption(title); setButtons(KDialog::Ok | KDialog::Cancel); setDefaultButton(KDialog::Ok); setModal(true); KVBox *page = new KVBox(); switch(transaction_type) { case TRANSACTION_TYPE_EXPENSE: {trans_page = addPage(page, i18n("Expense")); trans_page->setHeader(i18n("Expense")); transactionEditWidget = new TransactionEditWidget(false, b_extra, transaction_type, false, false, security, SECURITY_ALL_VALUES, select_security, budget, page); break;} case TRANSACTION_TYPE_INCOME: {trans_page = addPage(page, i18n("Income")); trans_page->setHeader(i18n("Income")); transactionEditWidget = new TransactionEditWidget(false, b_extra, transaction_type, false, false, security, SECURITY_ALL_VALUES, select_security, budget, page); break;} case TRANSACTION_TYPE_TRANSFER: {trans_page = addPage(page, i18n("Transfer")); trans_page->setHeader(i18n("Transfer")); transactionEditWidget = new TransactionEditWidget(false, b_extra, transaction_type, false, false, security, SECURITY_ALL_VALUES, select_security, budget, page); break;} case TRANSACTION_TYPE_SECURITY_BUY: {trans_page = addPage(page, i18n("Security Buy")); trans_page->setHeader(i18n("Security Buy")); transactionEditWidget = new TransactionEditWidget(false, b_extra, transaction_type, false, false, security, SECURITY_ALL_VALUES, select_security, budget, page); break;} case TRANSACTION_TYPE_SECURITY_SELL: {trans_page = addPage(page, i18n("Security Sell")); trans_page->setHeader(i18n("Security Sell")); transactionEditWidget = new TransactionEditWidget(false, b_extra, transaction_type, false, false, security, SECURITY_ALL_VALUES, select_security, budget, page); break;} } transactionEditWidget->updateAccounts(); transactionEditWidget->focusDescription(); transactionEditWidget->transactionsReset(); if(account) transactionEditWidget->setAccount(account); KVBox *page2 = new KVBox(); recurrence_page = addPage(page2, i18n("Recurrence")); recurrence_page->setHeader(i18n("Recurrence")); recurrenceEditWidget = new RecurrenceEditWidget(transactionEditWidget->date(), budget, page2); connect(transactionEditWidget, SIGNAL(dateChanged(const QDate&)), recurrenceEditWidget, SLOT(setStartDate(const QDate&))); } bool EditScheduledTransactionDialog::checkAccounts() { return transactionEditWidget->checkAccounts(); } void EditScheduledTransactionDialog::slotButtonClicked(int button) { if(button == KDialog::Ok) { if(!transactionEditWidget->validValues(true)) {setCurrentPage(trans_page); return;} recurrenceEditWidget->setStartDate(transactionEditWidget->date()); if(!recurrenceEditWidget->validValues()) {setCurrentPage(recurrence_page); return;} } KDialog::slotButtonClicked(button); } void EditScheduledTransactionDialog::setTransaction(Transaction *trans) { transactionEditWidget->setTransaction(trans); recurrenceEditWidget->setRecurrence(NULL); } void EditScheduledTransactionDialog::setScheduledTransaction(ScheduledTransaction *strans) { transactionEditWidget->setTransaction(strans->transaction()); recurrenceEditWidget->setRecurrence(strans->recurrence()); } ScheduledTransaction *EditScheduledTransactionDialog::createScheduledTransaction() { Transaction *trans = transactionEditWidget->createTransaction(); if(!trans) {setCurrentPage(trans_page); return NULL;} recurrenceEditWidget->setStartDate(trans->date()); return new ScheduledTransaction(budget, trans, recurrenceEditWidget->createRecurrence()); } bool EditScheduledTransactionDialog::modifyScheduledTransaction(ScheduledTransaction *strans) { Transaction *trans = transactionEditWidget->createTransaction(); if(!trans) {setCurrentPage(trans_page); return false;} recurrenceEditWidget->setStartDate(trans->date()); strans->setRecurrence(recurrenceEditWidget->createRecurrence()); strans->setTransaction(trans); return true; } bool EditScheduledTransactionDialog::modifyTransaction(Transaction *trans, Recurrence *&rec) { if(!transactionEditWidget->modifyTransaction(trans)) {setCurrentPage(trans_page); return false;} recurrenceEditWidget->setStartDate(trans->date()); rec = recurrenceEditWidget->createRecurrence(); return true; } ScheduledTransaction *EditScheduledTransactionDialog::newScheduledTransaction(int transaction_type, Budget *budg, QWidget *parent, Security *security, bool select_security, Account *account, bool extra_parameters) { EditScheduledTransactionDialog *dialog = NULL; switch(transaction_type) { case TRANSACTION_TYPE_EXPENSE: {dialog = new EditScheduledTransactionDialog(extra_parameters, transaction_type, security, select_security, budg, parent, i18n("New Expense"), account); break;} case TRANSACTION_TYPE_INCOME: { if(security || select_security) dialog = new EditScheduledTransactionDialog(extra_parameters, transaction_type, security, select_security, budg, parent, i18n("New Dividend"), account); else dialog = new EditScheduledTransactionDialog(extra_parameters, transaction_type, security, select_security, budg, parent, i18n("New Income"), account); break; } case TRANSACTION_TYPE_TRANSFER: {dialog = new EditScheduledTransactionDialog(extra_parameters, transaction_type, security, select_security, budg, parent, i18n("New Transfer"), account); break;} case TRANSACTION_TYPE_SECURITY_BUY: {dialog = new EditScheduledTransactionDialog(extra_parameters, transaction_type, security, select_security, budg, parent, i18n("New Security Buy"), account); break;} case TRANSACTION_TYPE_SECURITY_SELL: { dialog = new EditScheduledTransactionDialog(extra_parameters, transaction_type, security, select_security, budg, parent, i18n("New Security Sell"), account); //dialog->transactionEditWidget->setMaxSharesDate(QDate::currentDate()); break; } } ScheduledTransaction *strans = NULL; if(dialog->checkAccounts() && dialog->exec() == QDialog::Accepted) { strans = dialog->createScheduledTransaction(); } dialog->deleteLater(); return strans; } bool EditScheduledTransactionDialog::editScheduledTransaction(ScheduledTransaction *strans, QWidget *parent, bool select_security, bool extra_parameters) { EditScheduledTransactionDialog *dialog = NULL; switch(strans->transaction()->type()) { case TRANSACTION_TYPE_EXPENSE: {dialog = new EditScheduledTransactionDialog(extra_parameters, strans->transaction()->type(), NULL, false, strans->budget(), parent, i18n("Edit Expense")); break;} case TRANSACTION_TYPE_INCOME: { if(((Income*) strans->transaction())->security()) dialog = new EditScheduledTransactionDialog(extra_parameters, strans->transaction()->type(), ((Income*) strans->transaction())->security(), select_security, strans->budget(), parent, i18n("Edit Dividend")); else dialog = new EditScheduledTransactionDialog(extra_parameters, strans->transaction()->type(), NULL, false, strans->budget(), parent, i18n("Edit Income")); break; } case TRANSACTION_TYPE_TRANSFER: {dialog = new EditScheduledTransactionDialog(extra_parameters, strans->transaction()->type(), NULL, false, strans->budget(), parent, i18n("Edit Transfer")); break;} case TRANSACTION_TYPE_SECURITY_BUY: {dialog = new EditScheduledTransactionDialog(extra_parameters, strans->transaction()->type(), ((SecurityTransaction*) strans->transaction())->security(), select_security, strans->budget(), parent, i18n("Edit Securities Bought")); break;} case TRANSACTION_TYPE_SECURITY_SELL: {dialog = new EditScheduledTransactionDialog(extra_parameters, strans->transaction()->type(), ((SecurityTransaction*) strans->transaction())->security(), select_security, strans->budget(), parent, i18n("Edit Securities Sold")); break;} } dialog->setScheduledTransaction(strans); bool b = false; if(dialog->checkAccounts() && dialog->exec() == QDialog::Accepted) { b = dialog->modifyScheduledTransaction(strans); } dialog->deleteLater(); return b; } bool EditScheduledTransactionDialog::editTransaction(Transaction *trans, Recurrence *&rec, QWidget *parent, bool select_security, bool extra_parameters) { EditScheduledTransactionDialog *dialog = NULL; switch(trans->type()) { case TRANSACTION_TYPE_EXPENSE: {dialog = new EditScheduledTransactionDialog(extra_parameters, trans->type(), NULL, false, trans->budget(), parent, i18n("Edit Expense")); break;} case TRANSACTION_TYPE_INCOME: { if(((Income*) trans)->security()) dialog = new EditScheduledTransactionDialog(extra_parameters, trans->type(), ((Income*) trans)->security(), select_security, trans->budget(), parent, i18n("Edit Dividend")); else dialog = new EditScheduledTransactionDialog(extra_parameters, trans->type(), NULL, false, trans->budget(), parent, i18n("Edit Income")); break; } case TRANSACTION_TYPE_TRANSFER: {dialog = new EditScheduledTransactionDialog(extra_parameters, trans->type(), NULL, false, trans->budget(), parent, i18n("Edit Transfer")); break;} case TRANSACTION_TYPE_SECURITY_BUY: {dialog = new EditScheduledTransactionDialog(extra_parameters, trans->type(), ((SecurityTransaction*) trans)->security(), select_security, trans->budget(), parent, i18n("Edit Securities Bought")); break;} case TRANSACTION_TYPE_SECURITY_SELL: {dialog = new EditScheduledTransactionDialog(extra_parameters, trans->type(), ((SecurityTransaction*) trans)->security(), select_security, trans->budget(), parent, i18n("Edit Securities Sold")); break;} } dialog->setTransaction(trans); bool b = false; if(dialog->checkAccounts() && dialog->exec() == QDialog::Accepted) { b = dialog->modifyTransaction(trans, rec); } dialog->deleteLater(); return b; } #include "editscheduledtransactiondialog.moc" eqonomize-0.6/src/editscheduledtransactiondialog.h0000600000175000017500000000605711106576707021527 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EDIT_SCHEDULED_TRANSACTION_DIALOG_H #define EDIT_SCHEDULED_TRANSACTION_DIALOG_H #include class Budget; class Account; class TransactionEditWidget; class RecurrenceEditWidget; class Transaction; class Security; class ScheduledTransaction; class Recurrence; class EditScheduledTransactionDialog : public KPageDialog { Q_OBJECT protected: Budget *budget; bool b_extra; RecurrenceEditWidget *recurrenceEditWidget; TransactionEditWidget *transactionEditWidget; KPageWidgetItem *recurrence_page, *trans_page; public: EditScheduledTransactionDialog(bool extra_parameters, int transaction_type, Security *security, bool select_security, Budget *budg, QWidget *parent, QString title, Account *account = NULL); bool checkAccounts(); void setTransaction(Transaction *trans); void setScheduledTransaction(ScheduledTransaction *strans); ScheduledTransaction *createScheduledTransaction(); bool modifyScheduledTransaction(ScheduledTransaction *strans); bool modifyTransaction(Transaction *trans, Recurrence *&rec); static ScheduledTransaction *newScheduledTransaction(int transaction_type, Budget *budg, QWidget *parent, Security *security = NULL, bool select_security = false, Account *account = NULL, bool extra_parameters = false); static bool editScheduledTransaction(ScheduledTransaction *strans, QWidget *parent, bool select_security = true, bool extra_parameters = false); static bool editTransaction(Transaction *trans, Recurrence *&rec, QWidget *parent, bool select_security = true, bool extra_parameters = false); protected slots: void slotButtonClicked(int button); }; #endif eqonomize-0.6/src/editsplitdialog.cpp0000644000175000017500000004116511106576714017014 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "editsplitdialog.h" #include "transactioneditwidget.h" #include "budget.h" #include "eqonomize.h" #include #include #include #include #include #include #include #include #include #include #include "kdateedit.h" #include #include #include #include #include #include #include class SplitListViewItem : public QTreeWidgetItem { protected: Transaction *o_trans; bool b_deposit; public: SplitListViewItem(Transaction *trans, bool deposit); bool operator<(const QTreeWidgetItem&) const; Transaction *transaction() const; bool isDeposit() const; void setTransaction(Transaction *trans, bool deposit); }; SplitListViewItem::SplitListViewItem(Transaction *trans, bool deposit) : QTreeWidgetItem() { setTransaction(trans, deposit); setTextAlignment(3, Qt::AlignRight); setTextAlignment(4, Qt::AlignRight); } bool SplitListViewItem::operator<(const QTreeWidgetItem &i_pre) const { int col = 0; if(treeWidget()) col = treeWidget()->sortColumn(); SplitListViewItem *i = (SplitListViewItem*) &i_pre; if(col == 3) { double value1 = 0.0; double value2 = 0.0; if(b_deposit && o_trans->value() < 0.0) value1 = -o_trans->value(); else if(!b_deposit && o_trans->value() >= 0.0) value1 = o_trans->value(); if(i->isDeposit() && i->transaction()->value() < 0.0) value2 = -i->transaction()->value(); else if(!i->isDeposit() && i->transaction()->value() >= 0.0) value2 = i->transaction()->value(); return value1 < value2; } else if(col == 4) { double value1 = 0.0; double value2 = 0.0; if(!b_deposit && o_trans->value() < 0.0) value1 = -o_trans->value(); else if(b_deposit && o_trans->value() >= 0.0) value1 = o_trans->value(); if(!i->isDeposit() && i->transaction()->value() < 0.0) value2 = -i->transaction()->value(); else if(i->isDeposit() && i->transaction()->value() >= 0.0) value2 = i->transaction()->value(); return value1 < value2; } return QTreeWidgetItem::operator<(i_pre); } Transaction *SplitListViewItem::transaction() const { return o_trans; } bool SplitListViewItem::isDeposit() const { return b_deposit; } void SplitListViewItem::setTransaction(Transaction *trans, bool deposit) { o_trans = trans; b_deposit = deposit; Budget *budget = trans->budget(); double value = trans->value(); setText(1, trans->description()); setText(2, deposit ? trans->fromAccount()->name() : trans->toAccount()->name()); if(deposit) setText(3, value >= 0.0 ? QString::null : KGlobal::locale()->formatMoney(-value)); else setText(3, value < 0.0 ? QString::null : KGlobal::locale()->formatMoney(value)); if(!deposit) setText(4, value >= 0.0 ? QString::null : KGlobal::locale()->formatMoney(-value)); else setText(4, value < 0.0 ? QString::null : KGlobal::locale()->formatMoney(value)); if(trans->type() == TRANSACTION_TYPE_INCOME) { if(((Income*) trans)->security()) setText(0, i18n("Dividend")); else if(value >= 0) setText(0, i18n("Income")); else setText(0, i18n("Repayment")); } else if(trans->type() == TRANSACTION_TYPE_EXPENSE) { if(value >= 0) setText(0, i18n("Expense")); else setText(0, i18n("Refund")); } else if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY) { setText(0, i18n("Security Buy")); } else if(trans->type() == TRANSACTION_TYPE_SECURITY_SELL) { setText(0, i18n("Security Sell")); } else if(trans->toAccount() == budget->balancingAccount || trans->fromAccount() == budget->balancingAccount) { setText(0, i18n("Balancing")); } else { setText(0, i18n("Transfer")); } } EditSplitDialog::EditSplitDialog(Budget *budg, QWidget *parent, AssetsAccount *default_account, bool extra_parameters) : KDialog(parent, 0), budget(budg), b_extra(extra_parameters) { setCaption(i18n("Split Transaction")); setButtons(KDialog::Ok | KDialog::Cancel); setDefaultButton(KDialog::Cancel); setModal(true); setMainWidget(new QWidget(this)); QVBoxLayout *box1 = new QVBoxLayout(mainWidget()); QGridLayout *grid = new QGridLayout(); box1->addLayout(grid); grid->addWidget(new QLabel(i18n("Description:"), mainWidget()), 0, 0); descriptionEdit = new KLineEdit(mainWidget()); grid->addWidget(descriptionEdit, 0, 1); descriptionEdit->setFocus(); grid->addWidget(new QLabel(i18n("Date:"), mainWidget()), 1, 0); dateEdit = new KDateEdit(mainWidget()); dateEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); grid->addWidget(dateEdit, 1, 1); grid->addWidget(new QLabel(i18n("Account:"), mainWidget()), 2, 0); accountCombo = new KComboBox(mainWidget()); accountCombo->setEditable(false); int i = 0; AssetsAccount *account = budget->assetsAccounts.first(); while(account) { if(account != budget->balancingAccount && account->accountType() != ASSETS_TYPE_SECURITIES) { accountCombo->addItem(account->name()); if(account == default_account) accountCombo->setCurrentIndex(i); i++; } account = budget->assetsAccounts.next(); } grid->addWidget(accountCombo, 2, 1); box1->addWidget(new QLabel(i18n("Transactions:"), mainWidget())); QHBoxLayout *box2 = new QHBoxLayout(); box1->addLayout(box2); transactionsView = new EqonomizeTreeWidget(mainWidget()); transactionsView->setSortingEnabled(true); transactionsView->sortByColumn(0, Qt::AscendingOrder); transactionsView->setAllColumnsShowFocus(true); transactionsView->setColumnCount(5); QStringList headers; headers << i18n("Type"); headers << i18n("Description"); headers << i18n("Account/Category"); headers << i18n("Payment"); headers << i18n("Deposit"); transactionsView->setHeaderLabels(headers); transactionsView->setRootIsDecorated(false); box2->addWidget(transactionsView); KDialogButtonBox *buttons = new KDialogButtonBox(mainWidget(), Qt::Vertical); QPushButton *newButton = buttons->addButton(i18n("New"), QDialogButtonBox::ActionRole); QMenu *newMenu = new QMenu(this); newButton->setMenu(newMenu); connect(newMenu->addAction(KIcon("document-new"), i18n("New Expense...")), SIGNAL(triggered()), this, SLOT(newExpense())); connect(newMenu->addAction(KIcon("document-new"), i18n("New Income...")), SIGNAL(triggered()), this, SLOT(newIncome())); connect(newMenu->addAction(KIcon("document-new"), i18n("New Deposit...")), SIGNAL(triggered()), this, SLOT(newTransferTo())); connect(newMenu->addAction(KIcon("document-new"), i18n("New Withdrawal...")), SIGNAL(triggered()), this, SLOT(newTransferFrom())); connect(newMenu->addAction(KIcon("document-new"), i18n("New Security Shares Bought...")), SIGNAL(triggered()), this, SLOT(newSecurityBuy())); connect(newMenu->addAction(KIcon("document-new"), i18n("Security Shares Sold...")), SIGNAL(triggered()), this, SLOT(newSecuritySell())); connect(newMenu->addAction(KIcon("document-new"), i18n("New Dividend...")), SIGNAL(triggered()), this, SLOT(newDividend())); editButton = buttons->addButton(i18n("Edit..."), QDialogButtonBox::ActionRole); editButton->setEnabled(false); removeButton = buttons->addButton(KStandardGuiItem::guiItem(KStandardGuiItem::Delete), QDialogButtonBox::ActionRole); removeButton->setEnabled(false); box2->addWidget(buttons); totalLabel = new QLabel(mainWidget()); updateTotalValue(); box1->addWidget(totalLabel); connect(transactionsView, SIGNAL(itemSelectionChanged()), this, SLOT(transactionSelectionChanged())); connect(transactionsView, SIGNAL(doubleClicked(QTreeWidgetItem*, int)), this, SLOT(edit(QTreeWidgetItem*))); connect(removeButton, SIGNAL(clicked()), this, SLOT(remove())); connect(editButton, SIGNAL(clicked()), this, SLOT(edit())); } EditSplitDialog::~EditSplitDialog() {} void EditSplitDialog::updateTotalValue() { double total_value = 0.0; QTreeWidgetItemIterator it(transactionsView); QTreeWidgetItem *i = *it; while(i) { Transaction *trans = ((SplitListViewItem*) i)->transaction(); if(trans) { if(trans->fromAccount()) total_value += trans->value(); else total_value -= trans->value(); } ++it; i = *it; } totalLabel->setText(QString("
%1 %2
").arg(i18n("Total value:")).arg(KGlobal::locale()->formatMoney(total_value))); } AssetsAccount *EditSplitDialog::selectedAccount() { int index = 0; int cur_index = accountCombo->currentIndex(); AssetsAccount *account = budget->assetsAccounts.first(); while(account) { if(account != budget->balancingAccount && account->accountType() != ASSETS_TYPE_SECURITIES) { if(index == cur_index) { break; } index++; } account = budget->assetsAccounts.next(); } return account; } void EditSplitDialog::transactionSelectionChanged() { QList list = transactionsView->selectedItems(); SplitListViewItem *i = NULL; if(!list.isEmpty()) i = (SplitListViewItem*) list.first(); editButton->setEnabled(i && i->transaction()); removeButton->setEnabled(i && i->transaction()); } void EditSplitDialog::newTransaction(int transtype, bool select_security, bool transfer_to, Account *exclude_account) { TransactionEditDialog *dialog = new TransactionEditDialog(b_extra, transtype, true, transfer_to, NULL, SECURITY_ALL_VALUES, select_security, budget, this); dialog->editWidget->updateAccounts(exclude_account); if(dialog->editWidget->checkAccounts() && dialog->exec() == QDialog::Accepted) { Transaction *trans = dialog->editWidget->createTransaction(); if(trans) { appendTransaction(trans, (trans->toAccount() == NULL)); } updateTotalValue(); } dialog->deleteLater(); } void EditSplitDialog::newExpense() { newTransaction(TRANSACTION_TYPE_EXPENSE); } void EditSplitDialog::newDividend() { newTransaction(TRANSACTION_TYPE_INCOME, true); } void EditSplitDialog::newSecurityBuy() { newTransaction(TRANSACTION_TYPE_SECURITY_BUY, true); } void EditSplitDialog::newSecuritySell() { newTransaction(TRANSACTION_TYPE_SECURITY_SELL, true); } void EditSplitDialog::newIncome() { newTransaction(TRANSACTION_TYPE_INCOME); } void EditSplitDialog::newTransferFrom() { newTransaction(TRANSACTION_TYPE_TRANSFER, false, false, selectedAccount()); } void EditSplitDialog::newTransferTo() { newTransaction(TRANSACTION_TYPE_TRANSFER, false, true, selectedAccount()); } void EditSplitDialog::remove() { QList list = transactionsView->selectedItems(); if(list.isEmpty()) return; SplitListViewItem *i = (SplitListViewItem*) list.first(); if(i->transaction()) { delete i->transaction(); } delete i; updateTotalValue(); } void EditSplitDialog::edit() { QList list = transactionsView->selectedItems(); if(list.isEmpty()) return; edit(list.first()); } void EditSplitDialog::edit(QTreeWidgetItem *i_pre) { if(i_pre == NULL) return; SplitListViewItem *i = (SplitListViewItem*) i_pre; Transaction *trans = i->transaction(); if(trans) { AssetsAccount *account = selectedAccount(); Security *security = NULL; if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY || trans->type() == TRANSACTION_TYPE_SECURITY_SELL) { security = ((SecurityTransaction*) trans)->security(); } else if(trans->type() == TRANSACTION_TYPE_INCOME && ((Income*) trans)->security()) { security = ((Income*) trans)->security(); } TransactionEditDialog *dialog = new TransactionEditDialog(b_extra, trans->type(), true, trans->toAccount() == NULL, security, SECURITY_ALL_VALUES, security != NULL, budget, this); dialog->editWidget->updateAccounts(account); dialog->editWidget->setTransaction(trans); if(dialog->exec() == QDialog::Accepted) { if(dialog->editWidget->modifyTransaction(trans)) { i->setTransaction(trans, trans->toAccount() == NULL); } updateTotalValue(); } dialog->deleteLater(); } } SplitTransaction *EditSplitDialog::createSplitTransaction() { if(!validValues()) return NULL; AssetsAccount *account = selectedAccount(); SplitTransaction *split = new SplitTransaction(budget, dateEdit->date(), account, descriptionEdit->text()); QTreeWidgetItemIterator it(transactionsView); QTreeWidgetItem *i = *it; while(i) { Transaction *trans = ((SplitListViewItem*) i)->transaction(); if(trans) split->addTransaction(trans); ++it; i = *it; } return split; } void EditSplitDialog::setSplitTransaction(SplitTransaction *split) { descriptionEdit->setText(split->description()); dateEdit->setDate(split->date()); int index = 0; AssetsAccount *account = budget->assetsAccounts.first(); while(account) { if(account != budget->balancingAccount && account->accountType() != ASSETS_TYPE_SECURITIES) { if(account == split->account()) { accountCombo->setCurrentIndex(index); break; } index++; } account = budget->assetsAccounts.next(); } transactionsView->clear(); QList items; QVector::size_type c = split->splits.count(); for(QVector::size_type i = 0; i < c; i++) { Transaction *trans = split->splits[i]->copy(); trans->setDate(QDate()); items.append(new SplitListViewItem(trans, (trans->toAccount() == split->account()))); switch(trans->type()) { case TRANSACTION_TYPE_EXPENSE: { ((Expense*) trans)->setFrom(NULL); break; } case TRANSACTION_TYPE_INCOME: { ((Income*) trans)->setTo(NULL); break; } case TRANSACTION_TYPE_TRANSFER: { if(((Transfer*) trans)->from() == split->account()) { ((Transfer*) trans)->setFrom(NULL); } else { ((Transfer*) trans)->setTo(NULL); } break; } case TRANSACTION_TYPE_SECURITY_BUY: {} case TRANSACTION_TYPE_SECURITY_SELL: { ((SecurityTransaction*) trans)->setAccount(NULL); break; } } } transactionsView->addTopLevelItems(items); updateTotalValue(); transactionsView->setSortingEnabled(true); } void EditSplitDialog::appendTransaction(Transaction *trans, bool deposit) { SplitListViewItem *i = new SplitListViewItem(trans, deposit); transactionsView->insertTopLevelItem(transactionsView->topLevelItemCount(), i); transactionsView->setSortingEnabled(true); } void EditSplitDialog::slotButtonClicked(int button) { if(button == KDialog::Ok && !validValues()) return; if(button == KDialog::Cancel) { QTreeWidgetItemIterator it(transactionsView); QTreeWidgetItem *i = *it; while(i) { Transaction *trans = ((SplitListViewItem*) i)->transaction(); if(trans) delete trans; ++it; i = *it; } } KDialog::slotButtonClicked(button); } bool EditSplitDialog::checkAccounts() { if(accountCombo->count() == 0) { KMessageBox::error(this, i18n("No suitable account available.")); return false; } return true; } bool EditSplitDialog::validValues() { if(!checkAccounts()) return false; if(!dateEdit->date().isValid()) { KMessageBox::error(this, i18n("Invalid date.")); return false; } if(dateEdit->date() > QDate::currentDate()) { KMessageBox::error(this, i18n("Future dates is not allowed.")); return false; } if(transactionsView->topLevelItemCount() < 2) { KMessageBox::error(this, i18n("A split must contain at least two transactions.")); return false; } AssetsAccount *account = selectedAccount(); QTreeWidgetItemIterator it(transactionsView); QTreeWidgetItem *i = *it; while(i) { Transaction *trans = ((SplitListViewItem*) i)->transaction(); if(trans && (trans->fromAccount() == account || trans->toAccount() == account)) { KMessageBox::error(this, i18n("Cannot transfer money to and from the same account.")); return false; } ++it; i = *it; } return true; } #include "editsplitdialog.moc" eqonomize-0.6/src/editsplitdialog.h0000644000175000017500000000555611106576722016464 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EDIT_SPLIT_DIALOG_H #define EDIT_SPLIT_DIALOG_H #include class Budget; class Transaction; class AssetsAccount; class Account; class SplitTransaction; class KLineEdit; class KDateEdit; class KComboBox; class QPushButton; class QLabel; class QTreeWidget; class QTreeWidgetItem; class EditSplitDialog : public KDialog { Q_OBJECT protected: Budget *budget; bool b_extra; KDateEdit *dateEdit; KComboBox *accountCombo; KLineEdit *descriptionEdit; QTreeWidget *transactionsView; QPushButton *editButton, *removeButton; QLabel *totalLabel; void appendTransaction(Transaction *trans, bool deposit); void newTransaction(int transtype, bool select_security = false, bool transfer_to = false, Account *exclude_account = NULL); void updateTotalValue(); AssetsAccount *selectedAccount(); public: EditSplitDialog(Budget *budg, QWidget *parent, AssetsAccount *default_account = NULL, bool extra_parameters = false); ~EditSplitDialog(); SplitTransaction *createSplitTransaction(); void setSplitTransaction(SplitTransaction *split); bool validValues(); bool checkAccounts(); protected slots: void slotButtonClicked(int); void remove(); void edit(); void edit(QTreeWidgetItem*); void transactionSelectionChanged(); void newExpense(); void newIncome(); void newDividend(); void newSecurityBuy(); void newSecuritySell(); void newTransferFrom(); void newTransferTo(); }; #endif eqonomize-0.6/src/eqonomize.cpp0000600000175000017500000076323011107070303015615 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "eqonomize.h" #include "budget.h" #include "recurrence.h" #include "security.h" #include "transactionlistwidget.h" #include "transactioneditwidget.h" #include "recurrenceeditwidget.h" #include "editscheduledtransactiondialog.h" #include "overtimereport.h" #include "categoriescomparisonreport.h" #include "categoriescomparisonchart.h" #include "overtimechart.h" #include "importcsvdialog.h" #include "eqonomizemonthselector.h" #include "editsplitdialog.h" #include "ledgerdialog.h" #include "eqonomizevalueedit.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "kdateedit.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qifimportexport.h" #include QTreeWidgetItem *selectedItem(QTreeWidget *w) { QList list = w->selectedItems(); if(list.isEmpty()) return NULL; return list.first(); } double averageMonth(const QDate &date1, const QDate &date2) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); double average_month = (double) calSys->daysInYear(date1) / (double) calSys->monthsInYear(date1); int years = 1; QDate ydate; calSys->setYMD(ydate, calSys->year(date1), 1, 1); ydate = calSys->addYears(ydate, 1); while(calSys->year(ydate) <= calSys->year(date2)) { average_month += (double) calSys->daysInYear(ydate) / (double) calSys->monthsInYear(ydate); years++; ydate = calSys->addYears(ydate, 1); } return average_month / years; } double averageYear(const QDate &date1, const QDate &date2) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); double average_year = calSys->daysInYear(date1); int years = 1; QDate ydate; calSys->setYMD(ydate, calSys->year(date1), 1, 1); ydate = calSys->addYears(ydate, 1); while(calSys->year(ydate) <= calSys->year(date2)) { average_year += calSys->daysInYear(ydate); years++; ydate = calSys->addYears(ydate, 1); } return average_year / years; } double yearsBetweenDates(const QDate &date1, const QDate &date2) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); double years = 0.0; if(calSys->year(date1) == calSys->year(date2)) { int days = date1.daysTo(date2) + 1; years = (double) days / (double) calSys->daysInYear(date2); } else { QDate yeardate; calSys->setYMD(yeardate, calSys->year(date1), 1, 1); years += (1.0 - (calSys->dayOfYear(date1) - 1.0) / (double) calSys->daysInYear(date1)); yeardate = calSys->addYears(yeardate, 1); while(calSys->year(yeardate) != calSys->year(date2)) { years += 1.0; yeardate = calSys->addYears(yeardate, 1); } years += (double) calSys->dayOfYear(date2) / (double) calSys->daysInYear(date2); } return years; } double monthsBetweenDates(const QDate &date1, const QDate &date2) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); double months = 0.0; if(calSys->year(date1) == calSys->year(date2)) { if(calSys->month(date1) == calSys->month(date2)) { int days = date1.daysTo(date2) + 1; months = (double) days / (double) calSys->daysInMonth(date2); } else { QDate monthdate; calSys->setYMD(monthdate, calSys->year(date1), calSys->month(date1), 1); months += (1.0 - ((calSys->day(date1) - 1.0) / (double) calSys->daysInMonth(date1))); months += (calSys->month(date2) - calSys->month(date1) - 1); calSys->setYMD(monthdate, calSys->year(date2), calSys->month(date2), 1); months += (double) calSys->day(date2) / (double) calSys->daysInMonth(date2); } } else { QDate monthdate; calSys->setYMD(monthdate, calSys->year(date1), calSys->month(date1), 1); months += (1.0 - ((calSys->day(date1) - 1.0) / (double) calSys->daysInMonth(date1))); months += (calSys->monthsInYear(date1) - calSys->month(date1)); QDate yeardate; calSys->setYMD(yeardate, calSys->year(date1), 1, 1); yeardate = calSys->addYears(yeardate, 1); while(calSys->year(yeardate) != calSys->year(date2)) { months += calSys->monthsInYear(yeardate); yeardate = calSys->addYears(yeardate, 1); } calSys->setYMD(monthdate, calSys->year(date2), calSys->month(date2), 1); months += (double) calSys->day(date2) / (double) calSys->daysInMonth(date2); months += calSys->month(date2) - 1; } return months; } class SecurityListViewItem : public QTreeWidgetItem { protected: Security *o_security; public: SecurityListViewItem(Security *sec, QString s1, QString s2 = QString::null, QString s3 = QString::null, QString s4 = QString::null, QString s5 = QString::null, QString s6 = QString::null, QString s7 = QString::null, QString s8 = QString::null) : QTreeWidgetItem(UserType), o_security(sec) { setText(0, s1); setText(1, s2); setText(2, s3); setText(3, s4); setText(4, s5); setText(5, s6); setText(6, s7); setText(7, s8); setTextAlignment(1, Qt::AlignRight); setTextAlignment(2, Qt::AlignRight); setTextAlignment(3, Qt::AlignRight); setTextAlignment(4, Qt::AlignRight); setTextAlignment(5, Qt::AlignRight); setTextAlignment(6, Qt::AlignRight); setTextAlignment(7, Qt::AlignCenter); setTextAlignment(8, Qt::AlignCenter); } bool operator<(const QTreeWidgetItem &i_pre) const { int col = 0; if(treeWidget()) col = treeWidget()->sortColumn(); SecurityListViewItem *i = (SecurityListViewItem*) &i_pre; if(col >= 2 && col <= 6) { double d1 = text(col).toDouble(); double d2 = i->text(col).toDouble(); return d1 < d2; } return QTreeWidgetItem::operator<(i_pre); } Security* security() const {return o_security;} double cost, value, rate, profit; }; class ScheduleListViewItem : public QTreeWidgetItem { protected: ScheduledTransaction *o_strans; QDate d_date; public: ScheduleListViewItem(ScheduledTransaction *strans, const QDate &trans_date); bool operator<(const QTreeWidgetItem &i_pre) const; ScheduledTransaction *scheduledTransaction() const; void setScheduledTransaction(ScheduledTransaction *strans); const QDate &date() const; void setDate(const QDate &newdate); }; ScheduleListViewItem::ScheduleListViewItem(ScheduledTransaction *strans, const QDate &trans_date) : QTreeWidgetItem(UserType) { setTextAlignment(3, Qt::AlignRight); setTextAlignment(4, Qt::AlignCenter); setTextAlignment(5, Qt::AlignCenter); setScheduledTransaction(strans); setDate(trans_date); } bool ScheduleListViewItem::operator<(const QTreeWidgetItem &i_pre) const { int col = 0; if(treeWidget()) col = treeWidget()->sortColumn(); ScheduleListViewItem *i = (ScheduleListViewItem*) &i_pre; if(col == 0) { return d_date < i->date(); } else if(col == 3) { return o_strans->transaction()->value() < i->scheduledTransaction()->transaction()->value(); } return QTreeWidgetItem::operator<(i_pre); } ScheduledTransaction *ScheduleListViewItem::scheduledTransaction() const { return o_strans; } const QDate &ScheduleListViewItem::date() const { return d_date; } void ScheduleListViewItem::setDate(const QDate &newdate) { d_date = newdate; setText(0, KGlobal::locale()->formatDate(d_date, KLocale::ShortDate)); } void ScheduleListViewItem::setScheduledTransaction(ScheduledTransaction *strans) { o_strans = strans; Transaction *trans = strans->transaction(); setText(2, trans->description()); setText(3, KGlobal::locale()->formatMoney(trans->value())); setText(4, trans->fromAccount()->name()); setText(5, trans->toAccount()->name()); setText(6, trans->comment()); switch(trans->type()) { case TRANSACTION_TYPE_TRANSFER: {setText(1, i18n("Transfer")); break;} case TRANSACTION_TYPE_INCOME: { if(((Income*) trans)->security()) setText(1, i18n("Dividend")); else setText(1, i18n("Income")); break; } case TRANSACTION_TYPE_EXPENSE: {setText(1, i18n("Expense")); break;} case TRANSACTION_TYPE_SECURITY_BUY: {setText(1, i18n("Security Buy")); break;} case TRANSACTION_TYPE_SECURITY_SELL: {setText(1, i18n("Security Sell")); break;} } } class ConfirmScheduleListViewItem : public QTreeWidgetItem { protected: Transaction *o_trans; public: ConfirmScheduleListViewItem(Transaction *trans); bool operator<(const QTreeWidgetItem &i_pre) const; Transaction *transaction() const; void setTransaction(Transaction *trans); }; ConfirmScheduleListViewItem::ConfirmScheduleListViewItem(Transaction *trans) : QTreeWidgetItem(UserType) { setTransaction(trans); setTextAlignment(3, Qt::AlignRight); } bool ConfirmScheduleListViewItem::operator<(const QTreeWidgetItem &i_pre) const { int col = 0; if(treeWidget()) col = treeWidget()->sortColumn(); ConfirmScheduleListViewItem *i = (ConfirmScheduleListViewItem*) &i_pre; if(col == 0) { return o_trans->date() < i->transaction()->date(); } else if(col == 3) { return o_trans->value() < i->transaction()->value(); } return QTreeWidgetItem::operator<(i_pre); } Transaction *ConfirmScheduleListViewItem::transaction() const { return o_trans; } void ConfirmScheduleListViewItem::setTransaction(Transaction *trans) { o_trans = trans; setText(0, KGlobal::locale()->formatDate(trans->date(), KLocale::ShortDate)); switch(trans->type()) { case TRANSACTION_TYPE_TRANSFER: {setText(1, i18n("Transfer")); break;} case TRANSACTION_TYPE_INCOME: { if(((Income*) trans)->security()) setText(1, i18n("Dividend")); else setText(1, i18n("Income")); break; } case TRANSACTION_TYPE_EXPENSE: {setText(1, i18n("Expense")); break;} case TRANSACTION_TYPE_SECURITY_BUY: {setText(1, i18n("Security Buy")); break;} case TRANSACTION_TYPE_SECURITY_SELL: {setText(1, i18n("Security Sell")); break;} } setText(2, trans->description()); setText(3, KGlobal::locale()->formatMoney(trans->value())); } class SecurityTransactionListViewItem : public QTreeWidgetItem { public: SecurityTransactionListViewItem(QString, QString=QString::null, QString=QString::null, QString=QString::null); bool operator<(const QTreeWidgetItem &i_pre) const; SecurityTransaction *trans; Income *div; ReinvestedDividend *rediv; ScheduledTransaction *strans, *sdiv; SecurityTrade *ts; QDate date; double shares, value; }; SecurityTransactionListViewItem::SecurityTransactionListViewItem(QString s1, QString s2, QString s3, QString s4) : QTreeWidgetItem(UserType), trans(NULL), div(NULL), rediv(NULL), strans(NULL), sdiv(NULL), ts(NULL), shares(-1.0), value(-1.0) { setText(0, s1); setText(1, s2); setText(2, s3); setText(3, s4); setTextAlignment(0, Qt::AlignLeft); setTextAlignment(1, Qt::AlignLeft); setTextAlignment(2, Qt::AlignRight); setTextAlignment(3, Qt::AlignRight); } bool SecurityTransactionListViewItem::operator<(const QTreeWidgetItem &i_pre) const { int col = 0; if(treeWidget()) col = treeWidget()->sortColumn(); SecurityTransactionListViewItem *i = (SecurityTransactionListViewItem*) &i_pre; if(col == 0) { return date < i->date; } else if(col == 2) { return value < i->value; } else if(col == 2) { return shares < i->shares; } return QTreeWidgetItem::operator<(i_pre); } class QuotationListViewItem : public QTreeWidgetItem { public: QuotationListViewItem(const QDate &date_, double value_); bool operator<(const QTreeWidgetItem &i_pre) const; QDate date; double value; }; QuotationListViewItem::QuotationListViewItem(const QDate &date_, double value_) : QTreeWidgetItem(UserType), date(date_), value(value_) { setText(0, KGlobal::locale()->formatDate(date, KLocale::ShortDate)); setText(1, KGlobal::locale()->formatMoney(value)); setTextAlignment(0, Qt::AlignRight); setTextAlignment(1, Qt::AlignRight); } bool QuotationListViewItem::operator<(const QTreeWidgetItem &i_pre) const { QuotationListViewItem *i = (QuotationListViewItem*) &i_pre; if(!treeWidget() || treeWidget()->sortColumn() == 0) { return date < i->date; } else { return value < i->value; } return QTreeWidgetItem::operator<(i_pre); } RefundDialog::RefundDialog(Transaction *trans, QWidget *parent) : KDialog(parent, 0), transaction(trans) { if(trans->type() == TRANSACTION_TYPE_INCOME) setCaption(i18n("Repayment")); else setCaption(i18n("Refund")); setButtons(Ok | Cancel); setDefaultButton(Ok); setModal(true); setMainWidget(new QWidget(this)); QGridLayout *layout = new QGridLayout(mainWidget()); layout->addWidget(new QLabel(i18n("Date:"), mainWidget()), 0, 0); dateEdit = new KDateEdit(mainWidget()); dateEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); layout->addWidget(dateEdit, 0, 1); dateEdit->setFocus(); if(trans->type() == TRANSACTION_TYPE_INCOME) layout->addWidget(new QLabel(i18n("Cost:"), mainWidget()), 1, 0); else layout->addWidget(new QLabel(i18n("Income:"), mainWidget()), 1, 0); valueEdit = new EqonomizeValueEdit(trans->value(), false, true, mainWidget()); layout->addWidget(valueEdit, 1, 1); layout->addWidget(new QLabel(i18n("Account:"), mainWidget()), 2, 0); accountCombo = new KComboBox(mainWidget()); accountCombo->setEditable(false); int i = 0; AssetsAccount *account = transaction->budget()->assetsAccounts.first(); while(account) { if(account != transaction->budget()->balancingAccount && account->accountType() != ASSETS_TYPE_SECURITIES) { accountCombo->addItem(account->name()); if((transaction->type() == TRANSACTION_TYPE_EXPENSE && account == ((Expense*) transaction)->from()) || (transaction->type() == TRANSACTION_TYPE_INCOME && account == ((Income*) transaction)->to())) accountCombo->setCurrentIndex(i); i++; } account = transaction->budget()->assetsAccounts.next(); } layout->addWidget(accountCombo, 2, 1); layout->addWidget(new QLabel(i18n("Quantity:"), mainWidget()), 3, 0); quantityEdit = new EqonomizeValueEdit(trans->quantity(), 2, false, false, mainWidget()); layout->addWidget(quantityEdit, 3, 1); layout->addWidget(new QLabel(i18n("Comments:"), mainWidget()), 4, 0); commentsEdit = new KLineEdit(mainWidget()); if(trans->type() == TRANSACTION_TYPE_INCOME) commentsEdit->setText(i18n("Repayment")); else commentsEdit->setText(i18n("Refund")); layout->addWidget(commentsEdit, 4, 1); } Transaction *RefundDialog::createRefund() { if(!validValues()) return NULL; Transaction *trans = NULL; int i = 0; int cur_i = accountCombo->currentIndex(); AssetsAccount *account = transaction->budget()->assetsAccounts.first(); while(account) { if(account != transaction->budget()->balancingAccount && account->accountType() != ASSETS_TYPE_SECURITIES) { if(i == cur_i) break; i++; } account = transaction->budget()->assetsAccounts.next(); } trans = transaction->copy(); if(transaction->type() == TRANSACTION_TYPE_EXPENSE) { ((Expense*) trans)->setFrom(account); } else { ((Income*) trans)->setTo(account); } trans->setQuantity(-quantityEdit->value()); trans->setValue(-valueEdit->value()); trans->setDate(dateEdit->date()); trans->setComment(commentsEdit->text()); return trans; } void RefundDialog::slotButtonClicked(int button) { if(button != Ok || validValues()) { KDialog::slotButtonClicked(button); } } bool RefundDialog::validValues() { if(!dateEdit->date().isValid()) { KMessageBox::error(this, i18n("Invalid date.")); return false; } return true; } EditReinvestedDividendDialog::EditReinvestedDividendDialog(Budget *budg, Security *sec, bool select_security, QWidget *parent) : KDialog(parent, 0), budget(budg) { setCaption(i18n("Reinvested Dividend")); setButtons(Ok | Cancel); setDefaultButton(Ok); setModal(true); setMainWidget(new QWidget(this)); QGridLayout *layout = new QGridLayout(mainWidget()); securityCombo = NULL; layout->addWidget(new QLabel(i18n("Security:"), mainWidget()), 0, 0); if(select_security) { securityCombo = new KComboBox(mainWidget()); securityCombo->setEditable(false); Security *c_sec = budget->securities.first(); int i2 = 0; while(c_sec) { securityCombo->addItem(c_sec->name()); if(c_sec == sec) securityCombo->setCurrentIndex(i2); c_sec = budget->securities.next(); i2++; } layout->addWidget(securityCombo, 0, 1); } else { layout->addWidget(new QLabel(sec->name(), mainWidget()), 0, 1); } layout->addWidget(new QLabel(i18n("Shares added:"), mainWidget()), 1, 0); sharesEdit = new EqonomizeValueEdit(0.0, selectedSecurity()->decimals(), false, false, mainWidget()); layout->addWidget(sharesEdit, 1, 1); sharesEdit->setFocus(); layout->addWidget(new QLabel(i18n("Date:"), mainWidget()), 2, 0); dateEdit = new KDateEdit(mainWidget()); dateEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); layout->addWidget(dateEdit, 2, 1); if(securityCombo) connect(securityCombo, SIGNAL(activated(int)), this, SLOT(securityChanged())); } Security *EditReinvestedDividendDialog::selectedSecurity() { if(securityCombo) { int i = securityCombo->currentIndex(); if(i >= 0) { Security *c_sec = budget->securities.first(); while(i > 0 && c_sec) { c_sec = budget->securities.next(); i--; } return c_sec; } } return NULL; } void EditReinvestedDividendDialog::securityChanged() { if(selectedSecurity()) { if(sharesEdit) sharesEdit->setPrecision(selectedSecurity()->decimals()); } } void EditReinvestedDividendDialog::setDividend(ReinvestedDividend *rediv) { dateEdit->setDate(rediv->date); sharesEdit->setValue(rediv->shares); } bool EditReinvestedDividendDialog::modifyDividend(ReinvestedDividend *rediv) { if(!validValues()) return false; rediv->date = dateEdit->date(); rediv->shares = sharesEdit->value(); return true; } ReinvestedDividend *EditReinvestedDividendDialog::createDividend() { if(!validValues()) return NULL; return new ReinvestedDividend(dateEdit->date(), sharesEdit->value()); } void EditReinvestedDividendDialog::slotButtonClicked(int button) { if(button != Ok || validValues()) { KDialog::slotButtonClicked(button); } } bool EditReinvestedDividendDialog::validValues() { if(!dateEdit->date().isValid()) { KMessageBox::error(this, i18n("Invalid date.")); return false; } return true; } EditSecurityTradeDialog::EditSecurityTradeDialog(Budget *budg, Security *sec, QWidget *parent) : KDialog(parent, 0), budget(budg) { setCaption(i18n("Security Trade")); setButtons(Ok | Cancel); setDefaultButton(Ok); setModal(true); setMainWidget(new QWidget(this)); QGridLayout *layout = new QGridLayout(mainWidget()); layout->addWidget(new QLabel(i18n("From security:"), mainWidget()), 0, 0); fromSecurityCombo = new KComboBox(mainWidget()); fromSecurityCombo->setEditable(false); Security *c_sec = budget->securities.first(); if(!sec) sec = c_sec; int i = 0; while(c_sec) { fromSecurityCombo->addItem(c_sec->name()); if(c_sec == sec) { fromSecurityCombo->setCurrentIndex(i); } c_sec = budget->securities.next(); i++; } layout->addWidget(fromSecurityCombo, 0, 1); layout->addWidget(new QLabel(i18n("Shares moved:"), mainWidget()), 1, 0); QHBoxLayout *sharesLayout = new QHBoxLayout(); fromSharesEdit = new EqonomizeValueEdit(0.0, sec ? sec->shares() : 10000.0, 1.0, 0.0, sec ? sec->decimals() : 4, false, mainWidget()); fromSharesEdit->setSizePolicy(QSizePolicy::Expanding, fromSharesEdit->sizePolicy().verticalPolicy()); sharesLayout->addWidget(fromSharesEdit); QPushButton *maxSharesButton = new QPushButton(i18n("All"), mainWidget()); maxSharesButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); sharesLayout->addWidget(maxSharesButton); layout->addLayout(sharesLayout, 1, 1); fromSharesEdit->setFocus(); layout->addWidget(new QLabel(i18n("To security:"), mainWidget()), 2, 0); toSecurityCombo = new KComboBox(mainWidget()); toSecurityCombo->setEditable(false); c_sec = budget->securities.first(); bool sel = false; i = 0; while(c_sec) { toSecurityCombo->addItem(c_sec->name()); if(sec && !sel && c_sec != sec && c_sec->account() == sec->account()) { sel = true; toSecurityCombo->setCurrentIndex(i); } c_sec = budget->securities.next(); i++; } layout->addWidget(toSecurityCombo, 2, 1); layout->addWidget(new QLabel(i18n("Shares received:"), mainWidget()), 3, 0); toSharesEdit = new EqonomizeValueEdit(0.0, sec ? sec->decimals() : 4, false, false, mainWidget()); layout->addWidget(toSharesEdit, 3, 1); layout->addWidget(new QLabel(i18n("Value:"), mainWidget()), 4, 0); valueEdit = new EqonomizeValueEdit(false, mainWidget()); layout->addWidget(valueEdit, 4, 1); layout->addWidget(new QLabel(i18n("Date:"), mainWidget()), 5, 0); dateEdit = new KDateEdit(mainWidget()); dateEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); layout->addWidget(dateEdit, 5, 1); toSecurityChanged(); fromSecurityChanged(); connect(maxSharesButton, SIGNAL(clicked()), this, SLOT(maxShares())); connect(fromSecurityCombo, SIGNAL(activated(int)), this, SLOT(fromSecurityChanged())); connect(toSecurityCombo, SIGNAL(activated(int)), this, SLOT(toSecurityChanged())); } void EditSecurityTradeDialog::maxShares() { fromSharesEdit->setValue(fromSharesEdit->maxValue()); } Security *EditSecurityTradeDialog::selectedFromSecurity() { int index = fromSecurityCombo->currentIndex(); Security *sec = budget->securities.first(); int i = 0; while(sec) { if(i == index) { return sec; } i++; sec = budget->securities.next(); } return NULL; } Security *EditSecurityTradeDialog::selectedToSecurity() { int index = toSecurityCombo->currentIndex(); Security *sec = budget->securities.first(); int i = 0; while(sec) { if(i == index) { return sec; } i++; sec = budget->securities.next(); } return NULL; } void EditSecurityTradeDialog::fromSecurityChanged() { Security *sec = selectedFromSecurity(); if(sec) { fromSharesEdit->setPrecision(sec->decimals()); fromSharesEdit->setMaxValue(sec->shares()); } } void EditSecurityTradeDialog::toSecurityChanged() { Security *sec = selectedToSecurity(); if(sec) toSharesEdit->setPrecision(sec->decimals()); } void EditSecurityTradeDialog::setSecurityTrade(SecurityTrade *ts) { dateEdit->setDate(ts->date); Security *sec = budget->securities.first(); int i = 0; while(sec) { if(sec == ts->from_security) { fromSecurityCombo->setCurrentIndex(i); break; } i++; sec = budget->securities.next(); } fromSharesEdit->setMaxValue(ts->from_security->shares() + ts->from_shares); fromSharesEdit->setValue(ts->from_shares); toSharesEdit->setValue(ts->to_shares); valueEdit->setValue(ts->value); sec = budget->securities.first(); i = 0; while(sec) { if(sec == ts->to_security) { toSecurityCombo->setCurrentIndex(i); break; } i++; sec = budget->securities.next(); } } SecurityTrade *EditSecurityTradeDialog::createSecurityTrade() { if(!validValues()) return NULL; return new SecurityTrade(dateEdit->date(), valueEdit->value(), fromSharesEdit->value(), selectedFromSecurity(), toSharesEdit->value(), selectedToSecurity()); } bool EditSecurityTradeDialog::checkSecurities() { if(toSecurityCombo->count() < 2) { KMessageBox::error(this, i18n("No other security available for trade in the account.")); return false; } return true; } void EditSecurityTradeDialog::slotButtonClicked(int button) { if(button != Ok || validValues()) { KDialog::slotButtonClicked(button); } } bool EditSecurityTradeDialog::validValues() { if(selectedFromSecurity() == selectedToSecurity()) { KMessageBox::error(this, i18n("Selected to and from securities are the same.")); return false; } if(!dateEdit->date().isValid()) { KMessageBox::error(this, i18n("Invalid date.")); return false; } if(fromSharesEdit->value() == 0.0 || toSharesEdit->value() == 0.0) { KMessageBox::error(this, i18n("Zero shares not allowed.")); return false; } if(valueEdit->value() == 0.0) { KMessageBox::error(this, i18n("Zero value not allowed.")); return false; } return true; } EditQuotationsDialog::EditQuotationsDialog(QWidget *parent) : KDialog(parent, 0) { setCaption(i18n("Quotations")); setButtons(Ok | Cancel); setDefaultButton(Ok); setModal(true); setMainWidget(new QWidget(this)); QVBoxLayout *quotationsVLayout = new QVBoxLayout(mainWidget()); titleLabel = new QLabel(i18n("Quotations"), mainWidget()); quotationsVLayout->addWidget(titleLabel); QHBoxLayout *quotationsLayout = new QHBoxLayout(); quotationsVLayout->addLayout(quotationsLayout); quotationsView = new QTreeWidget(mainWidget()); quotationsView->setSortingEnabled(true); quotationsView->sortByColumn(0, Qt::DescendingOrder); quotationsView->setAllColumnsShowFocus(true); quotationsView->setColumnCount(2); QStringList headers; headers << i18n("Date"); headers << i18n("Price per Share"); quotationsView->setHeaderLabels(headers); quotationsView->setRootIsDecorated(false); quotationsView->header()->setClickable(false); QSizePolicy sp = quotationsView->sizePolicy(); sp.setHorizontalPolicy(QSizePolicy::MinimumExpanding); quotationsView->setSizePolicy(sp); quotationsLayout->addWidget(quotationsView); QVBoxLayout *buttonsLayout = new QVBoxLayout(); quotationsLayout->addLayout(buttonsLayout); quotationEdit = new EqonomizeValueEdit(0.01, INT_MAX / pow(10, KGlobal::locale()->fracDigits()) - 1.0, 1.0, 0.01, KGlobal::locale()->fracDigits(), true, mainWidget()); buttonsLayout->addWidget(quotationEdit); dateEdit = new KDateEdit(mainWidget()); dateEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); dateEdit->setDate(QDate::currentDate()); buttonsLayout->addWidget(dateEdit); addButton = new KPushButton(KStandardGuiItem::add(), mainWidget()); buttonsLayout->addWidget(addButton); changeButton = new KPushButton(KStandardGuiItem::apply(), mainWidget()); changeButton->setEnabled(false); buttonsLayout->addWidget(changeButton); deleteButton = new KPushButton(KStandardGuiItem::del(), mainWidget()); deleteButton->setEnabled(false); buttonsLayout->addWidget(deleteButton); buttonsLayout->addStretch(1); connect(quotationsView, SIGNAL(itemSelectionChanged()), this, SLOT(onSelectionChanged())); connect(addButton, SIGNAL(clicked()), this, SLOT(addQuotation())); connect(changeButton, SIGNAL(clicked()), this, SLOT(changeQuotation())); connect(deleteButton, SIGNAL(clicked()), this, SLOT(deleteQuotation())); } void EditQuotationsDialog::setSecurity(Security *security) { quotationsView->clear(); QList items; QMap::const_iterator it_end = security->quotations.end(); for(QMap::const_iterator it = security->quotations.begin(); it != it_end; ++it) { items.append(new QuotationListViewItem(it.key(), it.value())); } quotationsView->addTopLevelItems(items); quotationsView->setSortingEnabled(true); titleLabel->setText(i18n("Quotations for %1").arg(security->name())); } void EditQuotationsDialog::modifyQuotations(Security *security) { security->quotations.clear(); QTreeWidgetItemIterator it(quotationsView); QuotationListViewItem *i = (QuotationListViewItem*) *it; while(i) { security->quotations[i->date] = i->value; security->quotations_auto[i->date] = false; ++it; i = (QuotationListViewItem*) *it; } } void EditQuotationsDialog::onSelectionChanged() { QuotationListViewItem *i = (QuotationListViewItem*) selectedItem(quotationsView); if(i) { changeButton->setEnabled(true); deleteButton->setEnabled(true); dateEdit->setDate(i->date); quotationEdit->setValue(i->value); } else { changeButton->setEnabled(false); deleteButton->setEnabled(false); } } void EditQuotationsDialog::addQuotation() { QDate date = dateEdit->date(); if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); return; } QTreeWidgetItemIterator it(quotationsView); QuotationListViewItem *i = (QuotationListViewItem*) *it; while(i) { if(i->date == date) { i->value = quotationEdit->value(); i->setText(1, KGlobal::locale()->formatMoney(i->value)); return; } ++it; i = (QuotationListViewItem*) *it; } quotationsView->insertTopLevelItem(0, new QuotationListViewItem(date, quotationEdit->value())); quotationsView->setSortingEnabled(true); } void EditQuotationsDialog::changeQuotation() { QuotationListViewItem *i = (QuotationListViewItem*) selectedItem(quotationsView); if(i == NULL) return; QDate date = dateEdit->date(); if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); return; } QTreeWidgetItemIterator it(quotationsView); QuotationListViewItem *i2 = (QuotationListViewItem*) *it; while(i2) { if(i2->date == date) { i2->value = quotationEdit->value(); i2->setText(1, KGlobal::locale()->formatMoney(i2->value)); return; } ++it; i2 = (QuotationListViewItem*) *it; } i->date = date; i->value = quotationEdit->value(); i->setText(0, KGlobal::locale()->formatDate(date, KLocale::ShortDate)); i->setText(1, KGlobal::locale()->formatMoney(i->value)); } void EditQuotationsDialog::deleteQuotation() { QuotationListViewItem *i = (QuotationListViewItem*) selectedItem(quotationsView); if(i == NULL) return; delete i; } ConfirmScheduleDialog::ConfirmScheduleDialog(bool extra_parameters, Budget *budg, QWidget *parent, QString title) : KDialog(parent, 0), budget(budg), b_extra(extra_parameters) { setCaption(title); setButtons(Ok); setDefaultButton(Ok); setModal(true); setMainWidget(new QWidget(this)); QVBoxLayout *box1 = new QVBoxLayout(mainWidget()); QLabel *label = new QLabel(i18n("The following transactions was scheduled to occur today or before today.\nConfirm that they have indeed occurred (or will occur today)."), mainWidget()); box1->addWidget(label); QHBoxLayout *box2 = new QHBoxLayout(); box1->addLayout(box2); transactionsView = new QTreeWidget(mainWidget()); transactionsView->sortByColumn(0, Qt::AscendingOrder); transactionsView->setAllColumnsShowFocus(true); transactionsView->setColumnCount(4); QStringList headers; headers << i18n("Date"); headers << i18n("Type"); headers << i18n("Description"); headers << i18n("Amount"); transactionsView->setHeaderLabels(headers); transactionsView->setRootIsDecorated(false); QSizePolicy sp = transactionsView->sizePolicy(); sp.setHorizontalPolicy(QSizePolicy::MinimumExpanding); transactionsView->setSizePolicy(sp); box2->addWidget(transactionsView); KDialogButtonBox *buttons = new KDialogButtonBox(mainWidget(), Qt::Vertical); editButton = buttons->addButton(i18n("Edit..."), QDialogButtonBox::ActionRole); editButton->setEnabled(false); postponeButton = buttons->addButton(i18n("Postpone..."), QDialogButtonBox::ActionRole); postponeButton->setEnabled(false); removeButton = buttons->addButton(KStandardGuiItem::guiItem(KStandardGuiItem::Delete), QDialogButtonBox::ActionRole); removeButton->setEnabled(false); box2->addWidget(buttons); connect(transactionsView, SIGNAL(itemSelectionChanged()), this, SLOT(transactionSelectionChanged())); connect(removeButton, SIGNAL(clicked()), this, SLOT(remove())); connect(editButton, SIGNAL(clicked()), this, SLOT(edit())); connect(postponeButton, SIGNAL(clicked()), this, SLOT(postpone())); updateTransactions(); } void ConfirmScheduleDialog::transactionSelectionChanged() { QTreeWidgetItem *i = selectedItem(transactionsView); if(i == NULL) { editButton->setEnabled(false); removeButton->setEnabled(false); postponeButton->setEnabled(false); } else { editButton->setEnabled(true); removeButton->setEnabled(true); postponeButton->setEnabled(true); } } void ConfirmScheduleDialog::remove() { QTreeWidgetItem *i = selectedItem(transactionsView); if(i == NULL) return; Transaction *trans = ((ConfirmScheduleListViewItem*) i)->transaction(); delete trans; delete i; if(transactionsView->topLevelItemCount() == 0) reject(); } void ConfirmScheduleDialog::postpone() { QTreeWidgetItem *i = selectedItem(transactionsView); if(i == NULL) return; KDialog *dialog = new KDialog(this, 0); dialog->setCaption(i18n("Date")); dialog->setButtons(Ok | Cancel); dialog->setMainWidget(new KVBox(dialog)); KDatePicker *datePicker = new KDatePicker(KGlobal::locale()->calendar()->addDays(QDate::currentDate(), 1), dialog->mainWidget()); if(dialog->exec() == QDialog::Accepted) { if(datePicker->date() > QDate::currentDate()) { Transaction *trans = ((ConfirmScheduleListViewItem*) i)->transaction(); trans->setDate(datePicker->date()); budget->addScheduledTransaction(new ScheduledTransaction(budget, trans, NULL)); delete i; } else { KMessageBox::error(this, i18n("Can only postpone to future dates.")); } } dialog->deleteLater(); if(transactionsView->topLevelItemCount() == 0) reject(); } void ConfirmScheduleDialog::edit() { QTreeWidgetItem *i = selectedItem(transactionsView); if(i == NULL) return; Transaction *trans = ((ConfirmScheduleListViewItem*) i)->transaction(); Security *security = NULL; if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY || trans->type() == TRANSACTION_TYPE_SECURITY_SELL) { security = ((SecurityTransaction*) trans)->security(); } else if(trans->type() == TRANSACTION_TYPE_INCOME && ((Income*) trans)->security()) { security = ((Income*) trans)->security(); } TransactionEditDialog *dialog = new TransactionEditDialog(b_extra, trans->type(), false, false, security, SECURITY_ALL_VALUES, security != NULL, budget, this); dialog->editWidget->updateAccounts(); dialog->editWidget->setTransaction(trans); //if(trans->type() == TRANSACTION_TYPE_SECURITY_SELL) dialog->editWidget->setMaxSharesDate(QDate::currentDate()); if(dialog->editWidget->checkAccounts() && dialog->exec() == QDialog::Accepted) { if(dialog->editWidget->modifyTransaction(trans)) { if(trans->date() > QDate::currentDate()) { budget->addScheduledTransaction(new ScheduledTransaction(budget, trans, NULL)); delete i; } else { ((ConfirmScheduleListViewItem*) i)->setTransaction(trans); } } } dialog->deleteLater(); if(transactionsView->topLevelItemCount() == 0) reject(); } void ConfirmScheduleDialog::updateTransactions() { ScheduledTransaction *strans = budget->scheduledTransactions.first(); QList items; while(strans) { Transaction *trans = NULL; if(strans->firstOccurrence() < QDate::currentDate() || (QTime::currentTime().hour() >= 18 && strans->firstOccurrence() == QDate::currentDate())) { bool b = strans->isOneTimeTransaction(); trans = strans->realize(strans->firstOccurrence()); if(b) budget->removeScheduledTransaction(strans); strans = budget->scheduledTransactions.first(); } else { strans = budget->scheduledTransactions.next(); } if(trans) { QTreeWidgetItem *i = new ConfirmScheduleListViewItem(trans); items.append(i); } } transactionsView->addTopLevelItems(items); transactionsView->setSortingEnabled(true); QTreeWidgetItemIterator it(transactionsView); QTreeWidgetItem *i = *it; if(i) i->setSelected(true); } Transaction *ConfirmScheduleDialog::firstTransaction() { current_index = 0; current_item = (ConfirmScheduleListViewItem*) transactionsView->topLevelItem(current_index); if(current_item) return current_item->transaction(); return NULL; } Transaction *ConfirmScheduleDialog::nextTransaction() { current_index++; current_item = (ConfirmScheduleListViewItem*) transactionsView->topLevelItem(current_index); if(current_item) return current_item->transaction(); return NULL; } SecurityTransactionsDialog::SecurityTransactionsDialog(Security *sec, Eqonomize *parent, QString title) : KDialog(parent, 0), security(sec), mainWin(parent) { setCaption(title); setButtons(Close); setDefaultButton(Close); setModal(true); setMainWidget(new QWidget(this)); QVBoxLayout *box1 = new QVBoxLayout(mainWidget()); box1->addWidget(new QLabel(i18n("Transactions for %1").arg(security->name()), mainWidget())); QHBoxLayout *box2 = new QHBoxLayout(); box1->addLayout(box2); transactionsView = new EqonomizeTreeWidget(mainWidget()); transactionsView->sortByColumn(0, Qt::AscendingOrder); transactionsView->setAllColumnsShowFocus(true); transactionsView->setColumnCount(4); QStringList headers; headers << i18n("Date"); headers << i18n("Type"); headers << i18n("Value"); headers << i18n("Shares"); transactionsView->setHeaderLabels(headers); transactionsView->setRootIsDecorated(false); QSizePolicy sp = transactionsView->sizePolicy(); sp.setHorizontalPolicy(QSizePolicy::MinimumExpanding); transactionsView->setSizePolicy(sp); box2->addWidget(transactionsView); KDialogButtonBox *buttons = new KDialogButtonBox(mainWidget(), Qt::Vertical); editButton = buttons->addButton(i18n("Edit..."), QDialogButtonBox::ActionRole); editButton->setEnabled(false); removeButton = buttons->addButton(KStandardGuiItem::guiItem(KStandardGuiItem::Delete), QDialogButtonBox::ActionRole); removeButton->setEnabled(false); box2->addWidget(buttons); connect(transactionsView, SIGNAL(itemSelectionChanged()), this, SLOT(transactionSelectionChanged())); connect(transactionsView, SIGNAL(doubleClicked(QTreeWidgetItem*, int)), this, SLOT(edit(QTreeWidgetItem*))); connect(removeButton, SIGNAL(clicked()), this, SLOT(remove())); connect(editButton, SIGNAL(clicked()), this, SLOT(edit())); updateTransactions(); } void SecurityTransactionsDialog::transactionSelectionChanged() { QTreeWidgetItem *i = selectedItem(transactionsView); if(i == NULL) { editButton->setEnabled(false); removeButton->setEnabled(false); } else { editButton->setEnabled(true); removeButton->setEnabled(true); } } void SecurityTransactionsDialog::remove() { SecurityTransactionListViewItem *i = (SecurityTransactionListViewItem*) selectedItem(transactionsView); if(i == NULL) return; if(i->trans) { SecurityTransaction *trans = i->trans; security->budget()->removeTransaction(trans, true); mainWin->transactionRemoved(trans); delete trans; } else if(i->div) { Income *div = i->div; security->budget()->removeTransaction(div, true); mainWin->transactionRemoved(div); delete div; } else if(i->rediv) { ReinvestedDividend *rediv = i->rediv; security->reinvestedDividends.removeRef(rediv); mainWin->updateSecurity(security); mainWin->updateSecurityAccount(security->account()); mainWin->setModified(true); } else if(i->strans) { ScheduledTransaction *strans = i->strans; security->budget()->removeScheduledTransaction(strans, true); mainWin->scheduledTransactionRemoved(strans); delete strans; } else if(i->sdiv) { ScheduledTransaction *sdiv = i->sdiv; security->budget()->removeScheduledTransaction(sdiv, true); mainWin->scheduledTransactionRemoved(sdiv); delete sdiv; } else if(i->ts) { SecurityTrade *ts = i->ts; security->budget()->removeSecurityTrade(ts, true); mainWin->updateSecurity(ts->from_security); mainWin->updateSecurity(ts->to_security); mainWin->updateSecurityAccount(ts->from_security->account()); if(ts->to_security->account() != ts->from_security->account()) { mainWin->updateSecurityAccount(ts->to_security->account()); } mainWin->setModified(true); delete ts; } delete i; } void SecurityTransactionsDialog::edit() { edit(selectedItem(transactionsView)); } void SecurityTransactionsDialog::edit(QTreeWidgetItem *i_pre) { if(i_pre == NULL) return; SecurityTransactionListViewItem *i = (SecurityTransactionListViewItem*) i_pre; bool b = false; if(i->trans) b = mainWin->editTransaction(i->trans, this); else if(i->div) b = mainWin->editTransaction(i->div, this); else if(i->rediv) b = mainWin->editReinvestedDividend(i->rediv, security, this); else if(i->strans) b = mainWin->editScheduledTransaction(i->strans, this); else if(i->sdiv) b = mainWin->editScheduledTransaction(i->sdiv, this); else if(i->ts) b = mainWin->editSecurityTrade(i->ts, this); if(b) updateTransactions(); } void SecurityTransactionsDialog::updateTransactions() { transactionsView->clear(); QList items; SecurityTransaction *trans = security->transactions.first(); while(trans) { SecurityTransactionListViewItem *i = new SecurityTransactionListViewItem(KGlobal::locale()->formatDate(trans->date(), KLocale::ShortDate), QString::null, KGlobal::locale()->formatMoney(trans->value()), KGlobal::locale()->formatNumber(trans->shares(), security->decimals())); i->trans = trans; i->date = trans->date(); i->value = trans->value(); i->shares = trans->shares(); if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY) i->setText(1, i18n("Shares Bought")); else i->setText(1, i18n("Shares Sold")); items.append(i); trans = security->transactions.next(); } Income *div = security->dividends.first(); while(div) { SecurityTransactionListViewItem *i = new SecurityTransactionListViewItem(KGlobal::locale()->formatDate(div->date(), KLocale::ShortDate), i18n("Dividend"), KGlobal::locale()->formatMoney(div->value()), "-"); i->div = div; i->date = div->date(); i->value = div->value(); items.append(i); div = security->dividends.next(); } ReinvestedDividend *rediv = security->reinvestedDividends.first(); while(rediv) { SecurityTransactionListViewItem *i = new SecurityTransactionListViewItem(KGlobal::locale()->formatDate(rediv->date, KLocale::ShortDate), i18n("Reinvested Dividend"), "-", KGlobal::locale()->formatNumber(rediv->shares, security->decimals())); i->rediv = rediv; i->date = rediv->date; i->shares = rediv->shares; items.append(i); rediv = security->reinvestedDividends.next(); } SecurityTrade *ts = security->tradedShares.first(); while(ts) { double shares; if(ts->from_security == security) shares = ts->from_shares; else shares = ts->to_shares; SecurityTransactionListViewItem *i = new SecurityTransactionListViewItem(KGlobal::locale()->formatDate(ts->date, KLocale::ShortDate), ts->from_security == security ? i18n("Shares Sold (Traded)") : i18n("Shares Bought (Traded)"), KGlobal::locale()->formatMoney(ts->value), KGlobal::locale()->formatNumber(shares, security->decimals())); i->ts = ts; i->date = ts->date; i->shares = shares; i->value = ts->value; items.append(i); ts = security->tradedShares.next(); } ScheduledTransaction *strans = security->scheduledTransactions.first(); while(strans) { SecurityTransactionListViewItem *i = new SecurityTransactionListViewItem(KGlobal::locale()->formatDate(strans->transaction()->date(), KLocale::ShortDate), QString::null, KGlobal::locale()->formatMoney(strans->transaction()->value()), KGlobal::locale()->formatNumber(((SecurityTransaction*) strans->transaction())->shares(), security->decimals())); i->strans = strans; i->date = strans->transaction()->date(); i->value = strans->transaction()->value(); i->shares = ((SecurityTransaction*) strans->transaction())->shares(); if(strans->recurrence()) { if(strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY) i->setText(1, i18n("Shares Bought (Recurring)")); else i->setText(1, i18n("Shares Sold (Recurring)")); } else { if(strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY) i->setText(1, i18n("Shares Bought (Scheduled)")); else i->setText(1, i18n("Shares Sold (Scheduled)")); } items.append(i); strans = security->scheduledTransactions.next(); } strans = security->scheduledDividends.first(); while(strans) { SecurityTransactionListViewItem *i = new SecurityTransactionListViewItem(KGlobal::locale()->formatDate(strans->transaction()->date(), KLocale::ShortDate), QString::null, KGlobal::locale()->formatMoney(strans->transaction()->value()), "-"); i->sdiv = strans; i->date = strans->transaction()->date(); i->value = strans->transaction()->value(); if(strans->recurrence()) { i->setText(1, i18n("Recurring Dividend")); } else { i->setText(1, i18n("Scheduled Dividend")); } items.append(i); strans = security->scheduledDividends.next(); } transactionsView->addTopLevelItems(items); transactionsView->setSortingEnabled(true); } EditSecurityDialog::EditSecurityDialog(Budget *budg, QWidget *parent, QString title) : KDialog(parent, 0), budget(budg) { setCaption(title); setButtons(Ok | Cancel); setDefaultButton(Ok); setModal(true); setMainWidget(new QWidget(this)); QGridLayout *grid = new QGridLayout(mainWidget()); grid->addWidget(new QLabel(i18n("Type:"), mainWidget()), 0, 0); typeCombo = new KComboBox(mainWidget()); typeCombo->setEditable(false); typeCombo->addItem(i18n("Mutual Fund")); typeCombo->addItem(i18n("Bond")); typeCombo->addItem(i18n("Stock")); typeCombo->addItem(i18n("Other")); grid->addWidget(typeCombo, 0, 1); typeCombo->setFocus(); grid->addWidget(new QLabel(i18n("Name:"), mainWidget()), 1, 0); nameEdit = new KLineEdit(mainWidget()); grid->addWidget(nameEdit, 1, 1); grid->addWidget(new QLabel(i18n("Account:"), mainWidget()), 2, 0); accountCombo = new KComboBox(mainWidget()); accountCombo->setEditable(false); AssetsAccount *account = budget->assetsAccounts.first(); while(account) { if(account->accountType() == ASSETS_TYPE_SECURITIES) { accountCombo->addItem(account->name()); accounts.push_back(account); } account = budget->assetsAccounts.next(); } grid->addWidget(accountCombo, 2, 1); grid->addWidget(new QLabel(i18n("Decimals in Shares:"), mainWidget()), 3, 0); decimalsEdit = new KIntSpinBox(0, 8, 1, 4, mainWidget()); grid->addWidget(decimalsEdit, 3, 1); grid->addWidget(new QLabel(i18n("Initial Shares:"), mainWidget()), 4, 0); sharesEdit = new EqonomizeValueEdit(0.0, 4, false, false, mainWidget()); grid->addWidget(sharesEdit, 4, 1); quotationLabel = new QLabel(i18n("Initial quotation:"), mainWidget()); grid->addWidget(quotationLabel, 5, 0); quotationEdit = new EqonomizeValueEdit(false, mainWidget()); grid->addWidget(quotationEdit, 5, 1); quotationDateLabel = new QLabel(i18n("Date:"), mainWidget()); grid->addWidget(quotationDateLabel, 6, 0); quotationDateEdit = new KDateEdit(mainWidget()); quotationDateEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); grid->addWidget(quotationDateEdit, 6, 1); grid->addWidget(new QLabel(i18n("Description:"), mainWidget()), 7, 0); descriptionEdit = new KTextEdit(mainWidget()); grid->addWidget(descriptionEdit, 8, 0, 1, 2); nameEdit->setFocus(); connect(decimalsEdit, SIGNAL(valueChanged(int)), this, SLOT(decimalsChanged(int))); } bool EditSecurityDialog::checkAccount() { if(accountCombo->count() == 0) { KMessageBox::error(this, i18n("No suitable account or income category available.")); return false; } return true; } void EditSecurityDialog::decimalsChanged(int i) { sharesEdit->setRange(0.0, INT_MAX / pow(10.0, i) - 1, 1.0, i); } Security *EditSecurityDialog::newSecurity() { if(!checkAccount()) return NULL; SecurityType type; switch(typeCombo->currentIndex()) { case 1: {type = SECURITY_TYPE_BOND; break;} case 2: {type = SECURITY_TYPE_STOCK; break;} case 3: {type = SECURITY_TYPE_OTHER; break;} default: {type = SECURITY_TYPE_MUTUAL_FUND; break;} } Security *security = new Security(budget, accounts[accountCombo->currentIndex()], type, sharesEdit->value(), decimalsEdit->value(), nameEdit->text(), descriptionEdit->toPlainText()); if(quotationEdit->value() > 0.0) { security->setQuotation(quotationDateEdit->date(), quotationEdit->value()); } return security; } bool EditSecurityDialog::modifySecurity(Security *security) { if(!checkAccount()) return false; security->setName(nameEdit->text()); security->setInitialShares(sharesEdit->value()); security->setDescription(descriptionEdit->toPlainText()); security->setAccount(accounts[accountCombo->currentIndex()]); security->setDecimals(decimalsEdit->value()); switch(typeCombo->currentIndex()) { case 1: {security->setType(SECURITY_TYPE_BOND); break;} case 2: {security->setType(SECURITY_TYPE_STOCK); break;} case 3: {security->setType(SECURITY_TYPE_OTHER); break;} default: {security->setType(SECURITY_TYPE_MUTUAL_FUND); break;} } return true; } void EditSecurityDialog::setSecurity(Security *security) { nameEdit->setText(security->name()); quotationEdit->hide(); quotationDateEdit->hide(); quotationLabel->hide(); quotationDateLabel->hide(); descriptionEdit->setPlainText(security->description()); decimalsEdit->setValue(security->decimals()); decimalsChanged(security->decimals()); sharesEdit->setValue(security->initialShares()); for(QVector::size_type i = 0; i < accounts.size(); i++) { if(security->account() == accounts[i]) { accountCombo->setCurrentIndex(i); break; } } switch(security->type()) { case SECURITY_TYPE_BOND: {typeCombo->setCurrentIndex(1); break;} case SECURITY_TYPE_STOCK: {typeCombo->setCurrentIndex(2); break;} case SECURITY_TYPE_OTHER: {typeCombo->setCurrentIndex(3); break;} default: {typeCombo->setCurrentIndex(0); break;} } } EditAssetsAccountDialog::EditAssetsAccountDialog(Budget *budg, QWidget *parent, QString title) : KDialog(parent, 0), budget(budg) { setCaption(title); setButtons(Ok | Cancel); setDefaultButton(Ok); setModal(true); setMainWidget(new QWidget(this)); QGridLayout *grid = new QGridLayout(mainWidget()); grid->addWidget(new QLabel(i18n("Type:"), mainWidget()), 0, 0); typeCombo = new KComboBox(mainWidget()); typeCombo->setEditable(false); typeCombo->addItem(i18n("Cash")); typeCombo->addItem(i18n("Current Account")); typeCombo->addItem(i18n("Savings Account")); typeCombo->addItem(i18n("Credit Card")); typeCombo->addItem(i18n("Liabilities")); typeCombo->addItem(i18n("Securities")); grid->addWidget(typeCombo, 0, 1); grid->addWidget(new QLabel(i18n("Name:"), mainWidget()), 1, 0); nameEdit = new KLineEdit(mainWidget()); grid->addWidget(nameEdit, 1, 1); grid->addWidget(new QLabel(i18n("Initial balance:"), mainWidget()), 2, 0); valueEdit = new EqonomizeValueEdit(true, mainWidget()); grid->addWidget(valueEdit, 2, 1); budgetButton = new QCheckBox(i18n("Default account for budgeted transactions"), mainWidget()); budgetButton->setChecked(false); grid->addWidget(budgetButton, 3, 0, 1, 2); grid->addWidget(new QLabel(i18n("Description:"), mainWidget()), 4, 0); descriptionEdit = new KTextEdit(mainWidget()); grid->addWidget(descriptionEdit, 5, 0, 1, 2); nameEdit->setFocus(); current_account = NULL; connect(typeCombo, SIGNAL(activated(int)), this, SLOT(typeActivated(int))); } void EditAssetsAccountDialog::typeActivated(int index) { valueEdit->setEnabled(index != 5); budgetButton->setChecked(index == 1); budgetButton->setEnabled(index != 5); } AssetsAccount *EditAssetsAccountDialog::newAccount() { AssetsType type; switch(typeCombo->currentIndex()) { case 1: {type = ASSETS_TYPE_CURRENT; break;} case 2: {type = ASSETS_TYPE_SAVINGS; break;} case 3: {type = ASSETS_TYPE_CREDIT_CARD; break;} case 4: {type = ASSETS_TYPE_LIABILITIES; break;} case 5: {type = ASSETS_TYPE_SECURITIES; break;} default: {type = ASSETS_TYPE_CASH; break;} } AssetsAccount *account = new AssetsAccount(budget, type, nameEdit->text(), valueEdit->value(), descriptionEdit->toPlainText()); account->setAsBudgetAccount(budgetButton->isChecked()); return account; } void EditAssetsAccountDialog::modifyAccount(AssetsAccount *account) { account->setName(nameEdit->text()); account->setInitialBalance(valueEdit->value()); account->setDescription(descriptionEdit->toPlainText()); account->setAsBudgetAccount(budgetButton->isChecked()); switch(typeCombo->currentIndex()) { case 1: {account->setAccountType(ASSETS_TYPE_CURRENT); break;} case 2: {account->setAccountType(ASSETS_TYPE_SAVINGS); break;} case 3: {account->setAccountType(ASSETS_TYPE_CREDIT_CARD); break;} case 4: {account->setAccountType(ASSETS_TYPE_LIABILITIES); break;} case 5: {account->setAccountType(ASSETS_TYPE_SECURITIES); break;} default: {account->setAccountType(ASSETS_TYPE_CASH); break;} } } void EditAssetsAccountDialog::setAccount(AssetsAccount *account) { current_account = account; nameEdit->setText(account->name()); valueEdit->setValue(account->initialBalance()); descriptionEdit->setPlainText(account->description()); budgetButton->setChecked(account->isBudgetAccount()); switch(account->accountType()) { case ASSETS_TYPE_CURRENT: {typeCombo->setCurrentIndex(1); break;} case ASSETS_TYPE_SAVINGS: {typeCombo->setCurrentIndex(2); break;} case ASSETS_TYPE_CREDIT_CARD: {typeCombo->setCurrentIndex(3); break;} case ASSETS_TYPE_LIABILITIES: {typeCombo->setCurrentIndex(4); break;} case ASSETS_TYPE_SECURITIES: {typeCombo->setCurrentIndex(5); break;} default: {typeCombo->setCurrentIndex(0); break;} } typeActivated(typeCombo->currentIndex()); } void EditAssetsAccountDialog::slotButtonClicked(int button) { if(button == Ok) { QString sname = nameEdit->text().trimmed(); if(sname.isEmpty()) { nameEdit->setFocus(); KMessageBox::error(this, i18n("Empty name.")); return; } AssetsAccount *aaccount = budget->findAssetsAccount(sname); if(aaccount && aaccount != current_account) { nameEdit->setFocus(); KMessageBox::error(this, i18n("The entered name is used by another account.")); return; } } KDialog::slotButtonClicked(button); } EditIncomesAccountDialog::EditIncomesAccountDialog(Budget *budg, QWidget *parent, QString title) : KDialog(parent, 0), budget(budg) { setCaption(title); setButtons(Ok | Cancel); setDefaultButton(Ok); setModal(true); setMainWidget(new QWidget(this)); QGridLayout *grid = new QGridLayout(mainWidget()); grid->addWidget(new QLabel(i18n("Name:"), mainWidget()), 0, 0); nameEdit = new KLineEdit(mainWidget()); grid->addWidget(nameEdit, 0, 1); budgetButton = new QCheckBox(i18n("Monthly budget:"), mainWidget()); budgetButton->setChecked(false); grid->addWidget(budgetButton, 1, 0); budgetEdit = new EqonomizeValueEdit(false, mainWidget()); budgetEdit->setEnabled(false); grid->addWidget(budgetEdit, 1, 1); grid->addWidget(new QLabel(i18n("Description:"), mainWidget()), 2, 0); descriptionEdit = new KTextEdit(mainWidget()); grid->addWidget(descriptionEdit, 3, 0, 1, 2); nameEdit->setFocus(); current_account = NULL; connect(budgetButton, SIGNAL(toggled(bool)), this, SLOT(budgetEnabled(bool))); } IncomesAccount *EditIncomesAccountDialog::newAccount() { IncomesAccount *account = new IncomesAccount(budget, nameEdit->text(), descriptionEdit->toPlainText()); if(budgetButton->isChecked()) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); account->setMonthlyBudget(calSys->year(QDate::currentDate()), calSys->month(QDate::currentDate()), budgetEdit->value()); } return account; } void EditIncomesAccountDialog::modifyAccount(IncomesAccount *account) { account->setName(nameEdit->text()); account->setDescription(descriptionEdit->toPlainText()); } void EditIncomesAccountDialog::setAccount(IncomesAccount *account) { current_account = account; nameEdit->setText(account->name()); budgetEdit->hide(); budgetButton->hide(); descriptionEdit->setPlainText(account->description()); } void EditIncomesAccountDialog::budgetEnabled(bool b) { budgetEdit->setEnabled(b); } void EditIncomesAccountDialog::slotButtonClicked(int button) { if(button == Ok) { QString sname = nameEdit->text().trimmed(); if(sname.isEmpty()) { nameEdit->setFocus(); KMessageBox::error(this, i18n("Empty name.")); return; } IncomesAccount *iaccount = budget->findIncomesAccount(sname); if(iaccount && iaccount != current_account) { nameEdit->setFocus(); KMessageBox::error(this, i18n("The entered name is used by another income category.")); return; } } KDialog::slotButtonClicked(button); } EditExpensesAccountDialog::EditExpensesAccountDialog(Budget *budg, QWidget *parent, QString title) : KDialog(parent, 0), budget(budg) { setCaption(title); setButtons(Ok | Cancel); setDefaultButton(Ok); setModal(true); setMainWidget(new QWidget(this)); QGridLayout *grid = new QGridLayout(mainWidget()); grid->addWidget(new QLabel(i18n("Name:"), mainWidget()), 0, 0); nameEdit = new KLineEdit(mainWidget()); grid->addWidget(nameEdit, 0, 1); budgetButton = new QCheckBox(i18n("Monthly budget:"), mainWidget()); budgetButton->setChecked(false); grid->addWidget(budgetButton, 1, 0); budgetEdit = new EqonomizeValueEdit(false, mainWidget()); budgetEdit->setEnabled(false); grid->addWidget(budgetEdit, 1, 1); grid->addWidget(new QLabel(i18n("Description:"), mainWidget()), 2, 0); descriptionEdit = new KTextEdit(mainWidget()); grid->addWidget(descriptionEdit, 3, 0, 1, 2); nameEdit->setFocus(); current_account = NULL; connect(budgetButton, SIGNAL(toggled(bool)), this, SLOT(budgetEnabled(bool))); } ExpensesAccount *EditExpensesAccountDialog::newAccount() { ExpensesAccount *account = new ExpensesAccount(budget, nameEdit->text(), descriptionEdit->toPlainText()); if(budgetButton->isChecked()) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); account->setMonthlyBudget(calSys->year(QDate::currentDate()), calSys->month(QDate::currentDate()), budgetEdit->value()); } return account; } void EditExpensesAccountDialog::modifyAccount(ExpensesAccount *account) { account->setName(nameEdit->text()); account->setDescription(descriptionEdit->toPlainText()); } void EditExpensesAccountDialog::setAccount(ExpensesAccount *account) { current_account = account; nameEdit->setText(account->name()); budgetEdit->hide(); budgetButton->hide(); descriptionEdit->setPlainText(account->description()); } void EditExpensesAccountDialog::budgetEnabled(bool b) { budgetEdit->setEnabled(b); } void EditExpensesAccountDialog::slotButtonClicked(int button) { if(button == Ok) { QString sname = nameEdit->text().trimmed(); if(sname.isEmpty()) { nameEdit->setFocus(); KMessageBox::error(this, i18n("Empty name.")); return; } ExpensesAccount *eaccount = budget->findExpensesAccount(sname); if(eaccount && eaccount != current_account) { nameEdit->setFocus(); KMessageBox::error(this, i18n("The entered name is used by another expense category.")); return; } } KDialog::slotButtonClicked(button); } #define CHANGE_COLUMN 2 #define BUDGET_COLUMN 1 #define VALUE_COLUMN 3 class TotalListViewItem : public QTreeWidgetItem { public: TotalListViewItem(QTreeWidget *parent, QString label1, QString label2 = QString::null, QString label3 = QString::null, QString label4 = QString::null) : QTreeWidgetItem(parent, UserType) { setText(0, label1); setText(1, label2); setText(2, label3); setText(3, label4); setTextAlignment(BUDGET_COLUMN, Qt::AlignRight); setTextAlignment(CHANGE_COLUMN, Qt::AlignRight); setTextAlignment(VALUE_COLUMN, Qt::AlignRight); setBackground(0, parent->palette().alternateBase()); setBackground(1, parent->palette().alternateBase()); setBackground(2, parent->palette().alternateBase()); setBackground(3, parent->palette().alternateBase()); } TotalListViewItem(QTreeWidget *parent, QTreeWidgetItem *after, QString label1, QString label2 = QString::null, QString label3 = QString::null, QString label4 = QString::null) : QTreeWidgetItem(parent, after, UserType) { setText(0, label1); setText(1, label2); setText(2, label3); setText(3, label4); setTextAlignment(BUDGET_COLUMN, Qt::AlignRight); setTextAlignment(CHANGE_COLUMN, Qt::AlignRight); setTextAlignment(VALUE_COLUMN, Qt::AlignRight); setBackground(0, parent->palette().alternateBase()); setBackground(1, parent->palette().alternateBase()); setBackground(2, parent->palette().alternateBase()); setBackground(3, parent->palette().alternateBase()); } }; class AccountsListView : public EqonomizeTreeWidget { public: AccountsListView(QWidget *parent) : EqonomizeTreeWidget(parent) { setContentsMargins(25, 25, 25, 25); } }; Eqonomize::Eqonomize() : KXmlGuiWindow(0) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); cr_tmp_file = NULL; expenses_budget = 0.0; expenses_budget_diff = 0.0; incomes_budget = 0.0; incomes_budget_diff = 0.0; incomes_accounts_value = 0.0; incomes_accounts_change = 0.0; expenses_accounts_value = 0.0; expenses_accounts_change = 0.0; assets_accounts_value = 0.0; assets_accounts_change = 0.0; total_value = 0.0; total_cost = 0.0; total_profit = 0.0; total_rate = 0.0; partial_budget = false; modified = false; modified_auto_save = false; budget = new Budget(); KConfigGroup config = KGlobal::config()->group("General Options"); b_extra = config.readEntry("useExtraProperties", false); int initial_period_pre = config.readEntry("initialPeriod", int(INITIAL_PERIOD_CURRENT_MONTH)); if(initial_period_pre < INITIAL_PERIOD_CURRENT_MONTH || initial_period_pre > INITIAL_PERIOD_LAST) initial_period_pre = INITIAL_PERIOD_CURRENT_MONTH; InitialPeriod initial_period = (InitialPeriod) initial_period_pre; prev_cur_date = QDate::currentDate(); QDate curdate = prev_cur_date; bool from_enabled = true; switch(initial_period) { case INITIAL_PERIOD_CURRENT_MONTH: { calSys->setYMD(from_date, calSys->year(curdate), calSys->month(curdate), 1); to_date = curdate; break; } case INITIAL_PERIOD_CURRENT_YEAR: { calSys->setYMD(from_date, calSys->year(curdate), 1, 1); to_date = curdate; break; } case INITIAL_PERIOD_CURRENT_WHOLE_MONTH: { calSys->setYMD(from_date, calSys->year(curdate), calSys->month(curdate), 1); to_date = calSys->addDays(from_date, calSys->daysInMonth(curdate) - 1); break; } case INITIAL_PERIOD_CURRENT_WHOLE_YEAR: { calSys->setYMD(from_date, calSys->year(curdate), 1, 1); to_date = calSys->addDays(from_date, calSys->daysInYear(curdate) - 1); break; } case INITIAL_PERIOD_LAST: { from_date = QDate::fromString(config.readEntry("initialFromDate"), Qt::ISODate); if(!from_date.isValid()) calSys->setYMD(from_date, calSys->year(curdate), calSys->month(curdate), 1); from_enabled = config.readEntry("initialFromDateEnabled", false); to_date = QDate::fromString(config.readEntry("initialToDate"), Qt::ISODate); if(!to_date.isValid()) to_date = calSys->addDays(from_date, calSys->daysInMonth(from_date) - 1); break; } } calSys->setYMD(frommonth_begin, calSys->year(from_date), calSys->month(from_date), 1); prevmonth_begin = calSys->addMonths(to_date, -1); prevmonth_begin = calSys->addDays(prevmonth_begin, -(calSys->day(prevmonth_begin) - 1)); setAcceptDrops(true); QWidget *w_top = new QWidget(this); setCentralWidget(w_top); QVBoxLayout *topLayout = new QVBoxLayout(w_top); tabs = new KPageWidget(w_top); topLayout->addWidget(tabs); accounts_page = new QWidget(this); accounts_page_item = new KPageWidgetItem(accounts_page, i18n("Accounts")); accounts_page_item->setHeader(i18n("Accounts & Categories")); accounts_page_item->setIcon(KIcon("go-home")); tabs->addPage(accounts_page_item); expenses_page = new QWidget(this); expenses_page_item = new KPageWidgetItem(expenses_page, i18n("Expenses")); expenses_page_item->setHeader(i18n("Expenses")); expenses_page_item->setIcon(KIcon("go-previous")); tabs->addPage(expenses_page_item); incomes_page = new QWidget(this); incomes_page_item = new KPageWidgetItem(incomes_page, i18n("Incomes")); incomes_page_item->setHeader(i18n("Incomes")); incomes_page_item->setIcon(KIcon("go-next")); tabs->addPage(incomes_page_item); transfers_page = new QWidget(this); transfers_page_item = new KPageWidgetItem(transfers_page, i18n("Transfers")); transfers_page_item->setHeader(i18n("Transfers")); transfers_page_item->setIcon(KIcon("view-refresh")); tabs->addPage(transfers_page_item); securities_page = new QWidget(this); securities_page_item = new KPageWidgetItem(securities_page, i18n("Securities")); securities_page_item->setHeader(i18n("Securities")); securities_page_item->setIcon(KIcon("view-list-text")); tabs->addPage(securities_page_item); schedule_page = new QWidget(this); schedule_page_item = new KPageWidgetItem(schedule_page, i18n("Schedule")); schedule_page_item->setHeader(i18n("Scheduled Transactions")); schedule_page_item->setIcon(KIcon("view-pim-calendar")); tabs->addPage(schedule_page_item); connect(tabs, SIGNAL(currentPageChanged(KPageWidgetItem*, KPageWidgetItem*)), this, SLOT(onPageChange(KPageWidgetItem*, KPageWidgetItem*))); QVBoxLayout *accountsLayout = new QVBoxLayout(accounts_page); accountsLayout->setContentsMargins(0, 0, 0, 0); QVBoxLayout *accountsLayoutView = new QVBoxLayout(); accountsLayout->addLayout(accountsLayoutView); accountsView = new AccountsListView(accounts_page); accountsView->setSortingEnabled(false); accountsView->setAllColumnsShowFocus(true); accountsView->setColumnCount(4); QStringList accountsViewHeaders; accountsViewHeaders << i18n("Account / Category"); accountsViewHeaders << i18n("Remaining Budget (%1)").arg(KGlobal::locale()->currencySymbol()); accountsViewHeaders << i18n("Change (%1)").arg(KGlobal::locale()->currencySymbol()); accountsViewHeaders << i18n("Total (%1)").arg(KGlobal::locale()->currencySymbol()); accountsView->setHeaderLabels(accountsViewHeaders); accountsView->setRootIsDecorated(false); accountsView->header()->setClickable(false); accountsView->header()->setStretchLastSection(false); QSizePolicy sp = accountsView->sizePolicy(); sp.setVerticalPolicy(QSizePolicy::MinimumExpanding); accountsView->setSizePolicy(sp); QFontMetrics fm(accountsView->font()); accountsView->resizeColumnToContents(0); accountsView->resizeColumnToContents(1); accountsView->resizeColumnToContents(2); accountsView->resizeColumnToContents(3); int w = fm.width(i18nc("%2 remains of %1 budget", "%2 of %1").arg(KGlobal::locale()->formatNumber(10000.0, KGlobal::locale()->fracDigits())).arg(KGlobal::locale()->formatNumber(100000.0, KGlobal::locale()->fracDigits()))); if(accountsView->columnWidth(BUDGET_COLUMN) < w) accountsView->setColumnWidth(BUDGET_COLUMN, w); w = fm.width(KGlobal::locale()->formatNumber(999999999.99, KGlobal::locale()->fracDigits())); if(accountsView->columnWidth(CHANGE_COLUMN) < w) accountsView->setColumnWidth(CHANGE_COLUMN, w); w = fm.width(KGlobal::locale()->formatNumber(999999999.99, KGlobal::locale()->fracDigits()) + " "); if(accountsView->columnWidth(VALUE_COLUMN) < w) accountsView->setColumnWidth(VALUE_COLUMN, w); w = fm.width(i18n("Account / Category")); if(accountsView->columnWidth(0) < w) accountsView->setColumnWidth(0, w); accountsView->header()->setResizeMode(0, QHeaderView::Stretch); assetsItem = new TotalListViewItem(accountsView, i18n("Accounts"), QString::null, KGlobal::locale()->formatNumber(0.0, KGlobal::locale()->fracDigits()), KGlobal::locale()->formatNumber(0.0, KGlobal::locale()->fracDigits()) + " "); incomesItem = new TotalListViewItem(accountsView, assetsItem, i18n("Incomes"), "-", KGlobal::locale()->formatNumber(0.0, KGlobal::locale()->fracDigits()), KGlobal::locale()->formatNumber(0.0, KGlobal::locale()->fracDigits()) + " "); expensesItem = new TotalListViewItem(accountsView, incomesItem, i18n("Expenses"), "-", KGlobal::locale()->formatNumber(0.0, KGlobal::locale()->fracDigits()), KGlobal::locale()->formatNumber(0.0, KGlobal::locale()->fracDigits()) + " "); accountsLayoutView->addWidget(accountsView); QHBoxLayout *accountsLayoutFooter = new QHBoxLayout(); accountsLayoutView->addLayout(accountsLayoutFooter); accountsLayoutFooter->addStretch(1); footer1 = new QLabel(QString("* ") + i18n("Includes budgeted transactions"), accounts_page); accountsLayoutFooter->addWidget(footer1); footer1->hide(); accountsTabs = new KTabWidget(accounts_page); accountsTabs->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); QWidget *periodWidget = new QWidget(accounts_page); accountsTabs->addTab(periodWidget, i18n("Period")); QVBoxLayout *accountsPeriodLayout = new QVBoxLayout(periodWidget); QHBoxLayout *accountsPeriodLayout2 = new QHBoxLayout(); accountsPeriodLayout->addLayout(accountsPeriodLayout2); accountsPeriodFromButton = new QCheckBox(i18n("From"), periodWidget); accountsPeriodFromButton->setChecked(from_enabled); accountsPeriodLayout2->addWidget(accountsPeriodFromButton); accountsPeriodFromEdit = new KDateEdit(periodWidget); accountsPeriodFromEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); accountsPeriodFromEdit->setDate(from_date); accountsPeriodFromEdit->setEnabled(true); sp = accountsPeriodFromEdit->sizePolicy(); sp.setHorizontalPolicy(QSizePolicy::Expanding); accountsPeriodFromEdit->setSizePolicy(sp); accountsPeriodLayout2->addWidget(accountsPeriodFromEdit); accountsPeriodLayout2->addWidget(new QLabel(i18n("To"), periodWidget)); accountsPeriodToEdit = new KDateEdit(periodWidget); accountsPeriodToEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); accountsPeriodToEdit->setDate(to_date); accountsPeriodToEdit->setEnabled(true); accountsPeriodToEdit->setSizePolicy(sp); accountsPeriodLayout2->addWidget(accountsPeriodToEdit); QHBoxLayout *accountsPeriodLayout3 = new QHBoxLayout(); accountsPeriodLayout->addLayout(accountsPeriodLayout3); QPushButton *prevYearButton = new KPushButton(KIcon("arrow-left-double"), "", periodWidget); accountsPeriodLayout2->addWidget(prevYearButton); QPushButton *prevMonthButton = new KPushButton(KIcon("arrow-left"), "", periodWidget); accountsPeriodLayout2->addWidget(prevMonthButton); QPushButton *nextMonthButton = new KPushButton(KIcon("arrow-right"), "", periodWidget); accountsPeriodLayout2->addWidget(nextMonthButton); QPushButton *nextYearButton = new KPushButton(KIcon("arrow-right-double"), "", periodWidget); accountsPeriodLayout2->addWidget(nextYearButton); QPushButton *accountsPeriodButton = new KPushButton(i18n("Select Period"), periodWidget); QMenu *accountsPeriodMenu = new QMenu(this); ActionAP_1 = accountsPeriodMenu->addAction(i18n("Current Month")); ActionAP_2 = accountsPeriodMenu->addAction(i18n("Current Year")); ActionAP_3 = accountsPeriodMenu->addAction(i18n("Current Whole Month")); ActionAP_4 = accountsPeriodMenu->addAction(i18n("Current Whole Year")); ActionAP_5 = accountsPeriodMenu->addAction(i18n("Whole Past Month")); ActionAP_6 = accountsPeriodMenu->addAction(i18n("Whole Past Year")); ActionAP_7 = accountsPeriodMenu->addAction(i18n("Previous Month")); ActionAP_8 = accountsPeriodMenu->addAction(i18n("Previous Year")); accountsPeriodButton->setMenu(accountsPeriodMenu); accountsPeriodLayout3->addWidget(accountsPeriodButton); partialBudgetButton = new QCheckBox(i18n("Show partial budget"), periodWidget); accountsPeriodLayout3->addWidget(partialBudgetButton); accountsPeriodLayout3->addStretch(1); QWidget *budgetWidget = new QWidget(accounts_page); accountsTabs->addTab(budgetWidget, i18n("Edit Budget")); QVBoxLayout *budgetLayout = new QVBoxLayout(budgetWidget); QHBoxLayout *budgetLayout2 = new QHBoxLayout(); budgetLayout->addLayout(budgetLayout2); budgetButton = new QCheckBox(i18n("Budget:"), budgetWidget); budgetButton->setChecked(false); budgetLayout2->addWidget(budgetButton); budgetEdit = new EqonomizeValueEdit(false, budgetWidget); budgetEdit->setEnabled(false); sp = budgetEdit->sizePolicy(); sp.setHorizontalPolicy(QSizePolicy::Expanding); budgetEdit->setSizePolicy(sp); budgetEdit->setFocus(); budgetLayout2->addWidget(budgetEdit); budgetLayout2->addWidget(new QLabel(i18n("Month:"), budgetWidget)); budgetMonthEdit = new EqonomizeMonthSelector(budgetWidget); sp = budgetMonthEdit->sizePolicy(); sp.setHorizontalPolicy(QSizePolicy::Expanding); budgetMonthEdit->setSizePolicy(sp); budgetLayout2->addWidget(budgetMonthEdit); QHBoxLayout *budgetLayout3 = new QHBoxLayout(); budgetLayout->addLayout(budgetLayout3); budgetLayout3->addWidget(new QLabel(i18n("Result previous month:"), budgetWidget)); prevMonthBudgetLabel = new QLabel("-", budgetWidget); budgetLayout3->addWidget(prevMonthBudgetLabel); budgetLayout3->addStretch(1); accountsLayout->addWidget(accountsTabs); accountPopupMenu = NULL; connect(budgetMonthEdit, SIGNAL(dateChanged(const QDate&)), this, SLOT(budgetMonthChanged(const QDate&))); connect(budgetEdit, SIGNAL(valueChanged(double)), this, SLOT(budgetChanged(double))); connect(budgetEdit, SIGNAL(returnPressed()), this, SLOT(budgetEditReturnPressed())); connect(budgetButton, SIGNAL(toggled(bool)), this, SLOT(budgetToggled(bool))); connect(budgetButton, SIGNAL(toggled(bool)), budgetEdit, SLOT(setEnabled(bool))); connect(partialBudgetButton, SIGNAL(toggled(bool)), this, SLOT(setPartialBudget(bool))); connect(accountsPeriodMenu, SIGNAL(triggered(QAction*)), this, SLOT(periodSelected(QAction*))); connect(prevMonthButton, SIGNAL(clicked()), this, SLOT(prevMonth())); connect(nextMonthButton, SIGNAL(clicked()), this, SLOT(nextMonth())); connect(prevYearButton, SIGNAL(clicked()), this, SLOT(prevYear())); connect(nextYearButton, SIGNAL(clicked()), this, SLOT(nextYear())); connect(accountsPeriodFromButton, SIGNAL(toggled(bool)), accountsPeriodFromEdit, SLOT(setEnabled(bool))); connect(accountsPeriodFromButton, SIGNAL(toggled(bool)), this, SLOT(filterAccounts())); connect(accountsPeriodFromEdit, SIGNAL(dateChanged(const QDate&)), this, SLOT(accountsPeriodFromChanged(const QDate&))); connect(accountsPeriodToEdit, SIGNAL(dateChanged(const QDate&)), this, SLOT(accountsPeriodToChanged(const QDate&))); connect(accountsView, SIGNAL(itemSelectionChanged()), this, SLOT(accountsSelectionChanged())); connect(accountsView, SIGNAL(doubleClicked(QTreeWidgetItem*, int)), this, SLOT(accountExecuted(QTreeWidgetItem*, int))); connect(accountsView, SIGNAL(returnPressed(QTreeWidgetItem*)), this, SLOT(accountExecuted(QTreeWidgetItem*))); accountsView->setContextMenuPolicy(Qt::CustomContextMenu); connect(accountsView, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(popupAccountsMenu(const QPoint&))); expensesLayout = new QVBoxLayout(expenses_page); expensesLayout->setContentsMargins(0, 0, 0, 0); expensesWidget = new TransactionListWidget(b_extra, TRANSACTION_TYPE_EXPENSE, budget, this, expenses_page); expensesLayout->addWidget(expensesWidget); incomesLayout = new QVBoxLayout(incomes_page); incomesLayout->setContentsMargins(0, 0, 0, 0); incomesWidget = new TransactionListWidget(b_extra, TRANSACTION_TYPE_INCOME, budget, this, incomes_page); incomesLayout->addWidget(incomesWidget); transfersLayout = new QVBoxLayout(transfers_page); transfersLayout->setContentsMargins(0, 0, 0, 0); transfersWidget = new TransactionListWidget(b_extra, TRANSACTION_TYPE_TRANSFER, budget, this, transfers_page); transfersLayout->addWidget(transfersWidget); QWidget *securities_page_bak = securities_page; QVBoxLayout *securitiesLayout_pre = new QVBoxLayout(securities_page); securitiesLayout_pre->setContentsMargins(0, 0, 0, 0); securities_page = new QWidget(securities_page); securitiesLayout_pre->addWidget(securities_page); QVBoxLayout *securitiesLayout = new QVBoxLayout(securities_page); KDialogButtonBox *securitiesButtons = new KDialogButtonBox(securities_page); newSecurityButton = securitiesButtons->addButton(i18n("New Security..."), QDialogButtonBox::ActionRole); newSecurityButton->setEnabled(true); newSecurityTransactionButton = securitiesButtons->addButton(i18n("New Transaction"), QDialogButtonBox::ActionRole); QMenu *newSecurityTransactionMenu = new QMenu(this); newSecurityTransactionButton->setMenu(newSecurityTransactionMenu); setQuotationButton = securitiesButtons->addButton(i18n("Set Quotation..."), QDialogButtonBox::ActionRole); setQuotationButton->setEnabled(false); securitiesLayout->addWidget(securitiesButtons); QVBoxLayout *securitiesViewLayout = new QVBoxLayout(); securitiesLayout->addLayout(securitiesViewLayout); securitiesView = new EqonomizeTreeWidget(securities_page); securitiesView->setSortingEnabled(true); securitiesView->sortByColumn(0, Qt::AscendingOrder); securitiesView->setAllColumnsShowFocus(true); securitiesView->setColumnCount(9); QStringList securitiesViewHeaders; securitiesViewHeaders << i18n("Name"); securitiesViewHeaders << i18n("Value"); securitiesViewHeaders << i18n("Shares"); securitiesViewHeaders << i18n("Quotation"); securitiesViewHeaders << i18n("Cost"); securitiesViewHeaders << i18n("Profit"); securitiesViewHeaders << i18n("Yearly Rate"); securitiesViewHeaders << i18n("Type"); securitiesViewHeaders << i18n("Account"); securitiesView->setHeaderLabels(securitiesViewHeaders); securitiesView->setRootIsDecorated(false); sp = securitiesView->sizePolicy(); sp.setVerticalPolicy(QSizePolicy::MinimumExpanding); securitiesView->setSizePolicy(sp); securitiesViewLayout->addWidget(securitiesView); securitiesStatLabel = new QLabel(securities_page); securitiesViewLayout->addWidget(securitiesStatLabel); QGroupBox *periodGroup = new QGroupBox(i18n("Statistics Period"), securities_page); QVBoxLayout *securitiesPeriodLayout = new QVBoxLayout(periodGroup); QHBoxLayout *securitiesPeriodLayout2 = new QHBoxLayout(); securitiesPeriodLayout->addLayout(securitiesPeriodLayout2); securitiesPeriodFromButton = new QCheckBox(i18n("From"), periodGroup); securitiesPeriodFromButton->setChecked(false); securitiesPeriodLayout2->addWidget(securitiesPeriodFromButton); securitiesPeriodFromEdit = new KDateEdit(periodGroup); securitiesPeriodFromEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); calSys->setYMD(securities_from_date, calSys->year(curdate), 1, 1); securitiesPeriodFromEdit->setDate(securities_from_date); securitiesPeriodFromEdit->setEnabled(false); sp = securitiesPeriodFromEdit->sizePolicy(); sp.setHorizontalPolicy(QSizePolicy::Expanding); securitiesPeriodFromEdit->setSizePolicy(sp); securitiesPeriodLayout2->addWidget(securitiesPeriodFromEdit); securitiesPeriodLayout2->addWidget(new QLabel(i18n("To"), periodGroup)); securitiesPeriodToEdit = new KDateEdit(periodGroup); securitiesPeriodToEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); securities_to_date = curdate; securitiesPeriodToEdit->setDate(securities_to_date); securitiesPeriodToEdit->setEnabled(true); securitiesPeriodToEdit->setSizePolicy(sp); securitiesPeriodLayout2->addWidget(securitiesPeriodToEdit); securitiesLayout->addWidget(periodGroup); QHBoxLayout *securitiesPeriodLayout3 = new QHBoxLayout(); securitiesPeriodLayout2->addLayout(securitiesPeriodLayout3); QPushButton *securitiesPrevYearButton = new KPushButton(KIcon("arrow-left-double"), "", periodGroup); securitiesPeriodLayout3->addWidget(securitiesPrevYearButton); QPushButton *securitiesPrevMonthButton = new KPushButton(KIcon("arrow-left"), "", periodGroup); securitiesPeriodLayout3->addWidget(securitiesPrevMonthButton); QPushButton *securitiesNextMonthButton = new KPushButton(KIcon("arrow-right"), "", periodGroup); securitiesPeriodLayout3->addWidget(securitiesNextMonthButton); QPushButton *securitiesNextYearButton = new KPushButton(KIcon("arrow-right-double"), "", periodGroup); securitiesPeriodLayout3->addWidget(securitiesNextYearButton); securities_page = securities_page_bak; securitiesPopupMenu = NULL; updateSecuritiesStatistics(); connect(securitiesPrevMonthButton, SIGNAL(clicked()), this, SLOT(securitiesPrevMonth())); connect(securitiesNextMonthButton, SIGNAL(clicked()), this, SLOT(securitiesNextMonth())); connect(securitiesPrevYearButton, SIGNAL(clicked()), this, SLOT(securitiesPrevYear())); connect(securitiesNextYearButton, SIGNAL(clicked()), this, SLOT(securitiesNextYear())); connect(securitiesPeriodFromButton, SIGNAL(toggled(bool)), securitiesPeriodFromEdit, SLOT(setEnabled(bool))); connect(securitiesPeriodFromButton, SIGNAL(toggled(bool)), this, SLOT(updateSecurities())); connect(securitiesPeriodFromEdit, SIGNAL(dateChanged(const QDate&)), this, SLOT(securitiesPeriodFromChanged(const QDate&))); connect(securitiesPeriodToEdit, SIGNAL(dateChanged(const QDate&)), this, SLOT(securitiesPeriodToChanged(const QDate&))); connect(newSecurityButton, SIGNAL(clicked()), this, SLOT(newSecurity())); connect(setQuotationButton, SIGNAL(clicked()), this, SLOT(setQuotation())); connect(securitiesView, SIGNAL(itemSelectionChanged()), this, SLOT(securitiesSelectionChanged())); connect(securitiesView, SIGNAL(doubleClicked(QTreeWidgetItem*, int)), this, SLOT(securitiesExecuted(QTreeWidgetItem*, int))); connect(securitiesView, SIGNAL(returnPressed(QTreeWidgetItem*)), this, SLOT(securitiesExecuted(QTreeWidgetItem*))); securitiesView->setContextMenuPolicy(Qt::CustomContextMenu); connect(securitiesView, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(popupSecuritiesMenu(const QPoint&))); QVBoxLayout *scheduleLayout = new QVBoxLayout(schedule_page); scheduleLayout->setContentsMargins(0, 0, 0, 0); KDialogButtonBox *scheduleButtons = new KDialogButtonBox(schedule_page); newScheduleButton = scheduleButtons->addButton(i18n("New Schedule"), QDialogButtonBox::ActionRole); QMenu *newScheduleMenu = new QMenu(this); newScheduleButton->setMenu(newScheduleMenu); editScheduleButton = scheduleButtons->addButton(i18n("Edit"), QDialogButtonBox::ActionRole); editScheduleMenu = new QMenu(this); editScheduleButton->setMenu(editScheduleMenu); editScheduleButton->setEnabled(false); removeScheduleButton = scheduleButtons->addButton(KStandardGuiItem::remove().text(), QDialogButtonBox::ActionRole); removeScheduleMenu = new QMenu(this); removeScheduleButton->setMenu(removeScheduleMenu); removeScheduleButton->setEnabled(false); scheduleLayout->addWidget(scheduleButtons); scheduleView = new EqonomizeTreeWidget(schedule_page); scheduleView->setAllColumnsShowFocus(true); scheduleView->setColumnCount(7); QStringList scheduleViewHeaders; scheduleViewHeaders << i18n("Next Occurrence"); scheduleViewHeaders << i18n("Type"); scheduleViewHeaders << i18n("Description"); scheduleViewHeaders << i18n("Amount"); scheduleViewHeaders << i18n("From"); scheduleViewHeaders << i18n("To"); scheduleViewHeaders << i18n("Comments"); scheduleView->setHeaderLabels(scheduleViewHeaders); scheduleView->setRootIsDecorated(false); sp = scheduleView->sizePolicy(); sp.setVerticalPolicy(QSizePolicy::MinimumExpanding); scheduleView->setSizePolicy(sp); scheduleLayout->addWidget(scheduleView); scheduleView->sortByColumn(0, Qt::AscendingOrder); scheduleView->setSortingEnabled(true); schedulePopupMenu = NULL; connect(scheduleView, SIGNAL(itemSelectionChanged()), this, SLOT(scheduleSelectionChanged())); connect(scheduleView, SIGNAL(doubleClicked(QTreeWidgetItem*, int)), this, SLOT(scheduleExecuted(QTreeWidgetItem*))); connect(scheduleView, SIGNAL(returnPressed(QTreeWidgetItem*)), this, SLOT(scheduleExecuted(QTreeWidgetItem*))); scheduleView->setContextMenuPolicy(Qt::CustomContextMenu); connect(scheduleView, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(popupScheduleMenu(const QPoint&))); connect(scheduleView, SIGNAL(itemSelectionChanged()), this, SLOT(updateTransactionActions())); setupActions(); ActionSelectInitialPeriod->setCurrentItem(initial_period_pre); newScheduleMenu->addAction(ActionNewExpense); newScheduleMenu->addAction(ActionNewIncome); newScheduleMenu->addAction(ActionNewTransfer); editScheduleMenu->addAction(ActionEditSchedule); editScheduleMenu->addAction(ActionEditOccurrence); removeScheduleMenu->addAction(ActionDeleteSchedule); removeScheduleMenu->addAction(ActionDeleteOccurrence); newSecurityTransactionMenu->addAction(ActionBuyShares); newSecurityTransactionMenu->addAction(ActionSellShares); newSecurityTransactionMenu->addAction(ActionNewSecurityTrade); newSecurityTransactionMenu->addAction(ActionNewDividend); newSecurityTransactionMenu->addAction(ActionNewReinvestedDividend); setupGUI(ToolBar | Keys | Save | Create); readOptions(); QDesktopWidget desktop; if(first_run && !initialGeometrySet()) { resize(QSize(750, 650).boundedTo(desktop.availableGeometry(this).size())); } QTimer *scheduleTimer = new QTimer(); connect(scheduleTimer, SIGNAL(timeout()), this, SLOT(checkSchedule())); scheduleTimer->start(1000 * 60 * 30); auto_save_timeout = true; QTimer *autoSaveTimer = new QTimer(); connect(autoSaveTimer, SIGNAL(timeout()), this, SLOT(onAutoSaveTimeout())); autoSaveTimer->start(1000 * 60 * 1); QTimer *dateTimer = new QTimer(); connect(dateTimer, SIGNAL(timeout()), this, SLOT(checkDate())); dateTimer->start(1000 * 60); } Eqonomize::~Eqonomize() {} void Eqonomize::useExtraProperties(bool b) { b_extra = b; delete expensesWidget; expensesWidget = new TransactionListWidget(b_extra, TRANSACTION_TYPE_EXPENSE, budget, this, expenses_page); expensesLayout->addWidget(expensesWidget); expensesWidget->updateAccounts(); expensesWidget->transactionsReset(); if(tabs->currentPage()->widget() == expenses_page) { expensesWidget->onDisplay(); updateTransactionActions(); } expensesWidget->show(); delete incomesWidget; incomesWidget = new TransactionListWidget(b_extra, TRANSACTION_TYPE_INCOME, budget, this, incomes_page); incomesLayout->addWidget(incomesWidget); incomesWidget->updateAccounts(); incomesWidget->transactionsReset(); if(tabs->currentPage()->widget() == incomes_page) { incomesWidget->onDisplay(); updateTransactionActions(); } incomesWidget->show(); } void Eqonomize::checkDate() { if(QDate::currentDate() != prev_cur_date) { QDate prev_cur_date_bak = prev_cur_date; prev_cur_date = QDate::currentDate(); if(to_date == prev_cur_date_bak) { accountsPeriodToEdit->setDate(prev_cur_date); accountsPeriodToChanged(prev_cur_date); } if(securities_to_date == prev_cur_date_bak) { securitiesPeriodToEdit->setDate(prev_cur_date); securitiesPeriodToChanged(prev_cur_date); } expensesWidget->currentDateChanged(prev_cur_date_bak, prev_cur_date); incomesWidget->currentDateChanged(prev_cur_date_bak, prev_cur_date); transfersWidget->currentDateChanged(prev_cur_date_bak, prev_cur_date); } } void Eqonomize::showExpenses() { tabs->setCurrentPage(expenses_page_item); onPageChange(expenses_page); } void Eqonomize::showIncomes() { tabs->setCurrentPage(incomes_page_item); onPageChange(incomes_page); } void Eqonomize::showTransfers() { tabs->setCurrentPage(transfers_page_item); onPageChange(transfers_page); } void Eqonomize::setPartialBudget(bool b) { partial_budget = b; filterAccounts(); } void Eqonomize::budgetEditReturnPressed() { QTreeWidgetItem *i = selectedItem(accountsView); if(!i) return; int index = accountsView->indexOfTopLevelItem(i); index++; i = accountsView->topLevelItem(index); if(!i && account_items.contains(i) && account_items[i]->type() == ACCOUNT_TYPE_INCOMES) i = expensesItem->child(0); if(i) { i->setSelected(true); if(budgetEdit->isEnabled()) budgetEdit->lineEdit()->selectAll(); else budgetButton->setFocus(); } } void Eqonomize::budgetMonthChanged(const QDate &date) { accountsPeriodFromEdit->blockSignals(true); accountsPeriodFromButton->blockSignals(true); accountsPeriodToEdit->blockSignals(true); const KCalendarSystem *calSys = KGlobal::locale()->calendar(); from_date = date; to_date = calSys->addDays(from_date, calSys->daysInMonth(from_date) - 1); accountsPeriodFromButton->setChecked(true); accountsPeriodFromEdit->setDate(from_date); accountsPeriodToEdit->setDate(to_date); accountsPeriodFromEdit->blockSignals(false); accountsPeriodFromButton->blockSignals(false); accountsPeriodToEdit->blockSignals(false); filterAccounts(); } void Eqonomize::budgetChanged(double value) { QTreeWidgetItem *i = selectedItem(accountsView); if(!account_items.contains(i)) return; Account *account = account_items[i]; if(account->type() == ACCOUNT_TYPE_ASSETS) return; CategoryAccount *ca = (CategoryAccount*) account; QDate month = budgetMonthEdit->date(); ca->mbudgets[month] = value; ca = budget->incomesAccounts.first(); while(ca) { if(!ca->mbudgets.contains(month)) { value = ca->monthlyBudget(month); ca->mbudgets[month] = value; } ca = budget->incomesAccounts.next(); } ca = budget->expensesAccounts.first(); while(ca) { if(!ca->mbudgets.contains(month)) { value = ca->monthlyBudget(month); ca->mbudgets[month] = value; } ca = budget->expensesAccounts.next(); } setModified(true); filterAccounts(); } void Eqonomize::budgetToggled(bool b) { QTreeWidgetItem *i = selectedItem(accountsView); if(!account_items.contains(i)) return; Account *account = account_items[i]; if(account->type() == ACCOUNT_TYPE_ASSETS) return; CategoryAccount *ca = (CategoryAccount*) account; QDate month = budgetMonthEdit->date(); if(b) ca->mbudgets[month] = budgetEdit->value(); else ca->mbudgets[month] = -1; ca = budget->incomesAccounts.first(); while(ca) { if(!ca->mbudgets.contains(month)) { double value = ca->monthlyBudget(month); ca->mbudgets[month] = value; } ca = budget->incomesAccounts.next(); } ca = budget->expensesAccounts.first(); while(ca) { if(!ca->mbudgets.contains(month)) { double value = ca->monthlyBudget(month); ca->mbudgets[month] = value; } ca = budget->expensesAccounts.next(); } setModified(true); filterAccounts(); } void Eqonomize::periodSelected(QAction *a) { accountsPeriodFromEdit->blockSignals(true); accountsPeriodFromButton->blockSignals(true); accountsPeriodToEdit->blockSignals(true); const KCalendarSystem *calSys = KGlobal::locale()->calendar(); QDate curdate = QDate::currentDate(); if(a == ActionAP_1) { calSys->setYMD(from_date, calSys->year(curdate), calSys->month(curdate), 1); to_date = curdate; } else if(a == ActionAP_2) { calSys->setYMD(from_date, calSys->year(curdate), 1, 1); to_date = curdate; } else if(a == ActionAP_3) { calSys->setYMD(from_date, calSys->year(curdate), calSys->month(curdate), 1); to_date = calSys->addDays(from_date, calSys->daysInMonth(curdate) - 1); } else if(a == ActionAP_4) { calSys->setYMD(from_date, calSys->year(curdate), 1, 1); to_date = calSys->addDays(from_date, calSys->daysInYear(curdate) - 1); } else if(a == ActionAP_5) { to_date = curdate; from_date = calSys->addDays(calSys->addMonths(to_date, -1), 1); } else if(a == ActionAP_6) { to_date = curdate; from_date = calSys->addDays(calSys->addYears(to_date, -1), 1); } else if(a == ActionAP_7) { curdate = calSys->addMonths(curdate, -1); calSys->setYMD(from_date, calSys->year(curdate), calSys->month(curdate), 1); to_date = calSys->addDays(from_date, calSys->daysInMonth(curdate) - 1); } else if(a == ActionAP_8) { curdate = calSys->addYears(curdate, -1); calSys->setYMD(from_date, calSys->year(curdate), 1, 1); to_date = calSys->addDays(from_date, calSys->daysInYear(curdate) - 1); } accountsPeriodFromButton->setChecked(true); accountsPeriodFromEdit->setEnabled(true); accountsPeriodFromEdit->setDate(from_date); accountsPeriodToEdit->setDate(to_date); accountsPeriodFromEdit->blockSignals(false); accountsPeriodFromButton->blockSignals(false); accountsPeriodToEdit->blockSignals(false); filterAccounts(); } void Eqonomize::newSecurity() { EditSecurityDialog *dialog = new EditSecurityDialog(budget, this, i18n("New Security")); if(dialog->checkAccount() && dialog->exec() == QDialog::Accepted) { Security *security = dialog->newSecurity(); if(security) { budget->addSecurity(security); appendSecurity(security); updateSecurityAccount(security->account()); setModified(true); } } dialog->deleteLater(); } void Eqonomize::editSecurity(QTreeWidgetItem *i) { if(!i) return; Security *security = ((SecurityListViewItem*) i)->security(); EditSecurityDialog *dialog = new EditSecurityDialog(budget, this, i18n("Edit Security")); dialog->setSecurity(security); if(dialog->checkAccount() && dialog->exec() == QDialog::Accepted) { if(dialog->modifySecurity(security)) { updateSecurity(i); updateSecurityAccount(security->account()); setModified(true); incomesWidget->filterTransactions(); transfersWidget->filterTransactions(); } } dialog->deleteLater(); } void Eqonomize::editSecurity() { QTreeWidgetItem *i = selectedItem(securitiesView); if(i == NULL) return; editSecurity(i); } void Eqonomize::updateSecuritiesStatistics() { securitiesStatLabel->setText(QString("
%1 %5   %2 %6   %3 %7   %4 %8\%
").arg(i18n("Total value:")).arg(i18n("Cost:")).arg(i18n("Profit:")).arg(i18n("Rate:")).arg(KGlobal::locale()->formatMoney(total_value)).arg(KGlobal::locale()->formatMoney(total_cost)).arg(KGlobal::locale()->formatMoney(total_profit)).arg(KGlobal::locale()->formatNumber(total_rate * 100))); } void Eqonomize::deleteSecurity() { SecurityListViewItem *i = (SecurityListViewItem*) selectedItem(securitiesView); if(i == NULL) return; Security *security = i->security(); bool has_trans = budget->securityHasTransactions(security); if(!has_trans || KMessageBox::warningContinueCancel(this, i18n("Are you sure you want to delete the security \"%1\" and all associated transactions?").arg(security->name())) == KMessageBox::Continue) { total_value -= i->value; total_rate *= total_cost; total_cost -= i->cost; total_rate -= i->cost * i->rate; if(total_cost != 0.0) total_rate /= total_cost; total_profit -= i->profit; updateSecuritiesStatistics(); delete i; budget->removeSecurity(security); if(has_trans) { filterAccounts(); updateScheduledTransactions(); expensesWidget->filterTransactions(); incomesWidget->filterTransactions(); transfersWidget->filterTransactions(); emit transactionsModified(); } else { updateSecurityAccount(security->account()); } setModified(true); } } void Eqonomize::buySecurities() { SecurityListViewItem *i = (SecurityListViewItem*) selectedItem(securitiesView); newScheduledTransaction(TRANSACTION_TYPE_SECURITY_BUY, i == NULL ? NULL : i->security(), true); } void Eqonomize::sellSecurities() { SecurityListViewItem *i = (SecurityListViewItem*) selectedItem(securitiesView); newScheduledTransaction(TRANSACTION_TYPE_SECURITY_SELL, i == NULL ? NULL : i->security(), true); } void Eqonomize::newDividend() { SecurityListViewItem *i = (SecurityListViewItem*) selectedItem(securitiesView); newScheduledTransaction(TRANSACTION_TYPE_INCOME, i == NULL ? NULL : i->security(), true); } void Eqonomize::editReinvestedDividend(ReinvestedDividend *rediv, Security *security) { editReinvestedDividend(rediv, security, this); } bool Eqonomize::editReinvestedDividend(ReinvestedDividend *rediv, Security *security, QWidget *parent) { EditReinvestedDividendDialog *dialog = new EditReinvestedDividendDialog(budget, security, true, parent); dialog->setDividend(rediv); if(dialog->exec() == QDialog::Accepted) { if(dialog->modifyDividend(rediv)) { security->reinvestedDividends.setAutoDelete(false); security->reinvestedDividends.removeRef(rediv); security->reinvestedDividends.setAutoDelete(true); updateSecurity(security); updateSecurityAccount(security->account()); security = dialog->selectedSecurity(); security->reinvestedDividends.inSort(rediv); updateSecurity(security); updateSecurityAccount(security->account()); setModified(true); dialog->deleteLater(); return true; } } dialog->deleteLater(); return false; } void Eqonomize::newReinvestedDividend() { if(budget->securities.count() == 0) { KMessageBox::error(this, i18n("No security available.")); return; } SecurityListViewItem *i = (SecurityListViewItem*) selectedItem(securitiesView); Security *security = NULL; if(i) security = i->security(); EditReinvestedDividendDialog *dialog = new EditReinvestedDividendDialog(budget, security, true, this); if(dialog->exec() == QDialog::Accepted) { ReinvestedDividend *rediv = dialog->createDividend(); if(rediv) { security = dialog->selectedSecurity(); security->reinvestedDividends.inSort(rediv); updateSecurity(security); updateSecurityAccount(security->account()); setModified(true); } } dialog->deleteLater(); } void Eqonomize::editSecurityTrade(SecurityTrade *ts) { editSecurityTrade(ts, this); } bool Eqonomize::editSecurityTrade(SecurityTrade *ts, QWidget *parent) { EditSecurityTradeDialog *dialog = new EditSecurityTradeDialog(budget, ts->from_security, parent); dialog->setSecurityTrade(ts); if(dialog->exec() == QDialog::Accepted) { SecurityTrade *ts_new = dialog->createSecurityTrade(); if(ts_new) { budget->removeSecurityTrade(ts, true); budget->addSecurityTrade(ts_new); updateSecurity(ts_new->from_security); updateSecurity(ts_new->to_security); if(ts->to_security != ts_new->to_security) updateSecurity(ts->to_security); if(ts->from_security != ts_new->from_security) updateSecurity(ts->from_security); updateSecurityAccount(ts_new->from_security->account()); if(ts_new->to_security->account() != ts_new->from_security->account()) { updateSecurityAccount(ts_new->to_security->account()); } if(ts->to_security->account() != ts_new->to_security->account() && ts->to_security->account() != ts_new->from_security->account()) { updateSecurityAccount(ts->to_security->account()); } setModified(true); delete ts; dialog->deleteLater(); return true; } } dialog->deleteLater(); return false; } void Eqonomize::newSecurityTrade() { SecurityListViewItem *i = (SecurityListViewItem*) selectedItem(securitiesView); EditSecurityTradeDialog *dialog = new EditSecurityTradeDialog(budget, i == NULL ? NULL : i->security(), this); if(dialog->checkSecurities() && dialog->exec() == QDialog::Accepted) { SecurityTrade *ts = dialog->createSecurityTrade(); if(ts) { budget->addSecurityTrade(ts); updateSecurity(ts->from_security); updateSecurity(ts->to_security); updateSecurityAccount(ts->from_security->account()); if(ts->to_security->account() != ts->from_security->account()) { updateSecurityAccount(ts->to_security->account()); } setModified(true); } } dialog->deleteLater(); } void Eqonomize::setQuotation() { SecurityListViewItem *i = (SecurityListViewItem*) selectedItem(securitiesView); if(i == NULL) return; KDialog *dialog = new KDialog(this, 0); dialog->setCaption(i18n("Set Quotation (%1)").arg(i->security()->name())); dialog->setButtons(KDialog::Ok | KDialog::Cancel); dialog->setDefaultButton(KDialog::Ok); dialog->setModal(true); dialog->setMainWidget(new QWidget(dialog)); QGridLayout *grid = new QGridLayout(dialog->mainWidget()); grid->addWidget(new QLabel(i18n("Price per share:"), dialog->mainWidget()), 0, 0); EqonomizeValueEdit *quotationEdit = new EqonomizeValueEdit(0.01, INT_MAX / pow(10, KGlobal::locale()->fracDigits()) - 1.0, pow(10, -KGlobal::locale()->fracDigits()), i->security()->getQuotation(QDate::currentDate()), KGlobal::locale()->fracDigits(), true, dialog->mainWidget()); quotationEdit->setFocus(); grid->addWidget(quotationEdit, 0, 1); grid->addWidget(new QLabel(i18n("Date:"), dialog->mainWidget()), 1, 0); KDateEdit *dateEdit = new KDateEdit(dialog->mainWidget()); dateEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); grid->addWidget(dateEdit, 1, 1); while(dialog->exec() == QDialog::Accepted) { QDate date = dateEdit->date(); if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); } else if(date > QDate::currentDate()) { KMessageBox::error(this, i18n("Future dates are not allowed.")); } else { i->security()->setQuotation(date, quotationEdit->value()); updateSecurity(i); updateSecurityAccount(i->security()->account(), true); setModified(true); break; } } dialog->deleteLater(); } void Eqonomize::editQuotations() { SecurityListViewItem *i = (SecurityListViewItem*) selectedItem(securitiesView); if(!i) return; Security *security = i->security(); EditQuotationsDialog *dialog = new EditQuotationsDialog(this); dialog->setSecurity(security); if(dialog->exec() == QDialog::Accepted) { dialog->modifyQuotations(security); updateSecurity(i); updateSecurityAccount(security->account()); setModified(true); } dialog->deleteLater(); } void Eqonomize::editSecurityTransactions() { SecurityListViewItem *i = (SecurityListViewItem*) selectedItem(securitiesView); if(!i) return; SecurityTransactionsDialog *dialog = new SecurityTransactionsDialog(i->security(), this, i18n("Security Transactions")); dialog->exec(); dialog->deleteLater(); } void Eqonomize::securitiesSelectionChanged() { SecurityListViewItem *i = (SecurityListViewItem*) selectedItem(securitiesView); setQuotationButton->setEnabled(i != NULL); ActionEditSecurity->setEnabled(i != NULL); ActionDeleteSecurity->setEnabled(i != NULL); ActionSetQuotation->setEnabled(i != NULL); ActionEditQuotations->setEnabled(i != NULL); ActionEditSecurityTransactions->setEnabled(i != NULL); } void Eqonomize::securitiesExecuted(QTreeWidgetItem *i) { if(i == NULL) return; editSecurity(i); } void Eqonomize::securitiesExecuted(QTreeWidgetItem *i, int c) { if(i == NULL) return; switch(c) { case 4: {} case 5: {} case 6: {} case 1: {} case 2: { editSecurityTransactions(); break; } case 3: { setQuotation(); break; } case 8: { if(((SecurityListViewItem*) i)->security()) { editAccount(((SecurityListViewItem*) i)->security()->account()); } break; } default: { editSecurity(i); break; } } } void Eqonomize::popupSecuritiesMenu(const QPoint &p) { if(!securitiesPopupMenu) { securitiesPopupMenu = new QMenu(this); securitiesPopupMenu->addAction(ActionNewSecurity); securitiesPopupMenu->addAction(ActionEditSecurity); securitiesPopupMenu->addAction(ActionDeleteSecurity); securitiesPopupMenu->addSeparator(); securitiesPopupMenu->addAction(ActionBuyShares); securitiesPopupMenu->addAction(ActionSellShares); securitiesPopupMenu->addAction(ActionNewSecurityTrade); securitiesPopupMenu->addAction(ActionNewDividend); securitiesPopupMenu->addAction(ActionNewReinvestedDividend); securitiesPopupMenu->addAction(ActionEditSecurityTransactions); securitiesPopupMenu->addSeparator(); securitiesPopupMenu->addAction(ActionSetQuotation); securitiesPopupMenu->addAction(ActionEditQuotations); } securitiesPopupMenu->popup(securitiesView->viewport()->mapToGlobal(p)); } void Eqonomize::appendSecurity(Security *security) { double value = 0.0, cost = 0.0, rate = 0.0, profit = 0.0, quotation = 0.0, shares = 0.0; value = security->value(securities_to_date, true); cost = security->cost(securities_to_date); if(securities_to_date > QDate::currentDate()) quotation = security->expectedQuotation(securities_to_date); else quotation = security->getQuotation(securities_to_date); shares = security->shares(securities_to_date, true); if(securitiesPeriodFromButton->isChecked()) { rate = security->yearlyRate(securities_from_date, securities_to_date); profit = security->profit(securities_from_date, securities_to_date, true); } else { rate = security->yearlyRate(securities_to_date); profit = security->profit(securities_to_date, true); } SecurityListViewItem *i = new SecurityListViewItem(security, security->name(), KGlobal::locale()->formatMoney(value), KGlobal::locale()->formatNumber(shares, security->decimals()), KGlobal::locale()->formatMoney(quotation), KGlobal::locale()->formatMoney(cost), KGlobal::locale()->formatMoney(profit), KGlobal::locale()->formatNumber(rate * 100) + "%"); i->setText(8, security->account()->name()); i->value = value; i->cost = cost; i->rate = rate; i->profit = profit; switch(security->type()) { case SECURITY_TYPE_BOND: {i->setText(7, i18n("Bond")); break;} case SECURITY_TYPE_STOCK: {i->setText(7, i18n("Stock")); break;} case SECURITY_TYPE_MUTUAL_FUND: {i->setText(7, i18n("Mutual Fund")); break;} case SECURITY_TYPE_OTHER: {i->setText(7, i18n("Other")); break;} } securitiesView->insertTopLevelItem(securitiesView->topLevelItemCount(), i); total_rate *= total_value; total_value += value; total_cost += cost; total_rate += value * rate; if(total_cost != 0.0) total_rate /= total_value; total_profit += profit; updateSecuritiesStatistics(); securitiesView->setSortingEnabled(true); } void Eqonomize::updateSecurity(Security *security) { QTreeWidgetItemIterator it(securitiesView); QTreeWidgetItem *i = *it; while(i != NULL) { if(((SecurityListViewItem*) i)->security() == security) { updateSecurity(i); break; } ++it; i = *it; } } void Eqonomize::updateSecurity(QTreeWidgetItem *i) { Security *security = ((SecurityListViewItem*) i)->security(); total_rate *= total_value; total_value -= ((SecurityListViewItem*) i)->value; total_cost -= ((SecurityListViewItem*) i)->cost; total_rate -= ((SecurityListViewItem*) i)->value * ((SecurityListViewItem*) i)->rate; if(total_cost != 0.0) total_rate /= total_value; total_profit -= ((SecurityListViewItem*) i)->profit; double value = 0.0, cost = 0.0, rate = 0.0, profit = 0.0, quotation = 0.0, shares = 0.0; value = security->value(securities_to_date, true); cost = security->cost(securities_to_date); if(securities_to_date > QDate::currentDate()) quotation = security->expectedQuotation(securities_to_date); else quotation = security->getQuotation(securities_to_date); shares = security->shares(securities_to_date, true); if(securitiesPeriodFromButton->isChecked()) { rate = security->yearlyRate(securities_from_date, securities_to_date); profit = security->profit(securities_from_date, securities_to_date, true); } else { rate = security->yearlyRate(securities_to_date); profit = security->profit(securities_to_date, true); } ((SecurityListViewItem*) i)->value = value; ((SecurityListViewItem*) i)->cost = cost; ((SecurityListViewItem*) i)->rate = rate; ((SecurityListViewItem*) i)->profit = profit; total_rate *= total_value; total_value += value; total_cost += cost; total_rate += value * rate; if(total_cost != 0.0) total_rate /= total_value; total_profit += profit; i->setText(0, security->name()); switch(security->type()) { case SECURITY_TYPE_BOND: {i->setText(7, i18n("Bond")); break;} case SECURITY_TYPE_STOCK: {i->setText(7, i18n("Stock")); break;} case SECURITY_TYPE_MUTUAL_FUND: {i->setText(7, i18n("Mutual Fund")); break;} case SECURITY_TYPE_OTHER: {i->setText(7, i18n("Other")); break;} } i->setText(1, KGlobal::locale()->formatMoney(value)); i->setText(2, KGlobal::locale()->formatNumber(shares, security->decimals())); i->setText(3, KGlobal::locale()->formatMoney(quotation)); i->setText(4, KGlobal::locale()->formatMoney(cost)); i->setText(5, KGlobal::locale()->formatMoney(profit)); i->setText(6, KGlobal::locale()->formatNumber(rate * 100) + "%"); i->setText(8, security->account()->name()); updateSecuritiesStatistics(); } void Eqonomize::updateSecurities() { securitiesView->clear(); total_value = 0.0; total_cost = 0.0; total_profit = 0.0; total_rate = 0.0; Security *security = budget->securities.first(); while(security) { appendSecurity(security); security = budget->securities.next(); } } void Eqonomize::newSplitTransaction() { newSplitTransaction(this); } bool Eqonomize::newSplitTransaction(QWidget *parent, AssetsAccount *account) { EditSplitDialog *dialog = new EditSplitDialog(budget, parent, account, b_extra); if(dialog->checkAccounts() && dialog->exec() == QDialog::Accepted) { SplitTransaction *split = dialog->createSplitTransaction(); if(split) { budget->addSplitTransaction(split); splitTransactionAdded(split); dialog->deleteLater(); return true; } } dialog->deleteLater(); return false; } bool Eqonomize::editSplitTransaction(SplitTransaction *split) { return editSplitTransaction(split, this); } bool Eqonomize::editSplitTransaction(SplitTransaction *split, QWidget *parent) { EditSplitDialog *dialog = new EditSplitDialog(budget, parent, NULL, b_extra); dialog->setSplitTransaction(split); if(dialog->exec() == QDialog::Accepted) { SplitTransaction *new_split = dialog->createSplitTransaction(); if(new_split) { removeSplitTransaction(split); budget->addSplitTransaction(new_split); splitTransactionAdded(new_split); dialog->deleteLater(); return true; } } dialog->deleteLater(); return false; } bool Eqonomize::splitUpTransaction(SplitTransaction *split) { expensesWidget->onSplitRemoved(split); incomesWidget->onSplitRemoved(split); transfersWidget->onSplitRemoved(split); split->clear(true); budget->removeSplitTransaction(split, true); splitTransactionRemoved(split); delete split; setModified(true); return true; } bool Eqonomize::removeSplitTransaction(SplitTransaction *split) { budget->removeSplitTransaction(split, true); splitTransactionRemoved(split); delete split; return true; } bool Eqonomize::newScheduledTransaction(int transaction_type, Security *security, bool select_security) { return newScheduledTransaction(transaction_type, security, select_security, this); } bool Eqonomize::newScheduledTransaction(int transaction_type, Security *security, bool select_security, QWidget *parent, Account *account) { ScheduledTransaction *strans = EditScheduledTransactionDialog::newScheduledTransaction(transaction_type, budget, parent, security, select_security, account, b_extra); if(strans) { if(!strans->recurrence() && strans->transaction()->date() <= QDate::currentDate()) { Transaction *trans = strans->transaction()->copy(); delete strans; budget->addTransaction(trans); transactionAdded(trans); } else { budget->addScheduledTransaction(strans); scheduledTransactionAdded(strans); checkSchedule(); } return true; } return false; } void Eqonomize::newScheduledExpense() { newScheduledTransaction(TRANSACTION_TYPE_EXPENSE); } void Eqonomize::newScheduledIncome() { newScheduledTransaction(TRANSACTION_TYPE_INCOME); } void Eqonomize::newScheduledTransfer() { newScheduledTransaction(TRANSACTION_TYPE_TRANSFER); } bool Eqonomize::editScheduledTransaction(ScheduledTransaction *strans) { return editScheduledTransaction(strans, this); } bool Eqonomize::editScheduledTransaction(ScheduledTransaction *strans, QWidget *parent) { ScheduledTransaction *old_strans = strans->copy(); if(EditScheduledTransactionDialog::editScheduledTransaction(strans, parent, true, b_extra)) { if(!strans->recurrence() && strans->transaction()->date() <= QDate::currentDate()) { Transaction *trans = strans->transaction()->copy(); budget->removeScheduledTransaction(strans, true); scheduledTransactionRemoved(strans, old_strans); delete strans; budget->addTransaction(trans); transactionAdded(trans); } else { scheduledTransactionModified(strans, old_strans); checkSchedule(); } delete old_strans; return true; } delete old_strans; return false; } bool Eqonomize::editOccurrence(ScheduledTransaction *strans, const QDate &date) { return editOccurrence(strans, date, this); } bool Eqonomize::editOccurrence(ScheduledTransaction *strans, const QDate &date, QWidget *parent) { Security *security = NULL; if(strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) { security = ((SecurityTransaction*) strans->transaction())->security(); } else if(strans->transaction()->type() == TRANSACTION_TYPE_INCOME && ((Income*) strans->transaction())->security()) { security = ((Income*) strans->transaction())->security(); } TransactionEditDialog *dialog = new TransactionEditDialog(b_extra, strans->transaction()->type(), false, false, security, SECURITY_ALL_VALUES, security != NULL, budget, parent); dialog->editWidget->updateAccounts(); dialog->editWidget->setScheduledTransaction(strans, date); if(dialog->editWidget->checkAccounts() && dialog->exec() == QDialog::Accepted) { Transaction *trans = dialog->editWidget->createTransaction(); if(trans) { if(trans->date() > QDate::currentDate()) { ScheduledTransaction *strans_new = new ScheduledTransaction(budget, trans, NULL); budget->addScheduledTransaction(strans_new); scheduledTransactionAdded(strans_new); } else { budget->addTransaction(trans); transactionAdded(trans); } ScheduledTransaction *old_strans = strans->copy(); strans->addException(date); scheduledTransactionModified(strans, old_strans); delete old_strans; dialog->deleteLater(); return true; } } dialog->deleteLater(); return false; } void Eqonomize::editScheduledTransaction() { ScheduleListViewItem *i = (ScheduleListViewItem*) selectedItem(scheduleView); if(i == NULL) return; editScheduledTransaction(i->scheduledTransaction()); } void Eqonomize::editOccurrence() { ScheduleListViewItem *i = (ScheduleListViewItem*) selectedItem(scheduleView); if(i == NULL) return; editOccurrence(i->scheduledTransaction(), i->date()); } bool Eqonomize::removeScheduledTransaction(ScheduledTransaction *strans) { budget->removeScheduledTransaction(strans, true); scheduledTransactionRemoved(strans); delete strans; return true; } void Eqonomize::removeScheduledTransaction() { ScheduleListViewItem *i = (ScheduleListViewItem*) selectedItem(scheduleView); if(i == NULL) return; removeScheduledTransaction(i->scheduledTransaction()); } bool Eqonomize::removeOccurrence(ScheduledTransaction *strans, const QDate &date) { if(strans->isOneTimeTransaction()) { removeScheduledTransaction(strans); } else { ScheduledTransaction *oldstrans = strans->copy(); strans->addException(date); scheduledTransactionModified(strans, oldstrans); delete oldstrans; } return true; } void Eqonomize::removeOccurrence() { ScheduleListViewItem *i = (ScheduleListViewItem*) selectedItem(scheduleView); if(i == NULL) return; removeOccurrence(i->scheduledTransaction(), i->date()); } void Eqonomize::scheduleSelectionChanged() { ScheduleListViewItem *i = (ScheduleListViewItem*) selectedItem(scheduleView); if(i == NULL) { editScheduleButton->setEnabled(false); removeScheduleButton->setEnabled(false); } else { editScheduleButton->setEnabled(true); removeScheduleButton->setEnabled(true); ActionEditSchedule->setEnabled(true); ActionDeleteSchedule->setEnabled(true); ActionEditOccurrence->setEnabled(!i->scheduledTransaction()->isOneTimeTransaction()); ActionDeleteOccurrence->setEnabled(!i->scheduledTransaction()->isOneTimeTransaction()); } } void Eqonomize::scheduleExecuted(QTreeWidgetItem *i) { if(i == NULL) return; editScheduledTransaction(((ScheduleListViewItem*) i)->scheduledTransaction()); } void Eqonomize::popupScheduleMenu(const QPoint &p) { if(!schedulePopupMenu) { schedulePopupMenu = new QMenu(this); schedulePopupMenu->addAction(ActionEditScheduledTransaction); schedulePopupMenu->addAction(ActionEditTransaction); schedulePopupMenu->addSeparator(); schedulePopupMenu->addAction(ActionDeleteScheduledTransaction); schedulePopupMenu->addAction(ActionDeleteTransaction); } schedulePopupMenu->popup(scheduleView->viewport()->mapToGlobal(p)); } void Eqonomize::editSelectedScheduledTransaction() { TransactionListWidget *w = NULL; if(tabs->currentPage()->widget() == accounts_page) return; else if(tabs->currentPage()->widget() == expenses_page) w = expensesWidget; else if(tabs->currentPage()->widget() == incomes_page) w = incomesWidget; else if(tabs->currentPage()->widget() == transfers_page) w = transfersWidget; else if(tabs->currentPage()->widget() == securities_page) return; else if(tabs->currentPage()->widget() == schedule_page) { editScheduledTransaction(); return; } if(!w) return; w->editScheduledTransaction(); } void Eqonomize::editSelectedSplitTransaction() { TransactionListWidget *w = NULL; if(tabs->currentPage()->widget() == expenses_page) w = expensesWidget; else if(tabs->currentPage()->widget() == incomes_page) w = incomesWidget; else if(tabs->currentPage()->widget() == transfers_page) w = transfersWidget; else return; if(!w) return; w->editSplitTransaction(); } void Eqonomize::joinSelectedTransactions() { TransactionListWidget *w = NULL; if(tabs->currentPage()->widget() == expenses_page) w = expensesWidget; else if(tabs->currentPage()->widget() == incomes_page) w = incomesWidget; else if(tabs->currentPage()->widget() == transfers_page) w = transfersWidget; else return; if(!w) return; w->joinTransactions(); } void Eqonomize::splitUpSelectedTransaction() { TransactionListWidget *w = NULL; if(tabs->currentPage()->widget() == expenses_page) w = expensesWidget; else if(tabs->currentPage()->widget() == incomes_page) w = incomesWidget; else if(tabs->currentPage()->widget() == transfers_page) w = transfersWidget; else return; if(!w) return; w->splitUpTransaction(); } bool Eqonomize::editTransaction(Transaction *trans) { return editTransaction(trans, this); } bool Eqonomize::editTransaction(Transaction *trans, QWidget *parent) { Transaction *oldtrans = trans->copy(); Recurrence *rec = NULL; if(trans->parentSplit()) { SplitTransaction *split = trans->parentSplit(); Security *security = NULL; if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY || trans->type() == TRANSACTION_TYPE_SECURITY_SELL) { security = ((SecurityTransaction*) trans)->security(); } else if(trans->type() == TRANSACTION_TYPE_INCOME && ((Income*) trans)->security()) { security = ((Income*) trans)->security(); } TransactionEditDialog *dialog = new TransactionEditDialog(b_extra, trans->type(), true, trans->fromAccount() == split->account(), security, SECURITY_ALL_VALUES, security != NULL, budget, parent); dialog->editWidget->updateAccounts(split->account()); dialog->editWidget->setTransaction(trans); if(dialog->exec() == QDialog::Accepted) { if(dialog->editWidget->modifyTransaction(trans)) { transactionModified(trans, oldtrans); delete oldtrans; return true; } } dialog->deleteLater(); } else if(EditScheduledTransactionDialog::editTransaction(trans, rec, parent, true, b_extra)) { if(!rec && trans->date() <= QDate::currentDate()) { transactionModified(trans, oldtrans); } else { budget->removeTransaction(trans, true); transactionRemoved(trans); ScheduledTransaction *strans = new ScheduledTransaction(budget, trans, rec); budget->addScheduledTransaction(strans); scheduledTransactionAdded(strans); } delete oldtrans; return true; } delete oldtrans; return false; } void Eqonomize::newRefund() { if(tabs->currentPage()->widget() == expenses_page) expensesWidget->newRefundRepayment(); } void Eqonomize::newRepayment() { if(tabs->currentPage()->widget() == incomes_page) incomesWidget->newRefundRepayment(); } void Eqonomize::newRefundRepayment() { if(tabs->currentPage()->widget() == expenses_page) expensesWidget->newRefundRepayment(); else if(tabs->currentPage()->widget() == incomes_page) incomesWidget->newRefundRepayment(); } bool Eqonomize::newRefundRepayment(Transaction *trans) { if(trans->type() != TRANSACTION_TYPE_EXPENSE && trans->type() != TRANSACTION_TYPE_INCOME) return false; RefundDialog *dialog = new RefundDialog(trans, this); if(dialog->exec() == QDialog::Accepted) { Transaction *new_trans = dialog->createRefund(); if(new_trans) { budget->addTransaction(new_trans); transactionAdded(new_trans); dialog->deleteLater(); return true; } } dialog->deleteLater(); return false; } void Eqonomize::editSelectedTransaction() { TransactionListWidget *w = NULL; if(tabs->currentPage()->widget() == accounts_page) return; else if(tabs->currentPage()->widget() == expenses_page) w = expensesWidget; else if(tabs->currentPage()->widget() == incomes_page) w = incomesWidget; else if(tabs->currentPage()->widget() == transfers_page) w = transfersWidget; else if(tabs->currentPage()->widget() == securities_page) return; else if(tabs->currentPage()->widget() == schedule_page) { editOccurrence(); return; } if(!w) return; w->editTransaction(); } void Eqonomize::deleteSelectedScheduledTransaction() { TransactionListWidget *w = NULL; if(tabs->currentPage()->widget() == accounts_page) return; else if(tabs->currentPage()->widget() == expenses_page) w = expensesWidget; else if(tabs->currentPage()->widget() == incomes_page) w = incomesWidget; else if(tabs->currentPage()->widget() == transfers_page) w = transfersWidget; else if(tabs->currentPage()->widget() == securities_page) return; else if(tabs->currentPage()->widget() == schedule_page) { removeScheduledTransaction(); return; } if(!w) return; w->removeScheduledTransaction(); } void Eqonomize::deleteSelectedSplitTransaction() { TransactionListWidget *w = NULL; if(tabs->currentPage()->widget() == expenses_page) w = expensesWidget; else if(tabs->currentPage()->widget() == incomes_page) w = incomesWidget; else if(tabs->currentPage()->widget() == transfers_page) w = transfersWidget; else return; if(!w) return; w->removeSplitTransaction(); } void Eqonomize::deleteSelectedTransaction() { TransactionListWidget *w = NULL; if(tabs->currentPage()->widget() == accounts_page) return; else if(tabs->currentPage()->widget() == expenses_page) w = expensesWidget; else if(tabs->currentPage()->widget() == incomes_page) w = incomesWidget; else if(tabs->currentPage()->widget() == transfers_page) w = transfersWidget; else if(tabs->currentPage()->widget() == securities_page) return; else if(tabs->currentPage()->widget() == schedule_page) { removeOccurrence(); return; } if(!w) return; w->removeTransaction(); } void Eqonomize::onPageChange(KPageWidgetItem *page, KPageWidgetItem*) { onPageChange(page->widget()); } void Eqonomize::onPageChange(QWidget *w) { if(w == expenses_page) { expensesWidget->onDisplay(); } else if(w == incomes_page) { incomesWidget->onDisplay(); } else if(w == transfers_page) { transfersWidget->onDisplay(); } if(w == accounts_page) { accountsSelectionChanged(); } else { ActionDeleteAccount->setEnabled(false); ActionEditAccount->setEnabled(false); ActionBalanceAccount->setEnabled(false); ActionShowAccountTransactions->setEnabled(false); } if(w == securities_page) { securitiesSelectionChanged(); } else { ActionEditSecurity->setEnabled(false); ActionDeleteSecurity->setEnabled(false); ActionSetQuotation->setEnabled(false); ActionEditQuotations->setEnabled(false); ActionEditSecurityTransactions->setEnabled(false); } updateTransactionActions(); } void Eqonomize::updateTransactionActions() { TransactionListWidget *w = NULL; bool b_transaction = false, b_scheduledtransaction = false; if(tabs->currentPage()->widget() == accounts_page) {b_transaction = false; b_scheduledtransaction = false;} else if(tabs->currentPage()->widget() == expenses_page) w = expensesWidget; else if(tabs->currentPage()->widget() == incomes_page) w = incomesWidget; else if(tabs->currentPage()->widget() == transfers_page) w = transfersWidget; else if(tabs->currentPage()->widget() == securities_page) {b_transaction = false; b_scheduledtransaction = false;} else if(tabs->currentPage()->widget() == schedule_page) { ScheduleListViewItem *i = (ScheduleListViewItem*) selectedItem(scheduleView); b_transaction = i && !i->scheduledTransaction()->isOneTimeTransaction(); b_scheduledtransaction = (i != NULL); } if(w) { w->updateTransactionActions(); } else { ActionJoinTransactions->setEnabled(false); ActionSplitUpTransaction->setEnabled(false); ActionEditSplitTransaction->setEnabled(false); ActionDeleteSplitTransaction->setEnabled(false); ActionEditTransaction->setEnabled(b_transaction); ActionDeleteTransaction->setEnabled(b_transaction); ActionEditScheduledTransaction->setEnabled(b_scheduledtransaction); ActionDeleteScheduledTransaction->setEnabled(b_scheduledtransaction); ActionNewRefund->setEnabled(false); ActionNewRepayment->setEnabled(false); ActionNewRefundRepayment->setEnabled(false); } } void Eqonomize::popupAccountsMenu(const QPoint &p) { QTreeWidgetItem *i = accountsView->itemAt(p); if(i == NULL) return; if(i == assetsItem || (account_items.contains(i) && (account_items[i]->type() == ACCOUNT_TYPE_ASSETS))) { ActionAddAccount->setText("Add Account"); } else { ActionAddAccount->setText("Add Category"); } if(!accountPopupMenu) { accountPopupMenu = new QMenu(this); accountPopupMenu->addAction(ActionAddAccount); accountPopupMenu->addAction(ActionEditAccount); accountPopupMenu->addAction(ActionBalanceAccount); accountPopupMenu->addAction(ActionDeleteAccount); accountPopupMenu->addSeparator(); accountPopupMenu->addAction(ActionShowAccountTransactions); } accountPopupMenu->popup(accountsView->viewport()->mapToGlobal(p)); } void Eqonomize::showAccountTransactions(bool b) { QTreeWidgetItem *i = selectedItem(accountsView); if(i == NULL || i == assetsItem) return; if(i == incomesItem) { if(b) incomesWidget->setFilter(QDate(), to_date, -1.0, -1.0, NULL, NULL); else incomesWidget->setFilter(accountsPeriodFromButton->isChecked() ? from_date : QDate(), to_date, -1.0, -1.0, NULL, NULL); incomesWidget->showFilter(); tabs->setCurrentPage(incomes_page_item); onPageChange(incomes_page); } else if(i == expensesItem) { if(b) expensesWidget->setFilter(QDate(), to_date, -1.0, -1.0, NULL, NULL); else expensesWidget->setFilter(accountsPeriodFromButton->isChecked() ? from_date : QDate(), to_date, -1.0, -1.0, NULL, NULL); expensesWidget->showFilter(); tabs->setCurrentPage(expenses_page_item); onPageChange(expenses_page); } else { Account *account = account_items[i]; AccountType type = account->type(); if(type == ACCOUNT_TYPE_INCOMES) { if(b) incomesWidget->setFilter(QDate(), to_date, -1.0, -1.0, account, NULL); else incomesWidget->setFilter(accountsPeriodFromButton->isChecked() ? from_date : QDate(), to_date, -1.0, -1.0, account, NULL); incomesWidget->showFilter(); tabs->setCurrentPage(incomes_page_item); onPageChange(incomes_page); } else if(type == ACCOUNT_TYPE_EXPENSES) { if(b) expensesWidget->setFilter(QDate(), to_date, -1.0, -1.0, NULL, account); else expensesWidget->setFilter(accountsPeriodFromButton->isChecked() ? from_date : QDate(), to_date, -1.0, -1.0, NULL, account); expensesWidget->showFilter(); tabs->setCurrentPage(expenses_page_item); onPageChange(expenses_page); } else if(((AssetsAccount*) account)->accountType() == ASSETS_TYPE_SECURITIES) { tabs->setCurrentPage(securities_page_item); onPageChange(securities_page); } else { LedgerDialog *dialog = new LedgerDialog((AssetsAccount*) account, this, i18n("Ledger"), b_extra); QDesktopWidget desktop; QSize default_size = QSize(900, 600).boundedTo(desktop.availableGeometry(this).size()); dialog->setInitialSize(default_size); dialog->restoreDialogSize(KGlobal::config()->group("Ledger")); dialog->show(); connect(dialog, SIGNAL(finished()), this, SLOT(ledgerClosed())); connect(this, SIGNAL(timeToSaveConfig()), dialog, SLOT(saveConfig())); } } } void Eqonomize::accountsPeriodToChanged(const QDate &date) { bool error = false; if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); error = true; } if(!error && accountsPeriodFromEdit->date() > date) { if(accountsPeriodFromButton->isChecked()) { KMessageBox::error(this, i18n("To date is before from date.")); } from_date = date; accountsPeriodFromEdit->blockSignals(true); accountsPeriodFromEdit->setDate(from_date); accountsPeriodFromEdit->blockSignals(false); } if(error) { accountsPeriodToEdit->setFocus(); accountsPeriodToEdit->blockSignals(true); accountsPeriodToEdit->setDate(to_date); accountsPeriodToEdit->blockSignals(false); accountsPeriodToEdit->lineEdit()->selectAll(); return; } to_date = date; filterAccounts(); } void Eqonomize::accountsPeriodFromChanged(const QDate &date) { bool error = false; if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); error = true; } if(!error && date > accountsPeriodToEdit->date()) { KMessageBox::error(this, i18n("From date is after to date.")); to_date = date; accountsPeriodToEdit->blockSignals(true); accountsPeriodToEdit->setDate(to_date); accountsPeriodToEdit->blockSignals(false); } if(error) { accountsPeriodFromEdit->setFocus(); accountsPeriodFromEdit->blockSignals(true); accountsPeriodFromEdit->setDate(from_date); accountsPeriodFromEdit->blockSignals(false); accountsPeriodFromEdit->lineEdit()->selectAll(); return; } from_date = date; if(accountsPeriodFromButton->isChecked()) filterAccounts(); } void Eqonomize::prevMonth() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); accountsPeriodFromEdit->blockSignals(true); accountsPeriodToEdit->blockSignals(true); from_date = calSys->addMonths(from_date, -1); accountsPeriodFromEdit->setDate(from_date); if((to_date == QDate::currentDate() && calSys->day(from_date) == 1) || calSys->day(to_date) == calSys->daysInMonth(to_date)) { to_date = calSys->addMonths(to_date, -1); calSys->setYMD(to_date, calSys->year(to_date), calSys->month(to_date), calSys->daysInMonth(to_date)); } else { to_date = calSys->addMonths(to_date, -1); } accountsPeriodToEdit->setDate(to_date); accountsPeriodFromEdit->blockSignals(false); accountsPeriodToEdit->blockSignals(false); filterAccounts(); } void Eqonomize::nextMonth() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); accountsPeriodFromEdit->blockSignals(true); accountsPeriodToEdit->blockSignals(true); from_date = calSys->addMonths(from_date, 1); accountsPeriodFromEdit->setDate(from_date); to_date = accountsPeriodToEdit->date(); if((to_date == QDate::currentDate() && calSys->day(from_date) == 1) || calSys->day(to_date) == calSys->daysInMonth(to_date)) { to_date = calSys->addMonths(to_date, 1); calSys->setYMD(to_date, calSys->year(to_date), calSys->month(to_date), calSys->daysInMonth(to_date)); } else { to_date = calSys->addMonths(to_date, 1); } accountsPeriodToEdit->setDate(to_date); accountsPeriodFromEdit->blockSignals(false); accountsPeriodToEdit->blockSignals(false); filterAccounts(); } void Eqonomize::currentMonth() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); accountsPeriodFromEdit->blockSignals(true); accountsPeriodToEdit->blockSignals(true); QDate curdate = QDate::currentDate(); calSys->setYMD(from_date, calSys->year(curdate), calSys->month(curdate), 1); accountsPeriodFromEdit->setDate(from_date); to_date = curdate; accountsPeriodToEdit->setDate(to_date); accountsPeriodFromEdit->blockSignals(false); accountsPeriodToEdit->blockSignals(false); filterAccounts(); } void Eqonomize::prevYear() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); accountsPeriodFromEdit->blockSignals(true); accountsPeriodToEdit->blockSignals(true); from_date = calSys->addYears(from_date, -1); accountsPeriodFromEdit->setDate(from_date); if((to_date == QDate::currentDate() && calSys->day(from_date) == 1) || calSys->day(to_date) == calSys->daysInMonth(to_date)) { to_date = calSys->addYears(to_date, -1); calSys->setYMD(to_date, calSys->year(to_date), calSys->month(to_date), calSys->daysInMonth(to_date)); } else { to_date = calSys->addYears(to_date, -1); } accountsPeriodToEdit->setDate(to_date); accountsPeriodFromEdit->blockSignals(false); accountsPeriodToEdit->blockSignals(false); filterAccounts(); } void Eqonomize::nextYear() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); accountsPeriodFromEdit->blockSignals(true); accountsPeriodToEdit->blockSignals(true); from_date = calSys->addYears(from_date, 1); accountsPeriodFromEdit->setDate(from_date); if((to_date == QDate::currentDate() && calSys->day(from_date) == 1) || calSys->day(to_date) == calSys->daysInMonth(to_date)) { to_date = calSys->addYears(to_date, 1); calSys->setYMD(to_date, calSys->year(to_date), calSys->month(to_date), calSys->daysInMonth(to_date)); } else { to_date = calSys->addYears(to_date, 1); } accountsPeriodToEdit->setDate(to_date); accountsPeriodFromEdit->blockSignals(false); accountsPeriodToEdit->blockSignals(false); filterAccounts(); } void Eqonomize::currentYear() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); accountsPeriodFromEdit->blockSignals(true); accountsPeriodToEdit->blockSignals(true); QDate curdate = QDate::currentDate(); calSys->setYMD(from_date, calSys->year(curdate), 1, 1); accountsPeriodFromEdit->setDate(from_date); to_date = curdate; accountsPeriodToEdit->setDate(to_date); accountsPeriodFromEdit->blockSignals(false); accountsPeriodToEdit->blockSignals(false); filterAccounts(); } void Eqonomize::securitiesPeriodToChanged(const QDate &date) { bool error = false; if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); error = true; } if(!error && securitiesPeriodFromEdit->date() > date) { if(securitiesPeriodFromButton->isChecked()) { KMessageBox::error(this, i18n("To date is before from date.")); } securities_from_date = date; securitiesPeriodFromEdit->blockSignals(true); securitiesPeriodFromEdit->setDate(securities_from_date); securitiesPeriodFromEdit->blockSignals(false); } if(error) { securitiesPeriodToEdit->setFocus(); securitiesPeriodToEdit->blockSignals(true); securitiesPeriodToEdit->setDate(securities_to_date); securitiesPeriodToEdit->blockSignals(false); securitiesPeriodToEdit->lineEdit()->selectAll(); return; } securities_to_date = date; updateSecurities(); } void Eqonomize::securitiesPeriodFromChanged(const QDate &date) { bool error = false; if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); error = true; } if(!error && date > securitiesPeriodToEdit->date()) { KMessageBox::error(this, i18n("From date is after to date.")); securities_to_date = date; securitiesPeriodToEdit->blockSignals(true); securitiesPeriodToEdit->setDate(securities_to_date); securitiesPeriodToEdit->blockSignals(false); } if(error) { securitiesPeriodFromEdit->setFocus(); securitiesPeriodFromEdit->blockSignals(true); securitiesPeriodFromEdit->setDate(securities_from_date); securitiesPeriodFromEdit->blockSignals(false); securitiesPeriodFromEdit->lineEdit()->selectAll(); return; } securities_from_date = date; if(securitiesPeriodFromButton->isChecked()) updateSecurities(); } void Eqonomize::securitiesPrevMonth() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); securitiesPeriodFromEdit->blockSignals(true); securitiesPeriodToEdit->blockSignals(true); securities_from_date = calSys->addMonths(securities_from_date, -1); securitiesPeriodFromEdit->setDate(securities_from_date); if((securities_to_date == QDate::currentDate() && calSys->day(securities_from_date) == 1) || calSys->day(securities_to_date) == calSys->daysInMonth(securities_to_date)) { securities_to_date = calSys->addMonths(securities_to_date, -1); calSys->setYMD(securities_to_date, calSys->year(securities_to_date), calSys->month(securities_to_date), calSys->daysInMonth(securities_to_date)); } else { securities_to_date = calSys->addMonths(securities_to_date, -1); } securitiesPeriodToEdit->setDate(securities_to_date); securitiesPeriodFromEdit->blockSignals(false); securitiesPeriodToEdit->blockSignals(false); updateSecurities(); } void Eqonomize::securitiesNextMonth() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); securitiesPeriodFromEdit->blockSignals(true); securitiesPeriodToEdit->blockSignals(true); securities_from_date = calSys->addMonths(securities_from_date, 1); securitiesPeriodFromEdit->setDate(securities_from_date); securities_to_date = securitiesPeriodToEdit->date(); if((securities_to_date == QDate::currentDate() && calSys->day(securities_from_date) == 1) || calSys->day(securities_to_date) == calSys->daysInMonth(securities_to_date)) { securities_to_date = calSys->addMonths(securities_to_date, 1); calSys->setYMD(securities_to_date, calSys->year(securities_to_date), calSys->month(securities_to_date), calSys->daysInMonth(securities_to_date)); } else { securities_to_date = calSys->addMonths(securities_to_date, 1); } securitiesPeriodToEdit->setDate(securities_to_date); securitiesPeriodFromEdit->blockSignals(false); securitiesPeriodToEdit->blockSignals(false); updateSecurities(); } void Eqonomize::securitiesCurrentMonth() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); securitiesPeriodFromEdit->blockSignals(true); securitiesPeriodToEdit->blockSignals(true); QDate curdate = QDate::currentDate(); calSys->setYMD(securities_from_date, calSys->year(curdate), calSys->month(curdate), 1); securitiesPeriodFromEdit->setDate(securities_from_date); securities_to_date = curdate; securitiesPeriodToEdit->setDate(securities_to_date); securitiesPeriodFromEdit->blockSignals(false); securitiesPeriodToEdit->blockSignals(false); updateSecurities(); } void Eqonomize::securitiesPrevYear() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); securitiesPeriodFromEdit->blockSignals(true); securitiesPeriodToEdit->blockSignals(true); securities_from_date = calSys->addYears(securities_from_date, -1); securitiesPeriodFromEdit->setDate(securities_from_date); if((securities_to_date == QDate::currentDate() && calSys->day(securities_from_date) == 1) || calSys->day(securities_to_date) == calSys->daysInMonth(securities_to_date)) { securities_to_date = calSys->addYears(securities_to_date, -1); calSys->setYMD(securities_to_date, calSys->year(securities_to_date), calSys->month(securities_to_date), calSys->daysInMonth(securities_to_date)); } else { securities_to_date = calSys->addYears(securities_to_date, -1); } securitiesPeriodToEdit->setDate(securities_to_date); securitiesPeriodFromEdit->blockSignals(false); securitiesPeriodToEdit->blockSignals(false); updateSecurities(); } void Eqonomize::securitiesNextYear() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); securitiesPeriodFromEdit->blockSignals(true); securitiesPeriodToEdit->blockSignals(true); securities_from_date = calSys->addYears(securities_from_date, 1); securitiesPeriodFromEdit->setDate(securities_from_date); if((securities_to_date == QDate::currentDate() && calSys->day(securities_from_date) == 1) || calSys->day(securities_to_date) == calSys->daysInMonth(securities_to_date)) { securities_to_date = calSys->addYears(securities_to_date, 1); calSys->setYMD(securities_to_date, calSys->year(securities_to_date), calSys->month(securities_to_date), calSys->daysInMonth(securities_to_date)); } else { securities_to_date = calSys->addYears(securities_to_date, 1); } securitiesPeriodToEdit->setDate(securities_to_date); securitiesPeriodFromEdit->blockSignals(false); securitiesPeriodToEdit->blockSignals(false); updateSecurities(); } void Eqonomize::securitiesCurrentYear() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); securitiesPeriodFromEdit->blockSignals(true); securitiesPeriodToEdit->blockSignals(true); QDate curdate = QDate::currentDate(); calSys->setYMD(securities_from_date, calSys->year(curdate), 1, 1); securitiesPeriodFromEdit->setDate(securities_from_date); securities_to_date = curdate; securitiesPeriodToEdit->setDate(securities_to_date); securitiesPeriodFromEdit->blockSignals(false); securitiesPeriodToEdit->blockSignals(false); updateSecurities(); } void Eqonomize::setModified(bool has_been_modified) { modified_auto_save = has_been_modified; if(has_been_modified) autoSave(); if(modified == has_been_modified) return; modified = has_been_modified; ActionSave->setEnabled(modified); if(!current_url.isValid()) setCaption(i18n("Untitled"), has_been_modified); else setCaption(current_url.fileName(), has_been_modified); if(modified) emit budgetUpdated(); else auto_save_timeout = true; } void Eqonomize::createDefaultBudget() { if(!askSave()) return; budget->clear(); current_url = ""; ActionFileReload->setEnabled(false); KConfigGroup config = KGlobal::config()->group("General Options"); config.writeEntry("lastURL", current_url.url()); config.sync(); budget->addAccount(new AssetsAccount(budget, ASSETS_TYPE_CASH, i18n("Cash"), 100.0)); budget->addAccount(new AssetsAccount(budget, ASSETS_TYPE_CURRENT, i18n("Check Account"), 1000.0)); budget->addAccount(new AssetsAccount(budget, ASSETS_TYPE_SAVINGS, i18n("Savings Account"), 10000.0)); budget->addAccount(new IncomesAccount(budget, i18n("Salary"))); budget->addAccount(new IncomesAccount(budget, i18n("Other"))); budget->addAccount(new ExpensesAccount(budget, i18n("Bills"))); budget->addAccount(new ExpensesAccount(budget, i18n("Clothing"))); budget->addAccount(new ExpensesAccount(budget, i18n("Groceries"))); budget->addAccount(new ExpensesAccount(budget, i18n("Leisure"))); budget->addAccount(new ExpensesAccount(budget, i18n("Other"))); reloadBudget(); setModified(false); emit accountsModified(); emit transactionsModified(); emit budgetUpdated(); } void Eqonomize::reloadBudget() { incomes_accounts_value = 0.0; incomes_accounts_change = 0.0; expenses_accounts_value = 0.0; expenses_accounts_change = 0.0; assets_accounts_value = 0.0; assets_accounts_change = 0.0; expenses_budget = 0.0; expenses_budget_diff = 0.0; incomes_budget = 0.0; incomes_budget_diff = 0.0; account_value.clear(); account_change.clear(); for(QMap::Iterator it = account_items.begin(); it != account_items.end(); ++it) { delete it.key(); } account_items.clear(); item_accounts.clear(); AssetsAccount *aaccount = budget->assetsAccounts.first(); while(aaccount) { if(aaccount != budget->balancingAccount) { appendAssetsAccount(aaccount); } aaccount = budget->assetsAccounts.next(); } IncomesAccount *iaccount = budget->incomesAccounts.first(); while(iaccount) { appendIncomesAccount(iaccount); iaccount = budget->incomesAccounts.next(); } ExpensesAccount *eaccount = budget->expensesAccounts.first(); while(eaccount) { appendExpensesAccount(eaccount); eaccount = budget->expensesAccounts.next(); } account_value[budget->balancingAccount] = 0.0; account_change[budget->balancingAccount] = 0.0; expensesWidget->updateAccounts(); incomesWidget->updateAccounts(); transfersWidget->updateAccounts(); assetsItem->setExpanded(true); incomesItem->setExpanded(true); expensesItem->setExpanded(true); expensesWidget->transactionsReset(); incomesWidget->transactionsReset(); transfersWidget->transactionsReset(); filterAccounts(); updateScheduledTransactions(); updateSecurities(); } void Eqonomize::openURL(const KUrl& url) { if(url != current_url && crashRecovery(KUrl(url))) return; QString tmpfile; if(!url.isLocalFile()) { if(!KIO::NetAccess::download(url, tmpfile, this)) { KMessageBox::error(this, i18n("Couldn't fetch %1.").arg(url.prettyUrl())); return; } } else { tmpfile = url.path(); } QString errors; QString error = budget->loadFile(tmpfile, errors); if(!url.isLocalFile()) { KIO::NetAccess::removeTempFile(tmpfile); } if(!error.isNull()) { KMessageBox::error(this, i18n("Error loading %1: %2.").arg(url.prettyUrl()).arg(error), i18n("Couldn't open file")); return; } if(!errors.isEmpty()) { KMessageBox::error(this, errors); } setCaption(url.fileName(), false); current_url = url; ActionFileReload->setEnabled(true); KConfigGroup config = KGlobal::config()->group("General Options"); config.writeEntry("lastURL", current_url.url()); if(cr_tmp_file) { cr_tmp_file->releaseLock(); cr_tmp_file->remove(); delete cr_tmp_file; cr_tmp_file = NULL; } config.sync(); ActionOpenRecent->addUrl(url); reloadBudget(); emit accountsModified(); emit transactionsModified(); emit budgetUpdated(); setModified(false); checkSchedule(true); } bool Eqonomize::saveURL(const KUrl& url) { if(url.isLocalFile()) { bool exists = QFile::exists(url.path()); if(url != current_url && exists) { if(KMessageBox::warningYesNo(this, i18n("The selected file already exists. Would you like to overwrite the old copy?")) != KMessageBox::Yes) return false; } mode_t perms = 0x0600; if(exists) { KUrl u(url); u.setFileName(url.fileName() + "~"); KIO::UDSEntry fentry; if(KIO::NetAccess::stat(url, fentry, this)) { KFileItem item(fentry, url); perms = item.permissions(); } KIO::NetAccess::del(u, this); KIO::NetAccess::file_copy(url, u, this); } QString error = budget->saveFile(url.path(), perms); if(!error.isNull()) { KMessageBox::error(this, i18n("Error saving %1: %2.").arg(url.prettyUrl()).arg(error), i18n("Couldn't save file")); return false; } else { setCaption(url.fileName(), false); current_url = url; ActionFileReload->setEnabled(true); KConfigGroup config = KGlobal::config()->group("General Options"); config.writeEntry("lastURL", current_url.url()); if(cr_tmp_file) { cr_tmp_file->releaseLock(); cr_tmp_file->remove(); delete cr_tmp_file; cr_tmp_file = NULL; } config.sync(); ActionOpenRecent->addUrl(url); setModified(false); } return true; } KTemporaryFile tf; tf.open(); tf.setAutoRemove(true); QString error = budget->saveFile(tf.fileName()); if(!error.isNull()) { KMessageBox::error(this, i18n("Error saving %1: %2.").arg(url.prettyUrl()).arg(error), i18n("Couldn't save file")); return false; } if(KIO::NetAccess::upload(tf.fileName(), url, this)) { setCaption(url.fileName(), false); current_url = url; ActionFileReload->setEnabled(true); KConfigGroup config = KGlobal::config()->group("General Options"); config.writeEntry("lastURL", current_url.url()); if(cr_tmp_file) { cr_tmp_file->releaseLock(); cr_tmp_file->remove(); delete cr_tmp_file; cr_tmp_file = NULL; } config.sync(); ActionOpenRecent->addUrl(url); setModified(false); return true; } else { KMessageBox::error(this, i18n("Failed to upload file to %1.").arg(url.prettyUrl()), i18n("Couldn't save file")); } return false; } void Eqonomize::importCSV() { ImportCSVDialog *dialog = new ImportCSVDialog(budget, this); if(dialog->exec() == QDialog::Accepted) { reloadBudget(); emit accountsModified(); emit transactionsModified(); setModified(true); } dialog->deleteLater(); } void Eqonomize::importQIF() { if(importQIFFile(budget, this, b_extra)) { reloadBudget(); emit accountsModified(); emit transactionsModified(); setModified(true); } } void Eqonomize::exportQIF() { exportQIFFile(budget, this, b_extra); } void Eqonomize::showOverTimeReport() { KDialog *dialog = new KDialog(0, 0); dialog->setCaption(i18n("Report")); dialog->setButtons(KDialog::Close); dialog->setDefaultButton(KDialog::Close); dialog->setModal(true); OverTimeReport *report = new OverTimeReport(budget, dialog); report->updateDisplay(); dialog->setMainWidget(report); QDesktopWidget desktop; QSize default_size = QSize(750, 650).boundedTo(desktop.availableGeometry(this).size()); dialog->setInitialSize(default_size); dialog->restoreDialogSize(KGlobal::config()->group("Over Time Report")); dialog->show(); connect(this, SIGNAL(accountsModified()), report, SLOT(updateAccounts())); connect(this, SIGNAL(transactionsModified()), report, SLOT(updateTransactions())); connect(dialog, SIGNAL(finished()), this, SLOT(overTimeReportClosed())); connect(this, SIGNAL(timeToSaveConfig()), report, SLOT(saveConfig())); } void Eqonomize::overTimeReportClosed() { KDialog *dialog = (KDialog*) sender(); OverTimeReport *report = (OverTimeReport*) dialog->mainWidget(); report->saveConfig(); dialog->delayedDestruct(); } void Eqonomize::showCategoriesComparisonReport() { KDialog *dialog = new KDialog(0, 0); dialog->setCaption(i18n("Report")); dialog->setButtons(KDialog::Close); dialog->setDefaultButton(KDialog::Close); dialog->setModal(true); CategoriesComparisonReport *report = new CategoriesComparisonReport(budget, dialog, b_extra); report->updateDisplay(); dialog->setMainWidget(report); QDesktopWidget desktop; QSize default_size = QSize(750, 670).boundedTo(desktop.availableGeometry(this).size()); dialog->setInitialSize(default_size); dialog->restoreDialogSize(KGlobal::config()->group("Categories Comparison Report")); dialog->show(); connect(this, SIGNAL(accountsModified()), report, SLOT(updateAccounts())); connect(this, SIGNAL(transactionsModified()), report, SLOT(updateTransactions())); connect(dialog, SIGNAL(finished()), this, SLOT(categoriesComparisonReportClosed())); connect(this, SIGNAL(timeToSaveConfig()), report, SLOT(saveConfig())); } void Eqonomize::categoriesComparisonReportClosed() { KDialog *dialog = (KDialog*) sender(); CategoriesComparisonReport *report = (CategoriesComparisonReport*) dialog->mainWidget(); report->saveConfig(); dialog->delayedDestruct(); } void Eqonomize::ledgerClosed() { LedgerDialog *dialog = (LedgerDialog*) sender(); dialog->saveConfig(); dialog->delayedDestruct(); } void Eqonomize::showOverTimeChart() { KDialog *dialog = new KDialog(0, 0); dialog->setCaption(i18n("Chart")); dialog->setButtons(KDialog::Close); dialog->setDefaultButton(KDialog::Close); dialog->setModal(true); OverTimeChart *chart = new OverTimeChart(budget, dialog, b_extra); dialog->setMainWidget(chart); QDesktopWidget desktop; QSize default_size = QSize(850, b_extra ? 750 : 730).boundedTo(desktop.availableGeometry(this).size()); dialog->setInitialSize(default_size); dialog->restoreDialogSize(KGlobal::config()->group("Over Time Chart")); dialog->show(); chart->updateDisplay(); connect(this, SIGNAL(accountsModified()), chart, SLOT(updateAccounts())); connect(this, SIGNAL(transactionsModified()), chart, SLOT(updateTransactions())); connect(dialog, SIGNAL(finished()), this, SLOT(overTimeChartClosed())); connect(this, SIGNAL(timeToSaveConfig()), chart, SLOT(saveConfig())); } void Eqonomize::overTimeChartClosed() { KDialog *dialog = (KDialog*) sender(); OverTimeChart *chart = (OverTimeChart*) dialog->mainWidget(); chart->saveConfig(); dialog->delayedDestruct(); } void Eqonomize::showCategoriesComparisonChart() { KDialog *dialog = new KDialog(0, 0); dialog->setCaption(i18n("Chart")); dialog->setButtons(KDialog::Close); dialog->setDefaultButton(KDialog::Close); dialog->setModal(true); CategoriesComparisonChart *chart = new CategoriesComparisonChart(budget, dialog); dialog->setMainWidget(chart); QDesktopWidget desktop; QSize default_size = QSize(750, 700).boundedTo(desktop.availableGeometry(this).size()); dialog->setInitialSize(default_size); dialog->restoreDialogSize(KGlobal::config()->group("Categories Comparison Chart")); dialog->show(); chart->updateDisplay(); connect(this, SIGNAL(accountsModified()), chart, SLOT(updateAccounts())); connect(this, SIGNAL(transactionsModified()), chart, SLOT(updateTransactions())); connect(dialog, SIGNAL(finished()), this, SLOT(categoriesComparisonChartClosed())); connect(this, SIGNAL(timeToSaveConfig()), chart, SLOT(saveConfig())); } void Eqonomize::categoriesComparisonChartClosed() { KDialog *dialog = (KDialog*) sender(); CategoriesComparisonChart *report = (CategoriesComparisonChart*) dialog->mainWidget(); report->saveConfig(); dialog->delayedDestruct(); } QString htmlize_string(QString str) { str.replace('<', "<"); str.replace('>', ">"); str.replace('&', "&"); str.replace('\"', """); return str; } bool Eqonomize::exportScheduleList(QTextStream &outf, int fileformat) { switch(fileformat) { case 'h': { outf.setCodec("UTF-8"); outf << "" << '\n'; outf << "" << '\n'; outf << "\t" << '\n'; outf << "\t\t"; outf << htmlize_string(i18n("Transaction Schedule")); outf << "" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t" << '\n'; outf << "\t" << '\n'; outf << "\t" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t\t" << '\n'; QTreeWidgetItem *header = scheduleView->headerItem(); outf << "\t\t\t\t\t"; outf << ""; outf << ""; outf << ""; outf << ""; outf << ""; outf << "" << "\n"; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; QTreeWidgetItemIterator it(scheduleView); ScheduleListViewItem *i = (ScheduleListViewItem*) *it; while(i) { outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; outf << ""; outf << ""; outf << ""; outf << ""; outf << ""; outf << "" << "\n"; outf << "\t\t\t\t" << '\n'; ++it; i = (ScheduleListViewItem*) *it; } outf << "\t\t\t" << '\n'; outf << "\t\t
"; outf << htmlize_string(i18n("Transaction Schedule")); outf << "
" << htmlize_string(header->text(0)) << "" << htmlize_string(header->text(1)) << "" << htmlize_string(header->text(2)) << "" << htmlize_string(header->text(3)) << "" << htmlize_string(header->text(4)) << "" << htmlize_string(header->text(5)) << "" << htmlize_string(header->text(6)) << "
" << htmlize_string(KGlobal::locale()->formatDate(i->date(), KLocale::ShortDate)) << "" << htmlize_string(i->text(1)) << "" << htmlize_string(i->text(2)) << "" << htmlize_string(i->text(3)) << "" << htmlize_string(i->text(4)) << "" << htmlize_string(i->text(5)) << "" << htmlize_string(i->text(6)) << "
" << '\n'; outf << "\t" << '\n'; outf << "" << '\n'; break; } case 'c': { //outf.setEncoding(Q3TextStream::Locale); QTreeWidgetItem *header = scheduleView->headerItem(); outf << "\"" << header->text(0) << "\",\"" << header->text(1) << "\",\"" << header->text(2) << "\",\"" << header->text(3) << "\",\"" << header->text(4) << "\",\""<< header->text(5) << "\",\"" << header->text(6) << "\"\n"; QTreeWidgetItemIterator it(scheduleView); ScheduleListViewItem *i = (ScheduleListViewItem*) *it; while(i) { outf << "\"" << KGlobal::locale()->formatDate(i->date(), KLocale::ShortDate) << "\",\"" << i->text(1) << "\",\"" << i->text(2) << "\",\"" << i->text(3) << "\",\"" << i->text(4) << "\",\"" << i->text(5) << "\",\"" << i->text(6) << "\"\n"; ++it; i = (ScheduleListViewItem*) *it; } break; } } return true; } bool Eqonomize::exportSecuritiesList(QTextStream &outf, int fileformat) { switch(fileformat) { case 'h': { outf.setCodec("UTF-8"); outf << "" << '\n'; outf << "" << '\n'; outf << "\t" << '\n'; outf << "\t\t"; outf << htmlize_string(i18n("Securities")); outf << "" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t" << '\n'; outf << "\t" << '\n'; outf << "\t" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t\t" << '\n'; QTreeWidgetItem *header = securitiesView->headerItem(); outf << "\t\t\t\t\t"; outf << ""; outf << ""; outf << ""; outf << ""; outf << ""; outf << ""; outf << ""; outf << "" << "\n"; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; QTreeWidgetItemIterator it(securitiesView); SecurityListViewItem *i = (SecurityListViewItem*) *it; while(i) { outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; outf << ""; outf << ""; outf << ""; outf << ""; outf << ""; outf << ""; outf << ""; outf << "" << "\n"; outf << "\t\t\t\t" << '\n'; ++it; i = (SecurityListViewItem*) *it; } outf << "\t\t\t\t" << '\n'; if(securitiesView->topLevelItemCount() > 1) { outf << "\t\t\t\t\t"; outf << ""; outf << ""; outf << ""; outf << ""; outf << ""; outf << ""; outf << ""; outf << "" << "\n"; outf << "\t\t\t\t" << '\n'; } outf << "\t\t\t" << '\n'; outf << "\t\t
"; outf << htmlize_string(i18n("Securities")); outf << "
" << htmlize_string(header->text(0)) << "" << htmlize_string(header->text(1)) << "" << htmlize_string(header->text(2)) << "" << htmlize_string(header->text(3)) << "" << htmlize_string(header->text(4)) << "" << htmlize_string(header->text(5)) << "" << htmlize_string(header->text(6)) << "" << htmlize_string(header->text(7)) << "" << htmlize_string(header->text(8)) << "
" << htmlize_string(i->text(0)) << "" << htmlize_string(i->text(1)) << "" << htmlize_string(i->text(2)) << "" << htmlize_string(i->text(3)) << "" << htmlize_string(i->text(4)) << "" << htmlize_string(i->text(5)) << "" << htmlize_string(i->text(6)) << "" << htmlize_string(i->text(7)) << "" << htmlize_string(i->text(8)) << "
" << htmlize_string(i18n("Total")) << "" << htmlize_string(KGlobal::locale()->formatMoney(total_value)) << "--" << htmlize_string(KGlobal::locale()->formatMoney(total_cost)) << "" << htmlize_string(KGlobal::locale()->formatMoney(total_profit)) << "" << htmlize_string(KGlobal::locale()->formatNumber(total_rate * 100) + "%") << "--
" << '\n'; outf << "\t" << '\n'; outf << "" << '\n'; break; } case 'c': { //outf.setEncoding(Q3TextStream::Locale); QTreeWidgetItem *header = scheduleView->headerItem(); outf << "\"" << header->text(0) << "\",\"" << header->text(1) << "\",\"" << header->text(2) << "\",\"" << header->text(3) << "\",\"" << header->text(4) << "\",\"" << header->text(5) << "\",\"" << header->text(6) << "\",\"" << header->text(7) << "\",\"" << header->text(8) << "\"\n"; QTreeWidgetItemIterator it(securitiesView); SecurityListViewItem *i = (SecurityListViewItem*) *it; while(i) { outf << "\"" << i->text(0) << "\",\"" << i->text(1) << "\",\"" << i->text(2) << "\",\"" << i->text(3) << "\",\"" << i->text(4) << "\",\"" << i->text(5) << "\",\"" << i->text(6) << "\",\"" << i->text(7) << "\",\"" << i->text(8) << '\n'; ++it; i = (SecurityListViewItem*) *it; } break; } } return true; } bool Eqonomize::exportAccountsList(QTextStream &outf, int fileformat) { switch(fileformat) { case 'h': { outf.setCodec("UTF-8"); outf << "" << '\n'; outf << "" << '\n'; outf << "\t" << '\n'; outf << "\t\t"; outf << i18nc("html format", "Accounts & Categories"); outf << "" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t" << '\n'; outf << "\t" << '\n'; outf << "\t" << '\n'; if(accountsPeriodFromButton->isChecked()) outf << "\t\t

" << i18nc("html format", "Accounts & Categories (%1–%2)").arg(htmlize_string(KGlobal::locale()->formatDate(from_date, KLocale::ShortDate))).arg(htmlize_string(KGlobal::locale()->formatDate(to_date, KLocale::ShortDate))) << "

" << '\n'; else outf << "\t\t

" << i18nc("html format", "Accounts & Categories (to %1)").arg(htmlize_string(KGlobal::locale()->formatDate(to_date, KLocale::ShortDate))) << "

" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; outf << ""; outf << ""; outf << "" << '\n'; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t\t" << '\n'; if(includes_budget) { outf << "\t\t\t\t\t" << '\n'; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; } outf << "\t\t\t" << '\n'; Account *account = budget->assetsAccounts.first(); while(account) { outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; outf << ""; outf << ""; outf << "" << "\n"; outf << "\t\t\t\t" << '\n'; account = budget->assetsAccounts.next(); } outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; outf << ""; outf << ""; outf << "" << "\n"; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t
"; outf << htmlize_string(i18n("Accounts")); outf << "
" << htmlize_string(i18n("Name")) << "" << htmlize_string(i18n("Type")) << "" << htmlize_string(i18n("Change")); bool includes_budget = (to_date > QDate::currentDate() && (expenses_budget >= 0.0 || incomes_budget >= 0.0)); if(includes_budget) outf << "*"; outf << "" << htmlize_string(i18n("Balance")); if(includes_budget) outf << "*"; outf << "
" << ""; outf << "*" << htmlize_string(i18n("Includes budgeted transactions")); outf << "" << "
" << htmlize_string(account->name()); if(includes_budget && ((AssetsAccount*) account)->isBudgetAccount()) outf << "*"; outf << ""; switch(((AssetsAccount*) account)->accountType()) { case ASSETS_TYPE_CURRENT: {outf << htmlize_string(i18n("Current Account")); break;} case ASSETS_TYPE_SAVINGS: {outf << htmlize_string(i18n("Savings Account")); break;} case ASSETS_TYPE_CREDIT_CARD: {outf << htmlize_string(i18n("Credit Card")); break;} case ASSETS_TYPE_LIABILITIES: {outf << htmlize_string(i18n("Liabilities")); break;} case ASSETS_TYPE_SECURITIES: {outf << htmlize_string(i18n("Securities")); break;} default: {outf << htmlize_string(i18n("Cash")); break;} } outf << "" << htmlize_string(KGlobal::locale()->formatMoney(account_change[account])) << "" << htmlize_string(KGlobal::locale()->formatMoney(account_value[account])) << "
" << htmlize_string(i18n("Total")); if(includes_budget) outf << "*"; outf << ""; outf << "" << htmlize_string(KGlobal::locale()->formatMoney(assets_accounts_change)) << "" << htmlize_string(KGlobal::locale()->formatMoney(assets_accounts_value)) << "
" << '\n'; outf << "\t\t
" << '\n'; outf << "\t\t
" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; outf << ""; outf << ""; outf << "" << '\n'; outf << "" << '\n'; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; account = budget->incomesAccounts.first(); while(account) { outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; if(account_budget[account] < 0.0) { outf << ""; outf << ""; } else { outf << ""; outf << ""; } outf << ""; outf << "" << "\n"; outf << "\t\t\t\t" << '\n'; account = budget->incomesAccounts.next(); } outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; if(incomes_budget >= 0.0) { outf << ""; outf << ""; } else { outf << ""; outf << ""; } outf << ""; outf << "" << "\n"; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t
"; outf << htmlize_string(i18n("Incomes")); outf << "
" << htmlize_string(i18n("Category")) << "" << htmlize_string(i18n("Budget")) << "" << htmlize_string(i18n("Remaining Budget")) << "" << htmlize_string(i18n("Change")) << "" << htmlize_string(i18n("Total Incomes")) << "
" << htmlize_string(account->name()) << "--"; outf << htmlize_string(KGlobal::locale()->formatMoney(account_budget[account])); outf << ""; outf << htmlize_string(KGlobal::locale()->formatMoney(account_budget_diff[account])); outf << "" << htmlize_string(KGlobal::locale()->formatMoney(account_change[account])) << "" << htmlize_string(KGlobal::locale()->formatMoney(account_value[account])) << "
" << htmlize_string(i18n("Total")) << "" << htmlize_string(KGlobal::locale()->formatMoney(incomes_budget)) << "" << htmlize_string(KGlobal::locale()->formatMoney(incomes_budget_diff)) << "" << "-" << "" << "-" << "" << htmlize_string(KGlobal::locale()->formatMoney(incomes_accounts_change)) << "" << htmlize_string(KGlobal::locale()->formatMoney(incomes_accounts_value)) << "
" << '\n'; outf << "\t\t
" << '\n'; outf << "\t\t
" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; outf << ""; outf << ""; outf << "" << '\n'; outf << "" << '\n'; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; account = budget->expensesAccounts.first(); while(account) { outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; if(account_budget[account] < 0.0) { outf << ""; outf << ""; } else { outf << ""; outf << ""; } outf << ""; outf << "" << "\n"; outf << "\t\t\t\t" << '\n'; account = budget->expensesAccounts.next(); } outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; if(expenses_budget >= 0.0) { outf << ""; outf << ""; } else { outf << ""; outf << ""; } outf << ""; outf << "" << "\n"; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t
"; outf << htmlize_string(i18n("Costs")); outf << "
" << htmlize_string(i18n("Category")) << "" << htmlize_string(i18n("Budget")) << "" << htmlize_string(i18n("Remaining Budget")) << "" << htmlize_string(i18n("Change")) << "" << htmlize_string(i18n("Total Expenses")) << "
" << htmlize_string(account->name()) << "--"; outf << htmlize_string(KGlobal::locale()->formatMoney(account_budget[account])); outf << ""; outf << htmlize_string(KGlobal::locale()->formatMoney(account_budget_diff[account])); outf << "" << htmlize_string(KGlobal::locale()->formatMoney(account_change[account])) << "" << htmlize_string(KGlobal::locale()->formatMoney(account_value[account])) << "
" << htmlize_string(i18n("Total")) << "" << htmlize_string(KGlobal::locale()->formatMoney(expenses_budget)) << "" << htmlize_string(KGlobal::locale()->formatMoney(expenses_budget_diff)) << "" << "-" << "" << "-" << "" << htmlize_string(KGlobal::locale()->formatMoney(expenses_accounts_change)) << "" << htmlize_string(KGlobal::locale()->formatMoney(expenses_accounts_value)) << "
" << '\n'; outf << "\t" << '\n'; outf << "" << '\n'; break; } case 'c': { //outf.setEncoding(Q3TextStream::Locale); outf << "\"" << i18n("Account/Category") << "\",\"" << i18n("Change") << "\",\"" << i18n("Value") << "\"\n"; Account *account = budget->assetsAccounts.first(); while(account) { outf << "\"" << account->name() << "\",\"" << KGlobal::locale()->formatMoney(account_change[account]) << "\",\"" << KGlobal::locale()->formatMoney(account_value[account]) << "\"\n"; account = budget->assetsAccounts.next(); } account = budget->incomesAccounts.first(); while(account) { outf << "\"" << account->name() << "\",\"" << KGlobal::locale()->formatMoney(account_change[account]) << "\",\"" << KGlobal::locale()->formatMoney(account_value[account]) << "\"\n"; account = budget->incomesAccounts.next(); } account = budget->expensesAccounts.first(); while(account) { outf << "\"" << account->name() << "\",\"" << KGlobal::locale()->formatMoney(account_change[account]) << "\",\"" << KGlobal::locale()->formatMoney(account_value[account]) << "\"\n"; account = budget->expensesAccounts.next(); } break; } } return true; } void Eqonomize::printView() { if(tabs->currentPage()->widget() == expenses_page) { if(expensesWidget->isEmpty()) { KMessageBox::error(this, i18n("Empty expenses list.")); return; } } else if(tabs->currentPage()->widget() == incomes_page) { if(incomesWidget->isEmpty()) { KMessageBox::error(this, i18n("Empty incomes list.")); return; } } else if(tabs->currentPage()->widget() == transfers_page) { if(transfersWidget->isEmpty()) { KMessageBox::error(this, i18n("Empty transfers list.")); return; } } else if(tabs->currentPage()->widget() == securities_page) { if(securitiesView->topLevelItemCount() == 0) { KMessageBox::error(this, i18n("Empty securities list.")); return; } } else if(tabs->currentPage()->widget() == schedule_page) { if(scheduleView->topLevelItemCount() == 0) { KMessageBox::error(this, i18n("Empty schedule list.")); return; } } QString str; QTextStream stream(&str, QIODevice::WriteOnly); saveView(stream, 'h'); KHTMLPart *htmlpart = new KHTMLPart(this); htmlpart->begin(); htmlpart->write(str); htmlpart->end(); htmlpart->view()->print(); delete htmlpart; } bool Eqonomize::saveView(QTextStream &file, int fileformat) { if(tabs->currentPage()->widget() == accounts_page) {return exportAccountsList(file, fileformat);} else if(tabs->currentPage()->widget() == expenses_page) {return expensesWidget->exportList(file, fileformat);} else if(tabs->currentPage()->widget() == incomes_page) {return incomesWidget->exportList(file, fileformat);} else if(tabs->currentPage()->widget() == transfers_page) {return transfersWidget->exportList(file, fileformat);} else if(tabs->currentPage()->widget() == securities_page) {return exportSecuritiesList(file, fileformat);} else if(tabs->currentPage()->widget() == schedule_page) {return exportScheduleList(file, fileformat);} return false; } void Eqonomize::saveView() { if(tabs->currentPage()->widget() == expenses_page) { if(expensesWidget->isEmpty()) { KMessageBox::error(this, i18n("Empty expenses list.")); return; } } else if(tabs->currentPage()->widget() == incomes_page) { if(incomesWidget->isEmpty()) { KMessageBox::error(this, i18n("Empty incomes list.")); return; } } else if(tabs->currentPage()->widget() == transfers_page) { if(transfersWidget->isEmpty()) { KMessageBox::error(this, i18n("Empty transfers list.")); return; } } else if(tabs->currentPage()->widget() == securities_page) { if(securitiesView->topLevelItemCount() == 0) { KMessageBox::error(this, i18n("Empty securities list.")); return; } } else if(tabs->currentPage()->widget() == schedule_page) { if(scheduleView->topLevelItemCount() == 0) { KMessageBox::error(this, i18n("Empty schedule list.")); return; } } KFileDialog *dialog = new KFileDialog(KUrl(), QString::null, this); QStringList filter; filter << "text/html" << "text/x-csv"; dialog->setMimeFilter(filter, "text/html"); dialog->setOperationMode(KFileDialog::Saving); dialog->setMode(KFile::File); if(dialog->exec() != QDialog::Accepted) {dialog->deleteLater(); return;} KUrl url = dialog->selectedUrl(); char filetype = 'h'; if(dialog->currentMimeFilter() == "text/x-csv") filetype = 'c'; dialog->deleteLater(); if(url.isEmpty() && url.isValid()) return; if(url.isLocalFile()) { if(QFile::exists(url.path())) { if(KMessageBox::warningYesNo(this, i18n("The selected file already exists. Would you like to overwrite the old copy?")) != KMessageBox::Yes) return; } QFileInfo info(url.path()); if(info.isDir()) { KMessageBox::error(this, i18n("You selected a directory!")); return; } KSaveFile ofile(url.path()); ofile.open(); if(!ofile.isOpen()) { ofile.abort(); KMessageBox::error(this, i18n("Couldn't open file for writing.")); return; } QTextStream stream(&ofile); saveView(stream, filetype); if(!ofile.finalize()) { KMessageBox::error(this, i18n("Error while writing file; file was not saved.")); return; } return; } KTemporaryFile tf; tf.open(); tf.setAutoRemove(true); QTextStream stream(&tf); if(saveView(stream, filetype)) { if(!KIO::NetAccess::upload(tf.fileName(), url, this)) { KMessageBox::error(this, i18n("Failed to upload file to %1.").arg(url.prettyUrl())); } } } #define NEW_ACTION(action, text, icon, shortcut, receiver, slot, x, name) action = x->addAction(name); action->setText(text); action->setIcon(KIcon(icon)); action->setShortcut(shortcut); connect(action, SIGNAL(triggered()), receiver, slot); #define NEW_ACTION_2(action, text, shortcut, receiver, slot, x, name) action = x->addAction(name); action->setText(text); action->setShortcut(shortcut); connect(action, SIGNAL(triggered()), receiver, slot); #define NEW_TOGGLE_ACTION(action, text, shortcut, receiver, slot, x, name) action = new KToggleAction(this); x->addAction(name, action); action->setText(text); action->setShortcut(shortcut); connect(action, SIGNAL(toggled(bool)), receiver, slot); void Eqonomize::setupActions() { actionCollection()->addAction(KStandardAction::New, this, SLOT(fileNew())); actionCollection()->addAction(KStandardAction::Open, this, SLOT(fileOpen())); ActionSave = actionCollection()->addAction(KStandardAction::Save, this, SLOT(fileSave())); ActionOpenRecent = KStandardAction::openRecent(this, SLOT(fileOpenRecent(const KUrl&)), this); actionCollection()->addAction(ActionOpenRecent->objectName(), ActionOpenRecent); actionCollection()->addAction(KStandardAction::SaveAs, this, SLOT(fileSaveAs())); actionCollection()->addAction(KStandardAction::Quit, this, SLOT(close())); ActionFileReload = actionCollection()->addAction(KStandardAction::Revert, this, SLOT(fileReload())); NEW_ACTION(ActionSaveView, i18n("Export View..."), "document-export", 0, this, SLOT(saveView()), actionCollection(), "save_view"); ActionPrintView = actionCollection()->addAction(KStandardAction::Print, this, SLOT(printView())); ActionPrintView->setText(i18n("Print View...")); ActionSelectInitialPeriod = new KSelectAction(i18n("Initial Period"), this); actionCollection()->addAction("select_initial_period", ActionSelectInitialPeriod); QStringList period_list; period_list << i18n("Current Month"); period_list << i18n("Current Year"); period_list << i18n("Current Whole Month"); period_list << i18n("Current Whole Year"); period_list << i18n("Remember Last Dates"); ActionSelectInitialPeriod->setItems(period_list); NEW_ACTION(ActionImportCSV, i18n("Import CSV File..."), "document-import", 0, this, SLOT(importCSV()), actionCollection(), "import_csv"); NEW_ACTION(ActionImportQIF, i18n("Import QIF File..."), "document-import", 0, this, SLOT(importQIF()), actionCollection(), "import_qif"); NEW_ACTION(ActionExportQIF, i18n("Export As QIF File..."), "document-export", 0, this, SLOT(exportQIF()), actionCollection(), "export_qif"); NEW_ACTION(ActionAddAccount, i18n("Add Account..."), "document-new", 0, this, SLOT(addAccount()), actionCollection(), "add_account"); NEW_ACTION(ActionNewAssetsAccount, i18n("New Account..."), "document-new", 0, this, SLOT(newAssetsAccount()), actionCollection(), "new_assets_account"); NEW_ACTION(ActionNewIncomesAccount, i18n("New Income Category..."), "document-new", 0, this, SLOT(newIncomesAccount()), actionCollection(), "new_incomes_account"); NEW_ACTION(ActionNewExpensesAccount, i18n("New Expense Category..."), "document-new", 0, this, SLOT(newExpensesAccount()), actionCollection(), "new_expenses_account"); NEW_ACTION_2(ActionBalanceAccount, i18n("Balance..."), 0, this, SLOT(balanceAccount()), actionCollection(), "balance_account"); NEW_ACTION(ActionEditAccount, i18n("Edit..."), "document-open", 0, this, SLOT(editAccount()), actionCollection(), "edit_account"); NEW_ACTION(ActionDeleteAccount, KStandardGuiItem::remove().text(), "edit-delete", 0, this, SLOT(deleteAccount()), actionCollection(), "delete_account"); NEW_ACTION_2(ActionShowAccountTransactions, i18n("Show Transactions"), 0, this, SLOT(showAccountTransactions()), actionCollection(), "show_account_transactions"); NEW_ACTION(ActionNewExpense, i18n("New Expense..."), "document-new", Qt::CTRL+Qt::Key_E, this, SLOT(newScheduledExpense()), actionCollection(), "new_expense"); NEW_ACTION(ActionNewIncome, i18n("New Income..."), "document-new", Qt::CTRL+Qt::Key_I, this, SLOT(newScheduledIncome()), actionCollection(), "new_income"); NEW_ACTION(ActionNewTransfer, i18n("New Transfer..."), "document-new", Qt::CTRL+Qt::Key_T, this, SLOT(newScheduledTransfer()), actionCollection(), "new_transfer"); NEW_ACTION(ActionNewSplitTransaction, i18n("New Split Transaction..."), "document-new", 0, this, SLOT(newSplitTransaction()), actionCollection(), "new_split_transaction"); NEW_ACTION(ActionEditTransaction, i18n("Edit Transaction(s) (Occurrence)..."), "document-open", 0, this, SLOT(editSelectedTransaction()), actionCollection(), "edit_transaction"); NEW_ACTION(ActionEditOccurrence, i18n("Edit Occurrence..."), "document-open", 0, this, SLOT(editOccurrence()), actionCollection(), "edit_occurrence"); NEW_ACTION(ActionEditScheduledTransaction, i18n("Edit Schedule (Recurrence)..."), "document-open", 0, this, SLOT(editSelectedScheduledTransaction()), actionCollection(), "edit_scheduled_transaction"); NEW_ACTION(ActionEditSchedule, i18n("Edit Schedule..."), "document-open", 0, this, SLOT(editScheduledTransaction()), actionCollection(), "edit_schedule"); NEW_ACTION(ActionDeleteTransaction, i18n("Remove Transaction(s) (Occurrence)"), "edit-delete", 0, this, SLOT(deleteSelectedTransaction()), actionCollection(), "delete_transaction"); NEW_ACTION(ActionDeleteOccurrence, i18n("Remove Occurrence"), "edit-delete", 0, this, SLOT(removeOccurrence()), actionCollection(), "delete_occurrence"); NEW_ACTION(ActionDeleteScheduledTransaction, i18n("Delete Schedule (Recurrence)"), "edit-delete", 0, this, SLOT(deleteSelectedScheduledTransaction()), actionCollection(), "delete_scheduled_transaction"); NEW_ACTION(ActionDeleteSchedule, i18n("Delete Schedule"), "edit-delete", 0, this, SLOT(removeScheduledTransaction()), actionCollection(), "delete_schedule"); NEW_ACTION(ActionEditSplitTransaction, i18n("Edit Split Transaction..."), "document-open", 0, this, SLOT(editSelectedSplitTransaction()), actionCollection(), "edit_split_transaction"); NEW_ACTION(ActionDeleteSplitTransaction, i18n("Remove Split Transaction"), "edit-delete", 0, this, SLOT(deleteSelectedSplitTransaction()), actionCollection(), "delete_split_transaction"); NEW_ACTION_2(ActionJoinTransactions, i18n("Join Transactions..."), 0, this, SLOT(joinSelectedTransactions()), actionCollection(), "joins_transactions"); NEW_ACTION_2(ActionSplitUpTransaction, i18n("Split Up Transaction"), 0, this, SLOT(splitUpSelectedTransaction()), actionCollection(), "split_up_transaction"); NEW_ACTION(ActionNewRefund, i18n("Refund..."), "go-next", 0, this, SLOT(newRefund()), actionCollection(), "new_refund"); NEW_ACTION(ActionNewRepayment, i18n("Repayment..."), "go-previous", 0, this, SLOT(newRepayment()), actionCollection(), "new_repayment"); NEW_ACTION(ActionNewRefundRepayment, i18n("New Refund/Repayment..."), "document-new", 0, this, SLOT(newRefundRepayment()), actionCollection(), "new_refund_repayment"); NEW_ACTION(ActionNewSecurity, i18n("New Security..."), "document-new", 0, this, SLOT(newSecurity()), actionCollection(), "new_security"); NEW_ACTION(ActionEditSecurity, i18n("Edit Security..."), "document-open", 0, this, SLOT(editSecurity()), actionCollection(), "edit_security"); NEW_ACTION(ActionDeleteSecurity, i18n("Remove Security"), "edit-delete", 0, this, SLOT(deleteSecurity()), actionCollection(), "delete_security"); NEW_ACTION(ActionSellShares, i18n("Shares Sold..."), "go-next", 0, this, SLOT(sellSecurities()), actionCollection(), "sell_shares"); NEW_ACTION(ActionBuyShares, i18n("Shares Bought..."), "go-previous", 0, this, SLOT(buySecurities()), actionCollection(), "buy_shares"); NEW_ACTION(ActionNewDividend, i18n("Dividend..."), "go-next", 0, this, SLOT(newDividend()), actionCollection(), "new_dividend"); NEW_ACTION(ActionNewReinvestedDividend, i18n("Reinvested Dividend..."), "go-next", 0, this, SLOT(newReinvestedDividend()), actionCollection(), "new_reinvested_dividend"); NEW_ACTION_2(ActionNewSecurityTrade, i18n("Shares Moved..."), 0, this, SLOT(newSecurityTrade()), actionCollection(), "new_security_trade"); NEW_ACTION(ActionSetQuotation, i18n("Set Quotation..."), "view-calendar-day", 0, this, SLOT(setQuotation()), actionCollection(), "set_quotation"); NEW_ACTION(ActionEditQuotations, i18n("Edit Quotations..."), "view-calendar-list", 0, this, SLOT(editQuotations()), actionCollection(), "edit_quotations"); NEW_ACTION(ActionEditSecurityTransactions, i18n("Transactions..."), "view-list-details", 0, this, SLOT(editSecurityTransactions()), actionCollection(), "edit_security_transactions"); NEW_ACTION(ActionOverTimeReport, i18n("Development Over Time Report..."), "view-list-text", 0, this, SLOT(showOverTimeReport()), actionCollection(), "over_time_report"); NEW_ACTION(ActionCategoriesComparisonReport, i18n("Categories Comparison Report..."), "view-list-text", 0, this, SLOT(showCategoriesComparisonReport()), actionCollection(), "categories_comparison_report"); NEW_ACTION(ActionCategoriesComparisonChart, i18n("Categories Comparison Chart..."), "view-statistics", 0, this, SLOT(showCategoriesComparisonChart()), actionCollection(), "categories_comparison_chart"); NEW_ACTION(ActionOverTimeChart, i18n("Development Over Time Chart..."), "view-statistics", 0, this, SLOT(showOverTimeChart()), actionCollection(), "over_time_chart"); NEW_TOGGLE_ACTION(ActionExtraProperties, i18n("Use Additional Transaction Properties"), 0, this, SLOT(useExtraProperties(bool)), actionCollection(), "extra_properties"); ActionExtraProperties->setChecked(b_extra); ActionSave->setEnabled(false); ActionFileReload->setEnabled(false); ActionBalanceAccount->setEnabled(false); ActionEditAccount->setEnabled(false); ActionDeleteAccount->setEnabled(false); ActionShowAccountTransactions->setEnabled(false); ActionEditTransaction->setEnabled(false); ActionDeleteTransaction->setEnabled(false); ActionEditSplitTransaction->setEnabled(false); ActionDeleteSplitTransaction->setEnabled(false); ActionJoinTransactions->setEnabled(false); ActionSplitUpTransaction->setEnabled(false); ActionEditScheduledTransaction->setEnabled(false); ActionDeleteScheduledTransaction->setEnabled(false); ActionNewRefund->setEnabled(false); ActionNewRepayment->setEnabled(false); ActionNewRefundRepayment->setEnabled(false); ActionEditSecurity->setEnabled(false); ActionDeleteSecurity->setEnabled(false); ActionSellShares->setEnabled(true); ActionBuyShares->setEnabled(true); ActionNewDividend->setEnabled(true); ActionNewReinvestedDividend->setEnabled(true); ActionNewSecurityTrade->setEnabled(true); ActionSetQuotation->setEnabled(false); ActionEditQuotations->setEnabled(false); ActionEditSecurityTransactions->setEnabled(false); } bool Eqonomize::crashRecovery(KUrl url) { KConfigGroup config = KGlobal::config()->group("General Options"); QList staleFiles; if(url.isLocalFile()) { staleFiles = KAutoSaveFile::staleFiles(url); } else if(url.isEmpty()) { staleFiles = KAutoSaveFile::staleFiles(KUrl("/UNSAVED EQZ")); } if(!staleFiles.isEmpty()) { if(KMessageBox::questionYesNo(this, i18n("Eqonomize! exited unexpectedly before the file was saved and data was lost.\nDo you want to load the last auto-saved version of the file?"), i18n("Crash Recovery")) == KMessageBox::Yes) { QString errors; QString error = budget->loadFile(staleFiles.first()->fileName(), errors); if(!error.isNull()) { KMessageBox::error(this, i18n("Error loading %1: %2.").arg(cr_tmp_file->fileName()).arg(error), i18n("Couldn't open file")); config.sync(); foreach(KAutoSaveFile *stale, staleFiles) { stale->remove(); delete stale; } return false; } if(!errors.isEmpty()) { KMessageBox::error(this, errors); } current_url = url; ActionFileReload->setEnabled(true); setCaption(current_url.fileName(), false); foreach(KAutoSaveFile *stale, staleFiles) { stale->remove(); delete stale; } if(cr_tmp_file) { cr_tmp_file->releaseLock(); cr_tmp_file->remove(); delete cr_tmp_file; cr_tmp_file = NULL; } reloadBudget(); emit accountsModified(); emit transactionsModified(); emit budgetUpdated(); setModified(true); checkSchedule(true); return true; } } foreach(KAutoSaveFile *stale, staleFiles) { stale->remove(); delete stale; } return false; } void Eqonomize::onAutoSaveTimeout() { auto_save_timeout = true; if(modified_auto_save) { autoSave(); } } void Eqonomize::autoSave() { if(auto_save_timeout) { saveCrashRecovery(); modified_auto_save = false; auto_save_timeout = false; } } void Eqonomize::saveCrashRecovery() { if(!cr_tmp_file) { if(current_url.isEmpty()) cr_tmp_file = new KAutoSaveFile(KUrl("/UNSAVED EQZ"), this); else cr_tmp_file = new KAutoSaveFile(current_url, this); } if(budget->saveFile(cr_tmp_file->fileName()).isNull()) { KConfigGroup config = KGlobal::config()->group("General Options"); config.writeEntry("lastURL", current_url.url()); config.sync(); } } void Eqonomize::saveOptions() { KConfigGroup config = KGlobal::config()->group("General Options"); ActionOpenRecent->saveEntries(KGlobal::config()->group("RecentFiles")); config.writeEntry("lastURL", current_url.url()); config.writeEntry("currentEditExpenseFromItem", expensesWidget->currentEditFromItem()); config.writeEntry("currentEditExpenseToItem", expensesWidget->currentEditToItem()); config.writeEntry("currentEditIncomeFromItem", incomesWidget->currentEditFromItem()); config.writeEntry("currentEditIncomeToItem", incomesWidget->currentEditToItem()); config.writeEntry("currentEditTransferFromItem", transfersWidget->currentEditFromItem()); config.writeEntry("currentEditTransferToItem", transfersWidget->currentEditToItem()); config.writeEntry("useExtraProperties", b_extra); config.writeEntry("firstRun", false); InitialPeriod initial_period = (InitialPeriod) ActionSelectInitialPeriod->currentItem(); config.writeEntry("initialPeriod", int(initial_period)); if(initial_period == INITIAL_PERIOD_LAST) { config.writeEntry("initialFromDate", from_date.toString(Qt::ISODate)); config.writeEntry("initialFromDateEnabled", accountsPeriodFromButton->isChecked()); config.writeEntry("initialToDate", to_date.toString(Qt::ISODate)); } emit timeToSaveConfig(); } void Eqonomize::readFileDependentOptions() { KConfigGroup config = KGlobal::config()->group("General Options"); expensesWidget->setCurrentEditFromItem(config.readEntry("currentEditExpenseFromItem", int(0))); expensesWidget->setCurrentEditToItem(config.readEntry("currentEditExpenseToItem", int(0))); incomesWidget->setCurrentEditFromItem(config.readEntry("currentEditIncomeFromItem", int(0))); incomesWidget->setCurrentEditToItem(config.readEntry("currentEditIncomeToItem", int(0))); transfersWidget->setCurrentEditFromItem(config.readEntry("currentEditTransferFromItem", int(0))); transfersWidget->setCurrentEditToItem(config.readEntry("currentEditTransferToItem", int(0))); } void Eqonomize::readOptions() { KConfigGroup config = KGlobal::config()->group("General Options"); ActionOpenRecent->loadEntries(KGlobal::config()->group("RecentFiles")); first_run = config.readEntry("firstRun", true); config.writeEntry("firstRun", false); } bool Eqonomize::queryClose() { return askSave(true); } bool Eqonomize::queryExit() { saveOptions(); return true; } void Eqonomize::dragEnterEvent(QDragEnterEvent *event) { event->setAccepted(KUrl::List::canDecode(event->mimeData())); } void Eqonomize::dropEvent(QDropEvent *event) { KUrl::List urls = KUrl::List::fromMimeData(event->mimeData()); if(!urls.isEmpty()) { const KUrl &url = urls.first(); if(!askSave()) return; openURL(url); } } void Eqonomize::fileNew() { if(!askSave()) return; budget->clear(); reloadBudget(); setCaption(QString::null, false); current_url = ""; ActionFileReload->setEnabled(false); KConfigGroup config = KGlobal::config()->group("General Options"); config.writeEntry("lastURL", current_url.url()); if(cr_tmp_file) { cr_tmp_file->releaseLock(); cr_tmp_file->remove(); delete cr_tmp_file; cr_tmp_file = NULL; } config.sync(); setModified(false); emit accountsModified(); emit transactionsModified(); emit budgetUpdated(); } void Eqonomize::fileOpen() { if(!askSave()) return; KUrl url = KFileDialog::getOpenUrl(KUrl(), "application/x-eqonomize", this); if(!url.isEmpty()) openURL(url); } void Eqonomize::fileOpenRecent(const KUrl &url) { if(!askSave()) return; openURL(url); } void Eqonomize::fileReload() { openURL(current_url); } void Eqonomize::fileSave() { if(!current_url.isValid()) { KUrl file_url = KFileDialog::getSaveUrl(KUrl("budget"), "application/x-eqonomize", this); if (!file_url.isEmpty() && file_url.isValid()) { saveURL(file_url); } } else { saveURL(current_url); } } void Eqonomize::fileSaveAs() { KUrl file_url = KFileDialog::getSaveUrl(current_url.directory(), "application/x-eqonomize", this); if (!file_url.isEmpty() && file_url.isValid()) { saveURL(file_url); } } bool Eqonomize::askSave(bool before_exit) { if(!modified) return true; int b_save = 0; if(before_exit && current_url.isValid()) b_save = KMessageBox::warningYesNoCancel(this, i18n("The current file has been modified. Do you want to save it?"), QString(), KStandardGuiItem::yes(), KStandardGuiItem::no(), KStandardGuiItem::cancel(), "saveOnExit"); else b_save = KMessageBox::warningYesNoCancel(this, i18n("The current file has been modified. Do you want to save it?")); if(b_save == KMessageBox::Yes) { if(!current_url.isValid()) { KUrl file_url = KFileDialog::getSaveUrl(KUrl("budget"), "application/x-eqonomize", this); if (!file_url.isEmpty() && file_url.isValid()) { return saveURL(file_url); } else { return false; } } else { return saveURL(current_url); } } if(b_save == KMessageBox::No) { if(cr_tmp_file) { cr_tmp_file->releaseLock(); cr_tmp_file->remove(); delete cr_tmp_file; cr_tmp_file = NULL; } return true; } return false; } void Eqonomize::optionsPreferences() { } void Eqonomize::checkSchedule() { checkSchedule(true); } bool Eqonomize::checkSchedule(bool update_display) { bool b = false; ScheduledTransaction *strans = budget->scheduledTransactions.first(); while(strans) { if(strans->firstOccurrence() < QDate::currentDate() || (QTime::currentTime().hour() >= 18 && strans->firstOccurrence() == QDate::currentDate())) { b = true; ConfirmScheduleDialog *dialog = new ConfirmScheduleDialog(b_extra, budget, this, i18n("Confirm Schedule")); updateScheduledTransactions(); dialog->exec(); Transaction *trans = dialog->firstTransaction(); while(trans) { budget->addTransaction(trans); trans = dialog->nextTransaction(); } dialog->deleteLater(); break; } strans = budget->scheduledTransactions.next(); } if(b && update_display) { expensesWidget->transactionsReset(); incomesWidget->transactionsReset(); transfersWidget->transactionsReset(); filterAccounts(); updateScheduledTransactions(); updateSecurities(); emit transactionsModified(); setModified(true); } return b; } void Eqonomize::updateScheduledTransactions() { scheduleView->clear(); ScheduledTransaction *strans = budget->scheduledTransactions.first(); QList items; while(strans) { items.append(new ScheduleListViewItem(strans, strans->firstOccurrence())); strans = budget->scheduledTransactions.next(); } scheduleView->addTopLevelItems(items); scheduleView->setSortingEnabled(true); } void Eqonomize::appendScheduledTransaction(ScheduledTransaction *strans) { scheduleView->insertTopLevelItem(scheduleView->topLevelItemCount(), new ScheduleListViewItem(strans, strans->firstOccurrence())); scheduleView->setSortingEnabled(true); } void Eqonomize::addAccount() { QTreeWidgetItem *i = selectedItem(accountsView); if(i == NULL) return; if(i == assetsItem || (account_items.contains(i) && (account_items[i]->type() == ACCOUNT_TYPE_ASSETS))) { newAssetsAccount(); } else if(i == incomesItem || (account_items.contains(i) && (account_items[i]->type() == ACCOUNT_TYPE_INCOMES))) { newIncomesAccount(); } else { newExpensesAccount(); } } void Eqonomize::newAssetsAccount() { EditAssetsAccountDialog *dialog = new EditAssetsAccountDialog(budget, this, i18n("New Account")); if(dialog->exec() == QDialog::Accepted) { AssetsAccount *account = dialog->newAccount(); budget->addAccount(account); appendAssetsAccount(account); filterAccounts(); expensesWidget->updateFromAccounts(); incomesWidget->updateToAccounts(); transfersWidget->updateAccounts(); emit accountsModified(); setModified(true); } dialog->deleteLater(); } void Eqonomize::newIncomesAccount() { EditIncomesAccountDialog *dialog = new EditIncomesAccountDialog(budget, this, i18n("New Income Category")); if(dialog->exec() == QDialog::Accepted) { IncomesAccount *account = dialog->newAccount(); budget->addAccount(account); appendIncomesAccount(account); filterAccounts(); incomesWidget->updateFromAccounts(); emit accountsModified(); setModified(true); } dialog->deleteLater(); } void Eqonomize::newExpensesAccount() { EditExpensesAccountDialog *dialog = new EditExpensesAccountDialog(budget, this, i18n("New Expense Category")); if(dialog->exec() == QDialog::Accepted) { ExpensesAccount *account = dialog->newAccount(); budget->addAccount(account); appendExpensesAccount(account); filterAccounts(); expensesWidget->updateToAccounts(); emit accountsModified(); setModified(true); } dialog->deleteLater(); } void Eqonomize::accountExecuted(QTreeWidgetItem*) { showAccountTransactions(); } void Eqonomize::accountExecuted(QTreeWidgetItem *i, int c) { if(i == NULL) return; switch(c) { case 0: { if(account_items.contains(i)) { editAccount(account_items[i]); } break; } case 1: { if(account_items.contains(i)) { if(account_items[i]->type() == ACCOUNT_TYPE_ASSETS) { showAccountTransactions(); } else { accountsTabs->setCurrentIndex(1); if(budgetEdit->isEnabled()) { budgetEdit->setFocus(); budgetEdit->lineEdit()->selectAll(); } else { budgetButton->setFocus(); } } } break; } case 2: { showAccountTransactions(); break; } case 3: { showAccountTransactions(true); break; } } } void Eqonomize::balanceAccount() { QTreeWidgetItem *i = selectedItem(accountsView); if(!account_items.contains(i)) return; Account *i_account = account_items[i]; balanceAccount(i_account); } void Eqonomize::balanceAccount(Account *i_account) { if(!i_account) return; if(i_account->type() != ACCOUNT_TYPE_ASSETS || ((AssetsAccount*) i_account)->accountType() == ASSETS_TYPE_SECURITIES) return; AssetsAccount *account = (AssetsAccount*) i_account; double book_value = account->initialBalance(); double current_balancing = 0.0; Transaction *trans = budget->transactions.first(); while(trans) { if(trans->fromAccount() == account) { book_value -= trans->value(); if(trans->toAccount() == budget->balancingAccount) current_balancing -= trans->value(); } if(trans->toAccount() == account) { book_value += trans->value(); if(trans->fromAccount() == budget->balancingAccount) current_balancing += trans->value(); } trans = budget->transactions.next(); } KDialog *dialog = new KDialog(this, 0); dialog->setCaption(i18n("Balance Account")); dialog->setButtons(KDialog::Ok | KDialog::Cancel); dialog->setDefaultButton(KDialog::Cancel); dialog->setModal(true); dialog->setMainWidget(new QWidget(dialog)); QGridLayout *grid = new QGridLayout(dialog->mainWidget()); grid->addWidget(new QLabel(i18n("Book value:"), dialog->mainWidget()), 0, 0); QLabel *label = new QLabel(KGlobal::locale()->formatMoney(book_value), dialog->mainWidget()); label->setAlignment(Qt::AlignRight); grid->addWidget(label, 0, 1); label = new QLabel(QString("of which %1 is balanced").arg(KGlobal::locale()->formatMoney(current_balancing)), dialog->mainWidget()); label->setAlignment(Qt::AlignRight); grid->addWidget(label, 1, 1); grid->addWidget(new QLabel(i18n("Real value:"), dialog->mainWidget()), 2, 0); EqonomizeValueEdit *realEdit = new EqonomizeValueEdit(book_value, true, true, dialog->mainWidget()); grid->addWidget(realEdit, 2, 1); if(dialog->exec() == QDialog::Accepted && realEdit->value() != book_value) { trans = new Balancing(budget, realEdit->value() - book_value, QDate::currentDate(), account); budget->addTransaction(trans); transactionAdded(trans); } dialog->deleteLater(); } void Eqonomize::editAccount() { QTreeWidgetItem *i = selectedItem(accountsView); if(!account_items.contains(i)) return; Account *i_account = account_items[i]; editAccount(i_account); } bool Eqonomize::editAccount(Account *i_account) { return editAccount(i_account, this); } bool Eqonomize::editAccount(Account *i_account, QWidget *parent) { QTreeWidgetItem *i = item_accounts[i_account]; switch(i_account->type()) { case ACCOUNT_TYPE_ASSETS: { EditAssetsAccountDialog *dialog = new EditAssetsAccountDialog(budget, parent, i18n("Edit Account")); AssetsAccount *account = (AssetsAccount*) i_account; dialog->setAccount(account); double prev_ib = account->initialBalance(); bool was_budget_account = account->isBudgetAccount(); if(dialog->exec() == QDialog::Accepted) { dialog->modifyAccount(account); if(was_budget_account != account->isBudgetAccount()) { filterAccounts(); } else { account_value[account] += (account->initialBalance() - prev_ib); assets_accounts_value += (account->initialBalance() - prev_ib); if(to_date > QDate::currentDate()) i->setText(0, account->name() + "*"); else i->setText(0, account->name()); i->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(account_value[account], KGlobal::locale()->fracDigits()) + " "); assetsItem->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_value, KGlobal::locale()->fracDigits()) + " "); } emit accountsModified(); setModified(true); expensesWidget->updateFromAccounts(); incomesWidget->updateToAccounts(); transfersWidget->updateAccounts(); assetsItem->sortChildren(0, Qt::AscendingOrder); expensesWidget->filterTransactions(); incomesWidget->filterTransactions(); transfersWidget->filterTransactions(); dialog->deleteLater(); return true; } dialog->deleteLater(); break; } case ACCOUNT_TYPE_INCOMES: { EditIncomesAccountDialog *dialog = new EditIncomesAccountDialog(budget, parent, i18n("Edit Income Category")); IncomesAccount *account = (IncomesAccount*) i_account; dialog->setAccount(account); if(dialog->exec() == QDialog::Accepted) { dialog->modifyAccount(account); i->setText(0, account->name()); emit accountsModified(); setModified(true); incomesWidget->updateFromAccounts(); incomesItem->sortChildren(0, Qt::AscendingOrder); incomesWidget->filterTransactions(); dialog->deleteLater(); return true; } dialog->deleteLater(); break; } case ACCOUNT_TYPE_EXPENSES: { EditExpensesAccountDialog *dialog = new EditExpensesAccountDialog(budget, parent, i18n("Edit Expense Category")); ExpensesAccount *account = (ExpensesAccount*) i_account; dialog->setAccount(account); if(dialog->exec() == QDialog::Accepted) { dialog->modifyAccount(account); i->setText(0, account->name()); emit accountsModified(); setModified(true); expensesWidget->updateToAccounts(); expensesItem->sortChildren(0, Qt::AscendingOrder); expensesWidget->filterTransactions(); dialog->deleteLater(); return true; } dialog->deleteLater(); break; } } return false; } void Eqonomize::deleteAccount() { QTreeWidgetItem *i = selectedItem(accountsView); if(!account_items.contains(i)) return; Account *account = account_items[i]; if(!budget->accountHasTransactions(account)) { item_accounts.remove(account); account_items.remove(i); delete i; account_change.remove(account); account_value.remove(account); budget->removeAccount(account); expensesWidget->updateAccounts(); transfersWidget->updateAccounts(); incomesWidget->updateAccounts(); filterAccounts(); emit accountsModified(); setModified(true); } else { QRadioButton *deleteButton = NULL, *moveToButton = NULL; QComboBox *moveToCombo = NULL; QButtonGroup *group = NULL; KDialog *dialog = NULL; bool accounts_left = false; QVector moveto_accounts; switch(account->type()) { case ACCOUNT_TYPE_EXPENSES: {accounts_left = budget->expensesAccounts.count() > 1; break;} case ACCOUNT_TYPE_INCOMES: {accounts_left = budget->incomesAccounts.count() > 1; break;} case ACCOUNT_TYPE_ASSETS: { AssetsAccount *aaccount = budget->assetsAccounts.first(); while(aaccount) { if(aaccount != budget->balancingAccount && aaccount != account && ((((AssetsAccount*) account)->accountType() == ASSETS_TYPE_SECURITIES) == (aaccount->accountType() == ASSETS_TYPE_SECURITIES))) { accounts_left = true; break; } aaccount = budget->assetsAccounts.next(); } break; } } if(accounts_left) { dialog = new KDialog(this, 0); dialog->setCaption(i18n("Move transactions?")); dialog->setButtons(KDialog::Ok | KDialog::Cancel); dialog->setDefaultButton(KDialog::Cancel); dialog->setModal(true); dialog->setMainWidget(new QWidget(dialog)); QGridLayout *grid = new QGridLayout(dialog->mainWidget()); group = new QButtonGroup(dialog); QLabel *label = NULL; deleteButton = new QRadioButton(KStandardGuiItem::remove().text(), dialog->mainWidget()); group->addButton(deleteButton); moveToButton = new QRadioButton(i18n("Move to:"), dialog->mainWidget()); group->addButton(moveToButton); moveToButton->setChecked(true); moveToCombo = new KComboBox(dialog->mainWidget()); moveToCombo->setEditable(false); switch(account->type()) { case ACCOUNT_TYPE_EXPENSES: { label = new QLabel(i18n("The category contains some expenses.\nWhat do you want to do with them?"), dialog->mainWidget()); ExpensesAccount *eaccount = budget->expensesAccounts.first(); while(eaccount) { if(eaccount != account) { moveToCombo->addItem(eaccount->name()); moveto_accounts.push_back(eaccount); } eaccount = budget->expensesAccounts.next(); } break; } case ACCOUNT_TYPE_INCOMES: { label = new QLabel(i18n("The category contains some incomes.\nWhat do you want to do with them?"), dialog->mainWidget()); IncomesAccount *iaccount = budget->incomesAccounts.first(); while(iaccount) { if(iaccount != account) { moveToCombo->addItem(iaccount->name()); moveto_accounts.push_back(iaccount); } iaccount = budget->incomesAccounts.next(); } break; } case ACCOUNT_TYPE_ASSETS: { label = new QLabel(i18n("The account contains some transactions.\nWhat do you want to do with them?"), dialog->mainWidget()); AssetsAccount *aaccount = budget->assetsAccounts.first(); while(aaccount) { if(aaccount != budget->balancingAccount && aaccount != account && ((((AssetsAccount*) account)->accountType() == ASSETS_TYPE_SECURITIES) == (aaccount->accountType() == ASSETS_TYPE_SECURITIES))) { moveToCombo->addItem(aaccount->name()); moveto_accounts.push_back(aaccount); } aaccount = budget->assetsAccounts.next(); } break; } } grid->addWidget(label, 0, 0, 1, 2); grid->addWidget(deleteButton, 1, 0); grid->addWidget(moveToButton, 2, 0); grid->addWidget(moveToCombo, 2, 1); } bool do_delete = false; if(accounts_left) { do_delete = (dialog->exec() == QDialog::Accepted); } else { switch(account->type()) { case ACCOUNT_TYPE_EXPENSES: {do_delete = (KMessageBox::warningYesNo(this, i18n("The category contains some expenses that will be removed. Do you still want to remove the category?"), i18n("Remove Category?")) == KMessageBox::Yes); break;} case ACCOUNT_TYPE_INCOMES: {do_delete = (KMessageBox::warningYesNo(this, i18n("The category contains some incomes that will be removed. Do you still want to remove the category?"), i18n("Remove Category?")) == KMessageBox::Yes); break;} case ACCOUNT_TYPE_ASSETS: {do_delete = (KMessageBox::warningYesNo(this, i18n("The account contains some transactions that will be removed. Do you still want to remove the account?"), i18n("Remove Account?")) == KMessageBox::Yes); break;} } } if(do_delete) { if(accounts_left && moveToButton->isChecked()) { budget->moveTransactions(account, moveto_accounts[moveToCombo->currentIndex()]); } item_accounts.remove(account); account_items.remove(i); delete i; account_change.remove(account); account_value.remove(account); AccountType type = account->type(); budget->removeAccount(account); filterAccounts(); updateSecurities(); updateScheduledTransactions(); switch(type) { case ACCOUNT_TYPE_EXPENSES: {expensesWidget->filterTransactions(); break;} case ACCOUNT_TYPE_INCOMES: {incomesWidget->filterTransactions(); break;} case ACCOUNT_TYPE_ASSETS: {incomesWidget->filterTransactions(); expensesWidget->filterTransactions(); transfersWidget->filterTransactions(); break;} } expensesWidget->updateAccounts(); transfersWidget->updateAccounts(); incomesWidget->updateAccounts(); emit accountsModified(); emit transactionsModified(); setModified(true); } if(dialog) dialog->deleteLater(); } } void Eqonomize::transactionAdded(Transaction *trans) { addTransactionValue(trans, trans->date(), true); emit transactionsModified(); setModified(true); expensesWidget->onTransactionAdded(trans); incomesWidget->onTransactionAdded(trans); transfersWidget->onTransactionAdded(trans); if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY || trans->type() == TRANSACTION_TYPE_SECURITY_SELL) { updateSecurity(((SecurityTransaction*) trans)->security()); } else if(trans->type() == TRANSACTION_TYPE_INCOME && ((Income*) trans)->security()) { updateSecurity(((Income*) trans)->security()); } } void Eqonomize::transactionModified(Transaction *trans, Transaction *oldtrans) { subtractTransactionValue(oldtrans, true); addTransactionValue(trans, trans->date(), true); emit transactionsModified(); setModified(true); expensesWidget->onTransactionModified(trans, oldtrans); incomesWidget->onTransactionModified(trans, oldtrans); transfersWidget->onTransactionModified(trans, oldtrans); if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY || trans->type() == TRANSACTION_TYPE_SECURITY_SELL) { updateSecurity(((SecurityTransaction*) trans)->security()); if(((SecurityTransaction*) trans)->security() != ((SecurityTransaction*) oldtrans)->security()) { updateSecurity(((SecurityTransaction*) oldtrans)->security()); } } else if(trans->type() == TRANSACTION_TYPE_INCOME && ((Income*) trans)->security()) { updateSecurity(((Income*) trans)->security()); if(((Income*) trans)->security() != ((Income*) oldtrans)->security()) { updateSecurity(((Income*) oldtrans)->security()); } } } void Eqonomize::transactionRemoved(Transaction *trans) { subtractTransactionValue(trans, true); emit transactionsModified(); setModified(true); expensesWidget->onTransactionRemoved(trans); incomesWidget->onTransactionRemoved(trans); transfersWidget->onTransactionRemoved(trans); if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY || trans->type() == TRANSACTION_TYPE_SECURITY_SELL) { updateSecurity(((SecurityTransaction*) trans)->security()); } else if(trans->type() == TRANSACTION_TYPE_INCOME && ((Income*) trans)->security()) { updateSecurity(((Income*) trans)->security()); } } void Eqonomize::scheduledTransactionAdded(ScheduledTransaction *strans) { appendScheduledTransaction(strans); addScheduledTransactionValue(strans, true); emit transactionsModified(); setModified(true); expensesWidget->onScheduledTransactionAdded(strans); incomesWidget->onScheduledTransactionAdded(strans); transfersWidget->onScheduledTransactionAdded(strans); if(strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) { updateSecurity(((SecurityTransaction*) strans->transaction())->security()); } else if(strans->transaction()->type() == TRANSACTION_TYPE_INCOME && ((Income*) strans->transaction())->security()) { updateSecurity(((Income*) strans->transaction())->security()); } } void Eqonomize::scheduledTransactionModified(ScheduledTransaction *strans, ScheduledTransaction *oldstrans) { QTreeWidgetItemIterator it(scheduleView); ScheduleListViewItem *i = (ScheduleListViewItem*) *it; while(i) { if(i->scheduledTransaction() == strans) { i->setScheduledTransaction(strans); i->setDate(strans->firstOccurrence()); break; } ++it; i = (ScheduleListViewItem*) *it; } subtractScheduledTransactionValue(oldstrans, true); addScheduledTransactionValue(strans, true); emit transactionsModified(); setModified(true); expensesWidget->onScheduledTransactionModified(strans, oldstrans); incomesWidget->onScheduledTransactionModified(strans, oldstrans); transfersWidget->onScheduledTransactionModified(strans, oldstrans); if(strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) { updateSecurity(((SecurityTransaction*) strans->transaction())->security()); if(((SecurityTransaction*) strans->transaction())->security() != ((SecurityTransaction*) oldstrans->transaction())->security()) { updateSecurity(((SecurityTransaction*) oldstrans->transaction())->security()); } } else if(strans->transaction()->type() == TRANSACTION_TYPE_INCOME && ((Income*) strans->transaction())->security()) { updateSecurity(((Income*) strans->transaction())->security()); if(((Income*) strans->transaction())->security() != ((Income*) oldstrans->transaction())->security()) { updateSecurity(((Income*) oldstrans->transaction())->security()); } } } void Eqonomize::scheduledTransactionRemoved(ScheduledTransaction *strans) { scheduledTransactionRemoved(strans, strans); } void Eqonomize::scheduledTransactionRemoved(ScheduledTransaction *strans, ScheduledTransaction *old_strans) { QTreeWidgetItemIterator it(scheduleView); ScheduleListViewItem *i = (ScheduleListViewItem*) *it; while(i) { if(i->scheduledTransaction() == strans) { delete i; break; } ++it; i = (ScheduleListViewItem*) *it; } subtractScheduledTransactionValue(old_strans, true); emit transactionsModified(); setModified(true); expensesWidget->onScheduledTransactionRemoved(strans); incomesWidget->onScheduledTransactionRemoved(strans); transfersWidget->onScheduledTransactionRemoved(strans); if(strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) { updateSecurity(((SecurityTransaction*) strans->transaction())->security()); } else if(strans->transaction()->type() == TRANSACTION_TYPE_INCOME && ((Income*) strans->transaction())->security()) { updateSecurity(((Income*) strans->transaction())->security()); } } void Eqonomize::splitTransactionAdded(SplitTransaction *split) { blockSignals(true); QVector::size_type c = split->splits.count(); for(QVector::size_type i = 0; i < c; i++) { transactionAdded(split->splits[i]); } blockSignals(false); emit transactionsModified(); } void Eqonomize::splitTransactionRemoved(SplitTransaction *split) { blockSignals(true); QVector::size_type c = split->splits.count(); for(QVector::size_type i = 0; i < c; i++) { transactionRemoved(split->splits[i]); } blockSignals(false); emit transactionsModified(); } #define NEW_ACCOUNT_TREE_WIDGET_ITEM(i, parent, s1, s2, s3, s4) QTreeWidgetItem *i = new QTreeWidgetItem(parent); i->setText(0, s1); i->setText(1, s2); i->setText(2, s3); i->setText(3, s4); i->setTextAlignment(BUDGET_COLUMN, Qt::AlignRight); i->setTextAlignment(CHANGE_COLUMN, Qt::AlignRight); i->setTextAlignment(VALUE_COLUMN, Qt::AlignRight); void Eqonomize::appendExpensesAccount(ExpensesAccount *account) { NEW_ACCOUNT_TREE_WIDGET_ITEM(i, expensesItem, account->name(), "-", KGlobal::locale()->formatNumber(0.0, KGlobal::locale()->fracDigits()), KGlobal::locale()->formatNumber(0.0, KGlobal::locale()->fracDigits()) + " "); account_items[i] = account; item_accounts[account] = i; account_value[account] = 0.0; account_change[account] = 0.0; expensesItem->sortChildren(0, Qt::AscendingOrder); } void Eqonomize::appendIncomesAccount(IncomesAccount *account) { NEW_ACCOUNT_TREE_WIDGET_ITEM(i, incomesItem, account->name(), "-", KGlobal::locale()->formatNumber(0.0, KGlobal::locale()->fracDigits()), KGlobal::locale()->formatNumber(0.0, KGlobal::locale()->fracDigits()) + " "); account_items[i] = account; item_accounts[account] = i; account_value[account] = 0.0; account_change[account] = 0.0; incomesItem->sortChildren(0, Qt::AscendingOrder); } void Eqonomize::appendAssetsAccount(AssetsAccount *account) { NEW_ACCOUNT_TREE_WIDGET_ITEM(i, assetsItem, account->name(), QString::null, KGlobal::locale()->formatNumber(0.0, KGlobal::locale()->fracDigits()), KGlobal::locale()->formatNumber(account->initialBalance(), KGlobal::locale()->fracDigits()) + " "); if(account->isBudgetAccount() && to_date > QDate::currentDate()) i->setText(0, account->name() + "*"); account_items[i] = account; item_accounts[account] = i; account_value[account] = account->initialBalance(); assets_accounts_value += account->initialBalance(); account_change[account] = 0.0; assetsItem->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_value, KGlobal::locale()->fracDigits()) + " "); assetsItem->sortChildren(0, Qt::AscendingOrder); } bool Eqonomize::filterTransaction(Transaction *trans) { if(accountsPeriodFromButton->isChecked() && trans->date() < from_date) return true; if(trans->date() > to_date) return true; return false; } void Eqonomize::subtractScheduledTransactionValue(ScheduledTransaction *strans, bool update_value_display) { addScheduledTransactionValue(strans, update_value_display, true); } void Eqonomize::addScheduledTransactionValue(ScheduledTransaction *strans, bool update_value_display, bool subtract) { if(!strans->recurrence()) return addTransactionValue(strans->transaction(), strans->transaction()->date(), update_value_display, subtract, -1, -1, NULL); Recurrence *rec = strans->recurrence(); QDate curdate = rec->firstOccurrence(); int b_future = 1; if(to_date <= QDate::currentDate()) b_future = 0; else if(strans->transaction()->date() <= QDate::currentDate()) b_future = -1; while(!curdate.isNull() && curdate <= to_date) { addTransactionValue(strans->transaction(), curdate, update_value_display, subtract, 1, b_future, NULL); curdate = rec->nextOccurrence(curdate); } } void Eqonomize::subtractTransactionValue(Transaction *trans, bool update_value_display) { addTransactionValue(trans, trans->date(), update_value_display, true); } void Eqonomize::addTransactionValue(Transaction *trans, const QDate &transdate, bool update_value_display, bool subtract, int n, int b_future, const QDate *monthdate) { if(n == 0) return; bool b_filter_to = n < 0 && transdate > to_date; bool b_from = accountsPeriodFromButton->isChecked(); bool b_lastmonth = false; QDate date; if(b_filter_to) { if(!monthdate) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); if(calSys->year(transdate) != calSys->year(to_date) || calSys->month(transdate) != calSys->month(to_date)) return; } else { if(transdate > *monthdate) return; } b_lastmonth = true; } bool b_filter = !b_lastmonth && b_from && transdate < from_date; bool b_curmonth = false; bool b_firstmonth = false; const KCalendarSystem *calSys = KGlobal::locale()->calendar(); if(!b_lastmonth && b_future < 0) { if(to_date <= QDate::currentDate()) { b_future = 0; } else { b_future = (transdate > QDate::currentDate()); if(!b_future) { QDate curdate = QDate::currentDate(); if(calSys->year(curdate) == calSys->year(transdate) && calSys->month(curdate) == calSys->month(transdate)) { b_curmonth = true; b_future = true; } } } } else if(!b_lastmonth && b_future) { b_curmonth = (transdate <= QDate::currentDate()); } if(b_from && !b_lastmonth && b_filter && !frommonth_begin.isNull()) { if(transdate >= frommonth_begin) b_firstmonth = true; } bool balfrom = false; bool balto = false; double value = subtract ? -trans->value() : trans->value(); if(!monthdate) { calSys->setYMD(date, calSys->year(transdate), calSys->month(transdate), calSys->daysInMonth(transdate)); monthdate = &date; } if(n > 1) value *= n; switch(trans->fromAccount()->type()) { case ACCOUNT_TYPE_EXPENSES: { if(b_lastmonth) { account_month_endlast[trans->fromAccount()] -= value; account_month[trans->fromAccount()][*monthdate] -= value; if(update_value_display) { updateMonthlyBudget(trans->fromAccount()); updateTotalMonthlyExpensesBudget(); } break; } bool update_month_display = false; if(b_firstmonth) { account_month_beginfirst[trans->fromAccount()] -= value; update_month_display = true; } if(b_curmonth) { account_month_begincur[trans->fromAccount()] -= value; update_month_display = true; } if(b_future || (!frommonth_begin.isNull() && transdate >= frommonth_begin) || (!prevmonth_begin.isNull() && transdate >= prevmonth_begin)) { account_month[trans->fromAccount()][*monthdate] -= value; update_month_display = true; } if(update_value_display && update_month_display) { updateMonthlyBudget(trans->fromAccount()); updateTotalMonthlyExpensesBudget(); } account_value[trans->fromAccount()] -= value; expenses_accounts_value -= value; if(!b_filter) { account_change[trans->fromAccount()] -= value; expenses_accounts_change -= value; if(update_value_display) { expensesItem->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(expenses_accounts_change, KGlobal::locale()->fracDigits())); } } if(update_value_display) { expensesItem->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(expenses_accounts_value, KGlobal::locale()->fracDigits()) + " "); } break; } case ACCOUNT_TYPE_INCOMES: { if(b_lastmonth) { account_month_endlast[trans->fromAccount()] += value; account_month[trans->fromAccount()][*monthdate] += value; if(update_value_display) { updateMonthlyBudget(trans->fromAccount()); updateTotalMonthlyIncomesBudget(); } break; } bool update_month_display = false; if(b_firstmonth) { account_month_beginfirst[trans->fromAccount()] += value; update_month_display = true; } if(b_curmonth) { account_month_begincur[trans->fromAccount()] += value; update_month_display = true; } if(b_future || (!frommonth_begin.isNull() && transdate >= frommonth_begin) || (!prevmonth_begin.isNull() && transdate >= prevmonth_begin)) { account_month[trans->fromAccount()][*monthdate] += value; update_month_display = true; } if(update_value_display && update_month_display) { updateMonthlyBudget(trans->fromAccount()); updateTotalMonthlyIncomesBudget(); } account_value[trans->fromAccount()] += value; incomes_accounts_value += value; if(!b_filter) { account_change[trans->fromAccount()] += value; incomes_accounts_change += value; if(update_value_display) { incomesItem->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(incomes_accounts_change, KGlobal::locale()->fracDigits())); } } if(update_value_display) { incomesItem->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(incomes_accounts_value, KGlobal::locale()->fracDigits()) + " "); } break; } case ACCOUNT_TYPE_ASSETS: { if(b_lastmonth) break; if(((AssetsAccount*) trans->fromAccount())->accountType() == ASSETS_TYPE_SECURITIES) { if(update_value_display) { updateSecurityAccount((AssetsAccount*) trans->fromAccount(), false); assetsItem->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_value, KGlobal::locale()->fracDigits()) + " "); assetsItem->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_change, KGlobal::locale()->fracDigits())); item_accounts[trans->fromAccount()]->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(account_change[trans->fromAccount()], KGlobal::locale()->fracDigits())); } break; } balfrom = (trans->fromAccount() == budget->balancingAccount); if(!balfrom) { account_value[trans->fromAccount()] -= value; assets_accounts_value -= value; if(!b_filter) { account_change[trans->fromAccount()] -= value; assets_accounts_change -= value; if(update_value_display) { assetsItem->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_change, KGlobal::locale()->fracDigits())); item_accounts[trans->fromAccount()]->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(account_change[trans->fromAccount()], KGlobal::locale()->fracDigits())); } } if(update_value_display) assetsItem->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_value, KGlobal::locale()->fracDigits()) + " "); } break; } } switch(trans->toAccount()->type()) { case ACCOUNT_TYPE_EXPENSES: { if(b_lastmonth) { account_month_endlast[trans->toAccount()] += value; account_month[trans->toAccount()][*monthdate] += value; if(update_value_display) { updateMonthlyBudget(trans->toAccount()); updateTotalMonthlyExpensesBudget(); } break; } bool update_month_display = false; if(b_firstmonth) { account_month_beginfirst[trans->toAccount()] += value; update_month_display = true; } if(b_curmonth) { account_month_begincur[trans->toAccount()] += value; update_month_display = true; } if(b_future || (!frommonth_begin.isNull() && transdate >= frommonth_begin) || (!prevmonth_begin.isNull() && transdate >= prevmonth_begin)) { account_month[trans->toAccount()][*monthdate] += value; update_month_display = true; } if(update_value_display && update_month_display) { updateMonthlyBudget(trans->toAccount()); updateTotalMonthlyExpensesBudget(); } account_value[trans->toAccount()] += value; expenses_accounts_value += value; if(!b_filter) { account_change[trans->toAccount()] += value; expenses_accounts_change += value; if(update_value_display) { expensesItem->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(expenses_accounts_change, KGlobal::locale()->fracDigits())); } } if(update_value_display) { expensesItem->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(expenses_accounts_value, KGlobal::locale()->fracDigits()) + " "); } break; } case ACCOUNT_TYPE_INCOMES: { if(b_lastmonth) { account_month_endlast[trans->toAccount()] -= value; account_month[trans->toAccount()][*monthdate] -= value; if(update_value_display) { updateMonthlyBudget(trans->toAccount()); updateTotalMonthlyIncomesBudget(); } break; } bool update_month_display = false; if(b_firstmonth) { account_month_beginfirst[trans->toAccount()] -= value; update_month_display = true; } if(b_curmonth) { account_month_begincur[trans->toAccount()] -= value; update_month_display = true; } if(b_future || (!frommonth_begin.isNull() && transdate >= frommonth_begin) || (!prevmonth_begin.isNull() && transdate >= prevmonth_begin)) { account_month[trans->toAccount()][*monthdate] -= value; update_month_display = true; } if(update_value_display && update_month_display) { updateMonthlyBudget(trans->toAccount()); updateTotalMonthlyIncomesBudget(); } account_value[trans->toAccount()] -= value; incomes_accounts_value -= value; if(!b_filter) { account_change[trans->toAccount()] -= value; incomes_accounts_change -= value; if(update_value_display) { incomesItem->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(incomes_accounts_change, KGlobal::locale()->fracDigits())); } } if(update_value_display) { incomesItem->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(incomes_accounts_value, KGlobal::locale()->fracDigits()) + " "); } break; } case ACCOUNT_TYPE_ASSETS: { if(b_lastmonth) break; if(((AssetsAccount*) trans->toAccount())->accountType() == ASSETS_TYPE_SECURITIES) { if(update_value_display) { updateSecurityAccount((AssetsAccount*) trans->toAccount(), false); assetsItem->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_value, KGlobal::locale()->fracDigits()) + " "); assetsItem->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_change, KGlobal::locale()->fracDigits())); item_accounts[trans->toAccount()]->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(account_change[trans->toAccount()], KGlobal::locale()->fracDigits())); } break; } balto = (trans->toAccount() == budget->balancingAccount); if(!balto) { account_value[trans->toAccount()] += value; assets_accounts_value += value; if(!b_filter) { account_change[trans->toAccount()] += value; assets_accounts_change += value; if(update_value_display) { assetsItem->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_change, KGlobal::locale()->fracDigits())); item_accounts[trans->toAccount()]->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(account_change[trans->toAccount()], KGlobal::locale()->fracDigits())); } } if(update_value_display) assetsItem->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_value, KGlobal::locale()->fracDigits()) + " "); } break; } } if(update_value_display && !b_lastmonth) { if(!balfrom) { item_accounts[trans->fromAccount()]->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(account_value[trans->fromAccount()], KGlobal::locale()->fracDigits()) + " "); item_accounts[trans->fromAccount()]->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(account_change[trans->fromAccount()], KGlobal::locale()->fracDigits())); } if(!balto) { item_accounts[trans->toAccount()]->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(account_value[trans->toAccount()], KGlobal::locale()->fracDigits()) + " "); item_accounts[trans->toAccount()]->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(account_change[trans->toAccount()], KGlobal::locale()->fracDigits())); } } } void Eqonomize::updateTotalMonthlyExpensesBudget() { if(budget->expensesAccounts.count() > 0) { expenses_budget = 0.0; expenses_budget_diff = 0.0; ExpensesAccount *eaccount = budget->expensesAccounts.first(); bool b_budget = false; while(eaccount) { double d = account_budget[eaccount]; if(d >= 0.0) { expenses_budget += d; expenses_budget_diff += account_budget_diff[eaccount]; b_budget = true; } eaccount = budget->expensesAccounts.next(); } if(b_budget) { expensesItem->setText(BUDGET_COLUMN, i18nc("%1: budget; %2: remaining budget", "%2 of %1").arg(KGlobal::locale()->formatNumber(expenses_budget, KGlobal::locale()->fracDigits())).arg(KGlobal::locale()->formatNumber(expenses_budget_diff, KGlobal::locale()->fracDigits()))); return; } else { expenses_budget = -1.0; } } expensesItem->setText(BUDGET_COLUMN, "-"); } void Eqonomize::updateTotalMonthlyIncomesBudget() { if(budget->incomesAccounts.count() > 0) { incomes_budget = 0.0; incomes_budget_diff = 0.0; IncomesAccount *iaccount = budget->incomesAccounts.first(); bool b_budget = false; while(iaccount) { double d = account_budget[iaccount]; if(d >= 0.0) { incomes_budget += d; incomes_budget_diff += account_budget_diff[iaccount]; b_budget = true; } iaccount = budget->incomesAccounts.next(); } if(b_budget) { incomesItem->setText(BUDGET_COLUMN, i18nc("%1: budget; %2: remaining budget", "%2 of %1").arg(KGlobal::locale()->formatNumber(incomes_budget, KGlobal::locale()->fracDigits())).arg(KGlobal::locale()->formatNumber(incomes_budget_diff, KGlobal::locale()->fracDigits()))); return; } else { incomes_budget = -1.0; } } incomesItem->setText(BUDGET_COLUMN, "-"); } void Eqonomize::updateMonthlyBudget(Account *account) { if(account->type() == ACCOUNT_TYPE_ASSETS) return; CategoryAccount *ca = (CategoryAccount*) account; double mbudget = 0.0; QTreeWidgetItem *i = item_accounts[account]; QMap::const_iterator it = ca->mbudgets.begin(); QMap::const_iterator it_e = ca->mbudgets.end(); while(it != it_e && it.value() < 0.0) ++it; if(it == it_e || it.key() > to_date) { i->setText(BUDGET_COLUMN, "-"); account_budget[account] = -1.0; } else { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); bool after_from = false; QDate monthdate, monthend, curdate = QDate::currentDate(), curmonth, frommonth; frommonth = frommonth_begin; if(!accountsPeriodFromButton->isChecked() || frommonth <= it.key()) { after_from = true; } else { it = ca->mbudgets.find(frommonth); if(it == it_e) { QMap::const_iterator it_b = ca->mbudgets.begin(); --it; while(it != it_b) { if(frommonth > it.key()) break; --it; } } } double diff = 0.0, future_diff = 0.0, future_change_diff = 0.0, m = 0.0, v = 0.0; QDate monthlast; calSys->setYMD(monthlast, calSys->year(to_date), calSys->month(to_date), 1); QMap::const_iterator it_n = it; ++it_n; bool has_budget = false; bool b_firstmonth = !after_from && (monthdate != frommonth); monthdate = frommonth; do { m = it.value(); if(m >= 0.0) { monthend = calSys->addDays(monthdate, calSys->daysInMonth(monthdate) - 1); has_budget = true; bool b_lastmonth = (monthlast == monthdate && to_date != monthend); v = account_month[account][monthend]; if(partial_budget && (b_firstmonth || b_lastmonth)) { int day = 1; if(b_firstmonth) day = calSys->day(from_date); int dim = calSys->day(monthend); int day2 = dim; if(b_lastmonth) day2 = calSys->day(to_date); m = (m * (day2 - day + 1)) / dim; if(b_firstmonth) v -= account_month_beginfirst[account]; if(b_lastmonth) v -= account_month_endlast[account]; } mbudget += m; diff += m - v; b_firstmonth = false; } monthdate = calSys->addMonths(monthdate, 1); if(it_n != it_e && monthdate == it_n.key()) { it = it_n; ++it_n; } } while(monthdate <= monthlast); bool b_future = (curdate < to_date); curdate = calSys->addDays(curdate, 1); if(b_future) { bool after_cur = false; it = ca->mbudgets.begin(); while(it != it_e && it.value() < 0.0) ++it; if(curdate < it.key()) { curmonth = it.key(); after_cur = true; } else { calSys->setYMD(curmonth, calSys->year(curdate), calSys->month(curdate), 1); it = ca->mbudgets.find(curmonth); if(it == it_e) { QMap::const_iterator it_b = ca->mbudgets.begin(); --it; while(it != it_b) { if(curmonth > it.key()) break; --it; } } } it_n = it; ++it_n; bool had_from = after_from || from_date <= curdate; bool b_curmonth = !after_cur && (curmonth != curdate); do { m = it.value(); if(m >= 0.0) { monthend = calSys->addDays(curmonth, calSys->daysInMonth(curmonth) - 1); v = account_month[account][monthend]; bool b_lastmonth = (monthlast == curmonth && to_date != monthend); bool b_frommonth = !had_from && frommonth == curmonth; if(partial_budget && (b_curmonth || b_lastmonth || b_frommonth)) { int day = 1; if(b_curmonth) { v -= account_month_begincur[account]; day = calSys->day(curdate); } int dim = calSys->day(monthend); int day2; if(b_lastmonth) { v -= account_month_endlast[account]; day2 = calSys->day(to_date); } else { day2 = dim; } m = (m * (day2 - day + 1)) / dim; if(b_frommonth) { int day3 = calSys->day(from_date); double v3 = b_curmonth ? (account_month_beginfirst[account] - account_month_begincur[account]) : account_month_beginfirst[account]; double m3 = ((m - v) * (day3 - day + 1)) / (day2 - day + 1); if(v3 > m3) m3 = v3; double m2 = m - m3; double v2 = v - v3; if(m2 > v2) future_change_diff += m2 - v2; } } else if(b_frommonth) { int dim = calSys->day(monthend); int day = dim; if(b_lastmonth) { v -= account_month_endlast[account]; int day = calSys->day(to_date); m = (m * day) / dim; } int day2 = 1; if(b_curmonth) day2 = calSys->day(curdate); int day3 = calSys->day(from_date); double v3 = b_curmonth ? (account_month_beginfirst[account] - account_month_begincur[account]) : account_month_beginfirst[account]; double m3 = ((m - v) * (day3 - day2 + 1)) / (day - day2 + 1); if(v3 > m3) m3 = v3; double m2 = m - v - m3; double v2 = v - account_month_beginfirst[account]; if(m2 > v2) future_change_diff += m2 - v2; } else if(b_lastmonth) { v -= account_month_endlast[account]; int dim = calSys->day(monthend); int day = calSys->day(to_date); m = (m * day) / dim; } if(m > v) { future_diff += m - v; if(had_from) future_change_diff += m - v; } if(b_frommonth) had_from = true; b_curmonth = false; } curmonth = calSys->addMonths(curmonth, 1); if(it_n != it_e && curmonth == it_n.key()) { it = it_n; ++it_n; } } while(curmonth <= monthlast); } if(has_budget) { i->setText(BUDGET_COLUMN, i18nc("%1: budget; %2: remaining budget", "%2 of %1").arg(KGlobal::locale()->formatNumber(mbudget, KGlobal::locale()->fracDigits())).arg(KGlobal::locale()->formatNumber(diff, KGlobal::locale()->fracDigits()))); account_budget[account] = mbudget; account_budget_diff[account] = diff; } else { i->setText(BUDGET_COLUMN, "-"); account_budget[account] = -1.0; } double future_diff_bak = future_diff, future_diff_change_bak = future_change_diff; future_diff -= account_future_diff[account]; future_change_diff -= account_future_diff_change[account]; account_future_diff[account] = future_diff_bak; account_future_diff_change[account] = future_diff_change_bak; if(future_diff == 0.0 && future_change_diff == 0.0) return; if(budget->budgetAccount) { if(account->type() == ACCOUNT_TYPE_EXPENSES) { account_value[budget->budgetAccount] -= future_diff; account_change[budget->budgetAccount] -= future_change_diff; } else { account_value[budget->budgetAccount] += future_diff; account_change[budget->budgetAccount] += future_change_diff; } item_accounts[budget->budgetAccount]->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(account_change[budget->budgetAccount], KGlobal::locale()->fracDigits())); item_accounts[budget->budgetAccount]->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(account_value[budget->budgetAccount], KGlobal::locale()->fracDigits()) + " "); } if(account->type() == ACCOUNT_TYPE_EXPENSES) { assets_accounts_value -= future_diff; assets_accounts_change -= future_change_diff; } else { assets_accounts_value += future_diff; assets_accounts_change += future_change_diff; } assetsItem->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_value, KGlobal::locale()->fracDigits()) + " "); assetsItem->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_change, KGlobal::locale()->fracDigits())); } if(item_accounts[account] == selectedItem(accountsView)) updateBudgetEdit(); } void Eqonomize::updateBudgetEdit() { QTreeWidgetItem *i = selectedItem(accountsView); budgetEdit->blockSignals(true); budgetButton->blockSignals(true); if(i == NULL || i == assetsItem || i == incomesItem || i == expensesItem || account_items[i]->type() == ACCOUNT_TYPE_ASSETS) { budgetEdit->setValue(0.0); budgetEdit->setEnabled(false); budgetButton->setEnabled(false); if(i == incomesItem || i == expensesItem) { QDate tomonth, prevmonth_end; const KCalendarSystem *calSys = KGlobal::locale()->calendar(); calSys->setYMD(tomonth, calSys->year(to_date), calSys->month(to_date), 1); prevmonth_end = calSys->addDays(prevmonth_begin, calSys->daysInMonth(prevmonth_begin) - 1); double d_to = 0.0, d_prev = 0.0, v_prev = 0.0; CategoryAccount *ca; bool b_budget = false, b_budget_prev = false; if(i == incomesItem) ca = budget->incomesAccounts.first(); else ca = budget->expensesAccounts.first(); while(ca) { double d = ca->monthlyBudget(tomonth); if(d >= 0.0) { d_to += d; b_budget = true; } d = ca->monthlyBudget(prevmonth_begin); if(d >= 0.0) { d_prev += d; b_budget_prev = true; v_prev += account_month[ca][prevmonth_end]; } if(i == incomesItem) ca = budget->incomesAccounts.next(); else ca = budget->expensesAccounts.next(); } if(!b_budget_prev) { if(i == incomesItem) ca = budget->incomesAccounts.first(); else ca = budget->expensesAccounts.first(); while(ca) { v_prev += account_month[ca][prevmonth_end]; if(i == incomesItem) ca = budget->incomesAccounts.next(); else ca = budget->expensesAccounts.next(); } } if(!b_budget_prev) prevMonthBudgetLabel->setText(i18n("%1 (with no budget)").arg(KGlobal::locale()->formatMoney(v_prev))); else prevMonthBudgetLabel->setText(i18n("%1 (with budget %2)").arg(KGlobal::locale()->formatMoney(v_prev)).arg(KGlobal::locale()->formatMoney(d_prev))); budgetButton->setChecked(b_budget); budgetEdit->setValue(d_to); } else { budgetButton->setChecked(false); prevMonthBudgetLabel->setText("-"); } } else { CategoryAccount *ca = (CategoryAccount*) account_items[i]; QDate tomonth; const KCalendarSystem *calSys = KGlobal::locale()->calendar(); calSys->setYMD(tomonth, calSys->year(to_date), calSys->month(to_date), 1); double d = ca->monthlyBudget(tomonth); if(d < 0.0) { budgetEdit->setValue(0.0); budgetButton->setChecked(false); budgetEdit->setEnabled(false); } else { budgetEdit->setValue(d); budgetButton->setChecked(true); budgetEdit->setEnabled(true); } budgetButton->setEnabled(true); d = ca->monthlyBudget(prevmonth_begin); if(d < 0.0) prevMonthBudgetLabel->setText(i18n("%1 (with no budget)").arg(KGlobal::locale()->formatMoney(account_month[ca][calSys->addDays(prevmonth_begin, calSys->daysInMonth(prevmonth_begin) - 1)]))); else prevMonthBudgetLabel->setText(i18n("%1 (with budget %2)").arg(KGlobal::locale()->formatMoney(account_month[ca][calSys->addDays(prevmonth_begin, calSys->daysInMonth(prevmonth_begin) - 1)])).arg(KGlobal::locale()->formatMoney(d))); } budgetEdit->blockSignals(false); budgetButton->blockSignals(false); } void Eqonomize::accountsSelectionChanged() { QTreeWidgetItem *i = selectedItem(accountsView); if(i == NULL || i == assetsItem || i == incomesItem || i == expensesItem) { ActionDeleteAccount->setEnabled(false); ActionEditAccount->setEnabled(false); ActionBalanceAccount->setEnabled(false); budgetEdit->setEnabled(false); } else { ActionDeleteAccount->setEnabled(true); ActionEditAccount->setEnabled(true); ActionBalanceAccount->setEnabled(account_items[i]->type() == ACCOUNT_TYPE_ASSETS && ((AssetsAccount*) account_items[i])->accountType() != ASSETS_TYPE_SECURITIES); } ActionShowAccountTransactions->setEnabled(i != NULL && i != assetsItem); updateBudgetEdit(); } void Eqonomize::updateSecurityAccount(AssetsAccount *account, bool update_display) { double value = 0.0, value_from = 0.0; bool b_from = accountsPeriodFromButton->isChecked(); Security *security = budget->securities.first(); while(security) { if(security->account() == account) { value += security->value(to_date, true); if(b_from) value_from += security->value(from_date, true); } security = budget->securities.next(); } if(!b_from) { value_from = account->initialBalance(); } assets_accounts_value -= account_value[account]; assets_accounts_value += value; assets_accounts_change -= account_change[account]; assets_accounts_change += (value - value_from); account_value[account] = value; account_change[account] = value - value_from; if(update_display) { assetsItem->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_value, KGlobal::locale()->fracDigits()) + " "); assetsItem->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_change, KGlobal::locale()->fracDigits())); item_accounts[account]->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(value - value_from, KGlobal::locale()->fracDigits())); item_accounts[account]->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(value, KGlobal::locale()->fracDigits()) + " "); } } void Eqonomize::filterAccounts() { expenses_accounts_value = 0.0; expenses_accounts_change = 0.0; incomes_accounts_value = 0.0; incomes_accounts_change = 0.0; assets_accounts_value = 0.0; assets_accounts_change = 0.0; incomes_budget = 0.0; incomes_budget_diff = 0.0; expenses_budget = 0.0; expenses_budget_diff = 0.0; AssetsAccount *aaccount = budget->assetsAccounts.first(); while(aaccount) { if(aaccount->accountType() == ASSETS_TYPE_SECURITIES) { account_value[aaccount] = 0.0; account_change[aaccount] = 0.0; updateSecurityAccount(aaccount, false); } else { account_value[aaccount] = aaccount->initialBalance(); account_change[aaccount] = 0.0; assets_accounts_value += aaccount->initialBalance(); } aaccount = budget->assetsAccounts.next(); } const KCalendarSystem *calSys = KGlobal::locale()->calendar(); Transaction *trans = budget->transactions.first(); QDate monthdate, monthdate_begin; bool b_from = accountsPeriodFromButton->isChecked(); QDate lastmonth; calSys->setYMD(lastmonth, calSys->year(to_date), calSys->month(to_date), calSys->daysInMonth(to_date)); QDate curdate = QDate::currentDate(), curmonth, curmonth_begin; calSys->setYMD(curmonth_begin, calSys->year(curdate), calSys->month(curdate), 1); prevmonth_begin = calSys->addMonths(to_date, -1); prevmonth_begin = calSys->addDays(prevmonth_begin, -(calSys->day(prevmonth_begin) - 1)); calSys->setYMD(curmonth, calSys->year(curdate), calSys->month(curdate), calSys->daysInMonth(curdate)); frommonth_begin = QDate(); IncomesAccount *iaccount = budget->incomesAccounts.first(); while(iaccount) { account_value[iaccount] = 0.0; account_change[iaccount] = 0.0; account_month[iaccount] = QMap(); account_month[iaccount][monthdate] = 0.0; account_budget[iaccount] = -1.0; account_budget_diff[iaccount] = 0.0; account_month_beginfirst[iaccount] = 0.0; account_month_begincur[iaccount] = 0.0; account_month_endlast[iaccount] = 0.0; account_future_diff[iaccount] = 0.0; account_future_diff_change[iaccount] = 0.0; if(!iaccount->mbudgets.isEmpty() && iaccount->mbudgets.begin().value() >= 0.0 && (frommonth_begin.isNull() || iaccount->mbudgets.begin().key() < frommonth_begin)) { frommonth_begin = iaccount->mbudgets.begin().key(); } iaccount = budget->incomesAccounts.next(); } ExpensesAccount *eaccount = budget->expensesAccounts.first(); while(eaccount) { account_value[eaccount] = 0.0; account_change[eaccount] = 0.0; account_month[eaccount] = QMap(); account_month[eaccount][monthdate] = 0.0; account_budget[eaccount] = -1.0; account_budget_diff[eaccount] = 0.0; account_month_beginfirst[eaccount] = 0.0; account_month_begincur[eaccount] = 0.0; account_month_endlast[eaccount] = 0.0; account_future_diff[eaccount] = 0.0; account_future_diff_change[eaccount] = 0.0; if(!eaccount->mbudgets.isEmpty() && eaccount->mbudgets.begin().value() >= 0.0 && (frommonth_begin.isNull() || eaccount->mbudgets.begin().key() < frommonth_begin)) { frommonth_begin = eaccount->mbudgets.begin().key(); } eaccount = budget->expensesAccounts.next(); } if(frommonth_begin.isNull() || (b_from && frommonth_begin < from_date)) { if(b_from) calSys->setYMD(frommonth_begin, calSys->year(from_date), calSys->month(from_date), 1); else frommonth_begin = curmonth_begin; } if(frommonth_begin.isNull() || frommonth_begin > prevmonth_begin) { monthdate_begin = prevmonth_begin; } else { monthdate_begin = frommonth_begin; } if(monthdate_begin > curmonth_begin) monthdate_begin = curmonth_begin; monthdate = calSys->addDays(monthdate_begin, calSys->daysInMonth(monthdate_begin) - 1); bool b_future = false; bool b_past = (curdate >= to_date); if(b_past) { footer1->hide(); assetsItem->setText(0, i18n("Accounts")); if(budget->budgetAccount) { item_accounts[budget->budgetAccount]->setText(0, budget->budgetAccount->name()); } } else { footer1->show(); assetsItem->setText(0, i18n("Accounts") + "*"); if(budget->budgetAccount) { item_accounts[budget->budgetAccount]->setText(0, budget->budgetAccount->name() + "*"); } } while(trans && trans->date() <= lastmonth) { if(!b_past && !b_future && trans->date() >= curmonth_begin) b_future = true; if(!b_from || b_future || trans->date() >= frommonth_begin || trans->date() >= prevmonth_begin) { while(trans->date() > monthdate) { monthdate_begin = calSys->addMonths(monthdate_begin, 1); monthdate = calSys->addDays(monthdate_begin, calSys->daysInMonth(monthdate_begin) - 1); iaccount = budget->incomesAccounts.first(); while(iaccount) { account_month[iaccount][monthdate] = 0.0; iaccount = budget->incomesAccounts.next(); } eaccount = budget->expensesAccounts.first(); while(eaccount) { account_month[eaccount][monthdate] = 0.0; eaccount = budget->expensesAccounts.next(); } } addTransactionValue(trans, trans->date(), false, false, -1, b_future, &monthdate); } else { addTransactionValue(trans, trans->date(), false, false, -1, b_future, NULL); } trans = budget->transactions.next(); } while(lastmonth >= monthdate) { monthdate_begin = calSys->addMonths(monthdate_begin, 1); monthdate = calSys->addDays(monthdate_begin, calSys->daysInMonth(monthdate_begin) - 1); iaccount = budget->incomesAccounts.first(); while(iaccount) { account_month[iaccount][monthdate] = 0.0; iaccount = budget->incomesAccounts.next(); } eaccount = budget->expensesAccounts.first(); while(eaccount) { account_month[eaccount][monthdate] = 0.0; eaccount = budget->expensesAccounts.next(); } } ScheduledTransaction *strans = budget->scheduledTransactions.first(); while(strans && strans->transaction()->date() <= lastmonth) { addScheduledTransactionValue(strans, false, false); strans = budget->scheduledTransactions.next(); } for(QMap::Iterator it = account_items.begin(); it != account_items.end(); ++it) { switch(it.value()->type()) { case ACCOUNT_TYPE_INCOMES: {} case ACCOUNT_TYPE_EXPENSES: { updateMonthlyBudget(it.value()); break; } default: {} } } updateTotalMonthlyIncomesBudget(); updateTotalMonthlyExpensesBudget(); for(QMap::Iterator it = account_items.begin(); it != account_items.end(); ++it) { it.key()->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(account_change[it.value()], KGlobal::locale()->fracDigits())); it.key()->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(account_value[it.value()], KGlobal::locale()->fracDigits()) + " "); } incomesItem->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(incomes_accounts_value, KGlobal::locale()->fracDigits()) + " "); incomesItem->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(incomes_accounts_change, KGlobal::locale()->fracDigits())); expensesItem->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(expenses_accounts_value, KGlobal::locale()->fracDigits()) + " "); expensesItem->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(expenses_accounts_change, KGlobal::locale()->fracDigits())); assetsItem->setText(VALUE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_value, KGlobal::locale()->fracDigits()) + " "); assetsItem->setText(CHANGE_COLUMN, KGlobal::locale()->formatNumber(assets_accounts_change, KGlobal::locale()->fracDigits())); budgetMonthEdit->blockSignals(true); budgetMonthEdit->setDate(to_date); budgetMonthEdit->blockSignals(false); updateBudgetEdit(); } EqonomizeTreeWidget::EqonomizeTreeWidget(QWidget *parent) : QTreeWidget(parent) { connect(this, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(onDoubleClick(const QModelIndex&))); } EqonomizeTreeWidget::EqonomizeTreeWidget() : QTreeWidget() {} void EqonomizeTreeWidget::keyPressEvent(QKeyEvent *e) { if((e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) && currentItem()) { emit returnPressed(currentItem()); QTreeWidget::keyPressEvent(e); e->accept(); return; } QTreeWidget::keyPressEvent(e); } void EqonomizeTreeWidget::onDoubleClick(const QModelIndex &mi) { QModelIndex mip = mi.parent(); QTreeWidgetItem *i = NULL; if(mip.isValid()) { i = topLevelItem(mip.row())->child(mi.row()); } else { i = topLevelItem(mi.row()); } if(i) emit doubleClicked(i, mi.column()); } QIFWizardPage::QIFWizardPage() : QWizardPage() { is_complete = false; } bool QIFWizardPage::isComplete() const {return is_complete;} void QIFWizardPage::setComplete(bool b) {is_complete = b; emit completeChanged();} #include "eqonomize.moc" eqonomize-0.6/src/eqonomize.desktop0000644000175000017500000000100411106570612016503 0ustar hannahanna[Desktop Entry] Encoding=UTF-8 Name=Eqonomize! GenericName=Personal Accounting GenericName[sv]=Bokföring GenericName[de]=Buchhaltung Exec=eqonomize %i %m -caption "%c" Icon=eqonomize Type=Application MimeType=application/x-eqonomize DocPath=eqonomize/index.html Categories=Qt;KDE;Office;Finance Terminal=false X-DCOP-ServiceType=Unique X-DCOP-ServiceName=eqonomize X-KDE-StartupNotify=true Comment=Manage your peronal finances Comment[sv]=Hantera din privatekonomi Comment[de]=Verwaltung der persönlichen Finanzen eqonomize-0.6/src/eqonomize.h0000600000175000017500000005042111106576734015273 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EQONOMIZE_H #define EQONOMIZE_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class Budget; class Transaction; class ScheduledTransaction; class SplitTransaction; class Account; class AssetsAccount; class IncomesAccount; class ExpensesAccount; class KLineEdit; class KDateEdit; class KComboBox; class QPushButton; class QLabel; class QCheckBox; class KPageWidget; class KPageWidgetItem; class QRadioButton; class TransactionListWidget; class KAction; class QAction; class KSelectAction; class KToggleAction; class KRecentFilesAction; class QMenu; class KMenu; class Expense; class Income; class Transfer; class ConfirmScheduleListViewItem; class EqonomizeValueEdit; class KTextEdit; class Security; class ReinvestedDividend; class SecurityTrade; class QSpinBox; class QTabWidget; class EqonomizeMonthSelector; class KToolBar; class QVBoxLayout; class KAutoSaveFile; typedef enum { INITIAL_PERIOD_CURRENT_MONTH, INITIAL_PERIOD_CURRENT_YEAR, INITIAL_PERIOD_CURRENT_WHOLE_MONTH, INITIAL_PERIOD_CURRENT_WHOLE_YEAR, INITIAL_PERIOD_LAST } InitialPeriod; class Eqonomize : public KXmlGuiWindow { Q_OBJECT public: Eqonomize(); virtual ~Eqonomize(); bool saveURL(const KUrl& url); bool askSave(bool before_exit = false); void createDefaultBudget(); void readFileDependentOptions(); Budget *budget; bool first_run; void appendFilterExpense(Expense *expense, bool update_total_cost, bool update_accounts); void appendFilterIncome(Income *income, bool update_total_income, bool update_accounts); void appendFilterTransfer(Transfer *transfer, bool update_total_amount, bool update_accounts); bool filterTransaction(Transaction *trans); void subtractScheduledTransactionValue(ScheduledTransaction *strans, bool update_value_display); void addScheduledTransactionValue(ScheduledTransaction *strans, bool update_value_display, bool subtract = false); void subtractTransactionValue(Transaction *trans, bool update_value_display); void addTransactionValue(Transaction *trans, const QDate &transdate, bool update_value_display, bool subtract = false, int n = -1, int b_future = -1, const QDate *monthdate = NULL); void appendIncomesAccount(IncomesAccount *account); void appendExpensesAccount(ExpensesAccount *account); void appendAssetsAccount(AssetsAccount *account); void updateMonthlyBudget(Account *account); void updateTotalMonthlyExpensesBudget(); void updateTotalMonthlyIncomesBudget(); bool editAccount(Account*); bool editAccount(Account*, QWidget *parent); void balanceAccount(Account*); bool checkSchedule(bool update_display); void updateScheduledTransactions(); void appendScheduledTransaction(ScheduledTransaction *strans); bool editScheduledTransaction(ScheduledTransaction *strans); bool editScheduledTransaction(ScheduledTransaction *strans, QWidget *parent); bool editOccurrence(ScheduledTransaction *strans, const QDate &date); bool editOccurrence(ScheduledTransaction *strans, const QDate &date, QWidget *parent); bool editTransaction(Transaction *trans, QWidget *parent); bool editTransaction(Transaction *trans); bool removeScheduledTransaction(ScheduledTransaction *strans); bool removeOccurrence(ScheduledTransaction *strans, const QDate &date); bool newScheduledTransaction(int transaction_type, Security *security = NULL, bool select_security = false); bool newScheduledTransaction(int transaction_type, Security *security, bool select_security, QWidget *parent, Account *account = NULL); bool newSplitTransaction(QWidget *parent, AssetsAccount *account = NULL); bool editSplitTransaction(SplitTransaction *split); bool editSplitTransaction(SplitTransaction *split, QWidget *parent); bool splitUpTransaction(SplitTransaction *split); bool removeSplitTransaction(SplitTransaction *split); bool saveView(QTextStream &file, int fileformat); bool exportScheduleList(QTextStream &outf, int fileformat); bool exportAccountsList(QTextStream &outf, int fileformat); bool exportSecuritiesList(QTextStream &outf, int fileformat); void editSecurity(QTreeWidgetItem *i); void appendSecurity(Security *security); void updateSecurity(Security *security); void updateSecurity(QTreeWidgetItem *i); void updateSecurityAccount(AssetsAccount *account, bool update_display = true); bool editReinvestedDividend(ReinvestedDividend *rediv, Security *security, QWidget *parent); void editReinvestedDividend(ReinvestedDividend *rediv, Security *security); bool editSecurityTrade(SecurityTrade *ts, QWidget *parent); void editSecurityTrade(SecurityTrade *ts); void setModified(bool has_been_modified = true); void showExpenses(); void showIncomes(); void showTransfers(); void updateSecuritiesStatistics(); bool crashRecovery(KUrl url); bool newRefundRepayment(Transaction *trans); void readOptions(); QAction *ActionAP_1, *ActionAP_2, *ActionAP_3, *ActionAP_4, *ActionAP_5, *ActionAP_6, *ActionAP_7, *ActionAP_8; KAction *ActionEditSchedule, *ActionEditOccurrence, *ActionDeleteSchedule, *ActionDeleteOccurrence; KAction *ActionAddAccount, *ActionNewAssetsAccount, *ActionNewIncomesAccount, *ActionNewExpensesAccount, *ActionEditAccount, *ActionDeleteAccount, *ActionBalanceAccount; KAction *ActionShowAccountTransactions; KAction *ActionNewExpense, *ActionNewIncome, *ActionNewTransfer, *ActionNewSplitTransaction; KAction *ActionEditTransaction, *ActionEditScheduledTransaction, *ActionEditSplitTransaction; KAction *ActionJoinTransactions, *ActionSplitUpTransaction; KAction *ActionDeleteTransaction, *ActionDeleteScheduledTransaction, *ActionDeleteSplitTransaction; KAction *ActionNewSecurity, *ActionEditSecurity, *ActionBuyShares, *ActionSellShares, *ActionNewDividend, *ActionNewReinvestedDividend, *ActionNewSecurityTrade, *ActionSetQuotation, *ActionEditQuotations, *ActionEditSecurityTransactions, *ActionDeleteSecurity; KAction *ActionNewRefund, *ActionNewRepayment, *ActionNewRefundRepayment; KAction *ActionSave, *ActionFileReload, *ActionSaveView, *ActionPrintView; KAction *ActionOverTimeReport, *ActionCategoriesComparisonReport, *ActionOverTimeChart, *ActionCategoriesComparisonChart; KAction *ActionImportCSV, *ActionImportQIF, *ActionExportQIF; KSelectAction *ActionSelectInitialPeriod; KToggleAction *ActionExtraProperties; KRecentFilesAction *ActionOpenRecent; protected: void setupActions(); void saveOptions(); bool queryClose(); bool queryExit(); void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); KUrl current_url; double period_months, from_to_months; bool modified, modified_auto_save, auto_save_timeout; QDate from_date, to_date, frommonth_begin, prevmonth_begin; QDate securities_from_date, securities_to_date; QDate prev_cur_date; bool partial_budget; bool b_extra; KAutoSaveFile *cr_tmp_file; KToolBar *scheduleButtons, *securitiesButtons; KPageWidget *tabs; QTabWidget *accountsTabs; QCheckBox *budgetButton; EqonomizeValueEdit *budgetEdit; EqonomizeMonthSelector *budgetMonthEdit; QLabel *prevMonthBudgetLabel; QWidget *accounts_page, *expenses_page, *incomes_page, *transfers_page, *securities_page, *schedule_page; KPageWidgetItem *accounts_page_item, *expenses_page_item, *incomes_page_item, *transfers_page_item, *securities_page_item, *schedule_page_item; QVBoxLayout *expensesLayout, *incomesLayout, *transfersLayout; TransactionListWidget *expensesWidget, *incomesWidget, *transfersWidget; QTreeWidget *accountsView, *securitiesView, *scheduleView; QTreeWidgetItem *assetsItem, *incomesItem, *expensesItem; QCheckBox *accountsPeriodFromButton; KDateEdit *accountsPeriodFromEdit, *accountsPeriodToEdit; QCheckBox *partialBudgetButton; KComboBox *accountsPeriodCombo; QCheckBox *securitiesPeriodFromButton; KDateEdit *securitiesPeriodFromEdit, *securitiesPeriodToEdit; QPushButton *newScheduleButton, *editScheduleButton, *removeScheduleButton; QMenu *editScheduleMenu, *removeScheduleMenu; QPushButton *newSecurityTransactionButton, *newSecurityButton, *setQuotationButton; QLabel *securitiesStatLabel; QLabel *footer1; double total_value, total_cost, total_profit, total_rate; double expenses_accounts_value, incomes_accounts_value, assets_accounts_value; double expenses_accounts_change, incomes_accounts_change, assets_accounts_change; double expenses_budget, expenses_budget_diff, incomes_budget, incomes_budget_diff; QMap account_value; QMap account_change; QMap > account_month; QMap account_month_begincur; QMap account_month_beginfirst; QMap account_month_endlast; QMap account_budget; QMap account_budget_diff; QMap account_future_diff; QMap account_future_diff_change; QMap account_items; QMap item_accounts; QMenu *accountPopupMenu, *securitiesPopupMenu, *schedulePopupMenu; public slots: void saveCrashRecovery(); void autoSave(); void onAutoSaveTimeout(); void useExtraProperties(bool); void importCSV(); void importQIF(); void exportQIF(); void reloadBudget(); void showOverTimeReport(); void overTimeReportClosed(); void showCategoriesComparisonReport(); void overTimeChartClosed(); void showOverTimeChart(); void categoriesComparisonReportClosed(); void showCategoriesComparisonChart(); void categoriesComparisonChartClosed(); void printView(); void saveView(); void ledgerClosed(); void newSecurity(); void editSecurity(); void deleteSecurity(); void buySecurities(); void sellSecurities(); void newDividend(); void newReinvestedDividend(); void newSecurityTrade(); void setQuotation(); void editQuotations(); void editSecurityTransactions(); void securitiesSelectionChanged(); void securitiesExecuted(QTreeWidgetItem*); void securitiesExecuted(QTreeWidgetItem*, int); void popupSecuritiesMenu(const QPoint&); void updateSecurities(); void newSplitTransaction(); void newScheduledExpense(); void newScheduledIncome(); void newScheduledTransfer(); void editScheduledTransaction(); void editOccurrence(); void removeScheduledTransaction(); void removeOccurrence(); void scheduleSelectionChanged(); void scheduleExecuted(QTreeWidgetItem*); void popupScheduleMenu(const QPoint&); void editSelectedScheduledTransaction(); void editSelectedTransaction(); void editSelectedSplitTransaction(); void deleteSelectedScheduledTransaction(); void deleteSelectedTransaction(); void deleteSelectedSplitTransaction(); void joinSelectedTransactions(); void splitUpSelectedTransaction(); void newRefund(); void newRepayment(); void newRefundRepayment(); void onPageChange(KPageWidgetItem*, KPageWidgetItem*); void onPageChange(QWidget*); void showAccountTransactions(bool = false); void updateTransactionActions(); void openURL(const KUrl&); void fileNew(); void fileOpen(); void fileOpenRecent(const KUrl&); void fileReload(); void fileSave(); void fileSaveAs(); void optionsPreferences(); void checkSchedule(); void checkDate(); void popupAccountsMenu(const QPoint&); void addAccount(); void newAssetsAccount(); void newIncomesAccount(); void newExpensesAccount(); void accountExecuted(QTreeWidgetItem*, int); void accountExecuted(QTreeWidgetItem*); void balanceAccount(); void editAccount(); void deleteAccount(); void accountsSelectionChanged(); void setPartialBudget(bool); void budgetEditReturnPressed(); void budgetMonthChanged(const QDate&); void budgetChanged(double); void budgetToggled(bool); void updateBudgetEdit(); void accountsPeriodFromChanged(const QDate&); void accountsPeriodToChanged(const QDate&); void periodSelected(QAction*); void prevMonth(); void nextMonth(); void currentMonth(); void prevYear(); void nextYear(); void currentYear(); void securitiesPeriodFromChanged(const QDate&); void securitiesPeriodToChanged(const QDate&); void securitiesPrevMonth(); void securitiesNextMonth(); void securitiesCurrentMonth(); void securitiesPrevYear(); void securitiesNextYear(); void securitiesCurrentYear(); void transactionAdded(Transaction*); void transactionModified(Transaction*, Transaction*); void transactionRemoved(Transaction*); void scheduledTransactionAdded(ScheduledTransaction*); void scheduledTransactionModified(ScheduledTransaction*, ScheduledTransaction*); void scheduledTransactionRemoved(ScheduledTransaction*); void scheduledTransactionRemoved(ScheduledTransaction*, ScheduledTransaction*); void splitTransactionAdded(SplitTransaction*); void splitTransactionRemoved(SplitTransaction*); void filterAccounts(); signals: void accountsModified(); void transactionsModified(); void budgetUpdated(); void timeToSaveConfig(); }; class ConfirmScheduleDialog : public KDialog { Q_OBJECT protected: QTreeWidget *transactionsView; Budget *budget; bool b_extra; QPushButton *editButton, *removeButton, *postponeButton; ConfirmScheduleListViewItem *current_item; int current_index; public: ConfirmScheduleDialog(bool extra_parameters, Budget *budg, QWidget *parent, QString title); Transaction *firstTransaction(); Transaction *nextTransaction(); public slots: void transactionSelectionChanged(); void remove(); void edit(); void postpone(); void updateTransactions(); }; class EditAssetsAccountDialog : public KDialog { Q_OBJECT protected: KLineEdit *nameEdit; EqonomizeValueEdit *valueEdit; KTextEdit *descriptionEdit; KComboBox *typeCombo; QCheckBox *budgetButton; Budget *budget; Account *current_account; public: EditAssetsAccountDialog(Budget *budg, QWidget *parent, QString title); AssetsAccount *newAccount(); void modifyAccount(AssetsAccount *account); void setAccount(AssetsAccount *account); protected slots: void typeActivated(int); void slotButtonClicked(int); }; class EditExpensesAccountDialog : public KDialog { Q_OBJECT protected: KLineEdit *nameEdit; EqonomizeValueEdit *budgetEdit; KTextEdit *descriptionEdit; QCheckBox *budgetButton; Budget *budget; Account *current_account; public: EditExpensesAccountDialog(Budget *budg, QWidget *parent, QString title); ExpensesAccount *newAccount(); void modifyAccount(ExpensesAccount *account); void setAccount(ExpensesAccount *account); protected slots: void budgetEnabled(bool); void slotButtonClicked(int); }; class EditIncomesAccountDialog : public KDialog { Q_OBJECT protected: KLineEdit *nameEdit; EqonomizeValueEdit *budgetEdit; KTextEdit *descriptionEdit; QCheckBox *budgetButton; Budget *budget; Account *current_account; public: EditIncomesAccountDialog(Budget *budg, QWidget *parent, QString title); IncomesAccount *newAccount(); void modifyAccount(IncomesAccount *account); void setAccount(IncomesAccount *account); protected slots: void budgetEnabled(bool); void slotButtonClicked(int); }; class EditSecurityDialog : public KDialog { Q_OBJECT protected: KLineEdit *nameEdit; KTextEdit *descriptionEdit; EqonomizeValueEdit *sharesEdit, *quotationEdit; KDateEdit *quotationDateEdit; KComboBox *typeCombo, *accountCombo; QSpinBox *decimalsEdit; QLabel *quotationLabel, *quotationDateLabel; Budget *budget; QVector accounts; public: EditSecurityDialog(Budget *budg, QWidget *parent, QString title); Security *newSecurity(); bool modifySecurity(Security *security); void setSecurity(Security *security); bool checkAccount(); protected slots: void decimalsChanged(int); }; class EditQuotationsDialog : public KDialog { Q_OBJECT protected: QLabel *titleLabel; QTreeWidget *quotationsView; EqonomizeValueEdit *quotationEdit; KDateEdit *dateEdit; QPushButton *changeButton, *addButton, *deleteButton; public: EditQuotationsDialog(QWidget *parent); void setSecurity(Security *security); void modifyQuotations(Security *security); protected slots: void onSelectionChanged(); void addQuotation(); void changeQuotation(); void deleteQuotation(); }; class RefundDialog : public KDialog { Q_OBJECT protected: Transaction *transaction; EqonomizeValueEdit *valueEdit, *quantityEdit; KDateEdit *dateEdit; KComboBox *accountCombo; KLineEdit *commentsEdit; public: RefundDialog(Transaction *trans, QWidget *parent); Transaction *createRefund(); bool validValues(); protected slots: void slotButtonClicked(int); }; class EditReinvestedDividendDialog : public KDialog { Q_OBJECT protected: Budget *budget; KComboBox *securityCombo; EqonomizeValueEdit *sharesEdit; KDateEdit *dateEdit; public: EditReinvestedDividendDialog(Budget *budg, Security *sec, bool select_security, QWidget *parent); Security *selectedSecurity(); void securityChanged(); void setDividend(ReinvestedDividend *rediv); bool modifyDividend(ReinvestedDividend *rediv); ReinvestedDividend *createDividend(); bool validValues(); protected slots: void slotButtonClicked(int); }; class EditSecurityTradeDialog : public KDialog { Q_OBJECT protected: Budget *budget; KComboBox *fromSecurityCombo, *toSecurityCombo; EqonomizeValueEdit *valueEdit, *fromSharesEdit, *toSharesEdit; KDateEdit *dateEdit; public: EditSecurityTradeDialog(Budget *budg, Security *sec, QWidget *parent); void setSecurityTrade(SecurityTrade *ts); SecurityTrade *createSecurityTrade(); bool validValues(); bool checkSecurities(); protected slots: void slotButtonClicked(int); void maxShares(); Security *selectedFromSecurity(); Security *selectedToSecurity(); void fromSecurityChanged(); void toSecurityChanged(); }; class SecurityTransactionsDialog : public KDialog { Q_OBJECT protected: Security *security; Eqonomize *mainWin; QTreeWidget *transactionsView; QPushButton *editButton, *removeButton; void updateTransactions(); public: SecurityTransactionsDialog(Security *sec, Eqonomize *parent, QString title); protected slots: void remove(); void edit(); void edit(QTreeWidgetItem*); void transactionSelectionChanged(); }; class EqonomizeTreeWidget : public QTreeWidget { Q_OBJECT public: EqonomizeTreeWidget(QWidget *parent); EqonomizeTreeWidget(); protected slots: void keyPressEvent(QKeyEvent*); void onDoubleClick(const QModelIndex&); signals: void returnPressed(QTreeWidgetItem*); void doubleClicked(QTreeWidgetItem*, int); }; class QIFWizardPage : public QWizardPage { protected: bool is_complete; public: QIFWizardPage(); bool isComplete() const; void setComplete(bool b); }; #endif eqonomize-0.6/src/eqonomizemonthselector.cpp0000644000175000017500000001035311106576740020442 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "eqonomizemonthselector.h" #include #include #include #include #include #include #include #include EqonomizeMonthSelector::EqonomizeMonthSelector(QWidget *parent) : QWidget(parent) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); d_date = QDate::currentDate(); calSys->setYMD(d_date, calSys->year(d_date), calSys->month(d_date), 1); QHBoxLayout *layout = new QHBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); monthCombo = new KComboBox(this); monthCombo->setEditable(false); layout->addWidget(monthCombo); yearEdit = new QSpinBox(this); yearEdit->setRange(0, 4000); yearEdit->setValue(calSys->year(d_date)); layout->addWidget(yearEdit); updateMonths(); monthCombo->setCurrentIndex(calSys->month(d_date) - 1); connect(yearEdit, SIGNAL(valueChanged(int)), this, SLOT(onYearChanged(int))); connect(monthCombo, SIGNAL(activated(int)), this, SLOT(onMonthChanged(int))); } EqonomizeMonthSelector::~EqonomizeMonthSelector() {} QDate EqonomizeMonthSelector::date() const {return d_date;} void EqonomizeMonthSelector::onYearChanged(int year) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); calSys->setYMD(d_date, year, calSys->month(d_date), 1); updateMonths(); emit yearChanged(d_date); emit dateChanged(d_date); } void EqonomizeMonthSelector::onMonthChanged(int month) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); calSys->setYMD(d_date, calSys->year(d_date), month + 1, 1); emit monthChanged(d_date); emit dateChanged(d_date); } void EqonomizeMonthSelector::setDate(const QDate &newdate) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); if(newdate.isValid()) { calSys->setYMD(d_date, calSys->year(newdate), calSys->month(newdate), 1); yearEdit->blockSignals(true); yearEdit->setValue(calSys->year(newdate)); yearEdit->blockSignals(false); monthCombo->blockSignals(true); updateMonths(); monthCombo->setCurrentIndex(calSys->month(d_date) - 1); monthCombo->blockSignals(false); } } void EqonomizeMonthSelector::updateMonths() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); int months = calSys->monthsInYear(d_date); int year = calSys->year(d_date); monthCombo->blockSignals(true); if(monthCombo->count() != 12 || KGlobal::locale()->calendarType() != "gregorian") { monthCombo->clear(); for(int i = 1; i <= months; i++) { monthCombo->addItem(calSys->monthName(i, year)); } monthCombo->setCurrentIndex(calSys->month(d_date) - 1); } monthCombo->blockSignals(false); } void EqonomizeMonthSelector::focusMonth() {monthCombo->setFocus();} void EqonomizeMonthSelector::focusYear() {yearEdit->setFocus();} #include "eqonomizemonthselector.moc" eqonomize-0.6/src/eqonomizemonthselector.h0000644000175000017500000000420111106576744020106 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EQONOMIZE_MONTH_SELECTOR_H #define EQONOMIZE_MONTH_SELECTOR_H #include #include class QSpinBox; class QComboBox; class EqonomizeMonthSelector : public QWidget { Q_OBJECT public: EqonomizeMonthSelector(QWidget *parent); ~EqonomizeMonthSelector(); QDate date() const; protected: QComboBox *monthCombo; QSpinBox *yearEdit; QDate d_date; void updateMonths(); public slots: void setDate(const QDate&); void focusMonth(); void focusYear(); protected slots: void onYearChanged(int); void onMonthChanged(int); signals: void dateChanged(const QDate&); void yearChanged(const QDate&); void monthChanged(const QDate&); }; #endif eqonomize-0.6/src/eqonomizeui.rc0000644000175000017500000000413011041312441015767 0ustar hannahanna &Import &Accounts &Transactions &Securities Stat&istics eqonomize-0.6/src/eqonomizevalueedit.cpp0000600000175000017500000002107311106576751017531 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "eqonomizevalueedit.h" #include #include #include #include #include #include #include #include #include class Eqonomize_QSpinBox : public QSpinBox { public: Eqonomize_QSpinBox(int lower, int upper, int value, QWidget *parent) : QSpinBox(parent) { setRange(lower, upper); setValue(value); } QLineEdit *lineEdit() const { return QAbstractSpinBox::lineEdit(); } }; class Eqonomize_KDoubleSpinBox : public QDoubleSpinBox { public: Eqonomize_KDoubleSpinBox(double lower, double upper, double step, double value, int precision, QWidget *parent) : QDoubleSpinBox(parent) { setRange(lower, upper); setSingleStep(step); setValue(value); setDecimals(precision); } QLineEdit *lineEdit() const { return QAbstractSpinBox::lineEdit(); } }; EqonomizeValueEdit::EqonomizeValueEdit(bool allow_negative, QWidget *parent) : QWidget(parent) { layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); init(allow_negative ? INT_MIN / pow(10, KGlobal::locale()->fracDigits()) + 1.0 : 0.0, INT_MAX / pow(10, KGlobal::locale()->fracDigits()) - 1.0, 1.0, 0.0, KGlobal::locale()->fracDigits(), true); } EqonomizeValueEdit::EqonomizeValueEdit(double value, bool allow_negative, bool show_currency, QWidget *parent) : QWidget(parent) { layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); init(allow_negative ? INT_MIN / pow(10, KGlobal::locale()->fracDigits()) + 1.0 : 0.0, INT_MAX / pow(10, KGlobal::locale()->fracDigits()) - 1.0, 1.0, value, KGlobal::locale()->fracDigits(), show_currency); } EqonomizeValueEdit::EqonomizeValueEdit(double value, int precision, bool allow_negative, bool show_currency, QWidget *parent) : QWidget(parent) { layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); init(allow_negative ? INT_MIN / pow(10, precision) + 1.0 : 0.0, INT_MAX / pow(10, precision) - 1.0, 1.0, value, precision, show_currency); } EqonomizeValueEdit::EqonomizeValueEdit(double lower, double upper, double step, double value, int precision, bool show_currency, QWidget *parent) : QWidget(parent) { layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); init(lower, upper, step, value, precision, show_currency); } EqonomizeValueEdit::~EqonomizeValueEdit() {} void EqonomizeValueEdit::init(double lower, double upper, double step, double value, int precision, bool show_currency) { i_precision = precision; if(i_precision > 0) { valueEdit = new Eqonomize_KDoubleSpinBox(lower, upper, step, value, precision, this); lineEdit()->setAlignment(Qt::AlignRight); } else { valueEdit = new Eqonomize_QSpinBox((int) round(lower), (int) round(upper), (int) round(step), this); lineEdit()->setAlignment(Qt::AlignRight); setValue(value); } layout->addWidget(valueEdit); valueEdit->show(); setFocusProxy(valueEdit); if(show_currency) { if(KGlobal::locale()->positivePrefixCurrencySymbol() && KGlobal::locale()->negativePrefixCurrencySymbol()) { if(i_precision > 0) ((QDoubleSpinBox*) valueEdit)->setPrefix(KGlobal::locale()->currencySymbol() + " "); else ((QSpinBox*) valueEdit)->setPrefix(KGlobal::locale()->currencySymbol() + " "); } else { if(i_precision > 0) ((QDoubleSpinBox*) valueEdit)->setSuffix(QString(" ") + KGlobal::locale()->currencySymbol()); else ((QSpinBox*) valueEdit)->setSuffix(QString(" ") + KGlobal::locale()->currencySymbol()); } } if(i_precision > 0) { connect((QDoubleSpinBox*) valueEdit, SIGNAL(valueChanged(double)), this, SIGNAL(valueChanged(double))); } else { connect((QSpinBox*) valueEdit, SIGNAL(valueChanged(int)), this, SLOT(onValueChanged(int))); } connect(valueEdit, SIGNAL(editingFinished()), this, SLOT(onEditingFinished())); } void EqonomizeValueEdit::onEditingFinished() { if(hasFocus()) emit returnPressed(); } QLineEdit *EqonomizeValueEdit::lineEdit() const { if(i_precision > 0) return ((Eqonomize_KDoubleSpinBox*) valueEdit)->lineEdit(); return ((Eqonomize_QSpinBox*) valueEdit)->lineEdit(); } void EqonomizeValueEdit::selectAll() { lineEdit()->selectAll(); } double EqonomizeValueEdit::value() const { if(i_precision > 0) return ((QDoubleSpinBox*) valueEdit)->value(); else return (double) ((QSpinBox*) valueEdit)->value(); } double EqonomizeValueEdit::maxValue() const { if(i_precision > 0) return ((QDoubleSpinBox*) valueEdit)->maximum(); else return (double) ((QSpinBox*) valueEdit)->maximum(); } void EqonomizeValueEdit::onValueChanged(int) { emit valueChanged((double) ((QSpinBox*) valueEdit)->value()); } void EqonomizeValueEdit::setValue(double d_value) { if(i_precision > 0) ((QDoubleSpinBox*) valueEdit)->setValue(d_value); else ((QSpinBox*) valueEdit)->setValue((int) round(d_value)); } void EqonomizeValueEdit::setMaxValue(double d_value) { if(i_precision > 0) ((QDoubleSpinBox*) valueEdit)->setMaximum(d_value); else ((QSpinBox*) valueEdit)->setMaximum((int) round(d_value)); } void EqonomizeValueEdit::setRange(double lower, double upper, double step, int precision) { if(precision != i_precision && (precision == 0 || i_precision == 0)) { double d_value = value(); bool show_currency = false; if(i_precision > 0) show_currency = !((QDoubleSpinBox*) valueEdit)->prefix().isEmpty() || !((QDoubleSpinBox*) valueEdit)->suffix().isEmpty(); else show_currency = !((QSpinBox*) valueEdit)->prefix().isEmpty() || !((QSpinBox*) valueEdit)->suffix().isEmpty(); delete valueEdit; init(lower, upper, step, d_value, precision, show_currency); return; } i_precision = precision; if(i_precision > 0) { ((QDoubleSpinBox*) valueEdit)->setRange(lower, upper); ((QDoubleSpinBox*) valueEdit)->setSingleStep(step); ((QDoubleSpinBox*) valueEdit)->setDecimals(precision); } else { ((QSpinBox*) valueEdit)->setRange((int) round(lower), (int) round(upper)); } } void EqonomizeValueEdit::setPrecision(int precision) { if(precision == i_precision) return; if(precision == 0 || i_precision == 0) { double d_value = value(); bool show_currency = false; if(i_precision > 0) show_currency = !((QDoubleSpinBox*) valueEdit)->prefix().isEmpty() || !((QDoubleSpinBox*) valueEdit)->suffix().isEmpty(); else show_currency = !((QSpinBox*) valueEdit)->prefix().isEmpty() || !((QSpinBox*) valueEdit)->suffix().isEmpty(); bool b_neg = false; double d_step; if(i_precision > 0) { b_neg = ((QDoubleSpinBox*) valueEdit)->minimum() < 0.0; d_step = ((QDoubleSpinBox*) valueEdit)->singleStep(); } else { b_neg = ((QSpinBox*) valueEdit)->minimum() < 0; d_step = ((QSpinBox*) valueEdit)->singleStep(); } delete valueEdit; init(b_neg ? INT_MIN / pow(10, precision) + 1.0 : 0.0, INT_MAX / pow(10, precision) - 1.0, d_step, d_value, precision, show_currency); } else { bool b_neg = ((QDoubleSpinBox*) valueEdit)->minimum() < 0.0; double d_step = ((QDoubleSpinBox*) valueEdit)->singleStep(); i_precision = precision; ((QDoubleSpinBox*) valueEdit)->setRange(b_neg ? INT_MIN / pow(10, precision) + 1.0 : 0.0, INT_MAX / pow(10, precision) - 1.0); ((QDoubleSpinBox*) valueEdit)->setSingleStep(d_step); ((QDoubleSpinBox*) valueEdit)->setDecimals(precision); } } #include "eqonomizevalueedit.moc" eqonomize-0.6/src/eqonomizevalueedit.h0000600000175000017500000000533511106576754017204 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EQONOMIZE_VALUE_EDIT_H #define EQONOMIZE_VALUE_EDIT_H #include #include class QAbstractSpinBox; class QLineEdit; class EqonomizeValueEdit : public QWidget { Q_OBJECT public: EqonomizeValueEdit(bool allow_negative = true, QWidget *parent = 0); EqonomizeValueEdit(double value, bool allow_negative, bool show_currency, QWidget *parent = 0); EqonomizeValueEdit(double value, int precision, bool allow_negative, bool show_currency, QWidget *parent = 0); EqonomizeValueEdit(double lower, double upper, double step, double value, int precision = 2, bool show_currency = false, QWidget *parent = 0); ~EqonomizeValueEdit(); void init(double lower, double upper, double step, double value, int precision, bool show_currency); double value() const; double maxValue() const; void setRange(double lower, double upper, double step, int precision); void setPrecision(int precision); QLineEdit *lineEdit() const; protected: QAbstractSpinBox *valueEdit; QVBoxLayout *layout; int i_precision; protected slots: void onValueChanged(int); void onEditingFinished(); public slots: void setValue(double d_value); void setMaxValue(double d_value); void selectAll(); signals: void valueChanged(double); void returnPressed(); }; #endif eqonomize-0.6/src/hi128-app-eqonomize.png0000644000175000017500000002177010476224160017244 0ustar hannahannaPNG  IHDR>asBIT|dtEXtSoftwarewww.inkscape.org< IDATx{U4I:!yBb!FT.gTt1(gFw?| #*Byx5"! $NgtGuuSu^]_SUvUk^k]JD8/nQ.2Ge 2Qx(̑ JVɦ\WqiyyoBb(\ |LDRhKÈD _PU"lqׯVТZ[xCDci'^o_c7DӢ_Wyް8szR"wr{/E~/PY&_oޛ #/fʔ)rԏRíSQ(pkK}OTJ+i9_ 6t.|y_R*JE'"x!H!MXIԺs}֗(0ie[y?@kk"|&:Q5[IjQy~w/ p30nB^߸g٭R?lF%hh4T%PVOoy\K2..d22ڏ[QJ}X:޺D$$6BFC^ rqnz6}/*|z7ķ!1ecRR+R(6(:p )ӮS/^<M)uRL أfzz3Pb#o^,ֺQp݉%2Cq2Kw/r>,"q!N4/4 4:$[rFsMi`@)58A".XG%M842\g23GMQAex %Y{u'ΜϏnO(>*"wĵ0!x'`bZ=D2Q#f.>\/d&0eҙLta݂@{l)mv%HL0qB4h J񓯎߹sJ7׊Ƞi"kt#ai2Rj,aZ`.drh@25xE(!ܐPP=R}C~MWdq©sq]H+S_q?YjXe"Ѵո]mGusTK\*49l :1[Z&0X8?vŸq ( Aa(AQQ 8Z!'t{hpD_ܕw̓.pzm{–-[L=v{m(TػjD!Lj1ǃ FR-qxk?Wr섉L0e Cxi(Af}ͧK}8 i}lJ@Y<mK4tH~4$4 gD 0o;yob_֮ y4xߐ ]BoXu@Q(P@Qiי# B-I 5 a`#0T)_P> :hJK}!y)(;7#: /W: xBrBAa_GAPBa^MwjvS(R(P,iEL.|oI5[E EK=}X~K I~FCcz/l5a_]jC* :pXrFN}uRtwi|kcu v'T0"R{\umILOObj.DPрCO?;7) R@˩.WaL-4XVxu|=~7HB{6,^]4?5,0 !Qbs&j_>X-SiH?˯Ӧe=} 6oլ]S$OwQI"ADzm@x QqX/ B('8wvSTj(J/\)S;E@o̳E֬ eLu;G ٱu(L>`̱Wa 'G*:luԇJf9^ʼn3]ɳn]kdkBA1BRD(fY-b$YtI!_![vI6I6 uԏ@)u>>qyű&Q E:ʕD~/@ e R9ǭn mq#.j~j66F:ձ&#p_ ;޽[#ܻS( 'K=d29Qأ8CFoG ,Adc^9x mR3srioWa^ss߰IO|bNh&'쫒]T0єy74 hVPNa_Prϊ6e'~R ~  ľ$0B@ =9-c:AS<\hkSں#3I&` ^vvϟ~hR)X;VEORv=Cu׉H߰[} !"~{۽kߴaSHwyK6D' فNn)u]@Q8 dOKry?ܠن * s.#_D+pjݯ؁7s-0PG EZ\\#m4/<|Qh(C52V[Ay*{~Khg٦ܠƤXhq&DN/ .y G6b7~XB`#t)F%tqi_})Cqg =ޏ */ lM%! (hk?)Q 붷7\& aODeqD,PtXﭏT::R 2 oWb;mu{ӭE @0&:ч 0i 'ej(ÎEU+ Hzg´N5M1տ>8d|l px[) س\t@:(mz]Hq]3<@6[5a>cA&F[MK + E~{7FJ:a4znʶDMPJMßTrzM3 &V]é )+"1ĸa zҔ Nj g7 #؏< d<: %v8=x4Aw=/E+"W(EΙ}<9y9my:<+Ӟ9o?`䩖n]I4f1q9^Ͷ,y1yS>LL:z#n* Ĝ`PC,[8`n f-FȓX7&ڪ" n2vZD{Wk1J)RF_eIU2 {uU+3!8ABNn N œ_\?ڍޮ<Pko$Ck p TXHExSMh`8KUHn"v*zB %bvEHLjF{鬝`P0 FSTI%4[,fp{}˙II6e18gI7pu5t9 2I0Y)rhOhyE=fdЫ{ˉ3r a.Y&Y Fq{6y؋E[_!g2_$ h$(K&0^_GRP 7/g~'P3yZhVTf@e4 /R1/ :S:L1q#!F\" _Á$<]S"j)MCI / 3@ J01;OPMWL1`MPw48ZNn_G:#x l:n@015e}ykОƅ!_ =֣!~G,x;f1Lxθ%|&T a.& 3UnSǛ@w[SeOw~Cmں?`dCz~Áoo")Oצ.~Ōf0i$83(kAŘa`s8Wdk7={`_Wc0bQCWEyv}tmn{0Ky0 `}5h&:)6n' m%K ZLHPHDD&Ar^cs:9?i FW!J3ܼZSO{;o# #HtYo/K (lG{#͛%\ҥK9s&yf~an_v͖-[{*{]/QN; 0'  4򢄏j!Pz~Pnu,O׾584zⱩ鯚ow\Vݹo|tu9cE.9IDˎGxw 1@ PC R틆~M"=^qmKK +V(#?~_冥]բ8M7q>qθR ,Fu$o}Etº#ďFES E7vҁznݏE-Zėc7ggTFh[pqp:<Ov}NiŔ] \Xа HOkm !UF!/"?ƾHS9@z+"Q7!*MQ/-%Vu&]i_q6Y6BgnP` 6Dv}ݟH: 6nl j4tp{+jPo[>zIQ@5W б2 ?xK 9,(]kp8{蠣ßk%bdv|&B˴kTqD3`toMQ)l";O. 儯A}!gϼ }kׇ˻\BqblQŠ3v…7S%FZQǏ);6辧uU.p!XHZ^ 6^@Dz-)@yٲF@S&O0spU.7Tn瞲~WWgYsG_= JX f؍ԐP o)Qg_' -[peqf1S'NEu,(?̚5Гd ]Y)|_6;d$z-CbTL+ `2a}a=v]KF2d_ ӟĬYؾJDcUZ20QR*2 _1 !W'(Os m0I?Iuq+ӟVS9zm̫iWfp=?,l/s~`* X$"*#DL D(hx{%?q 34'lb{ fxQ),:||.\)<:~+Ox-]RD `-k`Gb ,yl;Fzn+c揩>ׯ-qa?&7qhl}~EkBH!8 ^E?%ATGE~H`f:8*0!{ iVqmPK/OMT0haggK.aN˜u3d~^r)I?IכP1m)`ƺLxӄ7nE]ĤI\~uMb~ȎAK$,oMǨcRy6u3R' `PmhXeͳwJ@ )SN8.8gn rrCN = =70"~{㗌'#;e"X~=׎(ژ7o+0Ϻ :d"f֯W_S :x!tm(Ɵ=+f3nQRo ꫯ'([\̫\ <fZxd{A¶χ  UW6ffŌ`┉ wҥ@L_q|P_{|X*AY̑`~IDATz4=%V~VZ>3}  X[#G8|Aȸ%/4 qhԅTQ-eE FF W <CݸIRD~фZ'lrF'\ōՉYm&Y*,MrB JPs"+Uc?mDz}&:x P𖼴EgH? ICrC%f f*_GՈ":N+af%\3kGЈt(c@;/|:\11#p빮=DF Ti㱝>u3 PMfo=^O틚D Pfh{zza >7.* cD{}5 =? ?$&e*KbPg{(x}% l/X¼Q@JXrtCw OVew|l[5NS-lb܇#^B fr9{cX 'j2g"R HLRgG9#RŽ%Umċ:L=H @)\JNJh⥃*e 2Qx=IENDB`eqonomize-0.6/src/hi128-mime-eqz.png0000644000175000017500000002122710476222066016204 0ustar hannahannaPNG  IHDR>asBIT|dtEXtSoftwarewww.inkscape.org< IDATxyչUg왦FA((ш`!`0z+Fd%yI35I5ĠxA#" t7=w>C:UNOw+_UkW7{*EJ<#6ϻƹƟDǟ Ey:t+9sfA7+5vpqI@JI0ltZvJP( L.mM"qKF^ 3\*=)NX|\%S.\..L`L5߿ͤ ?!7 lNl>0~.zztAQ 0ls4~qq\!%grn@_tvӃq.ΎtPuyEǛֽTEδv_fq!~M*>4g6,FQ<2!H$S iVqT6,W{8e*w987 SjT7FůBhy)% WgT?~?="A¼iAAV-HI, ^> ,oQqYCgQcM4n+jذ|ǚizbe\5rOP()l\vm ]( ="Δ!2M :&\({Ȳ*9הHu&Ǔ*}x%e,YFmA8Wϫ ,nJg?onlt?rf7ޠhIy5f#Zӣp4!t>Hh:AN\Ku.$x/4rtI+kCTY\jxf*|kʪ|gs#Hɏߜd?{<ۢ4} E]H. +ЄD>*O]Si~' $]FG-t]lnϿju\qi7+,鷅Am:OY$5Nʰ¦=7#dV,GgK\ͦ=:N|PQJ}̵υ^+/+cAcWOԙ`f}.kq$hbJuM-|Wʰ+jˡS,4l:'3X4 mo~6\5/%0 Zg@[ V/( T{s0&yP?*SLbJOB7"lKw-14]2VXUeFd89olpם)Sp꺴kw܉.&(Y^jGΝ SSAHRWe<}xRAQu4Q|*8p@{@C߻[Ww-_gݻols@;̪)5>i2ohT,5v`fvh,tL}pÁ:oobٲyW§Kp( aAܹstvvLag%K)&W}qV0_x '.!:: JN&0O1`L|a\;10`,_(80wԧ=M5B ̿|;ǟ69a\:ĉ8p{OIggakkk|~ m_~%/_mcٲeiLi@H)d/ӱq|2y΍7a\2t]gΝ<.kBz*ˮ$Cudj'*TW_>BMl~6?qkO;#}LV4\bKa;!Hc{'_9{ ө|fRjyh il5[IW'CХI:%5ݒ+ k~?2z!?w8p9F~/~L3pP"I$ :.ATPЋZBK2Dנ~e>fS7\2O<~o# QQ`l\@ # JH)9x 8y ƒ`܅4LQ I$}H`pP"ė*T%B`ϓ:D3/ַeALFH$?:` c_aU 4MG??Oέ0}>04!А[&DzNH0拨jU*!QU@0o2K.tvo1M0~IїoL?0. qFv͒şeeI(D$!I[:m=4]~m<_itg֬|K_xZ8\inc;D/K<@HZGjG>0 igسg7As_DJE%gZGy~5/ԙ4f2kF)//#GOHCE3t=C_M6N_OE|]H~Sdf.ݙLy]jIcB>ϳcl sܰ.HYBo`}e1iRGXf uuui9{,`7ӭ_&иYt)`HҥKYl L}4ɖ=L|;O!hJ?р}klٲ7ׯի}.x^vy)q,YAjMFCC FyQ; /ꌵ`뮻3f== 0%߮ ̈@"tHCS3qy(ɷxth}; z饗Y~>3g>o#tt Q|>f͚ł 6mZ6v"n:n|>cХyE޾|ԧIbSI1ڒo˜!~uu3ǾˢE>|~K k_ X͙3UVQVVS;&z!Gdɒ46w`#((Rqnvhb8$F7m.V|0_Q.Yߧ~Orw1|*++Yfs \}wCUUK(TWv}lItFc@{>|cr:}#9Г<w]._>Z!୷4)mmop=XįeÆ  Xnv@&Xv-ڥ@zZ` ډ--9*7ܱ~Y&>عs'S_ Mrx~ %x~ʔ)lذ!4#(- uT%n%ү&xJl}33iz /PHAסSo[(//K1kv6i@u8cch$5J޽6Eu'kؼTV[bEK8Ĝ xPFXG}OQ3=^0nGwI<cŪM=GG_ H*-U FcU9%LLz&c(N /Wߛln_r(xggμ{}`˘itvtq'oR `#$@dWIiSOSN`/>{^|iu u.7X 8mN]U%'GTLsa{Z8p ;k縷֬`k0.2x[OgB.SmRm@JɡCc RJ:::4_|* /^uno&\zJtmFN^nAGi;u/Zf)am&\E dJJɃ_&֭C$Ȅ&On5-OxlIflD~07<yJy3>`0Ֆf Lm~z$݋]ۘ!1' 0MC?a1y3(hijeͰw&ϨAh7B\uHgCGg;r.ُzeov!`3a&!bb1~?`Кw]|6s1mӝGliv*6G55!ADI`>X'`'yljωy:B8Ny־L{E&}X@P _ >@ X EQ, klA+uhocH#K{9&N޹f87CLfv/; !QJLH1 SSZA4'aYk]{ L)*Cb(}1&`8MjK#bz21T Xۤo350ғB3앢@ 6A<\+UE5~bL] L0CA8G5:vW( uBld M}ebLeywՌ c^Z^+$sN6DE3 PK#t- #4nN^xI|/-`4ҫL@N( +@]s|1i~xkዔ)a74 1 MD.c^N ɤ Oc#~ ҟO!muib|n0 ti{CM65KHw'q`%Ld"m1L`ox GOh]6=G\F!N<3sq DL )Lfri/1*gKܫPI}>Wjvi26Io<[E5@yd{JXE%Ay[/%v-Aq4@RėHXvI{?n*>hKWi|3M)> CO=,ph ۫bm8{k\N8TPoϦq89Vن.&CgP}db D~UUyxOҖ6 9#yn`)n&iCʐIr( @tpŠ@j2cG7^FvAUUh4k:<)1ǙԿ!} }H@uH}r@3s9e~4]v!{/S$OBM1{L=E*{1P4;&H~>4K1֭[ٝwluK<'d ߇IS^4 Wlf&UM~x@&oXvflBEEoo_ZHh'|%t"Cxm_S;aewyB&0=+#.3kJf j?o/__I x8cB8 eb% Uj8Rypphx2_\q~[W!ɏBih"ԉ[u͇!GrK|( PT<%!u C]`70`Prn&_1ć2H)_@ qϦ6lbJ?8 Qg-Lponnf۶mEJ(> Ix eL`+k3I( '} `Mm&`LۇE|(%"or8ؤf) 4 p/id3#---l߾aJ Tk VKQOfp.BF"1_'G3? 8ϟwy簈%4Oϸ ,`v%m> m8Ջ}nffv1bć. S>cٷHZ5.z%5>~)a>5AHGB&&e?|D%T%ؿk?I2寀 ʊjg* Խ%rn&GPJ05AGMk16&y.y}ADF #\POP.Ԍ6g"'|p8kĉ%b[6o>57眧6R0˻'oն&kZUi< 0yꩧBF|( |/ȣ1|.jIg}P({g̉$`&y80~T"MMMpFΝ;Ƕm%":lݺD"qx$>dDlǎرyW9  i߻{.KPFzEX>8*{/IENDB`eqonomize-0.6/src/hi16-app-eqonomize.png0000644000175000017500000000140110476220765017154 0ustar hannahannaPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8}Mh\e{g:whj1J)i U E()%!(n܉Bw Ut C,.LiU R)M3)%3w|d2縈F's1ԁ>0^vs+}2??-b]X7e gmlHFc%W;vmNLmFwfnjU |+ŗQ$x:[oy7fθ"ֿkm\MTO[۴]AΎGiiw㟖W2[Xor3B$m )s]" Qp8 e4Hs%)}LTSrO^и hiJ\,N}V;@-3p8qum!}$rځ06>&%;MѠ@XU Ca%pjw>Fu%IX8+ _! FU1<g<61O=U3$IENDB`eqonomize-0.6/src/hi16-mime-eqz.png0000644000175000017500000000140710476222165016116 0ustar hannahannaPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8}]k\U90ʠ@CAn~Cѿ?Ћ{Uz؎AHj%vpsI9콖C / ^]fggg=ZQuP@ |JȝU/DFEB, YaqB<o3+=\G}*. Q(DQ}`k<" yhGPK sk4j z{ 'CB(ʕ+ε~*Ɯ 5e|s;\ۥQ}}fkm k' !pOlw{ 'SLibHc9%LJzUnyTR5'=}L3s𼅪rUJ_2 #; tiz—\3d:yp3VU3p/FؽzhW,#rnP1!0` =]0 AHt r&ZKbb.ZK=s\Ӝ6n Ʉ(t:gsKw(gPԣ:!Ensཧ9C_l2YC< J4i(sst:u眖eEQhe.B˲,˴`0ݮr,b2uG94n䫣UIENDB`eqonomize-0.6/src/hi22-app-eqonomize.png0000644000175000017500000000212610476221046017147 0ustar hannahannaPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8MlU T)bRlGbPK  ,]hb`bąƅ 0acʇ>m{3o|{ymk1Lnf17?sۆ^`۞yyAsIH'.-R]ڵfڳw澮~:u&c >xǷo ]M۽~|hB*Uzɨa*bhh뎗^位mp쫣~qkO{hJB2SmA{CwrxUx_~]ѣI:=٫,_+Մ*]tv&.?C[F֛{LMW՛-kvj2uXcO}upUmw:uޞ\/> _cLuTtbcedIe% !!t+2 *(~ͯݾym6[}٬p7ff*OyaGpt1-S.GLdVݵmP :o/pxǀQ.I;I.9-l n_Ո`B6ό&*)ᣧqpQs<$ w%XQ kTBB98%hwC;mkRŶXP|,Dh@ns6h@< nho_G><ne0;#J,QbJu-۝=W> o &>7QD#8DazGU3> c'nj S.{P VyTUED98nxbIcppZ;Ƙ'B~v /Оiqg1+},\܀`H" 8oϳ.uioJ:7~aPhB˵ ֳuP@QhTU1|Kh)D!ZMs\ĉ! bv}؞{^j$s igr[} pΑ%5t vzѰ ߬$Jn܄Vhc Jd#ڶwPpc=Ed6CSL PU$ ܁Z6u@7>sU=08irΝUv~G K籟#O.CZ]^\\|kO+6P~ڪqώ"cmKK/vXk pyaa؀j a$I(#<#G "!"$I|x_U'v)+KKKo0IENDB`eqonomize-0.6/src/hi32-app-eqonomize.png0000644000175000017500000000334010476224142017147 0ustar hannahannaPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<rIDATXŗmTWga_JVAp(VFFDFZMlD$%hئіnjĚVXZ>,RKg̝{9>~̰@bgrr<zN˧Z0:&ς-U{!E $Z$I".w]nZo|}/8>=lW}c9ր $H$9ɁT&_U6ڲ۳}WW_zt "h.۝i{*myb  Lgz(.EpqJO|ro֏~ݱǂ{R}y.w/em88ĉ!"K?uV`2Ew?GbɃ]AsJ[o#8%h -.SrV W\V|z v, ކ`!t:J@əⱸj5Ϭ}:uj{+}a*RncE‰ƕB1l <$--l&yS,d0>^%bkM?DLк}#5OKg ;ZwNɤ"gW7 R@~hLT 5 ,b"#83Ub#+ٕ55@,W44{=_l( {ڭA(7TJnfjr\}$J:u}CD^xsLۥIENDB`eqonomize-0.6/src/hi32-mime-eqz.png0000644000175000017500000000324410476222140016106 0ustar hannahannaPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<6IDATX_lW3w;qSgi҈P '2)Eq(UI'$B*AU>4E ^d*"$FHPkS{kνx;^qo4{Ι;*ׯ_#}Gq \T[T46u'᪹=ϟI N'́Cs.-YfaXh\@6-I7jV gpQ{,ؓFP<@RXD dG|\V$w39O]W$0n+&(TքcIs!Pv,FŐ( !}{XQU:\V $P\TAQ%}Lx "vt";G[**cܤ@Gipvdm:w/"Zqncbmv833C.Gwy; QAUD\wνa~ګ<ԗַc=eʔD<=O&ӆTqvwk, !S  PJRc֟% æq@>_}/Vy2d,WrB,Jn7J`ee7qӗ7WIt}?૏G 4yȅHxSْ?%}䫌ŋ#8qqdz9|xAF:/>ztEV5 lf@DÍ~ŋ/>PӪ'8{}gVg^D\ŷ206v7Ϛq9Z&ֳM5=>NP )˵/N@+&z l`UVU _:/ #QBŢcykv*8ntߔ>eS<ࣱp7( ?y@k)@%ߚ$͸'km̪Rě/2T*QEuv"*ͽJQa؜S.sΥSNJ~[ #Gw'=ZǡC?GimZӅ=i븮K\fzzӧYiGUz+ïYkcz5r]d2!w<ǎ<* Bҙ3gw NoK $liֲgn %_j~~^ /PRRO{}nRٸoFIi#XXח:bDB(VЯ-P 賵ki|@ISB;jiKLLBW,!Ĥ&ͮ_fu1`BM4S[d\납kҙмnRi7ܖHV|O+y{6L%p$gio?Ykp Te{ew(77x%,xd^vy%%kMkn-V[ħ1ٶ}GOl:gI=i2'UȫfW^)|bFڅZ->_daDPh⃵]v[ٌ~m{޴h">x<  ;ԹCO-_*bp0J* iJФڸ0lĚ~ԛu+z  I; @'we q!>|k1 I?޶,L&D˲[:!RJ,i*K)4M44%-%./P Y|^Ś6ac)a@̀x"umz]Ş< vܧv#s!eġE97s:YyV 4z8G՝eǸ9P.gAILXQ!p5!RqY]pkyҒlTG$)tD <3MYQ:ML +5'[ M6@bZFB!禂p6CkttBiJ0XA@$ʚJ=5UQ  G M;KvV2::}h )`>?0S+8tvm]z55 d\HsABxT].Sb lׂX*LtSUbi 2VH&ᣏ 8?y# Y?͛7>]]ei~ְ޺@:A"o[N 9B¤Vܹ{y?Bp`zetI]PIڒw:i{Ĺ:.X=[s}D>@ȌBD>O.ȶX!%67qG%ʢEzsVr[mbAםa Ʉӟ9#iBj"5 Tƍ PN9Y1YWϢGYֱ,kq(%X&!I){˙zUX̼]|}3mm6bLٕŀ(R nSKM74-u-m_.J)Ҥ?˰ ʲy4gΜ)+T1.=w_Oh2,gLflX,Ͽ"upȐ1b8Ĉa9͏oq90Z0_;i D3IUH`2j۶ൿdÃ/.e}0MT㹭o3mFfٲe̜9h8qo)0=JB{d2l~6m-w7x ,Z&xjI/_N}}}iωmivWiD5knnj/ٻ<؃\h4_.]ʢEL3Zkl"4.wջ Pn @q%I=y7[bŊ|A)HK[llqa˛7C%dT,Umg//``Zih-63s(BյD V\n&}'W ;lH`$zm|K$0w ZM3{ΜS.pK94{}Ķd II$B'SΛ9sJ{>!%\AQk ۨ8f7S 4ԃax  ̼bbW-98¢Kul˄$pH$B8V!d F{ޯׄ\ vHo h=ud2%sؠ V:u↮z{A0a@}nwgNTJjF (FBZkH 퀌 \}ZXb!Ha@Z)1E '8oBJZkQG;S!U*J@9H&=$|QJ>ZU 0 T(2!Ӏc'< K@̠ ZREYB\Ȣ-=ҪplKV|)fWgBZð ]󁻠0:q(.ظ; Od0\d4iii){.$#x&$aHk7JM Nc&0bn#O]2}}}HR2ʁWy̐w?_$i3b$%&oF#N^߿_6=oJqpmp6l;a(%2Cޡ&:fЪUwUaP^?H>P|~?PXk<tAikkx}}U&d?))-ca5bap!ikkx/ Pi PCC't<1 U&댦g۱sH Tڻ>q]t>,Is7[m @ .\)[hy f*+fn 0 9"Ν۸z $[#n>_{}=s/`H{}c^k>JD]=߶ƕRO0ȇ5=1@);D$S^'~B`D1F11ƠHt,qĈ!8r{'ĕ{j{AWJSS"TJu_:V=xq)P% k<[)刈_Ntv;ӧfw+Nq[x QƎU{N)¹<(>_K-gRMŏ_ *.:8qu"yt` X*Rɤ)=[=k/\|5"AG c`б-~vv(ZVbmRʞ5.5#N}Ǟ8i)W$LiS?s?R]"ʰ-%I6\FdL(pm"1a4͞yS.q&5ۚ{ nӴTh/9L>GV?Jr6MhBˀTj`ʬQ:+l:}s/sS! yG8z;x.xuVO[w+0 0xOHUlY_rnqq}w%e93$NӃ# ]928x~ NVXx ?H jjY_ɐ8 H[tꃋM_<&4+ [ٲemBO^ҶR9ڸH)׋@eqHJǥ"J`{9rEVI.1W\q=b?|tfpwkxԘ}_+"USbGq 4HR 8(mvFȈ%@)rnYhSG >u3UDjCD>)^D/~4oc"Uzf#dJ= r睇1g!Z|~iw=2x,'r?"" r[S\2\b(n^[)޻ϋm;;N`DѢ`n-,>0_/~0){R6W~i!~B! ;fu$UҁK WATR)5ᴩ#ڏNVcp""hxxX|7tKw}`,prTS!Ha d2]v'u}X$ Zt٧fy \ eYKk8Nr]cBYGsK,lUb/b9eZd|/D,@iA/{/()M!a,PN e.O. Xb Ҟ 4o`B= 0Җuςs|G/1ZZ{Į}_|ߧ7w>_o0e04 #gc6ʺ?J^`A(P(|w+įnpRi#  LgcG(sR. =::a'<` ]  @`AzV٘AA3.AfW51[_q 9l wuAYqH5x`hp{Zxix,<^]E?5P5 Оh *'#@>:V^MUx og۱ldctݒEh}60D@<0-(dlzh~:O?4v'7tƈ=ǔSx{y2Rm(T<▰qS~JFpf<Xt)MMM}iqQ_LulV{.븀[!|KC+ NBЂth-P,p8~׳D(t*1#X0*ŧ0P`cMaY<{=k @P[ xhB QAL;Pyc V;W2w\nhd< q yc* Dڧah.ʬfq_… YjPR '>&(l\@fTXAuAH0$ Y޷<ĤIqܡqVP-r&Eb փ^tJXґ]@5Q%[}uT_fͧ%BVbQD!A'%@´iQ6E#J) yN[t:ض͒%K?uCJGY))C 1רf>Y O9sLdN:@kͲeyNgG-Z<ʕqW2}Akd|cʎ ?k/"~^xSMViL{~JP&6$ԍ һ?xDԸ@+V`IIc{<~owGGhbyT5x͙! ǀ(i6Ls2mmm~1a[X||ߞ .`}@Kx T`Fa8-=od6eXf {as͠=2ng{@Ê+Lu c'N:˽\$(#+D)_e#FřOI\Ɏ;Wvp_g_p1j$ >7zD6WKʉ*Bl.BR>Nsog+i)H#FG ؐHB, >VB^Q5 G/)Xb/a^ngg3C7^YZILg/ctЀF`UzZ-ÔP[@ ~}Uˬ ֫PPPON1Q%V"XV0*!@*W1(HDoY7UJ P^>z?.>5,GX4_p*pH B ~@; TSe_"?U"Դ`P\zADdgFc`IENDB`eqonomize-0.6/src/hi64-mime-eqz.png0000644000175000017500000000737510476222126016130 0ustar hannahannaPNG  IHDR@@iqsBIT|dtEXtSoftwarewww.inkscape.org<IDATx՛y}?ogjW+еʠH6*s2ILp`@l* BlTȁ1 Bʉ&q\$Q$ˎP.$YVf=3=ήdgz^}w׽B)'۶m{\{sƸT=еw?ܹs뮻ne4a!L_s/2_{~eIUxwF}sjXYe  ٺu/}tȮѤBJpđ đ*ӤT8T9R-rr}uZyy {YW(j"QS?YCGAu4xtanl{"1h!},'yv~t gk[8՟↕t315,l Hrx=>YJݪ%ՅC-Rbբ BO5 ba}'\ Z,r&⒔eM#ދrnwϧg`^Ƨ' 5B!9/C [DY_@@\ E$1ayZ4£6;̩3d5ȜZI9:=C&IS1iiX" o, L_{/ Zu`sKKȄta) , 6GcAƾ4 nZUFIl9Z9g SM4蘣30n!"i*Rbn߃XfEJ$-lBL$/(x'طw\^Tu40?т!b9r!\M9Njʱ8C8aO09]x~=֭ꫯ!Rr??xC*D'IʣZz xo{>ongrb?⦅oRG@4Z̸%zll. {V8fZ1m1{fpa+_3֬YSޓzRu5KZ7)̌5q>4ɿTά~*8p+nBuӹt /k)[r|`e,[uRvO1N>C[ qIGYy9K.ܤ@[4Rg~9 t9K,d޼yU|U>𵸊+{3TJkavl!,X!S һ9 m[.]78}GR} \o,e`.PfGHId"J&{L$P2鳽Ǐ BAiMp g9_ŋaS4uhhH7mAݦiÇkx,`*]dXf_,4M`0H P|8W{َ)IB&rNXنۆ^3gV 3*[z/tt*Y<sHuTh\*a78X@BLdhhhL%0 džhԝqo8! nADcn~Hh۹ 0 6ol?_ $.x;XzAG@P*aa$({0{b;vpFFF>gUW [$XJJ]@D:]D$ɢ8NN:-9 ޴iɂSfhՄ G x^I* V}옶m@wkbAв, (˲ؿW?cMGb@sstSP(T-N__ߴExMRgeq!*[J;}g``j0)JqQgpppFli~\q6oޜD"x/~^|ŧ4M[ oH)E"}4I;l,IENDB`eqonomize-0.6/src/importcsvdialog.cpp0000644000175000017500000013030611106576762017040 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "importcsvdialog.h" #include "budget.h" #include "kdateedit.h" #include "eqonomizevalueedit.h" #include "eqonomize.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define ALL_TYPES_ID 5 ImportCSVDialog::ImportCSVDialog(Budget *budg, QWidget *parent) : QWizard(parent), budget(budg) { setWindowTitle(i18n("Import CSV file")); setModal(true); QIFWizardPage *page1 = new QIFWizardPage(); page1->setTitle(i18n("Transaction Type Selection")); setPage(0, page1); QVBoxLayout *layout1 = new QVBoxLayout(page1); typeGroup = new QButtonGroup(this); QVBoxLayout *typeGroup_layout = new QVBoxLayout(); layout1->addLayout(typeGroup_layout); QRadioButton *rb = new QRadioButton(i18n("Expenses")); rb->setChecked(true); typeGroup_layout->addWidget(rb); typeGroup->addButton(rb, 0); rb->setFocus(); rb = new QRadioButton(i18n("Incomes")); typeGroup_layout->addWidget(rb); typeGroup->addButton(rb, 1); rb = new QRadioButton(i18n("Transfers")); typeGroup_layout->addWidget(rb); typeGroup->addButton(rb, 2); rb = new QRadioButton(i18n("Expenses and incomes (negative cost)")); typeGroup_layout->addWidget(rb); typeGroup->addButton(rb, 3); rb = new QRadioButton(i18n("Expenses and incomes (separate columns)")); typeGroup_layout->addWidget(rb); typeGroup->addButton(rb, 4); rb = new QRadioButton(i18n("All types")); typeGroup_layout->addWidget(rb); typeGroup->addButton(rb, 5); typeDescriptionLabel = new QLabel(page1); typeDescriptionLabel->setWordWrap(true); layout1->addWidget(typeDescriptionLabel); QIFWizardPage *page2 = new QIFWizardPage(); page2->setTitle(i18n("File Selection")); setPage(1, page2); QGridLayout *layout2 = new QGridLayout(page2); layout2->addWidget(new QLabel(i18n("File:"), page2), 0, 0); fileEdit = new KUrlRequester(page2); fileEdit->setMode(KFile::File | KFile::ExistingOnly); fileEdit->setFilter("text/x-csv"); layout2->addWidget(fileEdit, 0, 1); layout2->addWidget(new QLabel(i18n("First data row:"), page2), 1, 0); rowEdit = new QSpinBox(page2); rowEdit->setRange(0, 1000); rowEdit->setSpecialValueText(i18n("Auto")); rowEdit->setValue(0); layout2->addWidget(rowEdit, 1, 1); layout2->addWidget(new QLabel(i18n("Column delimiter:"), page2), 2, 0); delimiterCombo = new KComboBox(page2); delimiterCombo->setEditable(false); delimiterCombo->addItem(i18n("Comma")); delimiterCombo->addItem(i18n("Tabulator")); delimiterCombo->addItem(i18n("Semicolon")); delimiterCombo->addItem(i18n("Space")); delimiterCombo->addItem(i18n("Other")); layout2->addWidget(delimiterCombo, 2, 1); delimiterEdit = new KLineEdit(page2); delimiterEdit->setEnabled(false); layout2->addWidget(delimiterEdit, 3, 1); layout2->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Expanding), 4, 0, 1, 2); QIFWizardPage *page3 = new QIFWizardPage(); page3->setTitle(i18n("Columns Specification")); setPage(2, page3); QGridLayout *layout3 = new QGridLayout(page3); layout3->addWidget(new QLabel(i18n("Description:"), page3), 0, 0); descriptionGroup = new QButtonGroup(this); columnDescriptionButton = new QRadioButton(i18n("Column"), page3); descriptionGroup->addButton(columnDescriptionButton); layout3->addWidget(columnDescriptionButton, 0, 1); columnDescriptionEdit = new QSpinBox(page3); columnDescriptionEdit->setRange(1, 100); columnDescriptionEdit->setValue(2); columnDescriptionButton->setChecked(true); layout3->addWidget(columnDescriptionEdit, 0, 2); valueDescriptionButton = new QRadioButton(i18n("Value"), page3); descriptionGroup->addButton(valueDescriptionButton); layout3->addWidget(valueDescriptionButton, 0, 3); valueDescriptionEdit = new KLineEdit(page3); valueDescriptionEdit->setEnabled(false); layout3->addWidget(valueDescriptionEdit, 0, 4); costLabel = new QLabel(i18n("Cost:"), page3); layout3->addWidget(costLabel, 1, 0); costGroup = new QButtonGroup(this); columnCostButton = new QRadioButton(i18n("Column"), page3); costGroup->addButton(columnCostButton); layout3->addWidget(columnCostButton, 1, 1); columnCostEdit = new QSpinBox(page3); columnCostEdit->setRange(1, 100); columnCostEdit->setValue(3); columnCostButton->setChecked(true); layout3->addWidget(columnCostEdit, 1, 2); valueCostButton = new QRadioButton(i18n("Value"), page3); costGroup->addButton(valueCostButton); layout3->addWidget(valueCostButton, 1, 3); valueCostEdit = new EqonomizeValueEdit(false, page3); valueCostEdit->setEnabled(false); layout3->addWidget(valueCostEdit, 1, 4); costLabel->hide(); valueCostEdit->hide(); valueCostButton->hide(); columnCostEdit->hide(); columnCostButton->hide(); valueLabel = new QLabel(i18n("Cost:"), page3); layout3->addWidget(valueLabel, 2, 0); valueGroup = new QButtonGroup(this); columnValueButton = new QRadioButton(i18n("Column"), page3); valueGroup->addButton(columnValueButton); layout3->addWidget(columnValueButton, 2, 1); columnValueEdit = new QSpinBox(page3); columnValueEdit->setRange(1, 100); columnValueEdit->setValue(3); columnValueButton->setChecked(true); layout3->addWidget(columnValueEdit, 2, 2); valueValueButton = new QRadioButton(i18n("Value"), page3); valueGroup->addButton(valueValueButton); layout3->addWidget(valueValueButton, 2, 3); valueValueEdit = new EqonomizeValueEdit(false, page3); valueValueEdit->setEnabled(false); layout3->addWidget(valueValueEdit, 2, 4); layout3->addWidget(new QLabel(i18n("Date:"), page3), 3, 0); dateGroup = new QButtonGroup(this); columnDateButton = new QRadioButton(i18n("Column"), page3); dateGroup->addButton(columnDateButton); layout3->addWidget(columnDateButton, 3, 1); columnDateEdit = new QSpinBox(page3); columnDateEdit->setRange(1, 100); columnDateEdit->setValue(1); columnDateButton->setChecked(true); layout3->addWidget(columnDateEdit, 3, 2); valueDateButton = new QRadioButton(i18n("Value"), page3); dateGroup->addButton(valueDateButton); layout3->addWidget(valueDateButton, 3, 3); valueDateEdit = new KDateEdit(page3); valueDateEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); valueDateEdit->setEnabled(false); layout3->addWidget(valueDateEdit, 3, 4); AC1Label = new QLabel(i18n("Category:"), page3); layout3->addWidget(AC1Label, 4, 0); AC1Group = new QButtonGroup(this); columnAC1Button = new QRadioButton(i18n("Column"), page3); AC1Group->addButton(columnAC1Button); layout3->addWidget(columnAC1Button, 4, 1); columnAC1Edit = new QSpinBox(page3); columnAC1Edit->setRange(1, 100); columnAC1Edit->setValue(4); columnAC1Edit->setEnabled(false); layout3->addWidget(columnAC1Edit, 4, 2); valueAC1Button = new QRadioButton(i18n("Value"), page3); AC1Group->addButton(valueAC1Button); valueAC1Button->setChecked(true); layout3->addWidget(valueAC1Button, 4, 3); valueAC1Edit = new KComboBox(page3); valueAC1Edit->setEditable(false); layout3->addWidget(valueAC1Edit, 4, 4); AC2Label = new QLabel(i18n("From account:"), page3); layout3->addWidget(AC2Label, 5, 0); AC2Group = new QButtonGroup(this); columnAC2Button = new QRadioButton(i18n("Column"), page3); AC2Group->addButton(columnAC2Button); layout3->addWidget(columnAC2Button, 5, 1); columnAC2Edit = new QSpinBox(page3); columnAC2Edit->setRange(1, 100); columnAC2Edit->setValue(5); columnAC2Edit->setEnabled(false); layout3->addWidget(columnAC2Edit, 5, 2); valueAC2Button = new QRadioButton(i18n("Value"), page3); AC2Group->addButton(valueAC2Button); valueAC2Button->setChecked(true); layout3->addWidget(valueAC2Button, 5, 3); valueAC2Edit = new KComboBox(page3); valueAC2Edit->setEditable(false); layout3->addWidget(valueAC2Edit, 5, 4); layout3->addWidget(new QLabel(i18n("Comments:"), page3), 6, 0); commentsGroup = new QButtonGroup(this); columnCommentsButton = new QRadioButton(i18n("Column"), page3); commentsGroup->addButton(columnCommentsButton); layout3->addWidget(columnCommentsButton, 6, 1); columnCommentsEdit = new QSpinBox(page3); columnCommentsEdit->setRange(1, 100); columnCommentsEdit->setValue(6); columnCommentsEdit->setEnabled(false); layout3->addWidget(columnCommentsEdit, 6, 2); valueCommentsButton = new QRadioButton(i18n("Value"), page3); commentsGroup->addButton(valueCommentsButton); valueCommentsButton->setChecked(true); layout3->addWidget(valueCommentsButton, 6, 3); valueCommentsEdit = new KLineEdit(page3); layout3->addWidget(valueCommentsEdit, 6, 4); QHBoxLayout *layout3_cm = new QHBoxLayout(); layout3_cm->addStretch(1); createMissingButton = new QCheckBox(i18n("Create missing categories and accounts"), page3); createMissingButton->setChecked(true); layout3_cm->addWidget(createMissingButton); layout3->addLayout(layout3_cm, 7, 0, 1, 5); layout3->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Expanding), 8, 0, 1, 5); setOption(QWizard::HaveHelpButton, false); page3->setFinalPage(true); page1->setComplete(true); page2->setComplete(false); page3->setComplete(true); disconnect(button(NextButton), SIGNAL(clicked()), this, 0); connect(button(NextButton), SIGNAL(clicked()), this, SLOT(nextClicked())); typeChanged(0); connect(fileEdit, SIGNAL(textChanged(const QString&)), this, SLOT(onFileChanged(const QString&))); connect(delimiterCombo, SIGNAL(activated(int)), this, SLOT(delimiterChanged(int))); connect(columnDescriptionButton, SIGNAL(toggled(bool)), columnDescriptionEdit, SLOT(setEnabled(bool))); connect(valueDescriptionButton, SIGNAL(toggled(bool)), valueDescriptionEdit, SLOT(setEnabled(bool))); connect(columnValueButton, SIGNAL(toggled(bool)), columnValueEdit, SLOT(setEnabled(bool))); connect(valueValueButton, SIGNAL(toggled(bool)), valueValueEdit, SLOT(setEnabled(bool))); connect(columnDateButton, SIGNAL(toggled(bool)), columnDateEdit, SLOT(setEnabled(bool))); connect(valueDateButton, SIGNAL(toggled(bool)), valueDateEdit, SLOT(setEnabled(bool))); connect(columnAC1Button, SIGNAL(toggled(bool)), columnAC1Edit, SLOT(setEnabled(bool))); connect(valueAC1Button, SIGNAL(toggled(bool)), valueAC1Edit, SLOT(setEnabled(bool))); connect(columnAC2Button, SIGNAL(toggled(bool)), columnAC2Edit, SLOT(setEnabled(bool))); connect(valueAC2Button, SIGNAL(toggled(bool)), valueAC2Edit, SLOT(setEnabled(bool))); connect(columnCommentsButton, SIGNAL(toggled(bool)), columnCommentsEdit, SLOT(setEnabled(bool))); connect(valueCommentsButton, SIGNAL(toggled(bool)), valueCommentsEdit, SLOT(setEnabled(bool))); connect(typeGroup, SIGNAL(buttonClicked(int)), this, SLOT(typeChanged(int))); } ImportCSVDialog::~ImportCSVDialog() { } void ImportCSVDialog::onFileChanged(const QString &str) { ((QIFWizardPage*) page(1))->setComplete(!str.isEmpty()); } void ImportCSVDialog::delimiterChanged(int index) { delimiterEdit->setEnabled(index == 4); } void ImportCSVDialog::typeChanged(int id) { valueAC1Button->setChecked(true); columnAC1Edit->setEnabled(false); valueAC1Edit->setEnabled(true); valueAC1Button->setEnabled(true); valueAC2Button->setChecked(true); columnAC2Edit->setEnabled(false); valueAC2Edit->setEnabled(true); valueAC2Button->setEnabled(true); createMissingButton->setEnabled(id != ALL_TYPES_ID); createMissingButton->setChecked(id != ALL_TYPES_ID); valueAC1Edit->clear(); valueAC2Edit->clear(); if(id < 5) { AssetsAccount *aa = budget->assetsAccounts.first(); while(aa) {if(aa != budget->balancingAccount && aa->accountType() != ASSETS_TYPE_SECURITIES) valueAC2Edit->addItem(aa->name()); aa = budget->assetsAccounts.next();} } if(id == 4) { costLabel->show(); valueCostEdit->show(); columnCostEdit->show(); columnCostButton->show(); valueCostButton->show(); columnCostButton->setChecked(true); valueCostButton->setEnabled(false); valueCostEdit->setEnabled(false); columnValueEdit->setValue(4); columnAC1Edit->setValue(5); columnAC2Edit->setValue(6); columnCommentsEdit->setValue(7); } else { costLabel->hide(); valueCostEdit->hide(); columnCostEdit->hide(); columnCostButton->hide(); valueCostButton->hide(); columnValueEdit->setValue(3); columnAC1Edit->setValue(4); columnAC2Edit->setValue(5); columnCommentsEdit->setValue(6); } switch(id) { case 0: { typeDescriptionLabel->setText(i18n("Imports data as expenses. Costs have positive value. Value is the only required column.")); valueLabel->setText(i18n("Cost:")); AC1Label->setText(i18n("Category:")); AC2Label->setText(i18n("From account:")); ExpensesAccount *ea = budget->expensesAccounts.first(); while(ea) {valueAC1Edit->addItem(ea->name()); ea = budget->expensesAccounts.next();} break; } case 1: { typeDescriptionLabel->setText(i18n("Imports data as incomes. Value is the only required column.")); valueLabel->setText(i18n("Income:")); AC1Label->setText(i18n("Category:")); AC2Label->setText(i18n("To account:")); IncomesAccount *ia = budget->incomesAccounts.first(); while(ia) {valueAC1Edit->addItem(ia->name()); ia = budget->incomesAccounts.next();} break; } case 2: { typeDescriptionLabel->setText(i18n("Imports data as transfers. Value is the only required column.")); valueLabel->setText(i18n("Amount:")); AC1Label->setText(i18n("From account:")); AC2Label->setText(i18n("To account:")); AssetsAccount *aa = budget->assetsAccounts.first(); while(aa) {if(aa != budget->balancingAccount && aa->accountType() != ASSETS_TYPE_SECURITIES) valueAC1Edit->addItem(aa->name()); aa = budget->assetsAccounts.next();} break; } case 3: { typeDescriptionLabel->setText(i18n("Imports data as expenses and incomes. Costs have negative value. Value and category are both required columns.")); columnAC1Button->setChecked(true); columnAC1Edit->setEnabled(true); valueAC1Edit->setEnabled(false); valueAC1Button->setEnabled(false); valueLabel->setText(i18n("Value:")); AC1Label->setText(i18n("Category:")); AC2Label->setText(i18n("Account:")); break; } case 4: { typeDescriptionLabel->setText(i18n("Imports data as expenses and incomes. Costs and incomes have separate columns. Income, cost, and category are all required columns.")); columnAC1Button->setChecked(true); columnAC1Edit->setEnabled(true); valueAC1Edit->setEnabled(false); valueAC1Button->setEnabled(false); valueLabel->setText(i18n("Income:")); AC1Label->setText(i18n("Category:")); AC2Label->setText(i18n("Account:")); break; } case ALL_TYPES_ID: { typeDescriptionLabel->setText(i18n("Imports data as expenses, incomes, and transfers. Costs have negative or positive value. Value, to, and from are all required columns. Accounts and categories must be existing.")); columnAC1Button->setChecked(true); columnAC1Edit->setEnabled(true); valueAC1Edit->setEnabled(false); valueAC1Button->setEnabled(false); columnAC2Button->setChecked(true); columnAC2Edit->setEnabled(true); valueAC2Edit->setEnabled(false); valueAC2Button->setEnabled(false); valueLabel->setText(i18n("Value:")); AC1Label->setText(i18n("From:")); AC2Label->setText(i18n("To:")); break; } } columnValueButton->setChecked(true); valueValueButton->setEnabled(false); if(valueAC1Edit->count() == 0) { columnAC1Button->setChecked(true); columnAC1Edit->setEnabled(true); valueAC1Edit->setEnabled(false); valueAC1Button->setEnabled(false); } if(valueAC2Edit->count() == 0) { columnAC2Button->setChecked(true); columnAC2Edit->setEnabled(true); valueAC2Edit->setEnabled(false); valueAC2Button->setEnabled(false); } } void ImportCSVDialog::nextClicked() { if(currentPage() == page(0)) { fileEdit->setFocus(); } else if(currentPage() == page(1)) { const KUrl &url = fileEdit->url(); if(url.isEmpty()) { KMessageBox::error(this, i18n("A file must be selected.")); fileEdit->setFocus(); return; } else if(!url.isValid()) { QFileInfo info(fileEdit->lineEdit()->text()); if(info.isDir()) { KMessageBox::error(this, i18n("Selected file is a directory.")); fileEdit->setFocus(); return; } else if(!info.exists()) { KMessageBox::error(this, i18n("Selected file does not exist.")); fileEdit->setFocus(); return; } fileEdit->setUrl(info.absoluteFilePath()); } else if(url.isLocalFile()) { QFileInfo info(url.path()); if(info.isDir()) { KMessageBox::error(this, i18n("Selected file is a directory.")); fileEdit->setFocus(); return; } else if(!info.exists()) { KMessageBox::error(this, i18n("Selected file does not exist.")); fileEdit->setFocus(); return; } } if(delimiterCombo->currentIndex() == 4 && delimiterEdit->text().isEmpty()) { KMessageBox::error(this, i18n("Empty delimiter.")); delimiterEdit->setFocus(); return; } columnDescriptionEdit->setFocus(); } QWizard::next(); } QDate readCSVDate(const QString &str, const QString &date_format, const QString &alt_date_format) { struct tm tp; QDate date; if(strptime(str.toAscii(), date_format.toAscii(), &tp)) { date.setYMD(tp.tm_year > 17100 ? tp.tm_year - 15200 : tp.tm_year + 1900, tp.tm_mon + 1, tp.tm_mday); } else if(!alt_date_format.isEmpty() && strptime(str.toAscii(), alt_date_format.toAscii(), &tp)) { date.setYMD(tp.tm_year > 17100 ? tp.tm_year - 15200 : tp.tm_year + 1900, tp.tm_mon + 1, tp.tm_mday); } return date; } double readCSVValue(const QString &str, int value_format, bool *ok) { QString str2 = str; int l = (int) str2.length(); for(int i = 0; i < l; i++) { if(str2[i].isDigit()) { if(i > 0) { str2.remove(0, i); l -= i; } break; } } l--; for(int i = l; i >= 0; i--) { if(str2[i].isDigit()) { if(i < l) { str2.truncate(i + 1); } break; } } if(value_format == 2) { str2.replace(".", ""); str2.replace(",", "."); } else if(value_format == 1) { str2.replace(",", ""); } return str2.toDouble(ok); } //p1 MDY //p2 DMY //p3 YMD //p4 YDM void testCSVDate(const QString &str, bool &p1, bool &p2, bool &p3, bool &p4, bool &ly, char &separator) { if(separator < 0) { for(int i = 0; i < (int) str.length(); i++) { if(str[i] < '0' || str[i] > '9') { separator = str[i].toLatin1(); break; } } if(separator < 0) separator = 0; p1 = (separator != 0); p2 = (separator != 0); p3 = true; p4 = (separator != 0); ly = false; } if(p1 + p2 + p3 + p4 <= 1) return; QStringList strlist = str.split(separator, QString::SkipEmptyParts); if(strlist.count() == 2 && (p1 || p2)) { int i = strlist[1].indexOf('\''); if(i >= 0) { strlist.append(strlist[1]); strlist[2].remove(0, i + 1); strlist[1].truncate(i); p3 = false; p4 = false; ly = false; } } if(strlist.count() < 3) return; if(p1 || p2) { int v1 = strlist[0].toInt(); if(v1 > 12) p1 = false; if(v1 > 31 || v1 < 1) { p2 = false; if(v1 >= 100) ly = true; else ly = false; } } int v2 = strlist[1].toInt(); if(v2 > 12) {p2 = false; p3 = false;} int v3 = strlist[2].toInt(); if(v3 > 12) p4 = false; if(v3 > 31 || v3 < 1) { p3 = false; if(v3 >= 100) ly = true; else ly = false; } } void testCSVValue(const QString &str, int &value_format) { if(value_format <= 0) { int i = str.lastIndexOf('.'); int i2 = str.lastIndexOf(','); if(i2 >= 0 && i >= 0) { if(i2 > i) value_format = 2; else value_format = 1; return; } if(i >= 0) { i2 = 0; int l = (int) str.length(); for(int index = i + 1; index < l; index++) { if(str[index].isDigit()) { i2++; } else { break; } } if(i2 < 3) value_format = 1; else value_format = -1; } else if(i2 >= 0) { i = 0; int l = (int) str.length(); for(int index = i2 + 1; index < l; index++) { if(str[index].isDigit()) { i++; } else { break; } } if(i < 3) value_format = 2; else value_format = -1; } } } struct csv_info { int value_format; char separator; bool p1, p2, p3, p4, ly; }; bool ImportCSVDialog::import(bool test, csv_info *ci) { QString date_format, alt_date_format; if(test) { ci->p1 = true; ci->p2 = true; ci->p3 = true; ci->p4 = true; ci->ly = true; ci->value_format = 0; ci->separator = -1; } else { if(ci->p1) { date_format += "%m"; if(ci->separator > 0) date_format += ci->separator; date_format += "%d"; if(ci->separator > 0) date_format += ci->separator; if(ci->ly) { date_format += "%Y"; } else { if(ci->separator > 0) { alt_date_format = date_format; alt_date_format += '\''; alt_date_format += "%y"; } date_format += "%y"; } } else if(ci->p2) { date_format += "%d"; if(ci->separator > 0) date_format += ci->separator; date_format += "%m"; if(ci->separator > 0) date_format += ci->separator; if(ci->ly) { date_format += "%Y"; } else { if(ci->separator > 0) { alt_date_format = date_format; alt_date_format += '\''; alt_date_format += "%y"; } date_format += "%y"; } } else if(ci->p3) { if(ci->ly) date_format += "%Y"; else date_format += "%y"; if(ci->separator > 0) date_format += ci->separator; date_format += "%m"; if(ci->separator > 0) date_format += ci->separator; date_format += "%d"; } else if(ci->p4) { if(ci->ly) date_format += "%Y"; else date_format += "%y"; if(ci->separator > 0) date_format += ci->separator; date_format += "%d"; if(ci->separator > 0) date_format += ci->separator; date_format += "%m"; } } int first_row = rowEdit->value(); int type = typeGroup->checkedId(); QString delimiter; switch(delimiterCombo->currentIndex()) { case 0: {delimiter = ","; break;} case 1: {delimiter = "\t"; break;} case 2: {delimiter = ";"; break;} case 3: {delimiter = " "; break;} case 4: {delimiter = delimiterEdit->text(); break;} } int description_c = columnDescriptionButton->isChecked() ? columnDescriptionEdit->value() : -1; int value_c = columnValueButton->isChecked() ? columnValueEdit->value() : -1; int cost_c = (type == 4 && columnCostButton->isChecked()) ? columnCostEdit->value() : -1; int date_c = columnDateButton->isChecked() ? columnDateEdit->value() : -1; if(test && date_c < 0) { ci->p1 = true; ci->p2 = false; ci->p3 = false; ci->p4 = false; ci->ly = false; } int AC1_c = columnAC1Button->isChecked() ? columnAC1Edit->value() : -1; int AC2_c = columnAC2Button->isChecked() ? columnAC2Edit->value() : -1; int comments_c = columnCommentsButton->isChecked() ? columnCommentsEdit->value() : -1; int ncolumns = 0, min_columns = 0; if(value_c > ncolumns) ncolumns = value_c; if(cost_c > ncolumns) ncolumns = cost_c; if(date_c > ncolumns) ncolumns = date_c; if(AC1_c > ncolumns) ncolumns = AC1_c; if(AC2_c > ncolumns) ncolumns = AC2_c; min_columns = ncolumns; if(description_c > ncolumns) ncolumns = description_c; if(comments_c > ncolumns) ncolumns = comments_c; if((description_c > 0 && (description_c == value_c || description_c == cost_c || description_c == date_c || description_c == AC1_c || description_c == AC2_c || description_c == comments_c)) || (value_c > 0 && (value_c == date_c || value_c == cost_c || value_c == AC1_c || value_c == AC2_c || value_c == comments_c)) || (cost_c > 0 && (cost_c == date_c || cost_c == AC1_c || cost_c == AC2_c || cost_c == comments_c)) || (date_c > 0 && (date_c == AC1_c || date_c == AC2_c || date_c == comments_c)) || (AC1_c > 0 && (AC1_c == AC2_c || AC1_c == comments_c)) || (AC2_c > 0 && AC2_c == comments_c) ) { KMessageBox::error(this, i18n("The same column number is selected multiple times.")); return false; } bool create_missing = createMissingButton->isChecked() && type != ALL_TYPES_ID; QString description, comments; if(!test && description_c < 0) description = valueDescriptionEdit->text(); if(!test && comments_c < 0) comments = valueCommentsEdit->text(); QMap eaccounts, iaccounts, aaccounts; Account *ac1 = NULL, *ac2 = NULL; if(!test && (AC1_c < 0 || AC2_c < 0)) { ExpensesAccount *ea = budget->expensesAccounts.first(); while(ea) {eaccounts[ea->name()] = ea; ea = budget->expensesAccounts.next();} IncomesAccount *ia = budget->incomesAccounts.first(); while(ia) {iaccounts[ia->name()] = ia; ia = budget->incomesAccounts.next();} AssetsAccount *aa = budget->assetsAccounts.first(); while(aa) {aaccounts[aa->name()] = aa; aa = budget->assetsAccounts.next();} } if(AC1_c < 0) { int i = 0; Account *account = NULL; if(type == 0) account = budget->expensesAccounts.first(); else if(type == 1) account = budget->incomesAccounts.first(); else if(type == 2) account = budget->assetsAccounts.first(); while(account) { if(type == 2) { while(account == budget->balancingAccount || ((AssetsAccount*) account)->accountType() == ASSETS_TYPE_SECURITIES) { account = budget->assetsAccounts.next(); if(!account) break; } } if(i == valueAC1Edit->currentIndex()) { ac1 = account; break; } if(type == 0) { account = budget->expensesAccounts.next(); } else if(type == 1) { account = budget->incomesAccounts.next(); } else if(type == 2) { account = budget->assetsAccounts.next(); } i++; } } if(AC2_c < 0) { int i = 0; Account *account = budget->assetsAccounts.first(); while(account) { while(account == budget->balancingAccount || ((AssetsAccount*) account)->accountType() == ASSETS_TYPE_SECURITIES) { account = budget->assetsAccounts.next(); if(!account) break; } if(i == valueAC2Edit->currentIndex()) { ac2 = account; break; } account = budget->assetsAccounts.next(); i++; } if(ac1 == ac2) { KMessageBox::error(this, i18n("Selected from account is the same as the to account.")); return false; } } QDate date; if(date_c < 0) { date = valueDateEdit->date(); if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); return false; } } double value = 0.0; if(value_c < 0) { value = valueValueEdit->value(); } double cost = 0.0; KUrl url = fileEdit->url(); QString tmpfile; if(!url.isLocalFile()) { if(!KIO::NetAccess::download(url, tmpfile, this)) { KMessageBox::error(this, i18n("Couldn't fetch %1.").arg(url.prettyUrl())); return false; } } else { tmpfile = url.path(); } QFile file(tmpfile); if(!file.open(QIODevice::ReadOnly) ) { KMessageBox::error(this, i18n("Couldn't open %1 for reading.").arg(url.prettyUrl())); return false; } else if(!file.size()) { KMessageBox::error(this, i18n("Error reading %1.").arg(url.prettyUrl())); return false; } QTextStream fstream(&file); fstream.setCodec("UTF-8"); bool had_data = false; int successes = 0; int failed = 0; bool missing_columns = false, value_error = false, date_error = false; bool AC1_empty = false, AC2_empty = false, AC1_missing = false, AC2_missing = false, AC_security = false, AC_balancing = false, AC_same = false; int AC1_c_bak = AC1_c; int AC2_c_bak = AC2_c; int row = 0; QString line = fstream.readLine(); QString new_ac1 = "", new_ac2 = ""; QDate curdate = QDate::currentDate(); while(!line.isNull()) { row++; if((first_row == 0 && !line.isEmpty() && line[0] != '#') || (first_row > 0 && row >= first_row && !line.isEmpty())) { QStringList columns = line.split(delimiter, QString::KeepEmptyParts); for(QStringList::Iterator it = columns.begin(); it != columns.end(); ++it) { int i = 0; while(i < (int) (*it).length() && ((*it)[i] == ' ' || (*it)[i] == '\t')) { i++; } if(!(*it).isEmpty() && (*it)[i] == '\"') { (*it).remove(0, i + 1); i = (*it).length() - 1; while(i > 0 && ((*it)[i] == ' ' || (*it)[i] == '\t')) { i--; } if(i >= 0 && (*it)[i] == '\"') { (*it).truncate(i); } else { QStringList::Iterator it2 = it; ++it2; while(it2 != columns.end()) { i = (*it2).length() - 1; while(i > 0 && ((*it2)[i] == ' ' || (*it2)[i] == '\t')) { i--; } if(i >= 0 && (*it2)[i] == '\"') { (*it2).truncate(i); *it += delimiter; *it += *it2; columns.erase(it2); break; } *it += delimiter; *it += *it2; columns.erase(it2); it2 = it; ++it2; } } } *it = (*it).trimmed(); } if((int) columns.count() < min_columns) { if(first_row != 0) { missing_columns = true; failed++; } } else { bool success = true; if(!test && success && description_c > 0) { description = columns[description_c - 1]; } if(success && value_c > 0) { if(cost_c <= 0 || !columns[value_c - 1].isEmpty()) { bool ok = true; if(first_row == 0) { ok = false; QString &str = columns[value_c - 1]; int l = (int) str.length(); for(int i = 0; i < l; i++) { if(str[i].isDigit()) { ok = true; break; } } } if(!ok) { failed--; success = false; } else if(test) { if(ci->value_format <= 0) testCSVValue(columns[value_c - 1], ci->value_format); } else { value = readCSVValue(columns[value_c - 1], ci->value_format, &ok); if(!ok) { if(first_row == 0) failed--; else value_error = true; success = false; } } } else { value = 0.0; } } if(success && cost_c > 0) { if(value == 0.0 || !columns[cost_c - 1].isEmpty()) { bool ok = true; if(first_row == 0) { ok = false; QString &str = columns[value_c - 1]; int l = (int) str.length(); for(int i = 0; i < l; i++) { if(str[i].isDigit()) { ok = true; break; } } } if(!ok) { failed--; success = false; } else if(test) { if(ci->value_format <= 0) testCSVValue(columns[cost_c - 1], ci->value_format); } else { cost = readCSVValue(columns[cost_c - 1], ci->value_format, &ok); if(!ok) { if(first_row == 0) failed--; else value_error = true; success = false; } value -= cost; } } } if(success && date_c > 0) { bool ok = true; if(first_row == 0) { ok = false; QString &str = columns[date_c - 1]; for(int i = 0; i < (int) str.length(); i++) { if(str[i].isDigit()) { ok = true; break; } } } if(!ok) { failed--; success = false; } else if(test) { if(ci->p1 + ci->p2 + ci->p3 + ci->p4 > 1) testCSVDate(columns[date_c - 1], ci->p1, ci->p2, ci->p3, ci->p4, ci->ly, ci->separator); } else { date = readCSVDate(columns[date_c - 1], date_format, alt_date_format); if(!date.isValid()) { if(first_row == 0) failed--; else date_error = true; success = false; } } } if(test && ci->p1 + ci->p2 + ci->p3 + ci->p4 < 2 && ci->value_format > 0) break; if(test) success = false; if(success && type == ALL_TYPES_ID && value < 0.0) { AC1_c = AC2_c_bak; AC2_c = AC1_c_bak; value = -value; } if(success && AC1_c > 0) { QMap::iterator it_ac; bool found = false; if(type == 0 || ((type == 3 || type == 4) && value < 0.0)) { it_ac = eaccounts.find(columns[AC1_c - 1]); found = (it_ac != eaccounts.end()); } else if(type == 1 || type == 3 || type == 4) { it_ac = iaccounts.find(columns[AC1_c - 1]); found = (it_ac != iaccounts.end()); } else if(type == 2) { it_ac = aaccounts.find(columns[AC1_c - 1]); found = (it_ac != aaccounts.end()); } else if(type == ALL_TYPES_ID) { it_ac = iaccounts.find(columns[AC1_c - 1]); found = (it_ac != iaccounts.end()); if(!found) { it_ac = aaccounts.find(columns[AC1_c - 1]); found = (it_ac != aaccounts.end()); } } if(found) { ac1 = it_ac.value(); if(ac1->type() == ACCOUNT_TYPE_ASSETS && ((AssetsAccount*) ac1)->accountType() == ASSETS_TYPE_SECURITIES) { AC_security = true; success = false; } else if(type != 2 && type != ALL_TYPES_ID && ac1 == budget->balancingAccount) { AC_balancing = true; success = false; } } else if(columns[AC1_c - 1].isEmpty()) { AC1_empty = true; success = false; } else if(create_missing) { new_ac1 = columns[AC1_c - 1]; } else { AC1_missing = true; success = false; } } if(success && AC2_c > 0) { QMap::iterator it_ac; bool found = false; if(type == ALL_TYPES_ID) { it_ac = iaccounts.find(columns[AC2_c - 1]); found = (it_ac != iaccounts.end()); if(!found) { it_ac = aaccounts.find(columns[AC2_c - 1]); found = (it_ac != aaccounts.end()); } } else { it_ac = aaccounts.find(columns[AC2_c - 1]); found = (it_ac != aaccounts.end()); } if(found) { ac2 = it_ac.value(); if(ac1 == ac2) { AC_same = true; success = false; } else if(ac2->type() == ACCOUNT_TYPE_ASSETS && ((AssetsAccount*) ac2)->accountType() == ASSETS_TYPE_SECURITIES) { AC_security = true; success = false; } else if(ac2 == budget->balancingAccount) { if(type != 2) { AC_balancing = true; success = false; } else { if(type == ALL_TYPES_ID && ac1->type() != ACCOUNT_TYPE_ASSETS) { it_ac = aaccounts.find(columns[AC1_c - 1]); found = it_ac != aaccounts.end(); if(found) { ac1 = it_ac.value(); if(ac1->type() == ACCOUNT_TYPE_ASSETS && ((AssetsAccount*) ac1)->accountType() == ASSETS_TYPE_SECURITIES) { AC_security = true; success = false; } else if(ac1 == budget->balancingAccount) { AC_same = true; success = false; } } else { AC_balancing = true; success = false; } } if(success) { value = -value; Account *ac1_bak = ac1; ac1 = ac2; ac2 = ac1_bak; } } } else if(type == ALL_TYPES_ID && ac1 == budget->balancingAccount && ac2->type() != ACCOUNT_TYPE_ASSETS) { it_ac = aaccounts.find(columns[AC2_c - 1]); found = it_ac != aaccounts.end(); if(found) { ac2 = it_ac.value(); if(ac2->type() == ACCOUNT_TYPE_ASSETS && ((AssetsAccount*) ac2)->accountType() == ASSETS_TYPE_SECURITIES) { AC_security = true; success = false; } else if(ac2 == budget->balancingAccount) { AC_same = true; success = false; } } else { AC_balancing = true; success = false; } } } else if(columns[AC2_c - 1].isEmpty()) { AC2_empty = true; success = false; } else if(create_missing) { new_ac2 = columns[AC2_c - 1]; if(new_ac1 == new_ac2) { new_ac1 = ""; new_ac2 = ""; AC_same = true; success = false; } } else { AC2_missing = true; success = false; } } if(success && type == ALL_TYPES_ID) { AC1_c = AC1_c_bak; AC2_c = AC2_c_bak; } if(success && comments_c > 0) { comments = columns[comments_c - 1]; } if(success) { if(!new_ac1.isEmpty()) { if(type == 0 || ((type == 3 || type == 4) && value < 0.0)) {ac1 = new ExpensesAccount(budget, new_ac1); budget->addAccount(ac1); eaccounts[ac1->name()] = ac1;} else if(type == 1 || type == 3 || type == 4) {ac1 = new IncomesAccount(budget, new_ac1); budget->addAccount(ac1); iaccounts[ac1->name()] = ac1;} else if(type == 2) {ac1 = new AssetsAccount(budget, ASSETS_TYPE_CASH, new_ac1); budget->addAccount(ac1); aaccounts[ac1->name()] = ac1;} new_ac1 = ""; } if(!new_ac2.isEmpty()) { ac2 = new AssetsAccount(budget, ASSETS_TYPE_CASH, new_ac2); budget->addAccount(ac2); aaccounts[ac2->name()] = ac2; new_ac2 = ""; } Transaction *trans = NULL; switch(type) { case 0: { trans = new Expense(budget, value, date, (ExpensesAccount*) ac1, (AssetsAccount*) ac2, description, comments); successes++; break; } case 1: { trans = new Income(budget, value, date, (IncomesAccount*) ac1, (AssetsAccount*) ac2, description, comments); successes++; break; } case 2: { if(ac1 == budget->balancingAccount) { trans = new Balancing(budget, value, date, (AssetsAccount*) ac2, description); } else if(value < 0.0) { trans = new Transfer(budget, -value, date, (AssetsAccount*) ac2, (AssetsAccount*) ac1, description, comments); } else { trans = new Transfer(budget, value, date, (AssetsAccount*) ac1, (AssetsAccount*) ac2, description, comments); } successes++; break; } case 3: {} case 4: { if(value < 0.0) { trans = new Expense(budget, -value, date, (ExpensesAccount*) ac1, (AssetsAccount*) ac2, description, comments); } else { trans = new Income(budget, value, date, (IncomesAccount*) ac1, (AssetsAccount*) ac2, description, comments); } successes++; break; } case ALL_TYPES_ID: { if(ac1 == budget->balancingAccount) { trans = new Balancing(budget, value, date, (AssetsAccount*) ac2, description); } else if(ac1->type() == ACCOUNT_TYPE_INCOMES) { trans = new Income(budget, value, date, (IncomesAccount*) ac1, (AssetsAccount*) ac2, description, comments); } else if(ac2->type() == ACCOUNT_TYPE_EXPENSES) { trans = new Expense(budget, value, date, (ExpensesAccount*) ac2, (AssetsAccount*) ac1, description, comments); } else { trans = new Transfer(budget, value, date, (AssetsAccount*) ac1, (AssetsAccount*) ac2, description, comments); } successes++; break; } } if(trans) { if(trans->date() > curdate) { budget->addScheduledTransaction(new ScheduledTransaction(budget, trans, NULL)); } else { budget->addTransaction(trans); } } } else { failed++; } } had_data = true; if(first_row == 0) first_row = 1; } line = fstream.readLine(); } file.close(); if(!url.isLocalFile()) { KIO::NetAccess::removeTempFile(tmpfile); } if(test) { return true; } QString info = "", details = ""; if(successes > 0) { info = i18np("Successfully imported 1 transaction.", "Successfully imported %n transactions.", successes); } else { info = i18n("Unable to import any transactions imported."); } if(failed > 0) { info += '\n'; info += i18np("Failed to import 1 data row.", "Failed to import %n data rows.", failed); if(missing_columns) {details += "\n-"; details += i18n("Required columns missing.");} if(value_error) {details += "\n-"; details += i18n("Invalid value.");} if(date_error) {details += "\n-"; details += i18n("Invalid date.");} if(AC1_empty) {details += "\n-"; if(type == 0 || type == 1 || type == 2) {details += i18n("Empty category name.");} else {details += i18n("Empty account name.");}} if(AC2_empty) {details += "\n-"; details += i18n("Empty account name.");} if(AC1_missing) {details += "\n-"; if(type == 0 || type == 1 || type == 2) {details += i18n("Unknown category found.");} else {details += i18n("Unknown account found.");}} if(AC2_missing) {details += "\n-"; details += i18n("Unknown account found.");} if(AC_security) {details += "\n-"; details += i18n("Cannot import security transactions (to/from security accounts).");} if(AC_balancing) {details += "\n-"; details += i18n("Balancing account wrongly used.");} if(AC_same) {details += "\n-"; details += i18n("Same to and from account/category.");} } else if(successes == 0) { info = i18n("No data found."); } if(failed > 0 || successes == 0) { KMessageBox::sorry(this, info + details); } else { KMessageBox::information(this, info); } return successes > 0; } void ImportCSVDialog::accept() { csv_info ci; if(!import(true, &ci)) return; int ps = ci.p1 + ci.p2 + ci.p3 + ci.p4; if(ps == 0) { KMessageBox::error(this, i18n("Unrecognized date format.")); return; } if(ci.value_format < 0 || ps > 1) { KDialog *dialog = new KDialog(this, 0); dialog->setCaption(i18n("Specify Format")); dialog->setButtons(KDialog::Ok | KDialog::Cancel); dialog->setDefaultButton(KDialog::Cancel); dialog->setModal(true); dialog->setMainWidget(new QWidget(dialog)); QGridLayout *grid = new QGridLayout(dialog->mainWidget()); QLabel *label = new QLabel(i18n("The format of dates and/or numbers in the CSV file is ambiguous. Please select the correct format."), dialog->mainWidget()); label->setWordWrap(true); grid->addWidget(label, 0, 0, 1, 2); KComboBox *dateFormatCombo = NULL; if(ps > 1) { grid->addWidget(new QLabel(i18n("Date format:"), dialog->mainWidget()), 1, 0); dateFormatCombo = new KComboBox(dialog->mainWidget()); dateFormatCombo->setEditable(false); if(ci.p1) { QString date_format = "MM"; if(ci.separator > 0) date_format += ci.separator; date_format += "DD"; if(ci.separator > 0) date_format += ci.separator; date_format += "YY"; if(ci.ly) date_format += "YY"; dateFormatCombo->addItem(date_format); } if(ci.p2) { QString date_format = "DD"; if(ci.separator > 0) date_format += ci.separator; date_format += "MM"; if(ci.separator > 0) date_format += ci.separator; date_format += "YY"; if(ci.ly) date_format += "YY"; dateFormatCombo->addItem(date_format); } if(ci.p3) { QString date_format = "YY"; if(ci.ly) date_format += "YY"; if(ci.separator > 0) date_format += ci.separator; date_format += "MM"; if(ci.separator > 0) date_format += ci.separator; date_format += "DD"; dateFormatCombo->addItem(date_format); } if(ci.p4) { QString date_format = "YY"; if(ci.ly) date_format += "YY"; if(ci.separator > 0) date_format += ci.separator; date_format += "DD"; if(ci.separator > 0) date_format += ci.separator; date_format += "MM"; dateFormatCombo->addItem(date_format); } grid->addWidget(dateFormatCombo, 1, 1); } KComboBox *valueFormatCombo = NULL; if(ci.value_format < 0) { grid->addWidget(new QLabel(i18n("Value format:"), dialog->mainWidget()), ps > 1 ? 2 : 1, 0); valueFormatCombo = new KComboBox(dialog->mainWidget()); valueFormatCombo->setEditable(false); valueFormatCombo->addItem("1,000,000.00"); valueFormatCombo->addItem("1.000.000,00"); grid->addWidget(valueFormatCombo, ps > 1 ? 2 : 1, 1); } if(dialog->exec() != QDialog::Accepted) { return; } if(ps > 1) { bool p1 = false, p2 = false, p3 = false, p4 = false; int p[4]; int i = 0; if(ci.p1) {p[i] = 1; i++;} if(ci.p2) {p[i] = 2; i++;} if(ci.p3) {p[i] = 3; i++;} if(ci.p4) {p[i] = 4; i++;} switch(p[dateFormatCombo->currentIndex()]) { case 1: {p1 = true; break;} case 2: {p2 = true; break;} case 3: {p3 = true; break;} case 4: {p4 = true; break;} } ci.p1 = p1; ci.p2 = p2; ci.p3 = p3; ci.p4 = p4; } if(ci.value_format < 0) ci.value_format = valueFormatCombo->currentIndex() + 1; dialog->deleteLater(); } if(import(false, &ci)) QWizard::accept(); } #include "importcsvdialog.moc" eqonomize-0.6/src/importcsvdialog.h0000644000175000017500000000641311106576766016512 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef IMPORT_CSV_DIALOG_H #define IMPORT_CSV_DIALOG_H #include class Budget; class QButtonGroup; class QLabel; class QRadioButton; class QSpinBox; class KDateEdit; class EqonomizeValueEdit; class KLineEdit; class KComboBox; class KUrlRequester; class QCheckBox; struct csv_info; class ImportCSVDialog : public QWizard { Q_OBJECT protected: Budget *budget; QLabel *typeDescriptionLabel; QButtonGroup *typeGroup, *dateGroup, *valueGroup, *costGroup, *descriptionGroup, *AC1Group, *AC2Group, *commentsGroup; KUrlRequester *fileEdit; QSpinBox *rowEdit; KComboBox *delimiterCombo; KLineEdit *delimiterEdit; QRadioButton *columnDescriptionButton, *valueDescriptionButton; QSpinBox *columnDescriptionEdit; KLineEdit *valueDescriptionEdit; QLabel *valueLabel; QRadioButton *columnValueButton, *valueValueButton; QSpinBox *columnValueEdit; EqonomizeValueEdit *valueValueEdit; QLabel *costLabel; QRadioButton *columnCostButton, *valueCostButton; QSpinBox *columnCostEdit; EqonomizeValueEdit *valueCostEdit; QRadioButton *columnDateButton, *valueDateButton; QSpinBox *columnDateEdit; KDateEdit *valueDateEdit; QLabel *AC1Label; QRadioButton *columnAC1Button, *valueAC1Button; QSpinBox *columnAC1Edit; KComboBox *valueAC1Edit; QLabel *AC2Label; QRadioButton *columnAC2Button, *valueAC2Button; QSpinBox *columnAC2Edit; KComboBox *valueAC2Edit; QRadioButton *columnCommentsButton, *valueCommentsButton; QSpinBox *columnCommentsEdit; KLineEdit *valueCommentsEdit; QCheckBox *createMissingButton; bool import(bool test, csv_info *ci); public: ImportCSVDialog(Budget *budg, QWidget *parent); ~ImportCSVDialog(); protected slots: void onFileChanged(const QString&); void nextClicked(); void typeChanged(int); void delimiterChanged(int); void accept(); }; #endif eqonomize-0.6/src/kdateedit.cpp0000600000175000017500000002404711106753222015550 0ustar hannahanna/* This file is part of libkdepim. Copyright (c) 2002 Cornelius Schumacher Copyright (c) 2002 David Jarvie Copyright (c) 2003-2004 Reinhold Kainhofer Copyright (c) 2004 Tobias Koenig This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ //krazy:excludeall=qclasses as we want to subclass from QComboBox, not KComboBox #include "kdateedit.h" #include #include #include #include #include #include #include #include #include #include #include #include class DateValidator : public QValidator { public: DateValidator( const QStringList &keywords, QWidget *parent ) : QValidator( parent ), mKeywords( keywords ) {} virtual State validate( QString &str, int & ) const { int length = str.length(); // empty string is intermediate so one can clear the edit line and start from scratch if ( length <= 0 ) { return Intermediate; } if ( mKeywords.contains( str.toLower() ) ) { return Acceptable; } bool ok = false; KGlobal::locale()->readDate( str, &ok ); if ( ok ) { return Acceptable; } else { return Intermediate; } } private: QStringList mKeywords; }; KDateEdit::KDateEdit( QWidget *parent, const char *name ) : QComboBox( parent ), mReadOnly( false ), mDiscardNextMousePress( false ) { setObjectName( name ); // need at least one entry for popup to work setMaxCount( 1 ); setEditable( true ); mDate = QDate::currentDate(); QString today = KGlobal::locale()->formatDate( mDate, KLocale::ShortDate ); addItem( today ); setCurrentIndex( 0 ); setSizeAdjustPolicy( AdjustToContents ); connect( lineEdit(), SIGNAL( returnPressed() ), this, SLOT( lineEnterPressed() ) ); connect( this, SIGNAL( textChanged( const QString& ) ), SLOT( slotTextChanged( const QString& ) ) ); // mPopup = new KDatePickerPopup( KDatePickerPopup::DatePicker | KDatePickerPopup::Words, // QDate::currentDate(), this ); mPopup = new KDatePickerPopup( KDatePickerPopup::DatePicker, QDate::currentDate(), this ); mPopup->hide(); mPopup->installEventFilter( this ); connect( mPopup, SIGNAL( dateChanged( const QDate& ) ), SLOT( dateSelected( const QDate& ) ) ); // handle keyword entry setupKeywords(); lineEdit()->installEventFilter( this ); setValidator( new DateValidator( mKeywordMap.keys(), this ) ); mTextChanged = false; } KDateEdit::~KDateEdit() { } void KDateEdit::setDate( const QDate &date ) { assignDate( date ); updateView(); } QDate KDateEdit::date() const { return mDate; } void KDateEdit::setReadOnly( bool readOnly ) { mReadOnly = readOnly; lineEdit()->setReadOnly( readOnly ); } bool KDateEdit::isReadOnly() const { return mReadOnly; } void KDateEdit::showPopup() { if ( mReadOnly ) { return; } QRect desk = KGlobalSettings::desktopGeometry( this ); QPoint popupPoint = mapToGlobal( QPoint( 0, 0 ) ); int dateFrameHeight = mPopup->sizeHint().height(); if ( popupPoint.y() + height() + dateFrameHeight > desk.bottom() ) { popupPoint.setY( popupPoint.y() - dateFrameHeight ); } else { popupPoint.setY( popupPoint.y() + height() ); } int dateFrameWidth = mPopup->sizeHint().width(); if ( popupPoint.x() + dateFrameWidth > desk.right() ) { popupPoint.setX( desk.right() - dateFrameWidth ); } if ( popupPoint.x() < desk.left() ) { popupPoint.setX( desk.left() ); } if ( popupPoint.y() < desk.top() ) { popupPoint.setY( desk.top() ); } if ( mDate.isValid() ) { mPopup->setDate( mDate ); } else { mPopup->setDate( QDate::currentDate() ); } mPopup->popup( popupPoint ); // The combo box is now shown pressed. Make it show not pressed again // by causing its (invisible) list box to emit a 'selected' signal. // First, ensure that the list box contains the date currently displayed. QDate date = parseDate(); assignDate( date ); updateView(); // Now, simulate an Enter to unpress it QAbstractItemView *lb = view(); if ( lb ) { lb->setCurrentIndex( lb->model()->index( 0, 0 ) ); QKeyEvent *keyEvent = new QKeyEvent( QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier ); QApplication::postEvent( lb, keyEvent ); } } void KDateEdit::dateSelected( const QDate &date ) { if ( assignDate( date ) ) { updateView(); emit dateChanged( date ); emit dateEntered( date ); if ( date.isValid() ) { mPopup->hide(); } } } void KDateEdit::lineEnterPressed() { bool replaced = false; QDate date = parseDate( &replaced ); if ( assignDate( date ) ) { if ( replaced ) { updateView(); } emit dateChanged( date ); emit dateEntered( date ); } } QDate KDateEdit::parseDate( bool *replaced ) const { QString text = currentText(); QDate result; if ( replaced ) { (*replaced) = false; } if ( text.isEmpty() ) { result = QDate(); } else if ( mKeywordMap.contains( text.toLower() ) ) { QDate today = QDate::currentDate(); int i = mKeywordMap[ text.toLower() ]; if ( i >= 100 ) { /* A day name has been entered. Convert to offset from today. * This uses some math tricks to figure out the offset in days * to the next date the given day of the week occurs. There * are two cases, that the new day is >= the current day, which means * the new day has not occurred yet or that the new day < the current day, * which means the new day is already passed (so we need to find the * day in the next week). */ i -= 100; int currentDay = today.dayOfWeek(); if ( i >= currentDay ) { i -= currentDay; } else { i += 7 - currentDay; } } result = today.addDays( i ); if ( replaced ) { (*replaced) = true; } } else { result = KGlobal::locale()->readDate( text ); } return result; } void KDateEdit::focusOutEvent( QFocusEvent *e ) { if ( mTextChanged ) { lineEnterPressed(); mTextChanged = false; } QComboBox::focusOutEvent( e ); } void KDateEdit::keyPressEvent(QKeyEvent* e) { int step = 0; if ( e->key() == Qt::Key_Up ) { step = 1; } else if ( e->key() == Qt::Key_Down ) { step = -1; } if ( step && !mReadOnly ) { QDate date = parseDate(); if ( date.isValid() ) { date = date.addDays( step ); if ( assignDate( date ) ) { updateView(); emit dateChanged( date ); emit dateEntered( date ); } } } QComboBox::keyPressEvent(e); } bool KDateEdit::eventFilter( QObject *object, QEvent *event ) { if ( object == lineEdit() ) { // We only process the focus out event if the text has changed // since we got focus if ( ( event->type() == QEvent::FocusOut ) && mTextChanged ) { lineEnterPressed(); mTextChanged = false; } else if ( event->type() == QEvent::KeyPress ) { // Up and down arrow keys step the date QKeyEvent *keyEvent = (QKeyEvent *)event; if ( keyEvent->key() == Qt::Key_Return ) { lineEnterPressed(); return true; } } } else { // It's a date picker event switch ( event->type() ) { case QEvent::MouseButtonDblClick: case QEvent::MouseButtonPress: { QMouseEvent *mouseEvent = (QMouseEvent*)event; if ( !mPopup->rect().contains( mouseEvent->pos() ) ) { QPoint globalPos = mPopup->mapToGlobal( mouseEvent->pos() ); if ( QApplication::widgetAt( globalPos ) == this ) { // The date picker is being closed by a click on the // KDateEdit widget. Avoid popping it up again immediately. mDiscardNextMousePress = true; } } break; } default: break; } } return false; } void KDateEdit::mousePressEvent( QMouseEvent *event ) { if ( event->button() == Qt::LeftButton && mDiscardNextMousePress ) { mDiscardNextMousePress = false; return; } QComboBox::mousePressEvent( event ); } void KDateEdit::slotTextChanged( const QString & ) { QDate date = parseDate(); if ( assignDate( date ) ) { emit dateChanged( date ); } mTextChanged = true; } void KDateEdit::setupKeywords() { // Create the keyword list. This will be used to match against when the user // enters information. mKeywordMap.insert( i18nc( "the day after today", "tomorrow" ), 1 ); mKeywordMap.insert( i18nc( "this day", "today" ), 0 ); mKeywordMap.insert( i18nc( "the day before today", "yesterday" ), -1 ); QString dayName; for ( int i = 1; i <= 7; ++i ) { dayName = KGlobal::locale()->calendar()->weekDayName( i ).toLower(); mKeywordMap.insert( dayName, i + 100 ); } } bool KDateEdit::assignDate( const QDate &date ) { mDate = date; mTextChanged = false; return true; } void KDateEdit::updateView() { QString dateString; if ( mDate.isValid() ) { dateString = KGlobal::locale()->formatDate( mDate, KLocale::ShortDate ); } // We do not want to generate a signal here, // since we explicitly setting the date bool blocked = signalsBlocked(); blockSignals( true ); removeItem( 0 ); insertItem( 0, dateString ); blockSignals( blocked ); } #include "kdateedit.moc" eqonomize-0.6/src/kdateedit.h0000600000175000017500000000745111041633343015214 0ustar hannahanna/* This file is part of libkdepim. Copyright (c) 2002 Cornelius Schumacher Copyright (c) 2002 David Jarvie Copyright (c) 2004 Tobias Koenig This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef KDEPIM_KDATEEDIT_H #define KDEPIM_KDATEEDIT_H #include "kdatepickerpopup.h" #include #include #include #include #include class QEvent; class KDateEdit : public QComboBox { Q_OBJECT public: explicit KDateEdit( QWidget *parent = 0, const char *name = 0 ); virtual ~KDateEdit(); /** @return The date entered. This date could be invalid, you have to check validity yourself. */ QDate date() const; /** Sets whether the widget is read-only for the user. If read-only, the date pop-up is inactive, and the displayed date cannot be edited. @param readOnly True to set the widget read-only, false to set it read-write. */ void setReadOnly( bool readOnly ); /** @return True if the widget is read-only, false if read-write. */ bool isReadOnly() const; virtual void showPopup(); Q_SIGNALS: /** This signal is emitted whenever the user has entered a new date. When the user changes the date by editing the line edit field, the signal is not emitted until focus leaves the line edit field. The passed date can be invalid. */ void dateEntered( const QDate &date ); /** This signal is emitted whenever the user modifies the date. The passed date can be invalid. */ void dateChanged( const QDate &date ); public Q_SLOTS: /** Sets the date. @param date The new date to display. This date must be valid or it will not be set */ void setDate( const QDate &date ); protected Q_SLOTS: void lineEnterPressed(); void slotTextChanged( const QString & ); void dateSelected( const QDate & ); protected: virtual bool eventFilter( QObject *, QEvent * ); virtual void mousePressEvent( QMouseEvent * ); virtual void focusOutEvent( QFocusEvent * ); virtual void keyPressEvent( QKeyEvent * ); /** Sets the date, without altering the display. This method is used internally to set the widget's date value. As a virtual method, it allows derived classes to perform additional validation on the date value before it is set. Derived classes should return true if QDate::isValid(@p date) returns false. @param date The new date to set. @return True if the date was set, false if it was considered invalid and remains unchanged. */ virtual bool assignDate( const QDate &date ); /** Fills the keyword map. Reimplement it if you want additional keywords. */ void setupKeywords(); private: QDate parseDate( bool *replaced = 0 ) const; void updateView(); KDatePickerPopup *mPopup; QDate mDate; bool mReadOnly; bool mTextChanged; bool mDiscardNextMousePress; QMap mKeywordMap; }; #endif eqonomize-0.6/src/kdatepickerpopup.cpp0000600000175000017500000000734311041633425017164 0ustar hannahanna/* This file is part of libkdepim. Copyright (c) 2004 Bram Schoenmakers This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "kdatepickerpopup.h" #include #include #include #include class KDatePickerAction : public QWidgetAction { public: KDatePickerAction( KDatePicker *widget, QObject *parent ) : QWidgetAction( parent ), mDatePicker( widget ), mOriginalParent( widget->parentWidget() ) { } protected: QWidget *createWidget( QWidget *parent ) { mDatePicker->setParent( parent ); return mDatePicker; } void deleteWidget( QWidget *widget ) { if ( widget != mDatePicker ) { return; } mDatePicker->setParent( mOriginalParent ); } private: KDatePicker *mDatePicker; QWidget *mOriginalParent; }; KDatePickerPopup::KDatePickerPopup( Items items, const QDate &date, QWidget *parent ) : QMenu( parent ) { mItems = items; mDatePicker = new KDatePicker( this ); mDatePicker->setCloseButton( false ); connect( mDatePicker, SIGNAL( dateEntered( const QDate& ) ), SLOT( slotDateChanged( const QDate& ) ) ); connect( mDatePicker, SIGNAL( dateSelected( const QDate& ) ), SLOT( slotDateChanged( const QDate& ) ) ); mDatePicker->setDate( date ); buildMenu(); } void KDatePickerPopup::buildMenu() { if ( isVisible() ) { return; } clear(); if ( mItems & DatePicker ) { addAction( new KDatePickerAction( mDatePicker, this ) ); if ( ( mItems & NoDate ) || ( mItems & Words ) ) { addSeparator(); } } if ( mItems & Words ) { addAction( i18nc( "@option today", "&Today" ), this, SLOT( slotToday() ) ); addAction( i18nc( "@option tomorrow", "To&morrow" ), this, SLOT( slotTomorrow() ) ); addAction( i18nc( "@option next week", "Next &Week" ), this, SLOT( slotNextWeek() ) ); addAction( i18nc( "@option next month", "Next M&onth" ), this, SLOT( slotNextMonth() ) ); if ( mItems & NoDate ) { addSeparator(); } } if ( mItems & NoDate ) { addAction( i18nc( "@option do not specify a date", "No Date" ), this, SLOT( slotNoDate() ) ); } } KDatePicker *KDatePickerPopup::datePicker() const { return mDatePicker; } void KDatePickerPopup::setDate( const QDate &date ) { mDatePicker->setDate( date ); } #if 0 void KDatePickerPopup::setItems( int items ) { mItems = items; buildMenu(); } #endif void KDatePickerPopup::slotDateChanged( const QDate &date ) { emit dateChanged( date ); hide(); } void KDatePickerPopup::slotToday() { emit dateChanged( QDate::currentDate() ); } void KDatePickerPopup::slotTomorrow() { emit dateChanged( QDate::currentDate().addDays( 1 ) ); } void KDatePickerPopup::slotNoDate() { emit dateChanged( QDate() ); } void KDatePickerPopup::slotNextWeek() { emit dateChanged( QDate::currentDate().addDays( 7 ) ); } void KDatePickerPopup::slotNextMonth() { emit dateChanged( QDate::currentDate().addMonths( 1 ) ); } #include "kdatepickerpopup.moc" eqonomize-0.6/src/kdatepickerpopup.h0000600000175000017500000000522211041633446016626 0ustar hannahanna/* This file is part of libkdepim. Copyright (c) 2004 Bram Schoenmakers This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef KDEPIM_KDATEPICKERPOPUP_H #define KDEPIM_KDATEPICKERPOPUP_H #include #include class KDatePicker; class KDatePickerPopup: public QMenu { Q_OBJECT public: enum ItemFlag { NoDate = 1, DatePicker = 2, Words = 4 }; Q_DECLARE_FLAGS( Items, ItemFlag ) /** A constructor for the KDatePickerPopup. @param items List of all desirable items, separated with a bitwise OR. @param date Initial date of datepicker-widget. @param parent The object's parent. @param name The object's name. */ explicit KDatePickerPopup( Items items = DatePicker, const QDate &date = QDate::currentDate(), QWidget *parent = 0 ); /** @return A pointer to the private variable mDatePicker, an instance of KDatePicker. */ KDatePicker *datePicker() const; void setDate( const QDate &date ); #if 0 /** Set items which should be shown and rebuilds the menu afterwards. Only if the menu is not visible. @param items List of all desirable items, separated with a bitwise OR. */ void setItems( int items = 1 ); #endif /** @return Returns the bitwise result of the active items in the popup. */ int items() const { return mItems; } Q_SIGNALS: /** This signal emits the new date (selected with datepicker or other menu-items). */ void dateChanged ( const QDate &date ); protected Q_SLOTS: void slotDateChanged ( const QDate &date ); void slotToday(); void slotTomorrow(); void slotNextWeek(); void slotNextMonth(); void slotNoDate(); private: void buildMenu(); KDatePicker *mDatePicker; Items mItems; }; Q_DECLARE_OPERATORS_FOR_FLAGS( KDatePickerPopup::Items ) #endif eqonomize-0.6/src/ledgerdialog.cpp0000644000175000017500000006754511106576773016274 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "ledgerdialog.h" #include "transactioneditwidget.h" #include "eqonomize.h" #include "budget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern QString htmlize_string(QString str); class LedgerListViewItem : public QTreeWidgetItem { protected: Transaction *o_trans; SplitTransaction *o_split; public: LedgerListViewItem(Transaction *trans, SplitTransaction *split, QTreeWidget *parent, QString, QString=QString::null, QString=QString::null, QString=QString::null, QString=QString::null, QString=QString::null, QString=QString::null, QString=QString::null); Transaction *transaction() const; SplitTransaction *splitTransaction() const; }; LedgerListViewItem::LedgerListViewItem(Transaction *trans, SplitTransaction *split, QTreeWidget *parent, QString s1, QString s2, QString s3, QString s4, QString s5, QString s6, QString s7, QString s8) : QTreeWidgetItem(parent), o_trans(trans), o_split(split) { setText(0, s1); setText(1, s2); setText(2, s3); setText(3, s4); setText(4, s5); setText(5, s6); setText(6, s7); setText(7, s8); setTextAlignment(4, Qt::AlignRight); setTextAlignment(5, Qt::AlignRight); setTextAlignment(6, Qt::AlignRight); } Transaction *LedgerListViewItem::transaction() const { return o_trans; } SplitTransaction *LedgerListViewItem::splitTransaction() const { return o_split; } LedgerDialog::LedgerDialog(AssetsAccount *acc, Eqonomize *parent, QString title, bool extra_parameters) : KDialog(NULL, 0), account(acc), mainWin(parent), b_extra(extra_parameters) { setCaption(title); setButtons(KDialog::Close); setDefaultButton(KDialog::Close); setModal(true); setAttribute(Qt::WA_DeleteOnClose, true); budget = account->budget(); setMainWidget(new QWidget(this)); QVBoxLayout *box1 = new QVBoxLayout(mainWidget()); QHBoxLayout *topbox = new QHBoxLayout(); box1->addLayout(topbox); topbox->addWidget(new QLabel(i18n("Account:"), mainWidget())); accountCombo = new KComboBox(mainWidget()); accountCombo->setEditable(false); int i = 0; AssetsAccount *aaccount = budget->assetsAccounts.first(); while(aaccount) { if(aaccount != budget->balancingAccount && aaccount->accountType() != ASSETS_TYPE_SECURITIES) { accountCombo->addItem(aaccount->name()); if(aaccount == account) accountCombo->setCurrentIndex(i); i++; } aaccount = budget->assetsAccounts.next(); } topbox->addWidget(accountCombo); KDialogButtonBox *topbuttons = new KDialogButtonBox(mainWidget()); exportButton = topbuttons->addButton(i18n("Export..."), QDialogButtonBox::ActionRole); printButton = topbuttons->addButton(i18n("Print..."), QDialogButtonBox::ActionRole); topbox->addWidget(topbuttons); topbox->addStretch(1); QHBoxLayout *box2 = new QHBoxLayout(); box1->addLayout(box2); transactionsView = new EqonomizeTreeWidget(mainWidget()); transactionsView->setSortingEnabled(false); transactionsView->setAllColumnsShowFocus(true); transactionsView->setColumnCount(7); QStringList headers; headers << i18n("Date"); headers << i18n("Type"); headers << i18n("Description"); headers << i18n("Account/Category"); headers << i18n("Deposit"); headers << i18n("Withdrawal"); headers << i18n("Balance"); transactionsView->setHeaderLabels(headers); transactionsView->setRootIsDecorated(false); //transactionsView->setItemMargin(3); transactionsView->setMinimumHeight(450); transactionsView->setSelectionMode(QTreeWidget::ExtendedSelection); QSizePolicy sp = transactionsView->sizePolicy(); sp.setHorizontalPolicy(QSizePolicy::MinimumExpanding); transactionsView->setSizePolicy(sp); box2->addWidget(transactionsView); KDialogButtonBox *buttons = new KDialogButtonBox(mainWidget(), Qt::Vertical); QPushButton *newButton = buttons->addButton(i18n("New"), QDialogButtonBox::ActionRole); QMenu *newMenu = new QMenu(this); newButton->setMenu(newMenu); connect(newMenu->addAction(mainWin->ActionNewExpense->icon(), mainWin->ActionNewExpense->text()), SIGNAL(triggered()), this, SLOT(newExpense())); connect(newMenu->addAction(mainWin->ActionNewIncome->icon(), mainWin->ActionNewIncome->text()), SIGNAL(triggered()), this, SLOT(newIncome())); connect(newMenu->addAction(mainWin->ActionNewTransfer->icon(), mainWin->ActionNewTransfer->text()), SIGNAL(triggered()), this, SLOT(newTransfer())); connect(newMenu->addAction(mainWin->ActionNewSplitTransaction->icon(), mainWin->ActionNewSplitTransaction->text()), SIGNAL(triggered()), this, SLOT(newSplit())); editButton = buttons->addButton(i18n("Edit..."), QDialogButtonBox::ActionRole); editButton->setEnabled(false); removeButton = buttons->addButton(KStandardGuiItem::guiItem(KStandardGuiItem::Delete), QDialogButtonBox::ActionRole); removeButton->setEnabled(false); joinButton = buttons->addButton(i18n("Join..."), QDialogButtonBox::ActionRole); joinButton->setEnabled(false); splitUpButton = buttons->addButton(i18n("Split Up"), QDialogButtonBox::ActionRole); splitUpButton->setEnabled(false); box2->addWidget(buttons); connect(transactionsView, SIGNAL(itemSelectionChanged()), this, SLOT(transactionSelectionChanged())); connect(transactionsView, SIGNAL(doubleClicked(QTreeWidgetItem*, int)), this, SLOT(edit(QTreeWidgetItem*))); connect(removeButton, SIGNAL(clicked()), this, SLOT(remove())); connect(editButton, SIGNAL(clicked()), this, SLOT(edit())); connect(joinButton, SIGNAL(clicked()), this, SLOT(joinTransactions())); connect(splitUpButton, SIGNAL(clicked()), this, SLOT(splitUpTransaction())); connect(exportButton, SIGNAL(clicked()), this, SLOT(saveView())); connect(printButton, SIGNAL(clicked()), this, SLOT(printView())); connect(accountCombo, SIGNAL(activated(int)), this, SLOT(accountChanged(int))); connect(mainWin, SIGNAL(transactionsModified()), this, SLOT(updateTransactions())); connect(mainWin, SIGNAL(accountsModified()), this, SLOT(updateAccounts())); updateTransactions(); } LedgerDialog::~LedgerDialog() {} void LedgerDialog::saveConfig() { KConfigGroup config = KGlobal::config()->group("Ledger"); saveDialogSize(config); } void LedgerDialog::accountChanged(int index) { int i = 0; AssetsAccount *aaccount = budget->assetsAccounts.first(); while(aaccount) { if(aaccount != budget->balancingAccount && aaccount->accountType() != ASSETS_TYPE_SECURITIES) { if(i == index) { account = aaccount; break; } i++; } aaccount = budget->assetsAccounts.next(); } updateTransactions(); } void LedgerDialog::updateAccounts() { accountCombo->blockSignals(true); int i = 0; bool account_found = false; AssetsAccount *aaccount = budget->assetsAccounts.first(); while(aaccount) { if(aaccount != budget->balancingAccount && aaccount->accountType() != ASSETS_TYPE_SECURITIES) { accountCombo->addItem(aaccount->name()); if(aaccount == account) { accountCombo->setCurrentIndex(i); account_found = true; } i++; } aaccount = budget->assetsAccounts.next(); } if(!account_found) { if(accountCombo->count() == 0) { close(); return; } accountChanged(0); } else { updateTransactions(); } accountCombo->blockSignals(false); } void LedgerDialog::saveView() { if(transactionsView->topLevelItemCount() == 0) { KMessageBox::error(this, i18n("Empty transaction list.")); return; } KFileDialog *dialog = new KFileDialog(KUrl(), QString::null, this); QStringList filter; filter << "text/html" << "text/x-csv"; dialog->setMimeFilter(filter, "text/html"); dialog->setOperationMode(KFileDialog::Saving); dialog->setMode(KFile::File); if(dialog->exec() != QDialog::Accepted) {dialog->deleteLater(); return;} KUrl url = dialog->selectedUrl(); char filetype = 'h'; if(dialog->currentMimeFilter() == "text/x-csv") filetype = 'c'; dialog->deleteLater(); if(url.isEmpty() && url.isValid()) return; if(url.isLocalFile()) { if(QFile::exists(url.path())) { if(KMessageBox::warningYesNo(this, i18n("The selected file already exists. Would you like to overwrite the old copy?")) != KMessageBox::Yes) return; } QFileInfo info(url.path()); if(info.isDir()) { KMessageBox::error(this, i18n("You selected a directory!")); return; } KSaveFile ofile(url.path()); ofile.open(); ofile.setPermissions((QFile::Permissions) 0x0660); if(!ofile.isOpen()) { ofile.abort(); KMessageBox::error(this, i18n("Couldn't open file for writing.")); return; } QTextStream stream(&ofile); exportList(stream, filetype); if(!ofile.finalize()) { KMessageBox::error(this, i18n("Error while writing file; file was not saved.")); return; } return; } KTemporaryFile tf; tf.open(); tf.setAutoRemove(true); QTextStream stream(&tf); if(exportList(stream, filetype)) { if(!KIO::NetAccess::upload(tf.fileName(), url, this)) { KMessageBox::error(this, i18n("Failed to upload file to %1.").arg(url.prettyUrl())); } } } bool LedgerDialog::exportList(QTextStream &outf, int fileformat) { switch(fileformat) { case 'h': { outf.setCodec("UTF-8"); outf << "" << '\n'; outf << "" << '\n'; outf << "\t" << '\n'; outf << "\t\t"; outf << htmlize_string(i18n("Ledger")); outf << "" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t" << '\n'; outf << "\t" << '\n'; outf << "\t" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t\t" << '\n'; QTreeWidgetItem *header = transactionsView->headerItem(); outf << "\t\t\t\t\t"; outf << ""; outf << ""; outf << ""; outf << ""; outf << ""; outf << "" << "\n"; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; QTreeWidgetItemIterator it(transactionsView); LedgerListViewItem *i = (LedgerListViewItem*) *it; while(i) { outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; outf << ""; outf << ""; outf << ""; outf << ""; outf << ""; outf << "" << "\n"; outf << "\t\t\t\t" << '\n'; ++it; i = (LedgerListViewItem*) *it; } outf << "\t\t\t" << '\n'; outf << "\t\t
"; outf << htmlize_string(i18n("Transactions for %1").arg(account->name())); outf << "
" << htmlize_string(header->text(0)) << "" << htmlize_string(header->text(1)) << "" << htmlize_string(header->text(2)) << "" << htmlize_string(header->text(3)) << "" << htmlize_string(header->text(4)) << "" << htmlize_string(header->text(5)) << "" << htmlize_string(header->text(6)) << "
" << htmlize_string(i->text(0)) << "" << htmlize_string(i->text(1)) << "" << htmlize_string(i->text(2)) << "" << htmlize_string(i->text(3)) << "" << htmlize_string(i->text(4)) << "" << htmlize_string(i->text(5)) << "" << htmlize_string(i->text(6)) << "
" << '\n'; outf << "\t" << '\n'; outf << "" << '\n'; break; } case 'c': { //outf.setEncoding(Q3TextStream::Locale); QTreeWidgetItem *header = transactionsView->headerItem(); outf << "\"" << header->text(0) << "\",\"" << header->text(1) << "\",\"" << header->text(2) << "\",\"" << header->text(3) << "\",\"" << header->text(4) << "\",\""<< header->text(5) << "\",\"" << header->text(6) << "\"\n"; QTreeWidgetItemIterator it(transactionsView); LedgerListViewItem *i = (LedgerListViewItem*) *it; while(i) { outf << "\"" << i->text(0) << "\",\"" << i->text(1) << "\",\"" << i->text(2) << "\",\"" << i->text(3) << "\",\"" << i->text(4) << "\",\"" << i->text(5) << "\",\"" << i->text(6) << "\"\n"; ++it; i = (LedgerListViewItem*) *it; } break; } } return true; } void LedgerDialog::printView() { if(transactionsView->topLevelItemCount() == 0) { KMessageBox::error(this, i18n("Empty transaction list.")); return; } QString str; QTextStream stream(&str, QIODevice::WriteOnly); exportList(stream, 'h'); KHTMLPart *htmlpart = new KHTMLPart(this); htmlpart->begin(); htmlpart->write(str); htmlpart->end(); htmlpart->view()->print(); delete htmlpart; } void LedgerDialog::joinTransactions() { QList selection = transactionsView->selectedItems(); SplitTransaction *split = NULL; for(int index = 0; index < selection.size(); index++) { LedgerListViewItem *i = (LedgerListViewItem*) selection[index]; Transaction *trans = i->transaction(); if(trans && !i->splitTransaction()) { if(!split) { split = new SplitTransaction(budget, i->transaction()->date(), account); } split->splits.push_back(trans); } } if(!split) return; if(!mainWin->editSplitTransaction(split, this)) { split->clear(true); delete split; } } void LedgerDialog::splitUpTransaction() { QList selection = transactionsView->selectedItems(); LedgerListViewItem *i = (LedgerListViewItem*) selection.first(); if(i) { if(i->splitTransaction()) mainWin->splitUpTransaction(i->splitTransaction()); else if(i->transaction() && i->transaction()->parentSplit()) mainWin->splitUpTransaction(i->transaction()->parentSplit()); } } void LedgerDialog::transactionSelectionChanged() { QList selection = transactionsView->selectedItems(); bool selected = !selection.isEmpty(); removeButton->setEnabled(selected); editButton->setEnabled(selected); bool b_join = selected; bool b_split = selected; SplitTransaction *split = NULL; for(int index = 0; index < selection.size(); index++) { LedgerListViewItem *i = (LedgerListViewItem*) selection[index]; Transaction *trans = i->transaction(); if(!trans) { removeButton->setEnabled(false); if(selection.count() > 1) editButton->setEnabled(false); b_join = false; b_split = false; break; } if((b_join || b_split) && i->splitTransaction()) { b_join = false; b_split = (selection.count() == 1); } else if(b_split) { if(!split) split = trans->parentSplit(); if(!trans->parentSplit() || trans->parentSplit() != split) { b_split = false; } } if(b_join && trans->parentSplit()) { b_join = false; } } joinButton->setEnabled(b_join); splitUpButton->setEnabled(b_split); } void LedgerDialog::newExpense() { mainWin->newScheduledTransaction(TRANSACTION_TYPE_EXPENSE, NULL, false, this, account); } void LedgerDialog::newIncome() { mainWin->newScheduledTransaction(TRANSACTION_TYPE_INCOME, NULL, false, this, account); } void LedgerDialog::newTransfer() { mainWin->newScheduledTransaction(TRANSACTION_TYPE_TRANSFER, NULL, false, this, account); } void LedgerDialog::newSplit() { mainWin->newSplitTransaction(this, account); } void LedgerDialog::remove() { QList selection = transactionsView->selectedItems(); if(selection.count() > 1) { if(KMessageBox::warningContinueCancel(this, i18n("Are you sure you want to delete all (%1) selected transactions?").arg(selection.count())) == KMessageBox::Cancel) { return; } } transactionsView->clearSelection(); for(int index = 0; index < selection.size(); index++) { LedgerListViewItem *i = (LedgerListViewItem*) selection[index]; if(i->splitTransaction()) { budget->removeSplitTransaction(i->splitTransaction(), true); mainWin->splitTransactionRemoved(i->splitTransaction()); delete i->splitTransaction(); } else if(i->transaction()) { budget->removeTransaction(i->transaction(), true); mainWin->transactionRemoved(i->transaction()); delete i->transaction(); } } } void LedgerDialog::edit() { QList selection = transactionsView->selectedItems(); if(selection.count() == 1) { LedgerListViewItem *i = (LedgerListViewItem*) selection.first(); if(i->splitTransaction()) mainWin->editSplitTransaction(i->splitTransaction(), this); else if(!i->transaction()) mainWin->editAccount(account, this); else if(i->transaction()->parentSplit()) mainWin->editSplitTransaction(i->transaction()->parentSplit(), this); else if(i->transaction()) mainWin->editTransaction(i->transaction(), this); } else if(selection.count() > 1) { bool warned1 = false, warned2 = false, warned3 = false, warned4 = false; bool equal_date = true, equal_description = true, equal_value = true, equal_category = true, equal_payee = b_extra; int transtype = -1; Transaction *comptrans = NULL; Account *compcat = NULL; QDate compdate; for(int index = 0; index < selection.size(); index++) { LedgerListViewItem *i = (LedgerListViewItem*) selection[index]; if(!comptrans) { comptrans = i->transaction(); compdate = i->transaction()->date(); transtype = i->transaction()->type(); if(i->transaction()->parentSplit()) equal_date = false; if(i->transaction()->type() != TRANSACTION_TYPE_EXPENSE && i->transaction()->type() != TRANSACTION_TYPE_INCOME) equal_payee = false; if(i->transaction()->type() == TRANSACTION_TYPE_INCOME) { compcat = ((Income*) i->transaction())->category(); } else if(i->transaction()->type() == TRANSACTION_TYPE_EXPENSE) { compcat = ((Expense*) i->transaction())->category(); } else if(i->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || i->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) { equal_value = false; equal_description = false; compcat = ((SecurityTransaction*) i->transaction())->account(); if(compcat->type() == ACCOUNT_TYPE_ASSETS) { equal_category = false; } } } else { if(transtype >= 0 && comptrans->type() != transtype) { transtype = -1; } if(equal_date && (compdate != i->transaction()->date() || i->transaction()->parentSplit())) { equal_date = false; } if(equal_description && (i->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || i->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL || comptrans->description() != i->transaction()->description())) { equal_description = false; } if(equal_payee && (i->transaction()->type() != comptrans->type() || (comptrans->type() == TRANSACTION_TYPE_EXPENSE && ((Expense*) comptrans)->payee() != ((Expense*) i->transaction())->payee()) || (comptrans->type() == TRANSACTION_TYPE_INCOME && ((Income*) comptrans)->payer() != ((Income*) i->transaction())->payer()))) { equal_payee = false; } if(equal_value && (i->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || i->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL || comptrans->value() != i->transaction()->value())) { equal_value = false; } if(equal_category) { if(i->transaction()->type() == TRANSACTION_TYPE_INCOME) { if(compcat != ((Income*) i->transaction())->category()) { equal_category = false; } } else if(i->transaction()->type() == TRANSACTION_TYPE_EXPENSE) { if(compcat != ((Expense*) i->transaction())->category()) { equal_category = false; } } else if(i->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || i->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) { if(compcat != ((SecurityTransaction*) i->transaction())->account()) { equal_category = false; } } } } } MultipleTransactionsEditDialog *dialog = new MultipleTransactionsEditDialog(b_extra, transtype, budget, this); LedgerListViewItem *i = (LedgerListViewItem*) transactionsView->currentItem(); if(!i->isSelected()) i = (LedgerListViewItem*) selection.first(); if(i) { dialog->setTransaction(i->transaction()); } if(equal_description) dialog->descriptionButton->setChecked(true); if(equal_payee && dialog->payeeButton) dialog->payeeButton->setChecked(true); if(equal_value && dialog->valueButton) dialog->valueButton->setChecked(true); if(equal_date) dialog->dateButton->setChecked(true); if(equal_category && dialog->categoryButton) dialog->categoryButton->setChecked(true); if(dialog->exec() == QDialog::Accepted) { QDate date = dialog->date(); bool future = !date.isNull() && date > QDate::currentDate(); for(int index = 0; index < selection.size(); index++) { LedgerListViewItem *i = (LedgerListViewItem*) selection[index]; if(!warned1 && (i->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || i->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL)) { if(dialog->valueButton && dialog->valueButton->isChecked()) { KMessageBox::error(this, i18n("Cannot set the value of security transactions using the dialog for modifying multiple transactions.")); warned1 = true; } } if(!warned2 && (i->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || i->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL || (i->transaction()->type() == TRANSACTION_TYPE_INCOME && ((Income*) i->transaction())->security()))) { if(dialog->descriptionButton->isChecked()) { KMessageBox::error(this, i18n("Cannot change description of dividends and security transactions.")); warned2 = true; } } if(!warned3 && dialog->payeeButton && (i->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || i->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL || (i->transaction()->type() == TRANSACTION_TYPE_INCOME && ((Income*) i->transaction())->security()))) { if(dialog->payeeButton->isChecked()) { KMessageBox::error(this, i18n("Cannot change payer of dividends and security transactions.")); warned3 = true; } } if(!warned4 && i->transaction()->parentSplit()) { if(dialog->dateButton->isChecked()) { KMessageBox::error(this, i18n("Cannot change date of transactions that are part of a split transaction.")); warned4 = true; } } Transaction *trans = i->transaction(); Transaction *oldtrans = trans->copy(); if(dialog->modifyTransaction(trans)) { if(future && !trans->parentSplit()) { budget->removeTransaction(trans, true); mainWin->transactionRemoved(trans); ScheduledTransaction *strans = new ScheduledTransaction(budget, trans, NULL); budget->addScheduledTransaction(strans); mainWin->scheduledTransactionAdded(strans); } else { mainWin->transactionModified(trans, oldtrans); } } delete oldtrans; } } dialog->deleteLater(); } } void LedgerDialog::edit(QTreeWidgetItem*) { edit(); } void LedgerDialog::updateTransactions() { /*int contents_x = transactionsView->contentsX(); int contents_y = transactionsView->contentsY();*/ int scroll_h = transactionsView->horizontalScrollBar()->value(); int scroll_v = transactionsView->verticalScrollBar()->value(); Transaction *selected_transaction = NULL; SplitTransaction *selected_split = NULL; QList selection = transactionsView->selectedItems(); if(selection.count() == 1) { LedgerListViewItem *i = (LedgerListViewItem*) selection.first(); selected_split = i->splitTransaction(); if(!selected_split) selected_transaction = i->transaction(); } transactionsView->clear(); double balance = account->initialBalance(); if(balance != 0.0) transactionsView->insertTopLevelItem(0, new LedgerListViewItem(NULL, NULL, NULL, "-", "-", "Initial balance", "-", QString::null, QString::null, KGlobal::locale()->formatMoney(balance))); Transaction *trans = budget->transactions.first(); QVector splits; while(trans) { SplitTransaction *split_this = trans->parentSplit(); bool skip = false; if(!splits.isEmpty() && split_this) { if(splits[splits.size() - 1]->date() != split_this->date()) { splits.clear(); } else if(split_this) { for(QVector::size_type i = 0; i < splits.size(); i++) { if(split_this == splits[i]) { skip = true; break; } } } } if(!skip && (trans->fromAccount() == account || trans->toAccount() == account)) { if(split_this && split_this->account() != account) split_this = NULL; if(split_this) splits.push_back(split_this); bool deposit = split_this || (trans->toAccount() == account); double value = 0.0; if(split_this) value = split_this->value(); else value = trans->value(); if(deposit) balance += value; else balance -= value; if(!split_this && value < 0.0) { deposit = !deposit; value = -value; } if(split_this) { LedgerListViewItem *i = new LedgerListViewItem(trans, split_this, NULL, KGlobal::locale()->formatDate(split_this->date(), KLocale::ShortDate), i18n("Split Transaction"), split_this->description(), QString::null, (value >= 0.0) ? KGlobal::locale()->formatMoney(value) : QString::null, (value < 0.0) ? KGlobal::locale()->formatMoney(-value) : QString::null, KGlobal::locale()->formatMoney(balance)); transactionsView->insertTopLevelItem(0, i); if(split_this == selected_split) { i->setSelected(true); } } else { LedgerListViewItem *i = new LedgerListViewItem(trans, NULL, NULL, KGlobal::locale()->formatDate(trans->date(), KLocale::ShortDate), QString::null, trans->description(), deposit ? trans->fromAccount()->name() : trans->toAccount()->name(), (deposit && value >= 0.0) ? KGlobal::locale()->formatMoney(value < 0.0 ? -value : value) : QString::null, (deposit && value >= 0.0) ? QString::null : KGlobal::locale()->formatMoney(value < 0.0 ? -value : value), KGlobal::locale()->formatMoney(balance)); transactionsView->insertTopLevelItem(0, i); if(trans->type() == TRANSACTION_TYPE_INCOME) { if(value >= 0.0) i->setText(1, i18n("Income")); else i->setText(1, i18n("Repayment")); } else if(trans->type() == TRANSACTION_TYPE_EXPENSE) { if(value >= 0.0) i->setText(1, i18n("Expense")); else i->setText(1, i18n("Refund")); } else if(trans->toAccount() == budget->balancingAccount || trans->fromAccount() == budget->balancingAccount) i->setText(1, i18n("Balancing")); else i->setText(1, i18n("Transfer")); if(trans == selected_transaction) { i->setSelected(true); } } } trans = budget->transactions.next(); } //transactionsView->setContentsPos(contents_x, contents_y); transactionsView->horizontalScrollBar()->setValue(scroll_h); transactionsView->verticalScrollBar()->setValue(scroll_v); } #include "ledgerdialog.moc" eqonomize-0.6/src/ledgerdialog.h0000644000175000017500000000511411106576777015725 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef LEDGER_DIALOG_H #define LEDGER_DIALOG_H #include #include class Eqonomize; class AssetsAccount; class Budget; class QTreeWidget; class QTreeWidgetItem; class QPushButton; class KComboBox; class LedgerDialog : public KDialog { Q_OBJECT protected: AssetsAccount *account; Eqonomize *mainWin; Budget *budget; bool b_extra; QTreeWidget *transactionsView; QPushButton *editButton, *removeButton, *joinButton, *splitUpButton; QPushButton *exportButton, *printButton; KComboBox *accountCombo; bool exportList(QTextStream &outf, int fileformat); public: LedgerDialog(AssetsAccount *acc, Eqonomize *parent, QString title, bool extra_parameters); ~LedgerDialog(); public slots: void saveConfig(); protected slots: void remove(); void edit(); void edit(QTreeWidgetItem*); void transactionSelectionChanged(); void updateTransactions(); void updateAccounts(); void newExpense(); void newIncome(); void newTransfer(); void newSplit(); void joinTransactions(); void splitUpTransaction(); void saveView(); void printView(); void accountChanged(int); }; #endif eqonomize-0.6/src/main.cpp0000644000175000017500000000657311106631415014551 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "budget.h" #include #include #include #include #include #include #include "eqonomize.h" QString emptystr = ""; int main(int argc, char **argv) { KAboutData about("eqonomize", 0, ki18n("Eqonomize!"), "0.6", ki18n("A personal accounting program"), KAboutData::License_GPL, ki18n("(C) 2008 Hanna K."), KLocalizedString(), "http://eqonomize.sourceforge.net/", "hanna_k@users.sourceforge.net"); about.addAuthor(ki18n("Hanna K."), KLocalizedString(), "hanna_k@fmgirl.com"); KCmdLineArgs::init(argc, argv, &about); KCmdLineOptions options; options.add("e"); options.add("expenses", ki18n("Start with expenses list displayed")); options.add("i"); options.add("incomes", ki18n("Start with incomes list displayed")); options.add("t"); options.add("transfers", ki18n("Start with transfers list displayed")); options.add("+[URL]", ki18n("Document to open")); KCmdLineArgs::addCmdLineOptions(options); KUniqueApplication::addCmdLineOptions(); if(!KUniqueApplication::start()) { RESTORE(Eqonomize) return 0; } KUniqueApplication app; if(kapp->isSessionRestored()) { RESTORE(Eqonomize) } else { KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); Eqonomize *win = new Eqonomize(); kapp->setTopWidget(win); if(args->isSet("expenses")) { win->showExpenses(); } else if(args->isSet("incomes")) { win->showIncomes(); } else if(args->isSet("transfers")) { win->showTransfers(); } win->show(); qApp->processEvents(); QString url = KGlobal::config()->group("General Options").readPathEntry("lastURL", QString()); if(args->count() > 0) { win->openURL(args->url(0)); } else if(!url.isEmpty()) { win->openURL(KUrl(url)); win->readFileDependentOptions(); } else { if(!win->crashRecovery(KUrl())) { win->createDefaultBudget(); } } args->clear(); } return app.exec(); } eqonomize-0.6/src/overtimechart.cpp0000600000175000017500000022626111106577015016474 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "overtimechart.h" #include "budget.h" #include "account.h" #include "transaction.h" #include "recurrence.h" #include "eqonomizemonthselector.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct chart_month_info { double value; double count; QDate date; }; extern int months_between_dates(const QDate &date1, const QDate &date2); OverTimeChart::OverTimeChart(Budget *budg, QWidget *parent, bool extra_parameters) : QWidget(parent), budget(budg), b_extra(extra_parameters) { setAttribute(Qt::WA_DeleteOnClose, true); const KCalendarSystem *calSys = KGlobal::locale()->calendar(); QVBoxLayout *layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); KDialogButtonBox *buttons = new KDialogButtonBox(this); saveButton = buttons->addButton(KStandardGuiItem::saveAs(), QDialogButtonBox::ActionRole); printButton = buttons->addButton(KStandardGuiItem::print(), QDialogButtonBox::ActionRole); layout->addWidget(buttons); scene = NULL; view = new QGraphicsView(this); view->setRenderHint(QPainter::Antialiasing, true); view->setRenderHint(QPainter::HighQualityAntialiasing, true); layout->addWidget(view); KConfigGroup config = KGlobal::config()->group("Over Time Chart"); QGroupBox *settingsWidget = new QGroupBox(i18n("Options"), this); QGridLayout *settingsLayout = new QGridLayout(settingsWidget); QLabel *sourceLabel = new QLabel(i18n("Source:"), settingsWidget); settingsLayout->addWidget(sourceLabel, 2, 0); QHBoxLayout *choicesLayout = new QHBoxLayout(); settingsLayout->addLayout(choicesLayout, 2, 1); QGridLayout *choicesLayout_extra = NULL; if(b_extra) { sourceLabel->setAlignment(Qt::AlignLeft | Qt::AlignTop); choicesLayout_extra = new QGridLayout(); choicesLayout->addLayout(choicesLayout_extra); } sourceCombo = new KComboBox(settingsWidget); sourceCombo->setEditable(false); sourceCombo->addItem(i18n("Incomes and Expenses")); sourceCombo->addItem(i18n("Profits")); sourceCombo->addItem(i18n("Expenses")); sourceCombo->addItem(i18n("Incomes")); if(b_extra) choicesLayout_extra->addWidget(sourceCombo, 0, 0); else choicesLayout->addWidget(sourceCombo); categoryCombo = new KComboBox(settingsWidget); categoryCombo->setEditable(false); categoryCombo->addItem(i18n("All Categories Combined")); categoryCombo->setEnabled(false); if(b_extra) choicesLayout_extra->addWidget(categoryCombo, 0, 1); else choicesLayout->addWidget(categoryCombo); descriptionCombo = new KComboBox(settingsWidget); descriptionCombo->setEditable(false); descriptionCombo->addItem(i18n("All Descriptions Combined")); descriptionCombo->setEnabled(false); if(b_extra) choicesLayout_extra->addWidget(descriptionCombo, 1, 0); else choicesLayout->addWidget(descriptionCombo); payeeCombo = NULL; if(b_extra) { payeeCombo = new KComboBox(settingsWidget); payeeCombo->setEditable(false); payeeCombo->addItem(i18n("All Payees/Payers Combined")); payeeCombo->setEnabled(false); choicesLayout_extra->addWidget(payeeCombo, 1, 1); choicesLayout->addStretch(1); } current_account = NULL; current_source = 0; settingsLayout->addWidget(new QLabel(i18n("Start date:"), settingsWidget), 0, 0); QHBoxLayout *monthLayout = new QHBoxLayout(); settingsLayout->addLayout(monthLayout, 0, 1); startDateEdit = new EqonomizeMonthSelector(settingsWidget); Transaction *trans = budget->transactions.first(); while(trans) { if(trans->fromAccount()->type() != ACCOUNT_TYPE_ASSETS || trans->toAccount()->type() != ACCOUNT_TYPE_ASSETS) { start_date = trans->date(); if(calSys->day(start_date) > 1) { start_date = calSys->addMonths(start_date, 1); calSys->setYMD(start_date, calSys->year(start_date), calSys->month(start_date), 1); } break; } trans = budget->transactions.next(); } if(start_date.isNull() || start_date > QDate::currentDate()) start_date = QDate::currentDate(); if(calSys->month(start_date) == calSys->month(QDate::currentDate()) && calSys->year(start_date) == calSys->year(QDate::currentDate())) { start_date = calSys->addMonths(start_date, -1); calSys->setYMD(start_date, calSys->year(start_date), calSys->month(start_date), 1); } startDateEdit->setDate(start_date); monthLayout->addWidget(startDateEdit); monthLayout->addWidget(new QLabel(i18n("End date:"), settingsWidget)); endDateEdit = new EqonomizeMonthSelector(settingsWidget); end_date = calSys->addDays(QDate::currentDate(), -1); if(calSys->day(end_date) < calSys->daysInMonth(end_date)) { end_date = calSys->addMonths(end_date, -1); calSys->setYMD(end_date, calSys->year(end_date), calSys->month(end_date), calSys->daysInMonth(end_date)); } if(end_date <= start_date || (calSys->month(start_date) == calSys->month(end_date) && calSys->year(start_date) == calSys->year(end_date))) { end_date = QDate::currentDate(); calSys->setYMD(end_date, calSys->year(end_date), calSys->month(end_date), calSys->daysInMonth(end_date)); } endDateEdit->setDate(end_date); monthLayout->addWidget(endDateEdit); monthLayout->addStretch(1); settingsLayout->addWidget(new QLabel(i18n("Value:"), settingsWidget), 1, 0); QHBoxLayout *enabledLayout = new QHBoxLayout(); settingsLayout->addLayout(enabledLayout, 1, 1); valueGroup = new QButtonGroup(this); valueButton = new QRadioButton(i18n("Monthly total"), settingsWidget); valueButton->setChecked(config.readEntry("valueSelected", true)); valueGroup->addButton(valueButton, 0); enabledLayout->addWidget(valueButton); dailyButton = new QRadioButton(i18n("Daily average"), settingsWidget); dailyButton->setChecked(config.readEntry("dailyAverageSelected", false)); valueGroup->addButton(dailyButton, 1); enabledLayout->addWidget(dailyButton); countButton = new QRadioButton(i18n("Quantity"), settingsWidget); countButton->setChecked(config.readEntry("transactionCountSelected", false)); valueGroup->addButton(countButton, 2); enabledLayout->addWidget(countButton); perButton = new QRadioButton(i18n("Average value"), settingsWidget); perButton->setChecked(config.readEntry("valuePerTransactionSelected", false)); valueGroup->addButton(perButton, 3); enabledLayout->addWidget(perButton); enabledLayout->addStretch(1); layout->addWidget(settingsWidget); connect(startDateEdit, SIGNAL(monthChanged(const QDate&)), this, SLOT(startMonthChanged(const QDate&))); connect(startDateEdit, SIGNAL(yearChanged(const QDate&)), this, SLOT(startYearChanged(const QDate&))); connect(endDateEdit, SIGNAL(monthChanged(const QDate&)), this, SLOT(endMonthChanged(const QDate&))); connect(endDateEdit, SIGNAL(yearChanged(const QDate&)), this, SLOT(endYearChanged(const QDate&))); connect(valueButton, SIGNAL(toggled(bool)), this, SLOT(valueTypeToggled(bool))); connect(dailyButton, SIGNAL(toggled(bool)), this, SLOT(valueTypeToggled(bool))); connect(countButton, SIGNAL(toggled(bool)), this, SLOT(valueTypeToggled(bool))); connect(perButton, SIGNAL(toggled(bool)), this, SLOT(valueTypeToggled(bool))); connect(sourceCombo, SIGNAL(activated(int)), this, SLOT(sourceChanged(int))); connect(categoryCombo, SIGNAL(activated(int)), this, SLOT(categoryChanged(int))); connect(descriptionCombo, SIGNAL(activated(int)), this, SLOT(descriptionChanged(int))); if(b_extra) connect(payeeCombo, SIGNAL(activated(int)), this, SLOT(payeeChanged(int))); connect(saveButton, SIGNAL(clicked()), this, SLOT(save())); connect(printButton, SIGNAL(clicked()), this, SLOT(print())); } OverTimeChart::~OverTimeChart() {} void OverTimeChart::valueTypeToggled(bool b) { if(b) updateDisplay(); } void OverTimeChart::payeeChanged(int index) { current_payee = ""; bool b_income = (current_account && current_account->type() == ACCOUNT_TYPE_INCOMES); int d_index = descriptionCombo->currentIndex(); if(index == 0) { if(d_index == 1) current_source = b_income ? 7 : 8; else if(d_index == 0) current_source = b_income ? 5 : 6; else current_source = b_income ? 9 : 10; } else if(index == 1) { if(d_index == 1) { descriptionCombo->blockSignals(true); descriptionCombo->setCurrentIndex(0); descriptionCombo->blockSignals(false); d_index = 0; } if(d_index == 0) current_source = b_income ? 11 : 12; else current_source = b_income ? 13 : 14; } else { if(!has_empty_payee || index < payeeCombo->count() - 1) current_payee = payeeCombo->itemText(index); if(d_index == 1) current_source = b_income ? 17 : 18; else if(d_index == 0) current_source = b_income ? 15 : 16; else current_source = b_income ? 19 : 20; } updateDisplay(); } void OverTimeChart::descriptionChanged(int index) { current_description = ""; bool b_income = (current_account && current_account->type() == ACCOUNT_TYPE_INCOMES); int p_index = 0; if(b_extra) p_index = payeeCombo->currentIndex(); if(index == 0) { if(p_index == 1) current_source = b_income ? 11 : 12; else if(p_index == 0) current_source = b_income ? 5 : 6; else current_source = b_income ? 15 : 16; } else if(index == 1) { if(p_index == 1) { payeeCombo->blockSignals(true); payeeCombo->setCurrentIndex(0); payeeCombo->blockSignals(false); p_index = 0; } if(p_index == 0) current_source = b_income ? 7 : 8; else current_source = b_income ? 17 : 18; } else { if(!has_empty_description || index < descriptionCombo->count() - 1) current_description = descriptionCombo->itemText(index); if(p_index == 1) current_source = b_income ? 13 : 14; else if(p_index == 0) current_source = b_income ? 9 : 10; else current_source = b_income ? 19 : 20; } updateDisplay(); } void OverTimeChart::categoryChanged(int index) { bool b_income = (sourceCombo->currentIndex() == 3); descriptionCombo->blockSignals(true); int d_index = descriptionCombo->currentIndex(); descriptionCombo->clear(); descriptionCombo->addItem(i18n("All Descriptions Combined")); int p_index = 0; current_description = ""; current_payee = ""; if(b_extra) { p_index = payeeCombo->currentIndex(); payeeCombo->blockSignals(true); payeeCombo->clear(); if(b_income) payeeCombo->addItem(i18n("All Payers Combined")); else payeeCombo->addItem(i18n("All Payees Combined")); } current_account = NULL; if(index == 0) { if(b_income) { current_source = 1; } else { current_source = 2; } descriptionCombo->setEnabled(false); if(b_extra) payeeCombo->setEnabled(false); } else if(index == 1) { if(b_income) { current_source = 3; } else { current_source = 4; } descriptionCombo->setEnabled(false); if(b_extra) payeeCombo->setEnabled(false); } else { descriptionCombo->addItem(i18n("All Descriptions Split")); if(d_index == 1) descriptionCombo->setCurrentIndex(1); if(b_extra) { if(b_income) payeeCombo->addItem(i18n("All Payers Split")); else payeeCombo->addItem(i18n("All Payees Split")); if(p_index == 1 && d_index != 1) payeeCombo->setCurrentIndex(1); } if(!b_income) { int i = categoryCombo->currentIndex() - 2; if(i < (int) budget->expensesAccounts.count()) { current_account = budget->expensesAccounts.at(i); } if(d_index == 1) current_source = 8; else if(p_index == 1) current_source = 12; else current_source = 6; } else { int i = categoryCombo->currentIndex() - 2; if(i < (int) budget->incomesAccounts.count()) { current_account = budget->incomesAccounts.at(i); } if(d_index == 1) current_source = 7; else if(p_index == 1) current_source = 11; else current_source = 5; } has_empty_description = false; has_empty_payee = false; QMap descriptions, payees; Transaction *trans = budget->transactions.first(); while(trans) { if((trans->fromAccount() == current_account || trans->toAccount() == current_account)) { if(trans->description().isEmpty()) has_empty_description = true; else descriptions[trans->description()] = true; if(b_extra) { if(trans->type() == TRANSACTION_TYPE_EXPENSE) { if(((Expense*) trans)->payee().isEmpty()) has_empty_payee = true; else payees[((Expense*) trans)->payee()] = true; } else if(trans->type() == TRANSACTION_TYPE_INCOME) { if(((Income*) trans)->payer().isEmpty()) has_empty_payee = true; else payees[((Income*) trans)->payer()] = true; } } } trans = budget->transactions.next(); } QMap::iterator it_e = descriptions.end(); for(QMap::iterator it = descriptions.begin(); it != it_e; ++it) { descriptionCombo->addItem(it.key()); } if(has_empty_description) descriptionCombo->addItem(i18n("No description")); descriptionCombo->setEnabled(true); if(b_extra) { QMap::iterator it2_e = payees.end(); for(QMap::iterator it2 = payees.begin(); it2 != it2_e; ++it2) { payeeCombo->addItem(it2.key()); } if(has_empty_payee) { if(b_income) payeeCombo->addItem(i18n("No payer")); else payeeCombo->addItem(i18n("No payee")); } payeeCombo->setEnabled(true); } } descriptionCombo->blockSignals(false); if(b_extra) payeeCombo->blockSignals(false); updateDisplay(); } void OverTimeChart::sourceChanged(int index) { categoryCombo->blockSignals(true); descriptionCombo->blockSignals(true); if(b_extra) payeeCombo->blockSignals(true); int c_index = 1; if(categoryCombo->count() > 1 && categoryCombo->currentIndex() == 0) c_index = 0; categoryCombo->clear(); descriptionCombo->clear(); descriptionCombo->setEnabled(false); descriptionCombo->addItem(i18n("All Descriptions Combined")); if(b_extra) { payeeCombo->clear(); payeeCombo->setEnabled(false); if(index == 2) payeeCombo->addItem(i18n("All Payers Combined")); else if(index == 1) payeeCombo->addItem(i18n("All Payees Combined")); else payeeCombo->addItem(i18n("All Payees/Payers Combined")); } current_description = ""; current_payee = ""; current_account = NULL; categoryCombo->addItem(i18n("All Categories Combined")); if(index == 3) { categoryCombo->addItem(i18n("All Categories Split")); categoryCombo->setCurrentIndex(c_index); Account *account = budget->incomesAccounts.first(); while(account) { categoryCombo->addItem(account->name()); account = budget->incomesAccounts.next(); } categoryCombo->setEnabled(true); current_source = 3; } else if(index == 2) { categoryCombo->addItem(i18n("All Categories Split")); categoryCombo->setCurrentIndex(c_index); Account *account = budget->expensesAccounts.first(); while(account) { categoryCombo->addItem(account->name()); account = budget->expensesAccounts.next(); } categoryCombo->setEnabled(true); current_source = 4; } else if(index == 1) { categoryCombo->setEnabled(false); current_source = -1; if(countButton->isChecked() || perButton->isChecked()) { valueButton->blockSignals(true); countButton->blockSignals(true); perButton->blockSignals(true); valueButton->setChecked(true); countButton->setChecked(false); perButton->setChecked(false); valueButton->blockSignals(false); countButton->blockSignals(false); perButton->blockSignals(false); } } else { categoryCombo->setEnabled(false); current_source = 0; } countButton->setEnabled(index != 1); perButton->setEnabled(index != 1); categoryCombo->blockSignals(false); descriptionCombo->blockSignals(false); if(b_extra) payeeCombo->blockSignals(false); updateDisplay(); } void OverTimeChart::startYearChanged(const QDate &date) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); bool error = false; if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); error = true; } /*if(!error && date > QDate::currentDate()) { if(calSys->year(date) == calSys->year(QDate::currentDate())) { start_date = QDate::currentDate(); calSys->setYMD(start_date, calSys->year(start_date), calSys->month(start_date), 1); startDateEdit->blockSignals(true); startDateEdit->setDate(start_date); startDateEdit->blockSignals(false); updateDisplay(); return; } else { KMessageBox::error(this, i18n("Future dates are not allowed.")); error = true; } }*/ if(!error && date > end_date) { end_date = date; calSys->setYMD(end_date, calSys->year(end_date), calSys->month(end_date), calSys->daysInMonth(end_date)); endDateEdit->blockSignals(true); endDateEdit->setDate(end_date); endDateEdit->blockSignals(false); } if(error) { startDateEdit->focusYear(); startDateEdit->blockSignals(true); startDateEdit->setDate(start_date); startDateEdit->blockSignals(false); return; } start_date = date; updateDisplay(); } void OverTimeChart::startMonthChanged(const QDate &date) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); bool error = false; if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); error = true; } /*if(!error && date > QDate::currentDate()) { KMessageBox::error(this, i18n("Future dates are not allowed.")); error = true; }*/ if(!error && date > end_date) { end_date = date; calSys->setYMD(end_date, calSys->year(end_date), calSys->month(end_date), calSys->daysInMonth(end_date)); endDateEdit->blockSignals(true); endDateEdit->setDate(end_date); endDateEdit->blockSignals(false); } if(error) { startDateEdit->focusMonth(); startDateEdit->blockSignals(true); startDateEdit->setDate(start_date); startDateEdit->blockSignals(false); return; } start_date = date; updateDisplay(); } void OverTimeChart::endYearChanged(const QDate &date) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); bool error = false; if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); error = true; } /*if(!error && date > QDate::currentDate()) { if(calSys->year(date) == calSys->year(QDate::currentDate())) { end_date = QDate::currentDate(); calSys->setYMD(end_date, calSys->year(end_date), calSys->month(end_date), 1); endDateEdit->blockSignals(true); endDateEdit->setDate(end_date); endDateEdit->blockSignals(false); updateDisplay(); return; } else { KMessageBox::error(this, i18n("Future dates are not allowed.")); error = true; } }*/ if(!error && date < start_date) { start_date = date; startDateEdit->blockSignals(true); startDateEdit->setDate(start_date); startDateEdit->blockSignals(false); } if(error) { endDateEdit->focusYear(); endDateEdit->blockSignals(true); endDateEdit->setDate(end_date); endDateEdit->blockSignals(false); return; } end_date = date; calSys->setYMD(end_date, calSys->year(end_date), calSys->month(end_date), calSys->daysInMonth(end_date)); updateDisplay(); } void OverTimeChart::endMonthChanged(const QDate &date) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); bool error = false; if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); error = true; } /*if(!error && date > QDate::currentDate()) { KMessageBox::error(this, i18n("Future dates are not allowed.")); error = true; }*/ if(!error && date < start_date) { start_date = date; startDateEdit->blockSignals(true); startDateEdit->setDate(start_date); startDateEdit->blockSignals(false); } if(error) { endDateEdit->focusMonth(); endDateEdit->blockSignals(true); endDateEdit->setDate(end_date); endDateEdit->blockSignals(false); return; } end_date = date; calSys->setYMD(end_date, calSys->year(end_date), calSys->month(end_date), calSys->daysInMonth(end_date)); updateDisplay(); } void OverTimeChart::saveConfig() { KConfigGroup config = KGlobal::config()->group("Over Time Chart"); ((KDialog*) parent())->saveDialogSize(config); config.writeEntry("valueSelected", valueButton->isChecked()); config.writeEntry("dailyAverageSelected", dailyButton->isChecked()); config.writeEntry("transactionCountSelected", countButton->isChecked()); config.writeEntry("valuePerTransactionSelected", perButton->isChecked()); } void OverTimeChart::save() { if(!scene) return; KFileDialog *dialog = new KFileDialog(KUrl(), QString::null, this); QStringList filter; filter << "image/png"; if(QImageWriter::supportedImageFormats().contains("GIF")) { filter << "image/gif"; } if(QImageWriter::supportedImageFormats().contains("JPEG")) { filter << "image/jpeg"; } filter << "image/x-bmp"; filter << "image/x-xbm"; filter << "image/x-xpm"; filter << "image/x-portable-pixmap"; dialog->setMimeFilter(filter, "image/png"); dialog->setOperationMode(KFileDialog::Saving); dialog->setMode(KFile::File); if(dialog->exec() != QDialog::Accepted) {dialog->deleteLater(); return;} KUrl url = dialog->selectedUrl(); QString current_filter = dialog->currentFilter(); dialog->deleteLater(); if(url.isEmpty() && url.isValid()) return; if(url.isLocalFile()) { if(QFile::exists(url.path())) { if(KMessageBox::warningYesNo(this, i18n("The selected file already exists. Would you like to overwrite the old copy?")) != KMessageBox::Yes) return; } QFileInfo info(url.path()); if(info.isDir()) { KMessageBox::error(this, i18n("You selected a directory!")); return; } KSaveFile ofile(url.path()); ofile.open(); ofile.setPermissions((QFile::Permissions) 0x0660); if(!ofile.isOpen()) { ofile.abort(); KMessageBox::error(this, i18n("Couldn't open file for writing.")); return; } QRectF rect = scene->sceneRect(); rect.setX(0); rect.setY(0); rect.setRight(rect.right() + 20); rect.setBottom(rect.bottom() + 20); QPixmap pixmap((int) ceil(rect.width()), (int) ceil(rect.height())); QPainter p(&pixmap); p.setRenderHint(QPainter::Antialiasing, true); scene->render(&p, QRectF(), rect); if(current_filter == "image/png") {pixmap.save(&ofile, "PNG");} else if(current_filter == "image/x-bmp") {pixmap.save(&ofile, "BMP");} else if(current_filter == "image/x-xbm") {pixmap.save(&ofile, "XBM");} else if(current_filter == "image/x-xpm") {pixmap.save(&ofile, "XPM");} else if(current_filter == "image/x-portable-pixmap") {pixmap.save(&ofile, "PPM");} else if(current_filter == "image/gif") {pixmap.save(&ofile, "GIF");} else if(current_filter == "image/jpeg") {pixmap.save(&ofile, "JPEG");} if(!ofile.finalize()) { KMessageBox::error(this, i18n("Error while writing file; file was not saved.")); return; } return; } KTemporaryFile tf; tf.open(); tf.setAutoRemove(true); QRectF rect = scene->sceneRect(); rect.setX(0); rect.setY(0); rect.setRight(rect.right() + 20); rect.setBottom(rect.bottom() + 20); QPixmap pixmap((int) ceil(rect.width()), (int) ceil(rect.height())); QPainter p(&pixmap); p.setRenderHint(QPainter::Antialiasing, true); scene->render(&p, QRectF(), rect); if(current_filter == "image/png") {pixmap.save(&tf, "PNG");} else if(current_filter == "image/x-bmp") {pixmap.save(&tf, "BMP");} else if(current_filter == "image/x-xbm") {pixmap.save(&tf, "XBM");} else if(current_filter == "image/x-xpm") {pixmap.save(&tf, "XPM");} else if(current_filter == "image/x-portable-pixmap") {pixmap.save(&tf, "PPM");} else if(current_filter == "image/gif") {pixmap.save(&tf, "GIF");} else if(current_filter == "image/jpeg") {pixmap.save(&tf, "JPEG");} KIO::NetAccess::upload(tf.fileName(), url, this); } void OverTimeChart::print() { if(!scene) return; QPrinter pr; QPrintDialog *dialog = new QPrintDialog(&pr, this); if(dialog->exec() == QDialog::Accepted) { QPainter p(&pr); p.setRenderHint(QPainter::Antialiasing, true); QRectF rect = scene->sceneRect(); rect.setX(0); rect.setY(0); rect.setRight(rect.right() + 20); rect.setBottom(rect.bottom() + 20); scene->render(&p, QRectF(), rect); p.end(); } } QColor getColor2(int index) { switch(index % 11) { case 0: {return Qt::red;} case 1: {return Qt::blue;} case 2: {return Qt::cyan;} case 3: {return Qt::magenta;} case 4: {return Qt::green;} case 5: {return Qt::darkRed;} case 6: {return Qt::darkGreen;} case 7: {return Qt::darkBlue;} case 8: {return Qt::darkCyan;} case 9: {return Qt::darkMagenta;} case 10: {return Qt::darkYellow;} default: {return Qt::gray;} } } QPen getPen(int index) { QPen pen; pen.setWidth(2); switch(index / 11) { case 0: {pen.setStyle(Qt::SolidLine); break;} case 1: {pen.setStyle(Qt::DashLine); break;} case 3: {pen.setStyle(Qt::DashDotLine); break;} case 4: {pen.setStyle(Qt::DashDotDotLine); break;} default: {} } pen.setColor(getColor2(index)); return pen; } void OverTimeChart::updateDisplay() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); QVector monthly_incomes, monthly_expenses; QMap > monthly_cats; QMap mi_c; QMap > monthly_desc; QMap mi_d; chart_month_info *mi_e = NULL, *mi_i = NULL; chart_month_info **mi = NULL; QVector *monthly_values = NULL; QMap scheduled_cats; QMap scheduled_cat_counts; QMap scheduled_desc; QMap scheduled_desc_counts; bool isfirst_i = true, isfirst_e = true; QMap isfirst_c; QMap isfirst_d; bool *isfirst = NULL; int type = valueGroup->checkedId(); if(current_source == 3 || current_source < 2) { Account *account = budget->incomesAccounts.first(); while(account) { monthly_cats[account] = QVector(); mi_c[account] = NULL; isfirst_c[account] = true; scheduled_cats[account] = 0.0; scheduled_cat_counts[account] = 0.0; account = budget->incomesAccounts.next(); } } if(current_source == 4 || current_source < 3) { Account *account = budget->expensesAccounts.first(); while(account) { monthly_cats[account] = QVector(); mi_c[account] = NULL; isfirst_c[account] = true; scheduled_cats[account] = 0.0; scheduled_cat_counts[account] = 0.0; account = budget->expensesAccounts.next(); } } else if(current_source == 7 || current_source == 8 || current_source == 17 || current_source == 18) { if(has_empty_description) descriptionCombo->setItemText(descriptionCombo->count() - 1, ""); for(int i = 2; i < descriptionCombo->count(); i++) { QString str = descriptionCombo->itemText(i); monthly_desc[str] = QVector(); mi_d[str] = NULL; isfirst_d[str] = true; scheduled_desc[str] = 0.0; scheduled_desc_counts[str] = 0.0; } } else if(current_source == 11 || current_source == 12 || current_source == 13 || current_source == 14) { if(has_empty_payee) payeeCombo->setItemText(payeeCombo->count() - 1, ""); for(int i = 2; i < payeeCombo->count(); i++) { QString str = payeeCombo->itemText(i); monthly_desc[str] = QVector(); mi_d[str] = NULL; isfirst_d[str] = true; scheduled_desc[str] = 0.0; scheduled_desc_counts[str] = 0.0; } } QDate first_date = start_date; QDate last_date = end_date; double maxvalue = 1.0; double minvalue = 0.0; double maxcount = 1.0; bool started = false; Transaction *trans = budget->transactions.first(); while(trans && trans->date() <= last_date) { bool include = false; int sign = 1; if(!started && trans->date() >= first_date) started = true; if(started) { switch(current_source) { case -1: {} case 0: {} case 1: {} case 2: {} case 3: {} case 4: { if(current_source != 2 && current_source != 4 && trans->fromAccount()->type() == ACCOUNT_TYPE_INCOMES) { monthly_values = &monthly_cats[trans->fromAccount()]; mi = &mi_c[trans->fromAccount()]; isfirst = &isfirst_c[trans->fromAccount()]; sign = 1; include = true; } else if(current_source != 1 && current_source != 3 && trans->fromAccount()->type() == ACCOUNT_TYPE_EXPENSES) { monthly_values = &monthly_cats[trans->fromAccount()]; mi = &mi_c[trans->fromAccount()]; isfirst = &isfirst_c[trans->fromAccount()]; sign = -1; include = true; } else if(current_source != 2 && current_source != 4 && trans->toAccount()->type() == ACCOUNT_TYPE_INCOMES) { monthly_values = &monthly_cats[trans->toAccount()]; mi = &mi_c[trans->toAccount()]; isfirst = &isfirst_c[trans->toAccount()]; sign = -1; include = true; } else if(current_source != 1 && current_source != 3 && trans->toAccount()->type() == ACCOUNT_TYPE_EXPENSES) { monthly_values = &monthly_cats[trans->toAccount()]; mi = &mi_c[trans->toAccount()]; isfirst = &isfirst_c[trans->toAccount()]; sign = 1; include = true; } break; } case 5: { if(trans->fromAccount() == current_account) { monthly_values = &monthly_incomes; mi = &mi_i; isfirst = &isfirst_i; sign = 1; include = true; } else if(trans->toAccount() == current_account) { monthly_values = &monthly_incomes; mi = &mi_i; isfirst = &isfirst_i; sign = -1; include = true; } break; } case 6: { if(trans->fromAccount() == current_account) { monthly_values = &monthly_expenses; mi = &mi_e; isfirst = &isfirst_e; sign = -1; include = true; } else if(trans->toAccount() == current_account) { monthly_values = &monthly_expenses; mi = &mi_e; isfirst = &isfirst_e; sign = 1; include = true; } break; } case 7: { if(trans->fromAccount() == current_account) { monthly_values = &monthly_desc[trans->description()]; mi = &mi_d[trans->description()]; isfirst = &isfirst_d[trans->description()]; sign = 1; include = true; } else if(trans->toAccount() == current_account) { monthly_values = &monthly_desc[trans->description()]; mi = &mi_d[trans->description()]; isfirst = &isfirst_d[trans->description()]; sign = -1; include = true; } break; } case 8: { if(trans->fromAccount() == current_account) { monthly_values = &monthly_desc[trans->description()]; mi = &mi_d[trans->description()]; isfirst = &isfirst_d[trans->description()]; sign = -1; include = true; } else if(trans->toAccount() == current_account) { monthly_values = &monthly_desc[trans->description()]; mi = &mi_d[trans->description()]; isfirst = &isfirst_d[trans->description()]; sign = 1; include = true; } break; } case 9: { if(trans->fromAccount() == current_account && trans->description() == current_description) { monthly_values = &monthly_incomes; mi = &mi_i; isfirst = &isfirst_i; sign = 1; include = true; } else if(trans->toAccount() == current_account && trans->description() == current_description) { monthly_values = &monthly_incomes; mi = &mi_i; isfirst = &isfirst_i; sign = -1; include = true; } break; } case 10: { if(trans->fromAccount() == current_account && trans->description() == current_description) { monthly_values = &monthly_expenses; mi = &mi_e; isfirst = &isfirst_e; sign = -1; include = true; } else if(trans->toAccount() == current_account && trans->description() == current_description) { monthly_values = &monthly_expenses; mi = &mi_e; isfirst = &isfirst_e; sign = 1; include = true; } break; } case 11: { if(trans->type() != TRANSACTION_TYPE_INCOME) break; Income *income = (Income*) trans; if(income->category() == current_account) { monthly_values = &monthly_desc[income->payer()]; mi = &mi_d[income->payer()]; isfirst = &isfirst_d[income->payer()]; sign = 1; include = true; } break; } case 12: { if(trans->type() != TRANSACTION_TYPE_EXPENSE) break; Expense *expense = (Expense*) trans; if(expense->category() == current_account) { monthly_values = &monthly_desc[expense->payee()]; mi = &mi_d[expense->payee()]; isfirst = &isfirst_d[expense->payee()]; sign = 1; include = true; } break; } case 13: { if(trans->type() != TRANSACTION_TYPE_INCOME) break; Income *income = (Income*) trans; if(income->category() == current_account && income->description() == current_description) { monthly_values = &monthly_desc[income->payer()]; mi = &mi_d[income->payer()]; isfirst = &isfirst_d[income->payer()]; sign = 1; include = true; } break; } case 14: { if(trans->type() != TRANSACTION_TYPE_EXPENSE) break; Expense *expense = (Expense*) trans; if(expense->category() == current_account && expense->description() == current_description) { monthly_values = &monthly_desc[expense->payee()]; mi = &mi_d[expense->payee()]; isfirst = &isfirst_d[expense->payee()]; sign = 1; include = true; } break; } case 15: { if(trans->type() != TRANSACTION_TYPE_INCOME) break; Income *income = (Income*) trans; if(income->category() == current_account && income->payer() == current_payee) { monthly_values = &monthly_incomes; mi = &mi_i; isfirst = &isfirst_i; sign = 1; include = true; } break; } case 16: { if(trans->type() != TRANSACTION_TYPE_EXPENSE) break; Expense *expense = (Expense*) trans; if(expense->category() == current_account && expense->payee() == current_payee) { monthly_values = &monthly_expenses; mi = &mi_e; isfirst = &isfirst_e; sign = 1; include = true; } break; } case 17: { if(trans->type() != TRANSACTION_TYPE_INCOME) break; Income *income = (Income*) trans; if(income->category() == current_account && income->payer() == current_payee) { monthly_values = &monthly_desc[income->description()]; mi = &mi_d[income->description()]; isfirst = &isfirst_d[income->description()]; sign = 1; include = true; } break; } case 18: { if(trans->type() != TRANSACTION_TYPE_EXPENSE) break; Expense *expense = (Expense*) trans; if(expense->category() == current_account && expense->payee() == current_payee) { monthly_values = &monthly_desc[expense->description()]; mi = &mi_d[expense->description()]; isfirst = &isfirst_d[expense->description()]; sign = 1; include = true; } break; } case 19: { if(trans->type() != TRANSACTION_TYPE_INCOME) break; Income *income = (Income*) trans; if(income->category() == current_account && income->description() == current_description && income->payer() == current_payee) { monthly_values = &monthly_incomes; mi = &mi_i; isfirst = &isfirst_i; sign = 1; include = true; } break; } case 20: { if(trans->type() != TRANSACTION_TYPE_EXPENSE) break; Expense *expense = (Expense*) trans; if(expense->category() == current_account && expense->description() == current_description && expense->payee() == current_payee) { monthly_values = &monthly_expenses; mi = &mi_e; isfirst = &isfirst_e; sign = 1; include = true; } break; } } } if(include) { if(!(*mi) || trans->date() > (*mi)->date) { QDate newdate, olddate; calSys->setYMD(newdate, calSys->year(trans->date()), calSys->month(trans->date()), calSys->daysInMonth(trans->date())); if(*mi) { olddate = calSys->addMonths((*mi)->date, 1); calSys->setYMD(olddate, calSys->year(olddate), calSys->month(olddate), calSys->daysInMonth(olddate)); (*isfirst) = false; } else { calSys->setYMD(olddate, calSys->year(first_date), calSys->month(first_date), calSys->daysInMonth(first_date)); (*isfirst) = true; } while(olddate < newdate) { monthly_values->append(chart_month_info()); (*mi) = &monthly_values->back(); (*mi)->value = 0.0; (*mi)->count = 0.0; (*mi)->date = olddate; olddate = calSys->addMonths(olddate, 1); calSys->setYMD(olddate, calSys->year(olddate), calSys->month(olddate), calSys->daysInMonth(olddate)); (*isfirst) = false; } monthly_values->append(chart_month_info()); (*mi) = &monthly_values->back(); (*mi)->value = trans->value() * sign; (*mi)->count = trans->quantity(); (*mi)->date = newdate; } else { (*mi)->value += trans->value() * sign; (*mi)->count += trans->quantity(); } } trans = budget->transactions.next(); } int source_org = 0; switch(current_source) { case -1: {source_org = 0; break;} case 0: {source_org = 0; break;} case 1: {source_org = 3; break;} case 2: {source_org = 4; break;} case 3: {source_org = 3; break;} case 4: {source_org = 4; break;} case 5: {source_org = 1; break;} case 6: {source_org = 2; break;} case 7: {source_org = 7; break;} case 8: {source_org = 7; break;} case 9: {source_org = 1; break;} case 10: {source_org = 2; break;} case 11: {source_org = 11; break;} case 12: {source_org = 11; break;} case 13: {source_org = 11; break;} case 14: {source_org = 11; break;} case 15: {source_org = 1; break;} case 16: {source_org = 2; break;} case 17: {source_org = 7; break;} case 18: {source_org = 7; break;} case 19: {source_org = 1; break;} case 20: {source_org = 2; break;} } Account *account = NULL; int desc_i = 2; int desc_nr = 0; bool at_expenses = false; if(source_org == 7) desc_nr = descriptionCombo->count(); else if(source_org == 11) desc_nr = payeeCombo->count(); else if(source_org == 0) {account = budget->incomesAccounts.first(); if(!account) {at_expenses = true; account = budget->expensesAccounts.first();}} else if(source_org == 3) account = budget->incomesAccounts.first(); else if(source_org == 4) account = budget->expensesAccounts.first(); else if(source_org == 2) {mi = &mi_e; monthly_values = &monthly_expenses; isfirst = &isfirst_e;} else if(source_org == 1) {mi = &mi_i; monthly_values = &monthly_incomes; isfirst = &isfirst_i;} while(source_org == 1 || source_org == 2 || account || ((source_org == 7 || source_org == 11) && desc_i < desc_nr)) { if(source_org == 3 || source_org == 4 || source_org == 0) {mi = &mi_c[account]; monthly_values = &monthly_cats[account]; isfirst = &isfirst_c[account];} else if(source_org == 7) {mi = &mi_d[descriptionCombo->itemText(desc_i)]; monthly_values = &monthly_desc[descriptionCombo->itemText(desc_i)]; isfirst = &isfirst_d[descriptionCombo->itemText(desc_i)];} else if(source_org == 11) {mi = &mi_d[payeeCombo->itemText(desc_i)]; monthly_values = &monthly_desc[payeeCombo->itemText(desc_i)]; isfirst = &isfirst_d[payeeCombo->itemText(desc_i)];} if(!(*mi)) { monthly_values->append(chart_month_info()); (*mi) = &monthly_values->back(); (*mi)->value = 0.0; (*mi)->count = 0.0; calSys->setYMD((*mi)->date, calSys->year(first_date), calSys->month(first_date), calSys->daysInMonth(first_date)); (*isfirst) = true; } while((*mi)->date < last_date) { QDate newdate = calSys->addMonths((*mi)->date, 1); calSys->setYMD(newdate, calSys->year(newdate), calSys->month(newdate), calSys->daysInMonth(newdate)); monthly_values->append(chart_month_info()); (*mi) = &monthly_values->back(); (*mi)->value = 0.0; (*mi)->count = 0.0; (*mi)->date = newdate; (*isfirst) = false; } if(source_org == 7 || source_org == 11) desc_i++; else if(source_org == 3) account = budget->incomesAccounts.next(); else if(source_org == 4) account = budget->expensesAccounts.next(); else if(source_org == 0) { if(!at_expenses) { account = budget->incomesAccounts.next(); if(!account) { at_expenses = true; account = budget->expensesAccounts.first(); } } else { account = budget->expensesAccounts.next(); } } else break; } ScheduledTransaction *strans = budget->scheduledTransactions.first(); while(strans && strans->firstOccurrence() <= last_date) { trans = strans->transaction(); bool include = false; int sign = 1; switch(current_source) { case -1: {} case 0: {} case 1: {} case 2: {} case 3: {} case 4: { if(current_source != 2 && current_source != 4 && trans->fromAccount()->type() == ACCOUNT_TYPE_INCOMES) { monthly_values = &monthly_cats[trans->fromAccount()]; mi = &mi_c[trans->fromAccount()]; isfirst = &isfirst_c[trans->fromAccount()]; sign = 1; include = true; } else if(current_source != 1 && current_source != 3 && trans->fromAccount()->type() == ACCOUNT_TYPE_EXPENSES) { monthly_values = &monthly_cats[trans->fromAccount()]; mi = &mi_c[trans->fromAccount()]; isfirst = &isfirst_c[trans->fromAccount()]; sign = -1; include = true; } else if(current_source != 2 && current_source != 4 && trans->toAccount()->type() == ACCOUNT_TYPE_INCOMES) { monthly_values = &monthly_cats[trans->toAccount()]; mi = &mi_c[trans->toAccount()]; isfirst = &isfirst_c[trans->toAccount()]; sign = -1; include = true; } else if(current_source != 1 && current_source != 3 && trans->toAccount()->type() == ACCOUNT_TYPE_EXPENSES) { monthly_values = &monthly_cats[trans->toAccount()]; mi = &mi_c[trans->toAccount()]; isfirst = &isfirst_c[trans->toAccount()]; sign = 1; include = true; } break; } case 5: { if(trans->fromAccount() == current_account) { monthly_values = &monthly_incomes; mi = &mi_i; isfirst = &isfirst_i; sign = 1; include = true; } else if(trans->toAccount() == current_account) { monthly_values = &monthly_incomes; mi = &mi_i; isfirst = &isfirst_i; sign = -1; include = true; } break; } case 6: { if(trans->fromAccount() == current_account) { monthly_values = &monthly_expenses; mi = &mi_e; isfirst = &isfirst_e; sign = -1; include = true; } else if(trans->toAccount() == current_account) { monthly_values = &monthly_expenses; mi = &mi_e; isfirst = &isfirst_e; sign = 1; include = true; } break; } case 7: { if(trans->fromAccount() == current_account) { monthly_values = &monthly_desc[trans->description()]; mi = &mi_d[trans->description()]; isfirst = &isfirst_d[trans->description()]; sign = 1; include = true; } else if(trans->toAccount() == current_account) { monthly_values = &monthly_desc[trans->description()]; mi = &mi_d[trans->description()]; isfirst = &isfirst_d[trans->description()]; sign = -1; include = true; } break; } case 8: { if(trans->fromAccount() == current_account) { monthly_values = &monthly_desc[trans->description()]; mi = &mi_d[trans->description()]; isfirst = &isfirst_d[trans->description()]; sign = -1; include = true; } else if(trans->toAccount() == current_account) { monthly_values = &monthly_desc[trans->description()]; mi = &mi_d[trans->description()]; isfirst = &isfirst_d[trans->description()]; sign = 1; include = true; } break; } case 9: { if(trans->fromAccount() == current_account && trans->description() == current_description) { monthly_values = &monthly_incomes; mi = &mi_i; isfirst = &isfirst_i; sign = 1; include = true; } else if(trans->toAccount() == current_account && trans->description() == current_description) { monthly_values = &monthly_incomes; mi = &mi_i; isfirst = &isfirst_i; sign = -1; include = true; } break; } case 10: { if(trans->fromAccount() == current_account && trans->description() == current_description) { monthly_values = &monthly_expenses; mi = &mi_e; isfirst = &isfirst_e; sign = -1; include = true; } else if(trans->toAccount() == current_account && trans->description() == current_description) { monthly_values = &monthly_expenses; mi = &mi_e; isfirst = &isfirst_e; sign = 1; include = true; } break; } case 11: { if(trans->type() != TRANSACTION_TYPE_INCOME) break; Income *income = (Income*) trans; if(income->category() == current_account) { monthly_values = &monthly_desc[income->payer()]; mi = &mi_d[income->payer()]; isfirst = &isfirst_d[income->payer()]; sign = 1; include = true; } break; } case 12: { if(trans->type() != TRANSACTION_TYPE_EXPENSE) break; Expense *expense = (Expense*) trans; if(expense->category() == current_account) { monthly_values = &monthly_desc[expense->payee()]; mi = &mi_d[expense->payee()]; isfirst = &isfirst_d[expense->payee()]; sign = 1; include = true; } break; } case 13: { if(trans->type() != TRANSACTION_TYPE_INCOME) break; Income *income = (Income*) trans; if(income->category() == current_account && income->description() == current_description) { monthly_values = &monthly_desc[income->payer()]; mi = &mi_d[income->payer()]; isfirst = &isfirst_d[income->payer()]; sign = 1; include = true; } break; } case 14: { if(trans->type() != TRANSACTION_TYPE_EXPENSE) break; Expense *expense = (Expense*) trans; if(expense->category() == current_account && expense->description() == current_description) { monthly_values = &monthly_desc[expense->payee()]; mi = &mi_d[expense->payee()]; isfirst = &isfirst_d[expense->payee()]; sign = 1; include = true; } break; } case 15: { if(trans->type() != TRANSACTION_TYPE_INCOME) break; Income *income = (Income*) trans; if(income->category() == current_account && income->payer() == current_payee) { monthly_values = &monthly_incomes; mi = &mi_i; isfirst = &isfirst_i; sign = 1; include = true; } break; } case 16: { if(trans->type() != TRANSACTION_TYPE_EXPENSE) break; Expense *expense = (Expense*) trans; if(expense->category() == current_account && expense->payee() == current_payee) { monthly_values = &monthly_expenses; mi = &mi_e; isfirst = &isfirst_e; sign = 1; include = true; } break; } case 17: { if(trans->type() != TRANSACTION_TYPE_INCOME) break; Income *income = (Income*) trans; if(income->category() == current_account && income->payer() == current_payee) { monthly_values = &monthly_desc[income->description()]; mi = &mi_d[income->description()]; isfirst = &isfirst_d[income->description()]; sign = 1; include = true; } break; } case 18: { if(trans->type() != TRANSACTION_TYPE_EXPENSE) break; Expense *expense = (Expense*) trans; if(expense->category() == current_account && expense->payee() == current_payee) { monthly_values = &monthly_desc[expense->description()]; mi = &mi_d[expense->description()]; isfirst = &isfirst_d[expense->description()]; sign = 1; include = true; } break; } case 19: { if(trans->type() != TRANSACTION_TYPE_INCOME) break; Income *income = (Income*) trans; if(income->category() == current_account && income->description() == current_description && income->payer() == current_payee) { monthly_values = &monthly_incomes; mi = &mi_i; isfirst = &isfirst_i; sign = 1; include = true; } break; } case 20: { if(trans->type() != TRANSACTION_TYPE_EXPENSE) break; Expense *expense = (Expense*) trans; if(expense->category() == current_account && expense->description() == current_description && expense->payee() == current_payee) { monthly_values = &monthly_expenses; mi = &mi_e; isfirst = &isfirst_e; sign = 1; include = true; } break; } } if(include) { QDate transdate = strans->firstOccurrence(); QVector::iterator cmi_it = monthly_values->begin(); do { if(transdate >= first_date) { while(cmi_it->date < transdate) { ++cmi_it; } (*mi) = cmi_it; (*mi)->value += trans->value() * sign; (*mi)->count += trans->quantity(); } if(strans->recurrence()) { transdate = strans->recurrence()->nextOccurrence(transdate); } else { break; } } while(transdate <= last_date); } strans = budget->scheduledTransactions.next(); } account = current_account; desc_i = 2; desc_nr = 0; int imonth = calSys->month(QDate::currentDate()); if(calSys->day(QDate::currentDate()) == calSys->daysInMonth(QDate::currentDate())) { imonth++; } at_expenses = false; if(source_org == 7) {desc_nr = descriptionCombo->count(); account = NULL;} else if(source_org == 11) {desc_nr = payeeCombo->count(); account = NULL;} else if(source_org == 0) {account = budget->incomesAccounts.first(); if(!account) {at_expenses = true; account = budget->expensesAccounts.first();}} else if(source_org == 3) account = budget->incomesAccounts.first(); else if(source_org == 4) account = budget->expensesAccounts.first(); else if(source_org == 2) {mi = &mi_e; monthly_values = &monthly_expenses; isfirst = &isfirst_e;} else if(source_org == 1) {mi = &mi_i; monthly_values = &monthly_incomes; isfirst = &isfirst_i;} while(source_org == 1 || source_org == 2 || account || ((source_org == 7 || source_org == 11) && desc_i < desc_nr)) { if(source_org == 3 || source_org == 4 || source_org == 0) {mi = &mi_c[account]; monthly_values = &monthly_cats[account]; isfirst = &isfirst_c[account];} else if(source_org == 7) {mi = &mi_d[descriptionCombo->itemText(desc_i)]; monthly_values = &monthly_desc[descriptionCombo->itemText(desc_i)]; isfirst = &isfirst_d[descriptionCombo->itemText(desc_i)];} else if(source_org == 11) {mi = &mi_d[payeeCombo->itemText(desc_i)]; monthly_values = &monthly_desc[payeeCombo->itemText(desc_i)]; isfirst = &isfirst_d[payeeCombo->itemText(desc_i)];} (*mi) = &monthly_values->front(); QVector::iterator cmi_it = monthly_values->begin(); bool in_future = false; while(cmi_it != monthly_values->end()) { (*mi) = cmi_it; if(account && type < 2 && current_source < 7) { if(!in_future && calSys->month((*mi)->date) >= imonth) { in_future = true; } if(in_future && account->type() != ACCOUNT_TYPE_ASSETS) { double d_budget = ((CategoryAccount*) account)->monthlyBudget(calSys->year((*mi)->date), calSys->month((*mi)->date), false); if(d_budget >= 0.0 && d_budget > (*mi)->value) { (*mi)->value = d_budget; } } } switch(type) { case 1: { if((*mi)->date >= last_date) { (*mi)->value /= ((*isfirst) ? (first_date.daysTo(last_date) + 1) : calSys->day(last_date)); } else { (*mi)->value /= ((*isfirst) ? (first_date.daysTo((*mi)->date) + 1) : calSys->daysInMonth((*mi)->date)); } break; } case 2: {(*mi)->value = (*mi)->count; break;} case 3: {if((*mi)->count > 0.0) (*mi)->value /= (*mi)->count; else (*mi)->value = 0.0; break;} } if((*mi)->value > maxvalue) maxvalue = (*mi)->value; else if((*mi)->value < minvalue) minvalue = (*mi)->value; if((*mi)->count > maxcount) maxcount = (*mi)->count; ++cmi_it; } if(source_org == 7 || source_org == 11) desc_i++; else if(source_org == 3) account = budget->incomesAccounts.next(); else if(source_org == 4) account = budget->expensesAccounts.next(); else if(source_org == 0) { if(!at_expenses) { account = budget->incomesAccounts.next(); if(!account) { at_expenses = true; account = budget->expensesAccounts.first(); } } else { account = budget->expensesAccounts.next(); } } else break; } bool second_run = false; if(current_source < 3) { maxvalue = 0.0; minvalue = 0.0; maxcount = 0.0; } while(current_source < 3) { if(current_source == -1 || current_source == 1 || second_run) monthly_values = &monthly_incomes; else monthly_values = &monthly_expenses; if(!second_run || current_source != -1) { monthly_values->append(chart_month_info()); (*mi) = &monthly_values->back(); (*mi)->value = 0.0; (*mi)->count = 0.0; calSys->setYMD((*mi)->date, calSys->year(first_date), calSys->month(first_date), calSys->daysInMonth(first_date)); while((*mi)->date < last_date) { QDate newdate = calSys->addMonths((*mi)->date, 1); calSys->setYMD(newdate, calSys->year(newdate), calSys->month(newdate), calSys->daysInMonth(newdate)); monthly_values->append(chart_month_info()); (*mi) = &monthly_values->back(); (*mi)->value = 0.0; (*mi)->count = 0.0; (*mi)->date = newdate; } } if(current_source == 1 || second_run) account = budget->incomesAccounts.first(); else account = budget->expensesAccounts.first(); while(account) { QVector::iterator cmi_it = monthly_values->begin(); QVector::iterator cmi_itc = monthly_cats[account].begin(); while(cmi_it != monthly_values->end() && cmi_itc != monthly_cats[account].end()) { (*mi) = cmi_it; if(!second_run && current_source == -1) (*mi)->value -= cmi_itc->value; else (*mi)->value += cmi_itc->value; (*mi)->count += cmi_itc->count; ++cmi_it; ++cmi_itc; } if(current_source == 1 || second_run) account = budget->incomesAccounts.next(); else account = budget->expensesAccounts.next(); } if(current_source != -1 || second_run) { QVector::iterator cmi_it = monthly_values->begin(); while(cmi_it != monthly_values->end()) { (*mi) = cmi_it; if((*mi)->value > maxvalue) maxvalue = (*mi)->value; else if((*mi)->value < minvalue) minvalue = (*mi)->value; if((*mi)->count > maxcount) maxcount = (*mi)->count; ++cmi_it; } } if(current_source > 0 || second_run) break; second_run = true; } switch(current_source) { case -1: {source_org = 1; break;} case 0: {source_org = 0; break;} case 1: {source_org = 1; break;} case 2: {source_org = 2; break;} default: {} } QGraphicsScene *oldscene = scene; scene = new QGraphicsScene(this); scene->setBackgroundBrush(Qt::white); QFont legend_font = font(); QFontMetrics fm(legend_font); int fh = fm.height(); int years = calSys->year(last_date) - calSys->year(first_date); int months = months_between_dates(first_date, last_date) + 1; if(type == 2) { int intmax = (int) ceil(maxcount); if(intmax % 5 > 0) maxvalue = ((intmax / 5) + 1) * 5; else maxvalue = intmax; } else { if(-minvalue > maxvalue) maxvalue = -minvalue; double maxvalue_exp = round(log10(maxvalue)) - 1.0; if(maxvalue_exp <= 0.0) { maxvalue /= 2.0; maxvalue = ceil(maxvalue) * 2.0; } else { maxvalue /= pow(10, maxvalue_exp); maxvalue = ceil(maxvalue) * pow(10, maxvalue_exp); } if(minvalue < 0.0) minvalue = -maxvalue; } int n = 0; QDate monthdate = first_date; QDate curmonth = end_date; while(monthdate <= curmonth) { monthdate = calSys->addMonths(monthdate, 1); n++; } int linelength = (int) ceil(600.0 / n); int chart_height = 400; int margin = 30 + fh; int chart_y = margin + 15; int axis_width = 11; //int axis_height = 11 + fh; int chart_width = linelength * n; int y_lines = 5; if(minvalue < 0.0) y_lines = 4; int max_axis_value_width = 0; for(int i = 0; i <= y_lines; i++) { int w; if(type == 2 || maxvalue - minvalue >= 50.0) w = fm.width(KGlobal::locale()->formatLong((int) round(maxvalue - (((maxvalue - minvalue) * i) / y_lines)))); else w = fm.width(KGlobal::locale()->formatNumber((maxvalue - (((maxvalue - minvalue) * i) / y_lines)))); if(w > max_axis_value_width) max_axis_value_width = w; } axis_width += max_axis_value_width; QGraphicsSimpleTextItem *axis_text = new QGraphicsSimpleTextItem(); if(type == 2) axis_text->setText(i18n("Quantity")); else if(current_source == 0) axis_text->setText(i18n("Value (%1)").arg(KGlobal::locale()->currencySymbol())); else if(current_source == -1) axis_text->setText(i18n("Profit (%1)").arg(KGlobal::locale()->currencySymbol())); else if(current_source % 2 == 1) axis_text->setText(i18n("Income (%1)").arg(KGlobal::locale()->currencySymbol())); else axis_text->setText(i18n("Cost (%1)").arg(KGlobal::locale()->currencySymbol())); axis_text->setFont(legend_font); axis_text->setBrush(Qt::black); if(axis_text->boundingRect().width() / 2 > max_axis_value_width) max_axis_value_width = axis_text->boundingRect().width() / 2; axis_text->setPos(margin + axis_width - axis_text->boundingRect().width() / 2, margin - fh); scene->addItem(axis_text); QPen axis_pen; axis_pen.setColor(Qt::black); axis_pen.setWidth(1); axis_pen.setStyle(Qt::SolidLine); QGraphicsLineItem *y_axis = new QGraphicsLineItem(); y_axis->setLine(margin + axis_width, margin + 3, margin + axis_width, chart_height + chart_y); y_axis->setPen(axis_pen); scene->addItem(y_axis); QGraphicsLineItem *y_axis_dir1 = new QGraphicsLineItem(); y_axis_dir1->setLine(margin + axis_width, margin + 3, margin + axis_width - 3, margin + 9); y_axis_dir1->setPen(axis_pen); scene->addItem(y_axis_dir1); QGraphicsLineItem *y_axis_dir2 = new QGraphicsLineItem(); y_axis_dir2->setLine(margin + axis_width, margin + 3, margin + axis_width + 3, margin + 9); y_axis_dir2->setPen(axis_pen); scene->addItem(y_axis_dir2); QGraphicsLineItem *x_axis = new QGraphicsLineItem(); x_axis->setLine(margin + axis_width, chart_height + chart_y, margin + chart_width + axis_width + 12, chart_height + chart_y); x_axis->setPen(axis_pen); scene->addItem(x_axis); QGraphicsLineItem *x_axis_dir1 = new QGraphicsLineItem(); x_axis_dir1->setLine(margin + chart_width + axis_width + 6, chart_height + chart_y - 3, margin + chart_width + axis_width + 12, chart_height + chart_y); x_axis_dir1->setPen(axis_pen); scene->addItem(x_axis_dir1); QGraphicsLineItem *x_axis_dir2 = new QGraphicsLineItem(); x_axis_dir2->setLine(margin + chart_width + axis_width + 6, chart_height + chart_y + 3, margin + chart_width + axis_width + 12, chart_height + chart_y); x_axis_dir2->setPen(axis_pen); scene->addItem(x_axis_dir2); axis_text = new QGraphicsSimpleTextItem(i18n("Time")); axis_text->setFont(legend_font); axis_text->setBrush(Qt::black); axis_text->setPos(margin + chart_width + axis_width + 15, chart_y + chart_height - fh / 2); scene->addItem(axis_text); int x_axis_extra_width = 15 + axis_text->boundingRect().width(); QPen div_pen; div_pen.setColor(Qt::black); div_pen.setWidth(1); div_pen.setStyle(Qt::DotLine); int div_height = chart_height / y_lines; for(int i = 0; i < y_lines; i++) { QGraphicsLineItem *y_div = new QGraphicsLineItem(); y_div->setLine(margin + axis_width, chart_y + i * div_height, margin + chart_width + axis_width, chart_y + i * div_height); y_div->setPen(div_pen); scene->addItem(y_div); QGraphicsLineItem *y_mark = new QGraphicsLineItem(); y_mark->setLine(margin + axis_width - 10, chart_y + i * div_height, margin + axis_width, chart_y + i * div_height); y_mark->setPen(axis_pen); scene->addItem(y_mark); axis_text = new QGraphicsSimpleTextItem(); if(minvalue < 0.0 && i == y_lines / 2) axis_text->setText(KGlobal::locale()->formatLong(0)); else if(type == 2 || (maxvalue - minvalue) >= 50.0) axis_text->setText(KGlobal::locale()->formatLong((int) round(maxvalue - (((maxvalue - minvalue) * i) / y_lines)))); else axis_text->setText(KGlobal::locale()->formatNumber((maxvalue - (((maxvalue - minvalue) * i) / y_lines)))); axis_text->setFont(legend_font); axis_text->setBrush(Qt::black); axis_text->setPos(margin + axis_width - axis_text->boundingRect().width() - 11, chart_y + i * div_height - fh / 2); scene->addItem(axis_text); } axis_text = new QGraphicsSimpleTextItem(); if(minvalue != 0.0) { if(type == 2 || (maxvalue - minvalue) >= 50.0) axis_text->setText(KGlobal::locale()->formatLong((int) round(minvalue))); else axis_text->setText(KGlobal::locale()->formatNumber(minvalue)); } else { axis_text->setText(KGlobal::locale()->formatLong(0)); } axis_text->setFont(legend_font); axis_text->setBrush(Qt::black); axis_text->setPos(margin + axis_width - axis_text->boundingRect().width() - 11, chart_y + chart_height - fh / 2); scene->addItem(axis_text); int index = 0; int year = calSys->year(first_date) - 1; bool b_month_names = months <= 12, b_long_month_names = true; if(b_month_names) { monthdate = first_date; while(monthdate <= curmonth) { if(b_long_month_names) { if(fm.width(calSys->monthName(monthdate, KCalendarSystem::LongName)) > linelength - 8) { b_long_month_names = false; } } if(!b_long_month_names) { if(fm.width(calSys->monthName(monthdate, KCalendarSystem::ShortName)) > linelength) { b_month_names = false; break; } } monthdate = calSys->addMonths(monthdate, 1); } } monthdate = first_date; while(monthdate <= curmonth) { if(years < 5 || year != calSys->year(monthdate)) { QGraphicsLineItem *x_mark = new QGraphicsLineItem(); x_mark->setLine(margin + axis_width + index * linelength, chart_height + chart_y, margin + axis_width + index * linelength, chart_height + chart_y + 10); x_mark->setPen(axis_pen); scene->addItem(x_mark); } if(b_month_names) { QGraphicsSimpleTextItem *axis_text = new QGraphicsSimpleTextItem(calSys->monthName(monthdate, b_long_month_names ? KCalendarSystem::LongName : KCalendarSystem::ShortName)); axis_text->setFont(legend_font); axis_text->setBrush(Qt::black); axis_text->setPos(margin + axis_width + index * linelength + (linelength - axis_text->boundingRect().width()) / 2, chart_height + chart_y + 11); scene->addItem(axis_text); } else if(year != calSys->year(monthdate)) { year = calSys->year(monthdate); QGraphicsSimpleTextItem *axis_text = new QGraphicsSimpleTextItem(calSys->yearString(monthdate, years >= 5 ? KCalendarSystem::ShortFormat : KCalendarSystem::LongFormat)); axis_text->setFont(legend_font); axis_text->setBrush(Qt::black); axis_text->setPos(margin + axis_width + index * linelength, chart_height + chart_y + 11); scene->addItem(axis_text); } monthdate = calSys->addMonths(monthdate, 1); index++; } QGraphicsLineItem *x_mark = new QGraphicsLineItem(); x_mark->setLine(margin + axis_width + index * linelength, chart_height + chart_y, margin + axis_width + index * linelength, chart_height + chart_y + 10); x_mark->setPen(axis_pen); scene->addItem(x_mark); int line_y = chart_height + chart_y; int line_x = margin + axis_width; int text_width = 0; int legend_x = chart_width + axis_width + margin + x_axis_extra_width + 10; int legend_y = margin; index = 0; account = NULL; desc_i = 2; if(source_org == 3) account = budget->incomesAccounts.first(); else if(source_org == 4) account = budget->expensesAccounts.first(); else if(source_org == 2) {monthly_values = &monthly_expenses;} else if(source_org == 1 || source_org == 0) {monthly_values = &monthly_incomes;} while(source_org < 3 || account || ((source_org == 7 || source_org == 11) && desc_i < desc_nr)) { if(source_org == 3 || source_org == 4) {monthly_values = &monthly_cats[account];} else if(source_org == 7) {monthly_values = &monthly_desc[descriptionCombo->itemText(desc_i)];} else if(source_org == 11) {monthly_values = &monthly_desc[payeeCombo->itemText(desc_i)];} int prev_y = 0; int index2 = 0; QVector::iterator it_e = monthly_values->end(); for(QVector::iterator it = monthly_values->begin(); it != it_e; ++it) { if(index2 == 0) { prev_y = (int) floor((chart_height * (it->value - minvalue)) / (maxvalue - minvalue)) + 1; if(n == 1) { QGraphicsEllipseItem *dot = new QGraphicsEllipseItem(-2.5, -2.5, 5, 5); dot->setPos(line_x + linelength / 2, line_y - prev_y); QBrush brush(getColor2(index)); dot->setBrush(brush); dot->setZValue(10); scene->addItem(dot); } } else { int next_y = (int) floor((chart_height * (it->value - minvalue)) / (maxvalue - minvalue)) + 1; QGraphicsLineItem *line = new QGraphicsLineItem(); line->setPen(getPen(index)); line->setLine(line_x + ((index2 - 1) * linelength) + linelength / 2, line_y - prev_y, line_x + (index2 * linelength) + linelength / 2, line_y - next_y); line->setZValue(10); prev_y = next_y; scene->addItem(line); } index2++; } QGraphicsLineItem *legend_line = new QGraphicsLineItem(); legend_line->setLine(legend_x + 10, legend_y + 10 + (fh + 5) * index + fh / 2, legend_x + 10 + fh, legend_y + 10 + (fh + 5) * index + fh / 2); legend_line->setPen(getPen(index)); scene->addItem(legend_line); QGraphicsSimpleTextItem *legend_text = new QGraphicsSimpleTextItem(); switch(current_source) { case -1: { legend_text->setText(i18n("Profits")); break; } case 0: { if(index == 0) legend_text->setText(i18n("Incomes")); else if(index == 1) legend_text->setText(i18n("Expenses")); break; } case 1: {legend_text->setText(i18n("Incomes")); break;} case 2: {legend_text->setText(i18n("Expenses")); break;} case 3: {} case 4: {legend_text->setText(account->name()); break;} case 5: {} case 6: {legend_text->setText(current_account->name()); break;} case 17: {} case 18: {} case 7: {} case 8: { if(descriptionCombo->itemText(desc_i).isEmpty()) legend_text->setText(i18n("No description")); else legend_text->setText(descriptionCombo->itemText(desc_i)); break; } case 9: {} case 10: { if(current_description.isEmpty()) legend_text->setText(i18n("No description")); else legend_text->setText(current_description); break; } case 13: {} case 11: { if(payeeCombo->itemText(desc_i).isEmpty()) legend_text->setText(i18n("No payer")); else legend_text->setText(payeeCombo->itemText(desc_i)); break; } case 14: {} case 12: { if(payeeCombo->itemText(desc_i).isEmpty()) legend_text->setText(i18n("No payee")); else legend_text->setText(payeeCombo->itemText(desc_i)); break; } case 15: { if(current_payee.isEmpty()) legend_text->setText(i18n("No payer")); else legend_text->setText(current_payee); break; } case 16: { if(current_payee.isEmpty()) legend_text->setText(i18n("No payee")); else legend_text->setText(current_payee); break; } case 19: { QString str1, str2; if(current_payee.isEmpty() && current_description.isEmpty()) {str1 = i18n("No description"); str2 = i18n("no payer");} else if(current_payee.isEmpty()) {str1 = current_description; str2 = i18n("no payer");} else if(current_description.isEmpty()) {str1 = i18n("No description"); str2 = current_payee;} else {str1 = current_description; str2 = current_payee;} legend_text->setText(i18nc("%1: Description; %2: Payer", "%1/%2").arg(str1).arg(str2)); break; } case 20: { QString str1, str2; if(current_payee.isEmpty() && current_description.isEmpty()) {str1 = i18n("No description"); str2 = i18n("no payee");} else if(current_payee.isEmpty()) {str1 = current_description; str2 = i18n("no payee");} else if(current_description.isEmpty()) {str1 = i18n("No description"); str2 = current_payee;} else {str1 = current_description; str2 = current_payee;} legend_text->setText(i18nc("%1: Description; %2: Payee", "%1/%2").arg(str1).arg(str2)); break; } } if(legend_text->boundingRect().width() > text_width) text_width = legend_text->boundingRect().width(); legend_text->setFont(legend_font); legend_text->setBrush(Qt::black); legend_text->setPos(legend_x + 10 + fh + 5, legend_y + 10 + (fh + 5) * index); scene->addItem(legend_text); index++; if(source_org == 7 || source_org == 11) desc_i++; else if(source_org == 3) account = budget->incomesAccounts.next(); else if(source_org == 4) account = budget->expensesAccounts.next(); else if(source_org == 0 && monthly_values != &monthly_expenses) {monthly_values = &monthly_expenses;} else break; } QGraphicsRectItem *legend_outline = new QGraphicsRectItem(legend_x, legend_y, 10 + fh + 5 + text_width + 10, 10 + ((fh + 5) * index) + 5); legend_outline->setPen(QPen(Qt::black)); scene->addItem(legend_outline); QRectF rect = scene->sceneRect(); rect.setX(0); rect.setY(0); rect.setRight(rect.right() + 20); rect.setBottom(rect.bottom() + 20); scene->setSceneRect(rect); scene->update(); view->setScene(scene); view->fitInView(scene->sceneRect(), Qt::KeepAspectRatio); if(oldscene) { delete oldscene; } if(current_source == 7 || current_source == 8 || current_source == 17 || current_source == 18) { if(has_empty_description) descriptionCombo->setItemText(descriptionCombo->count() - 1, i18n("No description")); } else if(current_source == 12 || current_source == 14) { if(has_empty_payee) payeeCombo->setItemText(payeeCombo->count() - 1, i18n("No payee")); } else if(current_source == 11 || current_source == 13) { if(has_empty_payee) payeeCombo->setItemText(payeeCombo->count() - 1, i18n("No payer")); } } void OverTimeChart::resizeEvent(QResizeEvent *e) { QWidget::resizeEvent(e); if(scene) { view->fitInView(scene->sceneRect(), Qt::KeepAspectRatio); } } void OverTimeChart::updateTransactions() { if(descriptionCombo->isEnabled() && current_account) { bool b_income = (current_account->type() == ACCOUNT_TYPE_INCOMES); int curindex = descriptionCombo->currentIndex(); if(curindex > 1) { curindex = 0; } int curindex_p = 0; if(b_extra) { curindex_p = payeeCombo->currentIndex(); if(curindex_p > 1) { curindex_p = 0; } } descriptionCombo->blockSignals(true); descriptionCombo->clear(); descriptionCombo->addItem(i18n("All Descriptions Combined")); descriptionCombo->addItem(i18n("All Descriptions Split")); if(b_extra) { if(b_income) payeeCombo->addItem(i18n("All Payers Combined")); else payeeCombo->addItem(i18n("All Payees Combined")); if(b_income) payeeCombo->addItem(i18n("All Payers Split")); else payeeCombo->addItem(i18n("All Payees Split")); } has_empty_description = false; has_empty_payee = false; QMap descriptions, payees; Transaction *trans = budget->transactions.first(); while(trans) { if((trans->fromAccount() == current_account || trans->toAccount() == current_account)) { if(trans->description().isEmpty()) has_empty_description = true; else descriptions[trans->description()] = true; if(b_extra) { if(trans->type() == TRANSACTION_TYPE_EXPENSE) { if(((Expense*) trans)->payee().isEmpty()) has_empty_payee = true; else payees[((Expense*) trans)->payee()] = true; } else if(trans->type() == TRANSACTION_TYPE_INCOME) { if(((Income*) trans)->payer().isEmpty()) has_empty_payee = true; else payees[((Income*) trans)->payer()] = true; } } } trans = budget->transactions.next(); } QMap::iterator it_e = descriptions.end(); int i = 2; for(QMap::iterator it = descriptions.begin(); it != it_e; ++it) { if((current_source == 9 || current_source == 10 || current_source == 13 || current_source == 14 || current_source == 19 || current_source == 20) && it.key() == current_description) { curindex = i; } descriptionCombo->addItem(it.key()); i++; } if(has_empty_description) { if((current_source == 9 || current_source == 10 || current_source == 13 || current_source == 14 || current_source == 19 || current_source == 20) && current_description.isEmpty()) curindex = i; descriptionCombo->addItem(i18n("No description")); } if(b_extra) { i = 2; QMap::iterator it2_e = payees.end(); for(QMap::iterator it2 = payees.begin(); it2 != it2_e; ++it2) { if((current_source >= 15 || current_source <= 20) && it2.key() == current_payee) { curindex_p = i; } payeeCombo->addItem(it2.key()); i++; } if(has_empty_payee) { if((current_source >= 15 || current_source <= 20) && current_payee.isEmpty()) { curindex_p = i; } if(b_income) payeeCombo->addItem(i18n("No payer")); else payeeCombo->addItem(i18n("No payee")); } } if(curindex < descriptionCombo->count()) { descriptionCombo->setCurrentIndex(curindex); } if(b_extra && curindex_p < payeeCombo->count()) { payeeCombo->setCurrentIndex(curindex_p); } int d_index = descriptionCombo->currentIndex(); int p_index = 0; if(b_extra) p_index = payeeCombo->currentIndex(); if(d_index <= 1) current_description = ""; if(p_index <= 1) current_payee = ""; if(d_index == 0) { if(p_index == 0) current_source = b_income ? 5 : 6; else if(p_index == 1) current_source = b_income ? 11 : 12; else current_source = b_income ? 15 : 16; } else if(d_index == 1) { if(p_index == 0) current_source = b_income ? 7 : 8; else current_source = b_income ? 17 : 18; } else { if(p_index == 0) current_source = b_income ? 9 : 10; else if(p_index == 1) current_source = b_income ? 13 : 14; else current_source = b_income ? 19 : 20; } descriptionCombo->blockSignals(false); if(b_extra) payeeCombo->blockSignals(false); } updateDisplay(); } void OverTimeChart::updateAccounts() { if(categoryCombo->isEnabled()) { int curindex = categoryCombo->currentIndex(); if(curindex > 1) { curindex = 1; } categoryCombo->blockSignals(true); descriptionCombo->blockSignals(true); if(b_extra) payeeCombo->blockSignals(true); categoryCombo->clear(); categoryCombo->addItem(i18n("All Categories Combined")); categoryCombo->addItem(i18n("All Categories Split")); int i = 2; if(sourceCombo->currentIndex() == 2) { Account *account = budget->expensesAccounts.first(); while(account) { categoryCombo->addItem(account->name()); if(account == current_account) curindex = i; account = budget->expensesAccounts.next(); i++; } } else { Account *account = budget->incomesAccounts.first(); while(account) { categoryCombo->addItem(account->name()); if(account == current_account) curindex = i; account = budget->incomesAccounts.next(); i++; } } if(curindex < categoryCombo->count()) categoryCombo->setCurrentIndex(curindex); if(curindex <= 1) { descriptionCombo->clear(); descriptionCombo->setEnabled(false); descriptionCombo->addItem(i18n("All Descriptions Combined")); if(b_extra) { payeeCombo->clear(); payeeCombo->setEnabled(false); if(sourceCombo->currentIndex() == 3) payeeCombo->addItem(i18n("All Payees Combined")); else payeeCombo->addItem(i18n("All Payers Combined")); } descriptionCombo->setEnabled(false); if(b_extra) payeeCombo->setEnabled(false); } if(curindex == 0) { if(sourceCombo->currentIndex() == 3) { current_source = 1; } else { current_source = 2; } } else if(curindex == 1) { if(sourceCombo->currentIndex() == 3) { current_source = 3; } else { current_source = 4; } } categoryCombo->blockSignals(false); descriptionCombo->blockSignals(false); if(b_extra) payeeCombo->blockSignals(false); } updateDisplay(); } #include "overtimechart.moc" eqonomize-0.6/src/overtimechart.h0000644000175000017500000000561111106577022016141 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef OVER_TIME_CHART_H #define OVER_TIME_CHART_H #include #include #include class Budget; class QPushButton; class QComboBox; class QRadioButton; class QGraphicsScene; class QGraphicsView; class QButtonGroup; class Account; class EqonomizeMonthSelector; class OverTimeChart : public QWidget { Q_OBJECT public: OverTimeChart(Budget *budg, QWidget *parent, bool extra_parameters); ~OverTimeChart(); protected: Budget *budget; bool b_extra; QComboBox *sourceCombo, *categoryCombo, *descriptionCombo, *payeeCombo; EqonomizeMonthSelector *startDateEdit, *endDateEdit; QPushButton *saveButton, *printButton; QRadioButton *dailyButton, *valueButton, *countButton, *perButton; QGraphicsScene *scene; QGraphicsView *view; QButtonGroup *valueGroup; QDate start_date, end_date; Account *current_account; QString current_description, current_payee; int current_source; bool has_empty_description, has_empty_payee; void resizeEvent(QResizeEvent*); public slots: void sourceChanged(int); void categoryChanged(int); void descriptionChanged(int); void payeeChanged(int); void updateTransactions(); void updateAccounts(); void updateDisplay(); void save(); void print(); void saveConfig(); void startMonthChanged(const QDate&); void startYearChanged(const QDate&); void endMonthChanged(const QDate&); void endYearChanged(const QDate&); void valueTypeToggled(bool); }; #endif eqonomize-0.6/src/overtimereport.cpp0000644000175000017500000010123211106577026016706 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "overtimereport.h" #include "budget.h" #include "account.h" #include "transaction.h" #include "recurrence.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern QString htmlize_string(QString str); extern double averageMonth(const QDate &date1, const QDate &date2); extern double averageYear(const QDate &date1, const QDate &date2); struct month_info { double value; double count; QDate date; }; OverTimeReport::OverTimeReport(Budget *budg, QWidget *parent) : QWidget(parent), budget(budg) { setAttribute(Qt::WA_DeleteOnClose, true); QVBoxLayout *layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); KDialogButtonBox *buttons = new KDialogButtonBox(this); saveButton = buttons->addButton(KStandardGuiItem::saveAs(), QDialogButtonBox::ActionRole); printButton = buttons->addButton(KStandardGuiItem::print(), QDialogButtonBox::ActionRole); layout->addWidget(buttons); htmlpart = new KHTMLPart(this); layout->addWidget(htmlpart->view()); KConfigGroup config = KGlobal::config()->group("Over Time Report"); QGroupBox *settingsWidget = new QGroupBox(i18n("Options"), this); QGridLayout *settingsLayout = new QGridLayout(settingsWidget); settingsLayout->addWidget(new QLabel(i18n("Source:"), settingsWidget), 0, 0); QHBoxLayout *choicesLayout = new QHBoxLayout(); settingsLayout->addLayout(choicesLayout, 0, 1); sourceCombo = new KComboBox(settingsWidget); sourceCombo->setEditable(false); sourceCombo->addItem(i18n("Profits")); sourceCombo->addItem(i18n("Expenses")); sourceCombo->addItem(i18n("Incomes")); choicesLayout->addWidget(sourceCombo); categoryCombo = new KComboBox(settingsWidget); categoryCombo->setEditable(false); categoryCombo->addItem(i18n("All Categories Combined")); categoryCombo->setEnabled(false); choicesLayout->addWidget(categoryCombo); descriptionCombo = new KComboBox(settingsWidget); descriptionCombo->setEditable(false); descriptionCombo->addItem(i18n("All Descriptions Combined")); descriptionCombo->setEnabled(false); choicesLayout->addWidget(descriptionCombo); current_account = NULL; current_source = 0; settingsLayout->addWidget(new QLabel(i18n("Columns:"), settingsWidget), 1, 0); QHBoxLayout *enabledLayout = new QHBoxLayout(); settingsLayout->addLayout(enabledLayout, 1, 1); valueButton = new QCheckBox(i18n("Value"), settingsWidget); valueButton->setChecked(config.readEntry("valueEnabled", true)); enabledLayout->addWidget(valueButton); dailyButton = new QCheckBox(i18n("Daily"), settingsWidget); dailyButton->setChecked(config.readEntry("dailyAverageEnabled", true)); enabledLayout->addWidget(dailyButton); monthlyButton = new QCheckBox(i18n("Monthly"), settingsWidget); monthlyButton->setChecked(config.readEntry("monthlyAverageEnabled", true)); enabledLayout->addWidget(monthlyButton); yearlyButton = new QCheckBox(i18n("Yearly"), settingsWidget); yearlyButton->setChecked(config.readEntry("yearlyEnabled", false)); enabledLayout->addWidget(yearlyButton); countButton = new QCheckBox(i18n("Quantity"), settingsWidget); countButton->setChecked(config.readEntry("transactionCountEnabled", true)); enabledLayout->addWidget(countButton); perButton = new QCheckBox(i18n("Average value"), settingsWidget); perButton->setChecked(config.readEntry("valuePerTransactionEnabled", false)); enabledLayout->addWidget(perButton); enabledLayout->addStretch(1); layout->addWidget(settingsWidget); connect(valueButton, SIGNAL(toggled(bool)), this, SLOT(updateDisplay())); connect(dailyButton, SIGNAL(toggled(bool)), this, SLOT(updateDisplay())); connect(monthlyButton, SIGNAL(toggled(bool)), this, SLOT(updateDisplay())); connect(yearlyButton, SIGNAL(toggled(bool)), this, SLOT(updateDisplay())); connect(countButton, SIGNAL(toggled(bool)), this, SLOT(updateDisplay())); connect(perButton, SIGNAL(toggled(bool)), this, SLOT(updateDisplay())); connect(sourceCombo, SIGNAL(activated(int)), this, SLOT(sourceChanged(int))); connect(categoryCombo, SIGNAL(activated(int)), this, SLOT(categoryChanged(int))); connect(descriptionCombo, SIGNAL(activated(int)), this, SLOT(descriptionChanged(int))); connect(sourceCombo, SIGNAL(activated(int)), this, SLOT(updateDisplay())); connect(saveButton, SIGNAL(clicked()), this, SLOT(save())); connect(printButton, SIGNAL(clicked()), this, SLOT(print())); } void OverTimeReport::descriptionChanged(int index) { current_description = ""; bool b_income = (current_account && current_account->type() == ACCOUNT_TYPE_INCOMES); if(index == 0) { if(b_income) current_source = 5; else current_source = 6; } else { if(!has_empty_description || index < descriptionCombo->count() - 1) current_description = descriptionCombo->itemText(index); if(b_income) current_source = 9; else current_source = 10; } updateDisplay(); } void OverTimeReport::categoryChanged(int index) { descriptionCombo->blockSignals(true); descriptionCombo->clear(); descriptionCombo->addItem(i18n("All Descriptions Combined")); current_account = NULL; if(index == 0) { if(sourceCombo->currentIndex() == 2) { current_source = 1; } else { current_source = 2; } descriptionCombo->setEnabled(false); } else { if(sourceCombo->currentIndex() == 1) { int i = categoryCombo->currentIndex() - 1; if(i < (int) budget->expensesAccounts.count()) { current_account = budget->expensesAccounts.at(i); } current_source = 6; } else { int i = categoryCombo->currentIndex() - 1; if(i < (int) budget->incomesAccounts.count()) { current_account = budget->incomesAccounts.at(i); } current_source = 5; } has_empty_description = false; QMap descriptions; Transaction *trans = budget->transactions.first(); while(trans) { if((trans->fromAccount() == current_account || trans->toAccount() == current_account)) { if(trans->description().isEmpty()) has_empty_description = true; else descriptions[trans->description()] = true; } trans = budget->transactions.next(); } QMap::iterator it_e = descriptions.end(); for(QMap::iterator it = descriptions.begin(); it != it_e; ++it) { descriptionCombo->addItem(it.key()); } if(has_empty_description) descriptionCombo->addItem(i18n("No description")); descriptionCombo->setEnabled(true); } descriptionCombo->blockSignals(false); updateDisplay(); } void OverTimeReport::sourceChanged(int index) { categoryCombo->blockSignals(true); descriptionCombo->blockSignals(true); categoryCombo->clear(); descriptionCombo->clear(); descriptionCombo->setEnabled(false); descriptionCombo->addItem(i18n("All Descriptions Combined")); current_description = ""; current_account = NULL; categoryCombo->addItem(i18n("All Categories Combined")); if(index == 2) { Account *account = budget->incomesAccounts.first(); while(account) { categoryCombo->addItem(account->name()); account = budget->incomesAccounts.next(); } categoryCombo->setEnabled(true); current_source = 1; } else if(index == 1) { Account *account = budget->expensesAccounts.first(); while(account) { categoryCombo->addItem(account->name()); account = budget->expensesAccounts.next(); } categoryCombo->setEnabled(true); current_source = 2; } else { categoryCombo->setEnabled(false); current_source = 0; } categoryCombo->blockSignals(false); descriptionCombo->blockSignals(false); updateDisplay(); } void OverTimeReport::saveConfig() { KConfigGroup config = KGlobal::config()->group("Over Time Report"); ((KDialog*) parent())->saveDialogSize(config); config.writeEntry("valueEnabled", valueButton->isChecked()); config.writeEntry("dailyAverageEnabled", dailyButton->isChecked()); config.writeEntry("monthlyAverageEnabled", monthlyButton->isChecked()); config.writeEntry("yearlyAverageEnabled", yearlyButton->isChecked()); config.writeEntry("transactionCountEnabled", countButton->isChecked()); config.writeEntry("valuePerTransactionEnabled", perButton->isChecked()); } void OverTimeReport::save() { KFileDialog *dialog = new KFileDialog(KUrl(), QString::null, this); QStringList filter; filter << "text/html"; dialog->setMimeFilter(filter, "text/html"); dialog->setOperationMode(KFileDialog::Saving); dialog->setMode(KFile::File); if(dialog->exec() != QDialog::Accepted) {dialog->deleteLater(); return;} KUrl url = dialog->selectedUrl(); dialog->deleteLater(); if(url.isEmpty() && url.isValid()) return; if(url.isLocalFile()) { if(QFile::exists(url.path())) { if(KMessageBox::warningYesNo(this, i18n("The selected file already exists. Would you like to overwrite the old copy?")) != KMessageBox::Yes) return; } QFileInfo info(url.path()); if(info.isDir()) { KMessageBox::error(this, i18n("You selected a directory!")); return; } KSaveFile ofile(url.path()); ofile.open(); ofile.setPermissions((QFile::Permissions) 0x0660); if(!ofile.isOpen()) { ofile.abort(); KMessageBox::error(this, i18n("Couldn't open file for writing.")); return; } QTextStream outf(&ofile); outf.setCodec("UTF-8"); outf << source; if(!ofile.finalize()) { KMessageBox::error(this, i18n("Error while writing file; file was not saved.")); return; } return; } KTemporaryFile tf; tf.open(); tf.setAutoRemove(true); QTextStream outf(&tf); outf.setCodec("UTF-8"); outf << source; KIO::NetAccess::upload(tf.fileName(), url, this); } void OverTimeReport::print() { htmlpart->view()->print(); } void OverTimeReport::updateDisplay() { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); int columns = 2; bool enabled[6]; enabled[0] = valueButton->isChecked(); enabled[1] = dailyButton->isChecked(); enabled[2] = monthlyButton->isChecked(); enabled[3] = yearlyButton->isChecked(); enabled[4] = countButton->isChecked(); enabled[5] = perButton->isChecked(); for(size_t i = 0; i < 6; i++) { if(enabled[i]) columns++; } QVector monthly_values; month_info *mi = NULL; QDate first_date; AccountType at = ACCOUNT_TYPE_EXPENSES; Account *account = NULL; int type = 0; QString title, valuetitle, pertitle; switch(current_source) { case 0: { type = 0; title = i18n("Profits"); pertitle = i18n("Average Profit"); valuetitle = title; break; } case 1: { title = i18n("Incomes"); pertitle = i18n("Average Income"); valuetitle = title; type = 1; at = ACCOUNT_TYPE_INCOMES; break; } case 2: { title = i18n("Expenses"); pertitle = i18n("Average Cost"); valuetitle = title; type = 1; at = ACCOUNT_TYPE_EXPENSES; break; } case 5: { account = current_account; title = i18n("Incomes: %1").arg(account->name()); pertitle = i18n("Average Income"); valuetitle = i18n("Incomes"); type = 2; at = ACCOUNT_TYPE_INCOMES; break; } case 6: { account = current_account; title = i18n("Expenses: %1").arg(account->name()); pertitle = i18n("Average Cost"); valuetitle = i18n("Expenses"); type = 2; at = ACCOUNT_TYPE_EXPENSES; break; } case 9: { account = current_account; title = i18n("Incomes: %2, %1").arg(account->name()).arg(current_description.isEmpty() ? i18n("No description") : current_description); pertitle = i18n("Average Income"); valuetitle = i18n("Incomes"); type = 3; at = ACCOUNT_TYPE_INCOMES; break; } case 10: { account = current_account; title = i18n("Expenses: %2, %1").arg(account->name()).arg(current_description.isEmpty() ? i18n("No description") : current_description); pertitle = i18n("Average Cost"); valuetitle = i18n("Expenses"); type = 3; at = ACCOUNT_TYPE_EXPENSES; break; } } Transaction *trans = budget->transactions.first(); QDate start_date; while(trans) { if(trans->fromAccount()->type() != ACCOUNT_TYPE_ASSETS || trans->toAccount()->type() != ACCOUNT_TYPE_ASSETS) { start_date = trans->date(); if(calSys->day(start_date) > 1) { start_date = calSys->addMonths(start_date, 1); calSys->setYMD(start_date, calSys->year(start_date), calSys->month(start_date), 1); } break; } trans = budget->transactions.next(); } if(start_date.isNull() || start_date > QDate::currentDate()) start_date = QDate::currentDate(); if(calSys->month(start_date) == calSys->month(QDate::currentDate()) && calSys->year(start_date) == calSys->year(QDate::currentDate())) { start_date = calSys->addMonths(start_date, -1); calSys->setYMD(start_date, calSys->year(start_date), calSys->month(start_date), 1); } first_date = start_date; QDate curdate = calSys->addDays(QDate::currentDate(), -1); if(calSys->day(curdate) < calSys->daysInMonth(curdate)) { curdate = calSys->addMonths(curdate, -1); calSys->setYMD(curdate, calSys->year(curdate), calSys->month(curdate), calSys->daysInMonth(curdate)); } if(curdate <= first_date || (calSys->month(start_date) == calSys->month(curdate) && calSys->year(start_date) == calSys->year(curdate))) { curdate = QDate::currentDate(); } bool started = false; trans = budget->transactions.first(); while(trans && trans->date() <= curdate) { bool include = false; int sign = 1; if(!started && trans->date() >= first_date) started = true; if(started) { if((type == 1 && trans->fromAccount()->type() == at) || (type == 2 && trans->fromAccount() == account) || (type == 3 && trans->fromAccount() == account && trans->description() == current_description) || (type == 0 && trans->fromAccount()->type() != ACCOUNT_TYPE_ASSETS)) { if(type == 0) sign = 1; else if(at == ACCOUNT_TYPE_INCOMES) sign = 1; else sign = -1; include = true; } else if((type == 1 && trans->toAccount()->type() == at) || (type == 2 && trans->toAccount() == account) || (type == 3 && trans->toAccount() == account && trans->description() == current_description) || (type == 0 && trans->toAccount()->type() != ACCOUNT_TYPE_ASSETS)) { if(type == 0) sign = -1; else if(at == ACCOUNT_TYPE_INCOMES) sign = -1; else sign = 1; include = true; } } if(include) { if(!mi || trans->date() > mi->date) { QDate newdate, olddate; calSys->setYMD(newdate, calSys->year(trans->date()), calSys->month(trans->date()), calSys->daysInMonth(trans->date())); if(mi) { olddate = calSys->addMonths(mi->date, 1); calSys->setYMD(olddate, calSys->year(olddate), calSys->month(olddate), calSys->daysInMonth(olddate)); } else { calSys->setYMD(olddate, calSys->year(first_date), calSys->month(first_date), calSys->daysInMonth(first_date)); } while(olddate < newdate) { monthly_values.append(month_info()); mi = &monthly_values.back(); mi->value = 0.0; mi->count = 0.0; mi->date = olddate; olddate = calSys->addMonths(olddate, 1); calSys->setYMD(olddate, calSys->year(olddate), calSys->month(olddate), calSys->daysInMonth(olddate)); } monthly_values.append(month_info()); mi = &monthly_values.back(); mi->value = trans->value() * sign; mi->count = trans->quantity(); mi->date = newdate; } else { mi->value += trans->value() * sign; mi->count += trans->quantity(); } } trans = budget->transactions.next(); } if(mi) { while(mi->date < curdate) { QDate newdate = calSys->addMonths(mi->date, 1); calSys->setYMD(newdate, calSys->year(newdate), calSys->month(newdate), calSys->daysInMonth(newdate)); monthly_values.append(month_info()); mi = &monthly_values.back(); mi->value = 0.0; mi->count = 0.0; mi->date = newdate; } } double scheduled_value = 0.0; double scheduled_count = 0.0; if(mi) { ScheduledTransaction *strans = budget->scheduledTransactions.first(); while(strans && strans->transaction()->date() <= mi->date) { trans = strans->transaction(); bool include = false; int sign = 1; if((type == 1 && trans->fromAccount()->type() == at) || (type == 2 && trans->fromAccount() == account) || (type == 3 && trans->fromAccount() == account && trans->description() == current_description) || (type == 0 && trans->fromAccount()->type() != ACCOUNT_TYPE_ASSETS)) { if(type == 0) sign = 1; else if(at == ACCOUNT_TYPE_INCOMES) sign = 1; else sign = -1; include = true; } else if((type == 1 && trans->toAccount()->type() == at) || (type == 2 && trans->toAccount() == account) || (type == 3 && trans->toAccount() == account && trans->description() == current_description) || (type == 0 && trans->toAccount()->type() != ACCOUNT_TYPE_ASSETS)) { if(type == 0) sign = -1; else if(at == ACCOUNT_TYPE_INCOMES) sign = -1; else sign = 1; include = true; } if(include) { int count = (strans->recurrence() ? strans->recurrence()->countOccurrences(mi->date) : 1); scheduled_value += (trans->value() * sign * count); scheduled_count += count * trans->quantity(); } strans = budget->scheduledTransactions.next(); } } double average_month = averageMonth(first_date, curdate); double average_year = averageYear(first_date, curdate); source = ""; QTextStream outf(&source, QIODevice::WriteOnly); outf << "" << '\n'; outf << "" << '\n'; outf << "\t" << '\n'; outf << "\t\t"; outf << htmlize_string(title); outf << "" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t" << '\n'; outf << "\t" << '\n'; outf << "\t" << '\n'; outf << "\t\t

" << htmlize_string(title) << "

" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; outf << "\t\t\t\t\t"; bool use_footer1 = false; if(enabled[0]) { outf << "\t\t\t\t\t"; } if(enabled[1]) outf << "\t\t\t\t\t"; if(enabled[2]) outf << "\t\t\t\t\t"; if(enabled[3]) outf << "\t\t\t\t\t"; if(enabled[4]) { outf << "\t\t\t\t\t"; } if(enabled[5]) { outf << "\t\t\t\t\t"; } outf << "\t\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t" << '\n'; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; QVector::iterator it_b = monthly_values.begin(); QVector::iterator it_e = monthly_values.end(); if(it_e != it_b) --it_e; QVector::iterator it = monthly_values.end(); int year = 0; double yearly_value = 0.0, total_value = 0.0; double yearly_count = 0.0, total_count = 0.0; QDate year_date; bool first_year = true, first_month = true; bool multiple_months = monthly_values.size() > 1; bool multiple_years = multiple_months && calSys->year(first_date) != calSys->year(curdate); int i_count_frac = 0; double intpart = 0.0; while(it != it_b) { --it; if(modf(it->count, &intpart) != 0.0) { i_count_frac = 2; break; } } it = monthly_values.end(); while(it != it_b) { --it; outf << "\t\t\t\t" << '\n'; if(first_month || year != calSys->year(it->date)) { if(!first_month && multiple_years) { outf << "\t\t\t\t\t"; outf << "\t\t\t\t\t"; if(enabled[0]) outf << ""; int days = 1; if(first_year) { days = calSys->dayOfYear(curdate); } else if(year == calSys->year(first_date)) { days = calSys->daysInYear(year_date); days -= (calSys->dayOfYear(first_date) - 1); } else { days= calSys->daysInYear(year_date); } if(enabled[1]) outf << ""; if(enabled[2]) outf << ""; if(enabled[3]) outf << ""; if(enabled[4]) outf << ""; double pervalue = 0.0; if(first_year) { pervalue = (((yearly_count + scheduled_count) == 0.0) ? 0.0 : ((yearly_value + scheduled_value) / (yearly_count + scheduled_count))); } else { pervalue = (yearly_count == 0.0 ? 0.0 : (yearly_value / yearly_count)); } if(enabled[5]) outf << ""; first_year = false; outf << "\n"; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t" << '\n'; } year = calSys->year(it->date); yearly_value = it->value; yearly_count = it->count; year_date = it->date; outf << "\t\t\t\t\t"; } else { yearly_value += it->value; yearly_count += it->count; outf << "\t\t\t\t\t"; } total_value += it->value; total_count += it->count; outf << "\t\t\t\t\t"; if(enabled[0]) outf << ""; int days = 0; if(first_month) { days = calSys->day(curdate); } else if(it == it_b) { days = calSys->daysInMonth(it->date); days -= (calSys->day(first_date) - 1); } else { days = calSys->daysInMonth(it->date); } if(enabled[1]) outf << ""; if(enabled[2]) outf << ""; if(enabled[3]) outf << ""; if(enabled[4]) outf << ""; double pervalue = 0.0; if(first_month) { pervalue = (((it->count + scheduled_count) == 0.0) ? 0.0 : ((it->value + scheduled_value) / (it->count + scheduled_count))); } else { pervalue = (it->count == 0.0 ? 0.0 : (it->value / it->count)); } if(enabled[5]) outf << ""; first_month = false; outf << "\n"; outf << "\t\t\t\t" << '\n'; } if(multiple_years) { outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; outf << "\t\t\t\t\t"; if(enabled[0]) outf << ""; int days = calSys->daysInYear(year_date); days -= (calSys->dayOfYear(first_date) - 1); if(enabled[1]) outf << ""; if(enabled[2]) outf << ""; if(enabled[3]) outf << ""; if(enabled[4]) outf << ""; if(enabled[5]) outf << ""; outf << "\n"; outf << "\t\t\t\t" << '\n'; } if(multiple_months) { outf << "\t\t\t\t" << '\n'; int days = first_date.daysTo(curdate) + 1; outf << "\t\t\t\t\t"; outf << "\t\t\t\t\t"; if(enabled[0]) outf << ""; if(enabled[1]) outf << ""; if(enabled[2]) outf << ""; if(enabled[3]) outf << ""; if(enabled[4]) outf << ""; if(enabled[5]) outf << ""; outf << "\n"; outf << "\t\t\t\t" << '\n'; } outf << "\t\t\t" << '\n'; outf << "\t\t
" << htmlize_string(i18n("Year")) << "" << htmlize_string(i18n("Month")) << "" << htmlize_string(valuetitle); if(mi && mi->date > curdate) {outf << "*"; use_footer1 = true;} outf<< "" << htmlize_string(i18n("Daily Average")) << "" << htmlize_string(i18n("Monthly Average")) << "**" << "" << htmlize_string(i18n("Yearly Average")) << "**" << "" << htmlize_string(i18n("Quantity")); if(mi && mi->date > curdate) {outf << "*"; use_footer1 = true;} outf<< "" << htmlize_string(pertitle); if(mi && mi->date > curdate) {outf << "*"; use_footer1 = true;} outf<< "
" << ""; bool had_footer = false; if(use_footer1) { had_footer = true; outf << "*" << htmlize_string(i18n("Includes scheduled transactions")); } if(enabled[2] || enabled[3]) { if(had_footer) outf << "
"; outf << "**" << htmlize_string(i18n("Adjusted for the average month / year (%1 / %2 days)").arg(KGlobal::locale()->formatNumber(average_month, 1)).arg(KGlobal::locale()->formatNumber(average_year, 1))); } outf << "
" << "
" << htmlize_string(i18n("Subtotal")) << "" << htmlize_string(KGlobal::locale()->formatMoney(first_year ? (yearly_value + scheduled_value) : yearly_value)) << "" << htmlize_string(KGlobal::locale()->formatMoney(yearly_value / days)) << "" << htmlize_string(KGlobal::locale()->formatMoney(((yearly_value * average_month) / days))) << "" << htmlize_string(KGlobal::locale()->formatMoney((yearly_value * average_year) / days)) << "" << htmlize_string(KGlobal::locale()->formatNumber(first_year ? (yearly_count + scheduled_count) : yearly_count, i_count_frac)) << "" << htmlize_string(KGlobal::locale()->formatMoney(pervalue)) << "
" << htmlize_string(calSys->yearString(it->date, KCalendarSystem::ShortFormat)) << "" << htmlize_string(calSys->monthName(it->date)) << "" << htmlize_string(KGlobal::locale()->formatMoney(first_month ? (it->value + scheduled_value) : it->value)) << "" << htmlize_string(KGlobal::locale()->formatMoney(it->value / days)) << "" << htmlize_string(KGlobal::locale()->formatMoney((it->value * average_month) / days)) << "" << htmlize_string(KGlobal::locale()->formatMoney((it->value * average_year) / days)) << "" << htmlize_string(KGlobal::locale()->formatNumber(first_month ? (it->count + scheduled_count) : it->count, i_count_frac)) << "" << htmlize_string(KGlobal::locale()->formatMoney(pervalue)) << "
" << htmlize_string(i18n("Subtotal")) << "" << htmlize_string(KGlobal::locale()->formatMoney(yearly_value)) << "" << htmlize_string(KGlobal::locale()->formatMoney(yearly_value / days)) << "" << htmlize_string(KGlobal::locale()->formatMoney((yearly_value * average_month) / days)) << "" << htmlize_string(KGlobal::locale()->formatMoney((yearly_value * average_year) / days)) << "" << htmlize_string(KGlobal::locale()->formatNumber(yearly_count, i_count_frac)) << "" << htmlize_string(KGlobal::locale()->formatMoney(yearly_count == 0.0 ? 0.0 : (yearly_value / yearly_count))) << "
" << htmlize_string(i18n("Total")) << "" << htmlize_string(KGlobal::locale()->formatMoney(total_value + scheduled_value)) << "" << htmlize_string(KGlobal::locale()->formatMoney(total_value / days)) << "" << htmlize_string(KGlobal::locale()->formatMoney((total_value * average_month) / days)) << "" << htmlize_string(KGlobal::locale()->formatMoney((total_value * average_year) / days)) << "" << htmlize_string(KGlobal::locale()->formatNumber(total_count + scheduled_count, i_count_frac)) << "" << htmlize_string(KGlobal::locale()->formatMoney((total_count + scheduled_count) == 0.0 ? 0.0 : ((total_value + scheduled_value) / (total_count + scheduled_count)))) << "
" << '\n'; outf << "\t" << '\n'; outf << "" << '\n'; htmlpart->begin(); htmlpart->write(source); htmlpart->end(); } void OverTimeReport::updateTransactions() { if(descriptionCombo->isEnabled() && current_account) { int curindex = 0; descriptionCombo->blockSignals(true); descriptionCombo->clear(); descriptionCombo->addItem(i18n("All Descriptions Combined")); has_empty_description = false; QMap descriptions; Transaction *trans = budget->transactions.first(); while(trans) { if((trans->fromAccount() == current_account || trans->toAccount() == current_account)) { if(trans->description().isEmpty()) has_empty_description = true; else descriptions[trans->description()] = true; } trans = budget->transactions.next(); } QMap::iterator it_e = descriptions.end(); int i = 1; for(QMap::iterator it = descriptions.begin(); it != it_e; ++it) { if((current_source == 9 || current_source == 10) && it.key() == current_description) { curindex = i; } descriptionCombo->addItem(it.key()); i++; } if(has_empty_description) { if((current_source == 9 || current_source == 10) && current_description.isEmpty()) curindex = i; descriptionCombo->addItem(i18n("No description")); } if(curindex < descriptionCombo->count()) { descriptionCombo->setCurrentIndex(curindex); } bool b_income = (current_account && current_account->type() == ACCOUNT_TYPE_INCOMES); if(descriptionCombo->currentIndex() == 0) { if(b_income) current_source = 5; else current_source = 6; current_description = ""; } descriptionCombo->blockSignals(false); } updateDisplay(); } void OverTimeReport::updateAccounts() { if(categoryCombo->isEnabled()) { int curindex = 0; categoryCombo->blockSignals(true); descriptionCombo->blockSignals(true); categoryCombo->clear(); categoryCombo->addItem(i18n("All Categories Combined")); int i = 1; if(sourceCombo->currentIndex() == 1) { Account *account = budget->expensesAccounts.first(); while(account) { categoryCombo->addItem(account->name()); if(account == current_account) curindex = i; account = budget->expensesAccounts.next(); i++; } } else { Account *account = budget->incomesAccounts.first(); while(account) { categoryCombo->addItem(account->name()); if(account == current_account) curindex = i; account = budget->incomesAccounts.next(); i++; } } if(curindex < categoryCombo->count()) categoryCombo->setCurrentIndex(curindex); if(curindex == 0) { descriptionCombo->clear(); descriptionCombo->setEnabled(false); descriptionCombo->addItem(i18n("All Descriptions Combined")); if(sourceCombo->currentIndex() == 2) { current_source = 1; } else { current_source = 2; } descriptionCombo->setEnabled(false); } categoryCombo->blockSignals(false); descriptionCombo->blockSignals(false); } updateDisplay(); } #include "overtimereport.moc" eqonomize-0.6/src/overtimereport.h0000644000175000017500000000452311106577032016355 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef OVER_TIME_REPORT_H #define OVER_TIME_REPORT_H #include class Budget; class KHTMLPart; class QPushButton; class QComboBox; class QCheckBox; class Account; class OverTimeReport : public QWidget { Q_OBJECT public: OverTimeReport(Budget *budg, QWidget *parent); protected: Budget *budget; QString source; Account *current_account; QString current_description; int current_source; bool has_empty_description; KHTMLPart *htmlpart; QComboBox *sourceCombo, *categoryCombo, *descriptionCombo; QPushButton *saveButton, *printButton; QCheckBox *valueButton, *dailyButton, *monthlyButton, *yearlyButton, *countButton, *perButton; public slots: void sourceChanged(int); void categoryChanged(int); void descriptionChanged(int); void updateTransactions(); void updateAccounts(); void updateDisplay(); void save(); void print(); void saveConfig(); }; #endif eqonomize-0.6/src/qifimportexport.cpp0000644000175000017500000021554111106577036017106 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "qifimportexport.h" #include "eqonomize.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include ImportQIFDialog::ImportQIFDialog(Budget *budg, QWidget *parent, bool extra_parameters) : QWizard(parent), budget(budg), b_extra(extra_parameters) { setWindowTitle(i18n("Import QIF file")); setModal(true); next_id = -1; QIFWizardPage *page1 = new QIFWizardPage(); page1->setTitle(i18n("File Selection")); page1->setSubTitle(i18n("Select a QIF file to import. When you click next, the file be analysed and you might need to answer some questions about the format of the file.")); setPage(0, page1); QGridLayout *layout1 = new QGridLayout(page1); layout1->addWidget(new QLabel(i18n("File:"), page1), 0, 0); fileEdit = new KUrlRequester(page1); fileEdit->setMode(KFile::File | KFile::ExistingOnly); fileEdit->setFilter("*.qif"); layout1->addWidget(fileEdit, 0, 1); QIFWizardPage *page1_2 = new QIFWizardPage(); page1_2->setTitle(i18n("Local Definitions")); page1_2->setSubTitle(i18n("Unknown elements where found in the QIF file. It is possible that this is because of localized type names. Please map them to the correct standard names.")); setPage(1, page1_2); QGridLayout *layout1_2 = new QGridLayout(page1_2); defsView = new QTreeWidget(page1_2); layout1_2->addWidget(defsView, 0, 0, 1, 2); QStringList headers; headers << i18n("Local Text"); headers << i18n("Standard Text"); defsView->setColumnCount(2); defsView->setHeaderLabels(headers); layout1_2->addWidget(new QLabel(i18n("Select standard text:"), page1_2), 1, 0); defsCombo = new KComboBox(page1_2); defsCombo->setEditable(false); layout1_2->addWidget(defsCombo, 1, 1); QIFWizardPage *page2 = new QIFWizardPage(); page2->setTitle(i18n("Date Format")); page2->setSubTitle(i18n("The date format in the QIF file is ambiguous. Please select the correct format.")); setPage(2, page2); QGridLayout *layout2 = new QGridLayout(page2); layout2->addWidget(new QLabel(i18n("Date format:"), page2), 0, 0); dateFormatCombo = new KComboBox(page2); dateFormatCombo->setEditable(false); layout2->addWidget(dateFormatCombo, 0, 1); QIFWizardPage *page3 = new QIFWizardPage(); page3->setTitle(i18n("Default Account")); page3->setSubTitle(i18n("Could not find any account definitions in the QIF file. Please select a default account. It is also possible that this is caused by a localized opening balance text.")); setPage(3, page3); QGridLayout *layout3 = new QGridLayout(page3); layout3->addWidget(new QLabel(i18n("Default account:"), page3), 0, 0); accountCombo = new KComboBox(page3); accountCombo->setEditable(false); AssetsAccount *account = budget->assetsAccounts.first(); while(account) { if(account != budget->balancingAccount && account->accountType() != ASSETS_TYPE_SECURITIES) { accountCombo->addItem(account->name()); } account = budget->assetsAccounts.next(); } layout3->addWidget(accountCombo, 0, 1); layout3->addWidget(new QLabel(i18n("Opening balance text:"), page3), 1, 0); openingBalanceEdit = new KLineEdit(page3); openingBalanceEdit->setText("Opening Balance"); layout3->addWidget(openingBalanceEdit, 1, 1); QIFWizardPage *page4 = new QIFWizardPage(); page4->setTitle(i18n("Descriptions")); page4->setSubTitle(i18n("Transactions in QIF files does not have any specific description property. You are therefore given the option to choose how the description of imported transactions will be set.")); setPage(4, page4); QGridLayout *layout4 = new QGridLayout(page4); layout4->addWidget(new QLabel(i18n("Subcategories as:"), page4), 0, 0); QButtonGroup *subcategoryGroup = new QButtonGroup(this); subcategoryAsDescriptionButton = new QRadioButton(i18n("Description"), page4); subcategoryGroup->addButton(subcategoryAsDescriptionButton); layout4->addWidget(subcategoryAsDescriptionButton, 0, 1); subcategoryAsDescriptionButton->setChecked(true); subcategoryAsCategoryButton = new QRadioButton(i18n("Category"), page4); subcategoryGroup->addButton(subcategoryAsCategoryButton); layout4->addWidget(subcategoryAsCategoryButton, 0, 2); subcategoryIgnoreButton = new QRadioButton(i18n("Ignore"), page4); subcategoryGroup->addButton(subcategoryIgnoreButton); layout4->addWidget(subcategoryIgnoreButton, 0, 3); layout4->addWidget(new QLabel(i18n("Payee as:"), page4), 1, 0); QButtonGroup *payeeGroup = new QButtonGroup(this); payeeAsDescriptionButton = new QRadioButton(i18n("Description"), page4); payeeGroup->addButton(payeeAsDescriptionButton); layout4->addWidget(payeeAsDescriptionButton, 1, 1); payeeAsPayeeButton = new QRadioButton(i18n("Payee"), page4); payeeGroup->addButton(payeeAsPayeeButton); layout4->addWidget(payeeAsPayeeButton, 1, 2); payeeAsPayeeButton->setChecked(b_extra); payeeAsDescriptionButton->setChecked(!b_extra); layout4->addWidget(new QLabel(i18n("Memo as:"), page4), 2, 0); QButtonGroup *memoGroup = new QButtonGroup(this); memoAsDescriptionButton = new QRadioButton(i18n("Description"), page4); memoGroup->addButton(memoAsDescriptionButton); layout4->addWidget(memoAsDescriptionButton, 2, 1); memoAsCommentButton = new QRadioButton(i18n("Comments"), page4); memoGroup->addButton(memoAsCommentButton); layout4->addWidget(memoAsCommentButton, 2, 2); memoAsCommentButton->setChecked(true); layout4->addWidget(new QLabel(i18n("Priority:"), page4), 3, 0); descriptionPriorityCombo = new KComboBox(page4); descriptionPriorityCombo->setEditable(false); descriptionPriorityCombo->addItem(i18n("Subcategory/Payee/Comments")); descriptionPriorityCombo->addItem(i18n("Payee/Subcategory/Comments")); descriptionPriorityCombo->addItem(i18n("Subcategory/Comments/Payee")); descriptionPriorityCombo->addItem(i18n("Payee/Comments/Subcategory")); descriptionPriorityCombo->addItem(i18n("Comments/Subcategory/Payee")); descriptionPriorityCombo->addItem(i18n("Comments/Payee/Subcategory")); layout4->addWidget(descriptionPriorityCombo, 3, 1, 1, 3); setOption(QWizard::HaveHelpButton, false); page1->setCommitPage(true); page1_2->setCommitPage(true); page2->setCommitPage(true); page3->setCommitPage(true); page4->setCommitPage(true); page4->setFinalPage(true); page1->setComplete(false); page1_2->setComplete(true); page2->setComplete(true); page3->setComplete(true); page4->setComplete(true); fileEdit->setFocus(); setButtonText(CommitButton, buttonText(NextButton)); disconnect(button(CommitButton), SIGNAL(clicked()), this, 0); connect(button(CommitButton), SIGNAL(clicked()), this, SLOT(nextClicked())); connect(fileEdit, SIGNAL(textChanged(const QString&)), this, SLOT(onFileChanged(const QString&))); connect(defsView, SIGNAL(itemSelectionChanged()), this, SLOT(defSelectionChanged())); connect(defsCombo, SIGNAL(activated(int)), this, SLOT(defSelected(int))); } ImportQIFDialog::~ImportQIFDialog() {} void ImportQIFDialog::showPage(int index) { next_id = index; QWizard::next(); next_id = -1; } int ImportQIFDialog::nextId() const { if(next_id < 0) return QWizard::nextId(); return next_id; } void ImportQIFDialog::defSelectionChanged() { QList list = defsView->selectedItems(); if(!list.isEmpty()) { QTreeWidgetItem *i = list.first(); defsCombo->setEnabled(true); int type = qi.unknown_defs[qi.unknown_defs_pre[i->text(0)]]; switch(type) { case -2: {defsCombo->setCurrentIndex(0); break;} case 1: {defsCombo->setCurrentIndex(1); break;} case 10: {defsCombo->setCurrentIndex(2); break;} case 11: {defsCombo->setCurrentIndex(3); break;} case 2: {defsCombo->setCurrentIndex(4); break;} case 12: {defsCombo->setCurrentIndex(5); break;} case 9: {defsCombo->setCurrentIndex(6); break;} case 13: {defsCombo->setCurrentIndex(7); break;} case 14: {defsCombo->setCurrentIndex(8); break;} case 3: {defsCombo->setCurrentIndex(9); break;} case -1: {defsCombo->setCurrentIndex(10); break;} } } else { defsCombo->setEnabled(false); } } void ImportQIFDialog::defSelected(int index) { QList list = defsView->selectedItems(); if(!list.isEmpty()) { QTreeWidgetItem *i = list.first(); int type = -2; switch(index) { case 0: {type = -2; break;} case 1: {type = 1; break;} case 2: {type = 10; break;} case 3: {type = 11; break;} case 4: {type = 2; break;} case 5: {type = 12; break;} case 6: {type = 9; break;} case 7: {type = 13; break;} case 8: {type = 14; break;} case 9: {type = 3; break;} case 10: {type = -1; break;} } qi.unknown_defs[qi.unknown_defs_pre[i->text(0)]] = type; i->setText(1, defsCombo->itemText(index)); } } void ImportQIFDialog::onFileChanged(const QString &str) { ((QIFWizardPage*) page(0))->setComplete(!str.isEmpty()); } void ImportQIFDialog::nextClicked() { if(currentId() == 0 || currentId() == 1) { bool b_page1 = (currentId() == 1); KUrl url = fileEdit->url(); if(!b_page1) { if(url.isEmpty()) { KMessageBox::error(this, i18n("A file must be selected.")); fileEdit->setFocus(); return; } if(!url.isValid()) { QFileInfo info(fileEdit->lineEdit()->text()); if(info.isDir()) { KMessageBox::error(this, i18n("Selected file is a directory.")); fileEdit->setFocus(); return; } else if(!info.exists()) { KMessageBox::error(this, i18n("Selected file does not exist.")); fileEdit->setFocus(); return; } fileEdit->setUrl(info.absoluteFilePath()); url = fileEdit->url(); } } QString tmpfile; if(!url.isLocalFile()) { if(!KIO::NetAccess::download(url, tmpfile, this)) { KMessageBox::error(this, i18n("Couldn't fetch %1.").arg(url.prettyUrl())); return; } } else { tmpfile = url.path(); } QFile file(tmpfile); if(!file.open(QIODevice::ReadOnly) ) { KMessageBox::error(this, i18n("Couldn't open %1 for reading.").arg(url.prettyUrl())); return; } else if(!file.size()) { KMessageBox::error(this, i18n("Error reading %1.").arg(url.prettyUrl())); file.close(); return; } QTextStream fstream(&file); importQIF(fstream, true, qi, budget); int ps = qi.p1 + qi.p2 + qi.p3 + qi.p4; file.close(); if(b_page1 && (int) qi.unknown_defs.count() > defsView->topLevelItemCount()) { QMap::iterator it_e = qi.unknown_defs_pre.end(); QMap unknown_defs_old; QTreeWidgetItemIterator it(defsView); QTreeWidgetItem *qli = *it; while(qli) { unknown_defs_old[qli->text(0)] = true; ++it; qli = *it; } qli = NULL; for(QMap::iterator it = qi.unknown_defs_pre.begin(); it != it_e; ++it) { if(!unknown_defs_old.contains(it.key())) { QTreeWidgetItem *tmp_i = new QTreeWidgetItem(defsView); tmp_i->setText(0, it.key()); tmp_i->setText(1, i18n("Unknown")); if(!qli) qli = tmp_i; } } qli->setSelected(true); defsCombo->setCurrentIndex(0); return; } else if(!b_page1 && qi.unknown_defs.count() > 0) { defsCombo->addItem(i18n("Unknown")); defsCombo->addItem(i18n("Account")); defsCombo->addItem(i18n("Bank")); defsCombo->addItem(i18n("Cash")); defsCombo->addItem(i18n("Cat (Category)")); defsCombo->addItem(i18n("CCard (Credit Card)")); defsCombo->addItem(i18n("Invst (Investment)")); defsCombo->addItem(i18n("Oth A (Other Assets)")); defsCombo->addItem(i18n("Oth L (Other Liabilities)")); defsCombo->addItem(i18n("Security")); defsCombo->addItem(i18n("Other")); defsCombo->setCurrentIndex(0); QMap::iterator it_e = qi.unknown_defs_pre.end(); for(QMap::iterator it = qi.unknown_defs_pre.begin(); it != it_e; ++it) { QTreeWidgetItem *tmp_i = new QTreeWidgetItem(defsView); tmp_i->setText(0, it.key()); tmp_i->setText(1, i18n("Unknown")); } if(defsView->topLevelItem(0)) { defsView->topLevelItem(0)->setSelected(true); } } else { if(ps == 0) { KMessageBox::error(this, i18n("Unrecognized date format.")); return; } if(ps > 1) { dateFormatCombo->clear(); if(qi.p1) { QString date_format = "MM"; if(qi.separator > 0) date_format += qi.separator; date_format += "DD"; if(qi.separator > 0) date_format += qi.separator; date_format += "YY"; if(qi.ly) date_format += "YY"; dateFormatCombo->addItem(date_format); } if(qi.p2) { QString date_format = "DD"; if(qi.separator > 0) date_format += qi.separator; date_format += "MM"; if(qi.separator > 0) date_format += qi.separator; date_format += "YY"; if(qi.ly) date_format += "YY"; dateFormatCombo->addItem(date_format); } if(qi.p3) { QString date_format = "YY"; if(qi.ly) date_format += "YY"; if(qi.separator > 0) date_format += qi.separator; date_format += "MM"; if(qi.separator > 0) date_format += qi.separator; date_format += "DD"; dateFormatCombo->addItem(date_format); } if(qi.p4) { QString date_format = "YY"; if(qi.ly) date_format += "YY"; if(qi.separator > 0) date_format += qi.separator; date_format += "DD"; if(qi.separator > 0) date_format += qi.separator; date_format += "MM"; dateFormatCombo->addItem(date_format); } showPage(2); return; } else { if(!qi.had_transaction || qi.account_defined) showPage(4); else showPage(3); return; } } } else if(currentId() == 2) { bool p1 = false, p2 = false, p3 = false, p4 = false; int p[4]; int i = 0; if(qi.p1) {p[i] = 1; i++;} if(qi.p2) {p[i] = 2; i++;} if(qi.p3) {p[i] = 3; i++;} if(qi.p4) {p[i] = 4; i++;} switch(p[dateFormatCombo->currentIndex()]) { case 1: {p1 = true; break;} case 2: {p2 = true; break;} case 3: {p3 = true; break;} case 4: {p4 = true; break;} } qi.p1 = p1; qi.p2 = p2; qi.p3 = p3; qi.p4 = p4; if(!qi.had_transaction || qi.account_defined) { showPage(4); return; } } else if(currentId() == 3) { if(accountCombo->count() > 0) { int i = accountCombo->currentIndex(); AssetsAccount *account = budget->assetsAccounts.first(); while(account) { if(account != budget->balancingAccount && account->accountType() != ASSETS_TYPE_SECURITIES) { if(i == 0) { qi.current_account = account; } i--; } account = budget->assetsAccounts.next(); } } } QWizard::next(); } void ImportQIFDialog::accept() { qi.subcategory_as_description = subcategoryAsDescriptionButton->isChecked(); qi.subcategory_as_category = subcategoryAsCategoryButton->isChecked(); qi.payee_as_description = payeeAsDescriptionButton->isChecked(); qi.memo_as_description = memoAsDescriptionButton->isChecked(); qi.description_priority = descriptionPriorityCombo->currentIndex(); KUrl url = fileEdit->url(); if(url.isEmpty()) { return; } QString tmpfile; if(!url.isLocalFile()) { if(!KIO::NetAccess::download(url, tmpfile, this)) { KMessageBox::error(this, i18n("Couldn't fetch %1.").arg(url.prettyUrl())); return; } } else { tmpfile = url.path(); } QFile file(tmpfile); if(!file.open(QIODevice::ReadOnly) ) { KMessageBox::error(this, i18n("Couldn't open %1 for reading.").arg(url.prettyUrl())); return; } else if(!file.size()) { KMessageBox::error(this, i18n("Error reading %1.").arg(url.prettyUrl())); file.close(); return; } QTextStream fstream(&file); importQIF(fstream, false, qi, budget); QString info = ""; info += i18np("Successfully imported 1 transaction.", "Successfully imported %n transactions.", qi.transactions); if(qi.accounts > 0) { info += "\n"; info += i18np("Successfully imported 1 account.", "Successfully imported %n accounts.", qi.accounts); } if(qi.categories > 0) { info += "\n"; info += i18np("Successfully imported 1 category.", "Successfully imported %n categories.", qi.categories); } if(qi.duplicates > 0) { info += "\n"; info += i18np("1 duplicate transaction was ignored.", "%n duplicate transactions was ignored.", qi.duplicates); } if(qi.failed_transactions > 0) { info += "\n"; info += i18np("Failed to import 1 transaction.", "Failed to import %n transactions.", qi.failed_transactions); } if(qi.securities > 0) { info += "\n"; info += i18np("1 security was not imported.", "%n securities were not imported.", qi.securities); } if(qi.security_transactions > 0) { info += "\n"; info += i18np("1 security transaction was not imported.", "%n security transactions were not imported.", qi.security_transactions); } KMessageBox::information(this, info); if(qi.transactions || qi.accounts || qi.categories) return QWizard::accept(); return QWizard::reject(); } ExportQIFDialog::ExportQIFDialog(Budget *budg, QWidget *parent, bool extra_parameters) : KDialog(parent, 0), budget(budg), b_extra(extra_parameters) { setCaption(i18n("Export QIF File")); setButtons(KDialog::Ok | KDialog::Cancel); setDefaultButton(KDialog::Cancel); setModal(true); setMainWidget(new QWidget(this)); QGridLayout *grid = new QGridLayout(mainWidget()); grid->addWidget(new QLabel(i18n("Account:"), mainWidget()), 0, 0); accountCombo = new KComboBox(mainWidget()); accountCombo->setEditable(false); accountCombo->addItem(i18nc("All accounts", "All")); AssetsAccount *account = budget->assetsAccounts.first(); while(account) { if(account != budget->balancingAccount) { accountCombo->addItem(account->name()); } account = budget->assetsAccounts.next(); } grid->addWidget(accountCombo, 0, 1); accountCombo->setFocus(); grid->addWidget(new QLabel(i18n("Export transaction description as:"), mainWidget()), 1, 0, 1, 2); QHBoxLayout *descLayout = new QHBoxLayout(); QButtonGroup *group = new QButtonGroup(this); descriptionAsPayeeButton = new QRadioButton(i18n("Payee"), mainWidget()); group->addButton(descriptionAsPayeeButton); descLayout->addWidget(descriptionAsPayeeButton); if(!b_extra) descriptionAsPayeeButton->setChecked(true); descriptionAsMemoButton = new QRadioButton(i18n("Memo"), mainWidget()); group->addButton(descriptionAsMemoButton); descLayout->addWidget(descriptionAsMemoButton); if(b_extra) descriptionAsMemoButton->setChecked(true); descriptionAsSubcategoryButton = new QRadioButton(i18n("Subcategory"), mainWidget()); group->addButton(descriptionAsSubcategoryButton); descLayout->addWidget(descriptionAsSubcategoryButton); grid->addLayout(descLayout, 2, 0, 1, 2); grid->addWidget(new QLabel(i18n("Date format:"), mainWidget()), 3, 0); dateFormatCombo = new KComboBox(mainWidget()); dateFormatCombo->setEditable(false); dateFormatCombo->addItem("Standard (YYYY-MM-DD)"); dateFormatCombo->addItem("Local"); dateFormatCombo->addItem("US (MM/DD/YY)"); grid->addWidget(dateFormatCombo, 3, 1); grid->addWidget(new QLabel(i18n("Value format:"), mainWidget()), 4, 0); valueFormatCombo = new KComboBox(mainWidget()); valueFormatCombo->setEditable(false); valueFormatCombo->addItem("1,000,000.00"); valueFormatCombo->addItem("1.000.000,00"); grid->addWidget(valueFormatCombo, 4, 1); grid->addWidget(new QLabel(i18n("File:"), mainWidget()), 5, 0); fileEdit = new KUrlRequester(mainWidget()); fileEdit->setMode(KFile::File); fileEdit->setFilter("*.qif"); grid->addWidget(fileEdit, 5, 1); enableButtonOk(false); connect(fileEdit, SIGNAL(textChanged(const QString&)), this, SLOT(onFileChanged(const QString&))); } ExportQIFDialog::~ExportQIFDialog() {} void ExportQIFDialog::onFileChanged(const QString &str) { enableButtonOk(!str.isEmpty()); } void ExportQIFDialog::slotButtonClicked(int button) { if(button == KDialog::Ok) { qi.subcategory_as_description = descriptionAsSubcategoryButton->isChecked(); qi.payee_as_description = descriptionAsPayeeButton->isChecked(); qi.memo_as_description = descriptionAsMemoButton->isChecked(); KUrl url = fileEdit->url(); if(url.isEmpty()) { return; } int cur_index = accountCombo->currentIndex(); AssetsAccount *account = NULL; if(cur_index > 0) { cur_index--; int index = 0; account = budget->assetsAccounts.first(); while(account) { if(account != budget->balancingAccount) { if(index == cur_index) { break; } index++; } account = budget->assetsAccounts.next(); } } qi.current_account = account; qi.value_format = valueFormatCombo->currentIndex() + 1; qi.date_format = dateFormatCombo->currentIndex() + 1; if(!url.isValid()) { QFileInfo info(fileEdit->lineEdit()->text()); if(info.isDir()) { KMessageBox::error(this, i18n("Selected file is a directory.")); fileEdit->setFocus(); return; } fileEdit->setUrl(info.absoluteFilePath()); url = fileEdit->url(); } if(url.isLocalFile()) { if(QFile::exists(url.path())) { if(KMessageBox::warningYesNo(this, i18n("The selected file already exists. Would you like to overwrite the old copy?")) != KMessageBox::Yes) return; } QFileInfo info(url.path()); if(info.isDir()) { KMessageBox::error(this, i18n("You selected a directory!")); return; } KSaveFile ofile(url.path()); ofile.open(); ofile.setPermissions((QFile::Permissions) 0x0660); if(!ofile.isOpen()) { ofile.abort(); KMessageBox::error(this, i18n("Couldn't open file for writing.")); return; } QTextStream stream(&ofile); exportQIF(stream, qi, budget, true); if(!ofile.finalize()) { KMessageBox::error(this, i18n("Error while writing file; file was not saved.")); return; } return KDialog::slotButtonClicked(button); } KTemporaryFile tf; tf.open(); tf.setAutoRemove(true); QTextStream stream(&tf); exportQIF(stream, qi, budget, true); if(!KIO::NetAccess::upload(tf.fileName(), url, this)) { KMessageBox::error(this, i18n("Failed to upload file to %1.").arg(url.prettyUrl())); return; } } KDialog::slotButtonClicked(button); } QDate readQIFDate(const QString &str, const QString &date_format, const QString &alt_date_format) { struct tm tp; QDate date; if(strptime(str.toAscii(), date_format.toAscii(), &tp)) { date.setYMD(tp.tm_year > 17100 ? tp.tm_year - 15200 : tp.tm_year + 1900, tp.tm_mon + 1, tp.tm_mday); } else if(!alt_date_format.isEmpty() && strptime(str.toAscii(), alt_date_format.toAscii(), &tp)) { date.setYMD(tp.tm_year > 17100 ? tp.tm_year - 15200 : tp.tm_year + 1900, tp.tm_mon + 1, tp.tm_mday); } return date; } double readQIFValue(const QString &str, int value_format) { if(value_format == 2) { QString str2 = str; str2.replace(".", ""); str2.replace(",", "."); return str2.toDouble(); } else if(value_format == 1) { QString str2 = str; str2.replace(",", ""); return str2.toDouble(); } return str.toDouble(); } //p1 MDY //p2 DMY //p3 YMD //p4 YDM void testQIFDate(const QString &str, bool &p1, bool &p2, bool &p3, bool &p4, bool &ly, char &separator) { if(separator < 0) { for(int i = 0; i < (int) str.length(); i++) { if(str[i] < '0' || str[i] > '9') { separator = str[i].toLatin1(); break; } } if(separator < 0) separator = 0; p1 = (separator != 0); p2 = (separator != 0); p3 = true; p4 = (separator != 0); ly = false; } if(p1 + p2 + p3 + p4 <= 1) return; QStringList strlist = str.split(separator, QString::SkipEmptyParts); if(strlist.count() == 2 && (p1 || p2)) { int i = strlist[1].indexOf('\''); if(i >= 0) { strlist.append(strlist[1]); strlist[2].remove(0, i + 1); strlist[1].truncate(i); p3 = false; p4 = false; ly = false; } } if(strlist.count() < 3) return; if(p1 || p2) { int v1 = strlist[0].toInt(); if(v1 > 12) p1 = false; if(v1 > 31 || v1 < 1) { p2 = false; if(v1 >= 100) ly = true; else ly = false; } } int v2 = strlist[1].toInt(); if(v2 > 12) {p2 = false; p3 = false;} int v3 = strlist[2].toInt(); if(v3 > 12) p4 = false; if(v3 > 31 || v3 < 1) { p3 = false; if(v3 >= 100) ly = true; else ly = false; } } void testQIFValue(const QString &str, int &value_format) { if(value_format == 0) { int i = str.lastIndexOf('.'); int i2 = str.lastIndexOf(','); if(i2 >= 0 && i >= 0) { if(i2 > i) value_format = 2; else value_format = 1; return; } if(i >= 0) { value_format = 1; return; } if(i2 >= 0) { value_format = 2; return; } } } bool importQIFFile(Budget *budget, QWidget *parent, bool extra_parameters) { ImportQIFDialog *dialog = new ImportQIFDialog(budget, parent, extra_parameters); bool ret = (dialog->exec() == QDialog::Accepted); dialog->deleteLater(); return ret; } struct qif_split { QString memo, category, subcategory; double value, percentage; }; void importQIF(QTextStream &fstream, bool test, qif_info &qi, Budget *budget) { QDate date; QString memo, description, payee, category, subcategory, atype, atype_bak, name, ticker_symbol, security; bool incomecat = false; double value = 0.0, commission = 0.0, sec_amount = 0.0, shares = 0.0, price = 0.0; QString line = fstream.readLine().trimmed(), line_bak; QString date_format = "", alt_date_format = ""; QList transfers; QVector splits; qif_split *current_split = NULL; int type = -1; if(test) { qi.current_account = NULL; qi.unhandled = false; qi.unknown = false; qi.had_type = false; qi.had_type_def = false; qi.had_account_def = false; qi.account_defined = false; qi.had_transaction = false; qi.value_format = 0; qi.shares_format = 0; qi.price_format = 0; qi.percentage_format = 0; qi.separator = -1; qi.opening_balance_str = "opening balance"; qi.payee_as_description = false; qi.subcategory_as_description = true; qi.subcategory_as_category = false; qi.memo_as_description = false; qi.description_priority = 0; } else { qi.duplicates = 0; qi.transactions = 0; qi.securities = 0; qi.security_transactions = 0; qi.failed_transactions = 0; qi.accounts = 0; qi.categories = 0; qi.opening_balance_str = qi.opening_balance_str.toLower(); if(qi.p1) { date_format += "%m"; if(qi.separator > 0) date_format += qi.separator; date_format += "%d"; if(qi.separator > 0) date_format += qi.separator; if(qi.ly) { date_format += "%Y"; } else { if(qi.separator > 0) { alt_date_format = date_format; alt_date_format += '\''; alt_date_format += "%y"; } date_format += "%y"; } } else if(qi.p2) { date_format += "%d"; if(qi.separator > 0) date_format += qi.separator; date_format += "%m"; if(qi.separator > 0) date_format += qi.separator; if(qi.ly) { date_format += "%Y"; } else { if(qi.separator > 0) { alt_date_format = date_format; alt_date_format += '\''; alt_date_format += "%y"; } date_format += "%y"; } } else if(qi.p3) { if(qi.ly) date_format += "%Y"; else date_format += "%y"; if(qi.separator > 0) date_format += qi.separator; date_format += "%m"; if(qi.separator > 0) date_format += qi.separator; date_format += "%d"; } else if(qi.p4) { if(qi.ly) date_format += "%Y"; else date_format += "%y"; if(qi.separator > 0) date_format += qi.separator; date_format += "%d"; if(qi.separator > 0) date_format += qi.separator; date_format += "%m"; } } while(!line.isNull()) { if(!line.isEmpty()) { char field = line[0].toLatin1(); line.remove(0, 1); line = line.trimmed(); switch(field) { case '!': { line_bak = line.trimmed(); line = line_bak.toLower(); if(qi.unknown_defs.contains(line)) { type = qi.unknown_defs[line]; if(type > 1) type = -1; if(type == 1) { qi.had_account_def = true; } else if(type == -1) { qi.had_type_def = true; qi.unhandled = true; } else if(type == -2) { qi.unknown = true; } } else if(line == "account") { qi.had_account_def = true; type = 1; } else if(line.startsWith("option")) { } else if(line.startsWith("clear")) { } else { bool is_type = false; if(line.startsWith("type:") || line.startsWith("type ")) { qi.had_type = true; line.remove(0, 5); line = line.trimmed(); is_type = true; } else { int i = line.indexOf(":"); if(i < 0) i = line.indexOf(" "); if(i >= 0) { line.remove(0, i + 1); is_type = true; } } if(is_type) { if(qi.unknown_defs.contains(line)) { type = qi.unknown_defs[line]; if(type == 1) { type = -1; } if(type == -1) { qi.had_type_def = true; qi.unhandled = true; } else if(type >= 9) { qi.had_type_def = true; } else if(type == -2) { qi.unknown = true; } } else if(line == "cat") { type = 2; } else if(line == "security") { type = 3; } else if(line == "invst") { qi.had_type_def = true; type = 9; } else if(line.startsWith("ban")) { qi.had_type_def = true; type = 10; } else if(line == "cash" || line == "kas") { qi.had_type_def = true; type = 11; } else if(line == "ccard") { qi.had_type_def = true; type = 12; } else if(line == "oth a" || line == "ov b") { qi.had_type_def = true; type = 13; } else if(line == "oth l" || line == "ov s") { qi.had_type_def = true; type = 14; } else if(line == "prices" || line == "budget" || line == "tax" || line == "invoice" || line == "bill" || line == "memorized" || line == "class") { qi.had_type_def = true; qi.unhandled = true; type = -1; } else { if(test) { int i = line_bak.indexOf(":"); if(i < 0) i = line_bak.indexOf(" "); if(i >= 0) { line_bak.remove(0, i + 1); } qi.unknown_defs_pre[line_bak] = line; qi.unknown_defs[line] = -2; } qi.unknown = true; type = -2; } } else { if(test) { qi.unknown_defs_pre[line_bak] = line; qi.unknown_defs[line] = -2; } qi.unknown = true; type = -3; } } break; } case '/': { //Balance date (Account) if(type == 1) { /*if(test) testQIFDate(line, qi.p1, qi.p2, qi.p3, qi.p4, qi.ly, qi.separator); else date = readQIFDate(line, date_format, alt_date_format);*/ } break; } case '%': { //Percentage of split if percentages are used (Transaction) if(type >= 10) { if(test) testQIFValue(line, qi.percentage_format); else if(current_split) current_split->percentage = readQIFValue(line, qi.percentage_format); } break; } case -35: {} case -36: {} case '$': { //Balance (Account), amount transfered (Security transaction), amount of split (Memorized, Transaction) if(type == 9) { if(test) testQIFValue(line, qi.value_format); else sec_amount = readQIFValue(line, qi.value_format); } else if(type >= 10) { if(test) testQIFValue(line, qi.value_format); else if(current_split) current_split->value = readQIFValue(line, qi.value_format); } break; } case 1: {} case 2: {} case 3: {} case 4: {} case 5: {} case 6: {} case 7: { //Amortization (Memorized) break; } case 'A': { //Address (Memorized, Transaction) break; } case 'B': { //Budget amount (Category, Budget), balance (account) break; } case 'C': { //Cleared status (Security transaction, Memorized, Transaction) break; } case 'D': { //Description (Account, Category, Class, Budget) if(type == 1 || type == 2 || type == 3) description = line; //Date (Security transaction, Transaction) else if(type >= 9) { if(test) testQIFDate(line, qi.p1, qi.p2, qi.p3, qi.p4, qi.ly, qi.separator); else date = readQIFDate(line, date_format, alt_date_format); } break; } case 'E': { //Expense category (Category) or memo in split (Memorized, Transaction) if(type == 2) incomecat = false; else if(type >= 10 && !test && current_split) current_split->memo = line; break; } case 'F': { //Reimbursable business expense flag (Transaction) break; } case 'I': { //Income category (Category) or price (Security transaction) if(type == 2) incomecat = true; else if(type == 9) { if(test) testQIFValue(line, qi.price_format); else price = readQIFValue(line, qi.price_format); } break; } case 'K': { //Memorized break; } case 'L': { //Category (Memorized, Security transaction, Transaction) or credit limit (Account) if(type >= 9) { int i = line.indexOf('/'); if(i >= 0) line.truncate(i); category = line; i = line.indexOf(':'); if(i >= 0) { bool is_transfer = line.length() >= 2 && line[0] == '[' && line.endsWith("]"); if(is_transfer) line.truncate(line.length() - 1); if(qi.subcategory_as_category) { i = line.lastIndexOf(':'); category.remove(0, i + 1); category = category.trimmed(); if(is_transfer) category += "]"; } else { category.truncate(i); category = category.trimmed(); if(is_transfer) category += "]"; subcategory = line; subcategory.remove(0, i + 1); subcategory = subcategory.trimmed(); } } } break; } case 'M': { //Memo (Memorized, Security transaction, Transaction) if(type >= 9) memo = line; break; } case 'N': { //Name (Class, Account, Category, Budget, Security) or action (Security transaction) or num (Transaction) if(type == 1 || type == 2 || type == 3) name = line; else if(type == 9) { } break; } case 'O': { //Commission (Security transaction) if(type == 9) { if(test) testQIFValue(line, qi.value_format); else commission = readQIFValue(line, qi.value_format); } break; } case 'P': { //Payee (Memorized, Security transaction, Transaction) if(type >= 9) payee = line; break; } case 'Q': { //Quantity (Security transaction) if(type == 9) { if(test) testQIFValue(line, qi.shares_format); else value = readQIFValue(line, qi.shares_format); } break; } case 'R': { //Tax schedule information (Category) break; } case 'S': { //Category/class in split (Memorized, Transaction), stock ticker symbol (Security) if(type == 3) { ticker_symbol = line; } else if(type >= 10 && !test) { splits.push_back(qif_split()); current_split = &splits.last(); current_split->value = 0.0; current_split->percentage = 0.0; int i = line.indexOf('/'); if(i >= 0) line.truncate(i); current_split->category = line; i = line.indexOf(':'); if(i >= 0) { bool is_transfer = line.length() >= 2 && line[0] == '[' && line.endsWith("]"); if(is_transfer) line.truncate(line.length() - 1); if(qi.subcategory_as_category) { i = line.lastIndexOf(':'); current_split->category.remove(0, i + 1); current_split->category = current_split->category.trimmed(); if(is_transfer) current_split->category += "]"; } else { current_split->category.truncate(i); current_split->category = current_split->category.trimmed(); if(is_transfer) current_split->category += "]"; current_split->subcategory = line; current_split->subcategory.remove(0, i + 1); current_split->subcategory = current_split->subcategory.trimmed(); } } } break; } case 'T': { //Type (Account, Security), tax related (Category) if(type == 1 || type == 3) { atype_bak = line; atype = line.toLower(); } //Value (Memorized, Security transaction, Transaction) else if(type >= 9) { if(test) testQIFValue(line, qi.value_format); else value = readQIFValue(line, qi.value_format); } break; } case 'U': { //Value (Memorized, Security transaction, Transaction) if(type >= 9) { if(test) testQIFValue(line, qi.value_format); else value = readQIFValue(line, qi.value_format); } break; } case 'X': { //? (Account), small business extensions (Transaction) break; } case 'Y': { //Security (Security transaction) if(type == 9) { security = line; } break; } case '^': { //End of entry if(type >= 10) { //Transaction bool is_transfer = category.length() >= 2 && category[0] == '[' && category.endsWith("]"); QString payee_lower = payee.toLower(); bool is_opening_balance = splits.empty() && is_transfer && (payee_lower == qi.opening_balance_str || payee_lower == "opening balance" || payee_lower == "opening"); if(test && !qi.account_defined && is_opening_balance && !qi.had_transaction) qi.account_defined = true; if(!test && !is_opening_balance) { switch(qi.description_priority) { case 0: { if(qi.subcategory_as_description && !subcategory.isEmpty()) {description = subcategory; subcategory = "";} else if(qi.payee_as_description && !payee.isEmpty()) {description = payee; payee = "";} else if(qi.memo_as_description && !memo.isEmpty()) {description = memo; memo = "";} break; } case 1: { if(qi.payee_as_description && !payee.isEmpty()) {description = payee; payee = "";} else if(qi.subcategory_as_description && !subcategory.isEmpty()) {description = subcategory; subcategory = "";} else if(qi.memo_as_description && !memo.isEmpty()) {description = memo; memo = "";} break; } case 2: { if(qi.subcategory_as_description && !subcategory.isEmpty()) {description = subcategory; subcategory = "";} else if(qi.memo_as_description && !memo.isEmpty()) {description = memo; memo = "";} else if(qi.payee_as_description && !payee.isEmpty()) {description = payee; payee = "";} break; } case 3: { if(qi.payee_as_description && !payee.isEmpty()) {description = payee; payee = "";} else if(qi.memo_as_description && !memo.isEmpty()) {description = memo; memo = "";} else if(qi.subcategory_as_description && !subcategory.isEmpty()) {description = subcategory; subcategory = "";} break; } case 4: { if(qi.memo_as_description && !memo.isEmpty()) {description = memo; memo = "";} else if(qi.subcategory_as_description && !subcategory.isEmpty()) {description = subcategory; subcategory = "";} else if(qi.payee_as_description && !payee.isEmpty()) {description = payee; payee = "";} break; } case 5: { if(qi.memo_as_description && !memo.isEmpty()) {description = memo; memo = "";} else if(qi.payee_as_description && !payee.isEmpty()) {description = payee; payee = "";} else if(qi.subcategory_as_description && !subcategory.isEmpty()) {description = subcategory; subcategory = "";} break; } } } if(!test && !splits.empty()) { if(!date.isValid() || !qi.current_account) { qi.failed_transactions++; } else { SplitTransaction *split = new SplitTransaction(budget, date, qi.current_account, description); QVector::size_type c = splits.count(); for(QVector::size_type i = 0; i < c; i++) { current_split = &splits[i]; bool is_transfer = current_split->category.length() >= 2 && current_split->category[0] == '[' && current_split->category.endsWith("]"); description = ""; if(current_split->percentage != 0.0 && current_split->value == 0.0) { if(i == c - 1) current_split->value = value; else current_split->value = (value * current_split->percentage) / 100; } value -= current_split->value; switch(qi.description_priority) { case 0: { if(qi.subcategory_as_description && !current_split->subcategory.isEmpty()) {description = current_split->subcategory; current_split->subcategory = "";} else if(qi.payee_as_description && !payee.isEmpty()) {description = payee; payee = "";} else if(qi.memo_as_description && !current_split->memo.isEmpty()) {description = current_split->memo; current_split->memo = "";} break; } case 1: { if(qi.payee_as_description && !payee.isEmpty()) {description = payee; payee = "";} else if(qi.subcategory_as_description && !current_split->subcategory.isEmpty()) {description = current_split->subcategory; current_split->subcategory = "";} else if(qi.memo_as_description && !current_split->memo.isEmpty()) {description = current_split->memo; current_split->memo = "";} break; } case 2: { if(qi.subcategory_as_description && !current_split->subcategory.isEmpty()) {description = current_split->subcategory; current_split->subcategory = "";} else if(qi.memo_as_description && !current_split->memo.isEmpty()) {description = current_split->memo; current_split->memo = "";} else if(qi.payee_as_description && !payee.isEmpty()) {description = payee; payee = "";} break; } case 3: { if(qi.payee_as_description && !payee.isEmpty()) {description = payee; payee = "";} else if(qi.memo_as_description && !current_split->memo.isEmpty()) {description = current_split->memo; current_split->memo = "";} else if(qi.subcategory_as_description && !current_split->subcategory.isEmpty()) {description = current_split->subcategory; current_split->subcategory = "";} break; } case 4: { if(qi.memo_as_description && !current_split->memo.isEmpty()) {description = current_split->memo; current_split->memo = "";} else if(qi.subcategory_as_description && !current_split->subcategory.isEmpty()) {description = current_split->subcategory; current_split->subcategory = "";} else if(qi.payee_as_description && !payee.isEmpty()) {description = payee; payee = "";} break; } case 5: { if(qi.memo_as_description && !current_split->memo.isEmpty()) {description = current_split->memo; current_split->memo = "";} else if(qi.payee_as_description && !payee.isEmpty()) {description = payee; payee = "";} else if(qi.subcategory_as_description && !current_split->subcategory.isEmpty()) {description = current_split->subcategory; current_split->subcategory = "";} break; } } if(!test && is_transfer) { //Transfer current_split->category.remove(0, 1); current_split->category.truncate(current_split->category.length() - 1); if(current_split->category.isEmpty()) { current_split->category = i18n("Unnamed"); } AssetsAccount *acc = budget->findAssetsAccount(current_split->category); if(!acc) { acc = new AssetsAccount(budget, ASSETS_TYPE_CURRENT, current_split->category); budget->addAccount(acc); qi.accounts++; } Transfer *tra = NULL; if(current_split->value < 0.0) tra = new Transfer(budget, -current_split->value, date, qi.current_account, acc, description, current_split->memo); else tra = new Transfer(budget, current_split->value, date, acc, qi.current_account, description, current_split->memo); bool duplicate = false; Transfer *trans = budget->transfers.first(); while(trans) { if(trans->equals(tra)) { Transfer *trans2 = NULL; duplicate = true; for(int index = 0; index < transfers.size(); index++) { trans2 = transfers[index]; if(!trans2) break; if(trans2 == trans) { duplicate = false; break; } } break; } trans = budget->transfers.next(); } if(duplicate) { qi.duplicates++; delete tra; } else { split->splits.push_back(tra); transfers.append(tra); } } else { bool empty = current_split->category.isEmpty(); bool b_exp = current_split->value < 0.0; if(empty) { current_split->category = i18n("Uncategorized"); } Account *cat = NULL; if(b_exp) { cat = budget->findExpensesAccount(current_split->category); if(!empty && !cat) { cat = budget->findIncomesAccount(current_split->category); if(cat) b_exp = false; } if(!cat) { cat = new ExpensesAccount(budget, current_split->category); budget->addAccount(cat); qi.categories++; } } else { cat = budget->findIncomesAccount(current_split->category); if(!empty && !cat) { cat = budget->findExpensesAccount(current_split->category); if(cat) b_exp = true; } if(!cat) { cat = new IncomesAccount(budget, current_split->category); budget->addAccount(cat); qi.categories++; } } if(b_exp) { //Expense Expense *exp = new Expense(budget, -current_split->value, date, (ExpensesAccount*) cat, qi.current_account, description, current_split->memo); if(value > 0.0) exp->setQuantity(-1.0); exp->setPayee(payee); split->splits.push_back(exp); exp->setParentSplit(split); } else { //Income Income *inc = new Income(budget, current_split->value, date, (IncomesAccount*) cat, qi.current_account, description, current_split->memo); if(value < 0.0) inc->setQuantity(-1.0); inc->setPayer(payee); split->splits.push_back(inc); inc->setParentSplit(split); } } } budget->addSplitTransaction(split); qi.transactions++; } } else if(!test && is_transfer) { //Transfer category.remove(0, 1); category.truncate(category.length() - 1); if(category.isEmpty()) { category = i18n("Unnamed"); } AssetsAccount *acc = budget->findAssetsAccount(category); if(is_opening_balance || acc == qi.current_account) { if(!acc) { AssetsType account_type = ASSETS_TYPE_CURRENT; if(type == 11) account_type = ASSETS_TYPE_CASH; else if(type == 12) account_type = ASSETS_TYPE_CREDIT_CARD; else if(type == 13) account_type = ASSETS_TYPE_SAVINGS; else if(type == 14) account_type = ASSETS_TYPE_LIABILITIES; acc = new AssetsAccount(budget, account_type, category); budget->addAccount(acc); qi.accounts++; } if(!budget->accountHasTransactions(acc) && acc->accountType() != ASSETS_TYPE_SECURITIES && acc->initialBalance() == 0.0) { acc->setInitialBalance(value); } qi.current_account = acc; transfers.clear(); } else { if(!acc) { acc = new AssetsAccount(budget, ASSETS_TYPE_CURRENT, category); budget->addAccount(acc); qi.accounts++; } Transfer *tra = NULL; if(!date.isValid() || !qi.current_account) { qi.failed_transactions++; } else { if(value < 0.0) tra = new Transfer(budget, -value, date, qi.current_account, acc, description, memo); else tra = new Transfer(budget, value, date, acc, qi.current_account, description, memo); bool duplicate = false; Transfer *trans = budget->transfers.first(); while(trans) { if(trans->equals(tra)) { Transfer *trans2 = NULL; duplicate = true; for(int index = 0; index < transfers.size(); index++) { trans2 = transfers[index]; if(!trans2) break; if(trans2 == trans) { duplicate = false; break; } } break; } trans = budget->transfers.next(); } if(duplicate) { qi.duplicates++; delete tra; } else { budget->addTransaction(tra); transfers.append(tra); qi.transactions++; } } } } else if(!test) { bool empty = category.isEmpty(); bool b_exp = value < 0.0; if(empty) { category = i18n("Uncategorized"); } Account *cat = NULL; if(b_exp) { cat = budget->findExpensesAccount(category); if(!empty && !cat) { cat = budget->findIncomesAccount(category); if(cat) b_exp = false; } if(!cat) { cat = new ExpensesAccount(budget, category); budget->addAccount(cat); qi.categories++; } } else { cat = budget->findIncomesAccount(category); if(!empty && !cat) { cat = budget->findExpensesAccount(category); if(cat) b_exp = true; } if(!cat) { cat = new IncomesAccount(budget, category); budget->addAccount(cat); qi.categories++; } } if(b_exp) { //Expense if(!date.isValid() || !qi.current_account) { qi.failed_transactions++; } else { Expense *exp = new Expense(budget, -value, date, (ExpensesAccount*) cat, qi.current_account, description, memo); if(value > 0.0) exp->setQuantity(-1.0); exp->setPayee(payee); budget->addTransaction(exp); qi.transactions++; } } else { //Income if(!date.isValid() || !qi.current_account) { qi.failed_transactions++; } else { Income *inc = new Income(budget, value, date, (IncomesAccount*) cat, qi.current_account, description, memo); if(value < 0.0) inc->setQuantity(-1.0); inc->setPayer(payee); budget->addTransaction(inc); qi.transactions++; } } } qi.had_transaction = true; } else if(type == 9 && !test) { //Security transaction qi.security_transactions++; } else if(type == 1 && (!test || !qi.account_defined)) { //account if(!qi.had_transaction) qi.account_defined = true; if(name.isEmpty()) name = i18n("Unnamed"); qi.current_account = budget->findAssetsAccount(name); if(!qi.current_account) { AssetsType account_type = ASSETS_TYPE_CURRENT; if(qi.unknown_defs.contains(atype)) { int ut_type = qi.unknown_defs[atype]; if(ut_type == 9) account_type = ASSETS_TYPE_SECURITIES; else if(ut_type == 11) account_type = ASSETS_TYPE_CASH; else if(ut_type == 12) account_type = ASSETS_TYPE_CREDIT_CARD; else if(ut_type == 13) account_type = ASSETS_TYPE_SAVINGS; else if(ut_type == 14) account_type = ASSETS_TYPE_LIABILITIES; } else if(atype == "cash") account_type = ASSETS_TYPE_CASH; else if(atype == "invst" || atype == "mutual") account_type = ASSETS_TYPE_SECURITIES; else if(atype == "ccard" || atype == "creditcard") account_type = ASSETS_TYPE_CREDIT_CARD; else if(atype == "oth l") account_type = ASSETS_TYPE_LIABILITIES; else if(atype == "oth a") account_type = ASSETS_TYPE_SAVINGS; else if(atype != "bank" && atype != "port") { if(test) { qi.unknown_defs_pre[atype_bak] = atype; qi.unknown_defs[atype] = -2; } qi.unknown = true; } if(!test) { qi.current_account = new AssetsAccount(budget, account_type, name, 0.0, description); budget->addAccount(qi.current_account); qi.accounts++; } } transfers.clear(); } else if(type == 2 && !test) { //category int i = name.lastIndexOf(':'); if(i >= 0 && qi.subcategory_as_category) { name.remove(0, i + 1); name = name.trimmed(); i = -1; } if(i < 0 && !name.isEmpty()) { if(incomecat) { if(!budget->findIncomesAccount(name)) { budget->addAccount(new IncomesAccount(budget, name, description)); qi.categories++; } } else { if(!budget->findExpensesAccount(name)) { budget->addAccount(new ExpensesAccount(budget, name, description)); qi.categories++; } } } } else if(type == 3 && !test) { //security /*if(name.isEmpty()) name = i18n("Unnamed"); Security *sec = budget->findSecurity(name); if(!sec) { SecurityType sectype = SECURITY_TYPE_STOCK; if(atype == "mutual fund" || atype == "fund" || atype == "mf") sectype = SECURITY_TYPE_MUTUAL_FUND; else if(atype == "bond" || atype == "dept") sectype = SECURITY_TYPE_BOND; else if(atype == "other" || atype != "oth") sectype = SECURITY_TYPE_OTHER; else if(atype != "stock" && atype != "st") qi.unknown = true; AssetsAccount *saccount = NULL; if(qi.current_account && qi.current_account->accountType() == ASSETS_TYPE_SECURITIES) { saccount = qi.current_account; } else { saccount = budget->assetsAccounts.first(); while(saccount) { if(saccount->accountType() == ASSETS_TYPE_SECURITIES) break; saccount = budget->assetsAccounts.next(); } if(!saccount) { saccount = new AssetsAccount(budget, ASSETS_TYPE_SECURITIES, i18n("Securities")); budget->addAccount(saccount); qi.accounts++; } } sec = new Security(budget, saccount, sectype, 0.0, 4, name, description); budget->addSecurity(sec); }*/ qi.securities++; } memo = QString(); description = QString(); payee = QString(); category = QString(); subcategory = QString(); atype = QString(); atype_bak = QString(); name = QString(); ticker_symbol = QString(); security = QString(); value = 0.0; commission = 0.0; sec_amount = 0.0; shares = 0.0; price = 0.0; date = QDate(); splits.clear(); current_split = NULL; incomecat = false; break; } } } line = fstream.readLine().trimmed(); } if(qi.value_format == 0) qi.value_format = 1; if(qi.shares_format == 0) qi.shares_format = 1; if(qi.price_format == 0) qi.price_format = 1; if(qi.percentage_format == 0) qi.percentage_format = 1; } QString writeQIFDate(const QDate &date, int date_format) { if(date_format == 1) return date.toString(Qt::ISODate); else if(date_format == 2) return date.toString(Qt::LocalDate); if(date.year() >= 2000) return date.toString("MM/dd'yy"); return date.toString("MM/dd/yy"); } QString writeQIFValue(double value, int value_format, int decimals) { if(value_format == 1) return QString::number(value, 'f', decimals); QString str = QString::number(value, 'f', decimals); str.replace(".", ","); return str; } void exportQIFTransaction(QTextStream &fstream, qif_info &qi, Transaction *trans) { bool sectrans = false; bool secacc = false; Account *cat = NULL; const QString *payee = NULL; bool neg = false; double d_com = 0.0; fstream << "D" << writeQIFDate(trans->date(), qi.date_format) << "\n"; switch(trans->type()) { case TRANSACTION_TYPE_EXPENSE: { cat = ((Expense*) trans)->category(); payee = &((Expense*) trans)->payee(); neg = true; break; } case TRANSACTION_TYPE_INCOME: { sectrans = true; if(((Income*) trans)->security() && ((Income*) trans)->security()->account() == qi.current_account) { fstream << "N" << "DivX" << "\n"; fstream << "Y" << ((Income*) trans)->security()->name() << "\n"; secacc = true; } cat = ((Income*) trans)->category(); payee = &((Income*) trans)->payer(); break; } case TRANSACTION_TYPE_TRANSFER: { if(((Transfer*) trans)->from() == qi.current_account) {cat = ((Transfer*) trans)->to(); neg = true;} else cat = ((Transfer*) trans)->from(); break; } case TRANSACTION_TYPE_SECURITY_SELL: {} case TRANSACTION_TYPE_SECURITY_BUY: { SecurityTransaction *sec = (SecurityTransaction*) trans; sectrans = true; if(sec->security()->account() != qi.current_account) { if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY) { neg = true; } break; } secacc = true; if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY) { fstream << "N" << "BuyX" << "\n"; d_com = sec->value() - sec->shares() * sec->shareValue(); } else { fstream << "N" << "SellX" << "\n"; d_com = sec->shares() * sec->shareValue() - sec->value(); } if(d_com != 0.0) { double deci_pow = pow(10, KGlobal::locale()->fracDigits()); d_com = round(d_com * deci_pow) / deci_pow; } fstream << "Y" << sec->security()->name() << "\n"; fstream << "I" << writeQIFValue(sec->shareValue(), qi.value_format, KGlobal::locale()->fracDigits()) << "\n"; fstream << "Q" << writeQIFValue(sec->shares(), qi.value_format, sec->security()->decimals()) << "\n"; cat = ((SecurityTransaction*) trans)->account(); break; } } fstream << "T" << writeQIFValue(neg ? -trans->value() : trans->value(), qi.value_format, KGlobal::locale()->fracDigits()) << "\n"; fstream << "C" << "X" << "\n"; if(!sectrans && qi.payee_as_description && !trans->description().isEmpty()) fstream << "P" << trans->description() << "\n"; else if(payee && !payee->isEmpty()) fstream << "P" << *payee << "\n"; if(!sectrans && qi.memo_as_description && !trans->description().isEmpty()) fstream << "M" << trans->description() << "\n"; else if(!trans->comment().isEmpty()) fstream << "M" << trans->comment() << "\n"; else if(sectrans && !secacc) fstream << "M" << trans->description() << "\n"; if(sectrans && secacc && d_com != 0.0) { fstream << "O" << writeQIFValue(d_com, qi.value_format, KGlobal::locale()->fracDigits()) << "\n"; } if(!cat) fstream << "L" << "[" << ((SecurityTransaction*) trans)->security()->account()->name() << ":" << ((SecurityTransaction*) trans)->security()->name() << "]" << "\n"; else if(cat->type() == ACCOUNT_TYPE_ASSETS) fstream << "L" << "[" << cat->name() << "]" << "\n"; else if(qi.subcategory_as_description && !trans->description().isEmpty()) fstream << "L" << cat->name() << ":" << trans->description() << "\n"; else fstream << "L" << cat->name() << "\n"; if(sectrans && secacc) fstream << "$" << writeQIFValue((trans->type() == TRANSACTION_TYPE_SECURITY_SELL) ? -trans->value() : trans->value(), qi.value_format, KGlobal::locale()->fracDigits()) << "\n"; fstream << "^" << "\n"; } void exportQIFSplitTransaction(QTextStream &fstream, qif_info &qi, SplitTransaction *split) { fstream << "D" << writeQIFDate(split->date(), qi.date_format) << "\n"; fstream << "T" << writeQIFValue(split->value(), qi.value_format, KGlobal::locale()->fracDigits()) << "\n"; fstream << "C" << "X" << "\n"; if(qi.payee_as_description) { if(!split->description().isEmpty()) fstream << "P" << split->description() << "\n"; } if(qi.memo_as_description) { if(!split->description().isEmpty()) fstream << "M" << split->description() << "\n"; } else if(!split->comment().isEmpty()) fstream << "M" << split->comment() << "\n"; QVector::size_type c = split->splits.count(); for(QVector::size_type i = 0; i < c; i++) { Transaction *trans = split->splits[i]; Account *cat = NULL; bool neg = false; switch(trans->type()) { case TRANSACTION_TYPE_EXPENSE: { cat = ((Expense*) trans)->category(); neg = true; break; } case TRANSACTION_TYPE_INCOME: { cat = ((Income*) trans)->category(); break; } case TRANSACTION_TYPE_TRANSFER: { if(((Transfer*) trans)->from() == qi.current_account) {cat = ((Transfer*) trans)->to(); neg = true;} else cat = ((Transfer*) trans)->from(); break; } default: {} } if(cat->type() == ACCOUNT_TYPE_ASSETS) fstream << "S" << "[" << cat->name() << "]" << "\n"; else if(qi.subcategory_as_description && !trans->description().isEmpty()) fstream << "S" << cat->name() << ":" << trans->description() << "\n"; else fstream << "S" << cat->name() << "\n"; if(!trans->description().isEmpty() && (qi.memo_as_description || (!qi.subcategory_as_description && trans->comment().isEmpty()))) fstream << "E" << trans->description() << "\n"; else if(!trans->comment().isEmpty()) fstream << "E" << trans->comment() << "\n"; fstream << "$" << writeQIFValue(neg ? -trans->value() : trans->value(), qi.value_format, KGlobal::locale()->fracDigits()) << "\n"; } fstream << "^" << "\n"; } void exportQIFOpeningBalance(QTextStream &fstream, qif_info &qi, AssetsAccount *account, const QDate &date) { fstream << "!Type:"; switch(account->accountType()) { case ASSETS_TYPE_CURRENT: {fstream << "Bank"; break;} case ASSETS_TYPE_SAVINGS: {fstream << "Bank"; break;} case ASSETS_TYPE_CREDIT_CARD: {fstream << "CCard"; break;} case ASSETS_TYPE_LIABILITIES: {fstream << "Oth L"; break;} case ASSETS_TYPE_SECURITIES: {fstream << "Invst"; break;} case ASSETS_TYPE_BALANCING: {fstream << "Oth A"; break;} case ASSETS_TYPE_CASH: {fstream << "Cash"; break;} } fstream << "\n"; if(account->accountType() == ASSETS_TYPE_SECURITIES) { Budget *budget = account->budget(); Security *sec = budget->securities.first(); while(sec) { if(sec->account() == account && sec->initialShares() > 0.0) { QMap::const_iterator it = sec->quotations.begin(); if(it == sec->quotations.end()) fstream << "D" << writeQIFDate(date, qi.date_format) << "\n"; else fstream << "D" << writeQIFDate(it.key(), qi.date_format) << "\n"; fstream << "N" << "ShrsIn" << "\n"; fstream << "Y" << sec->name() << "\n"; if(it != sec->quotations.end()) fstream << "I" << writeQIFValue(it.value(), qi.value_format, KGlobal::locale()->fracDigits()) << "\n"; fstream << "Q" << writeQIFValue(sec->initialShares(), qi.value_format, sec->decimals()) << "\n"; if(it != sec->quotations.end()) fstream << "T" << writeQIFValue(sec->initialBalance(), qi.value_format, KGlobal::locale()->fracDigits()) << "\n"; fstream << "C" << "X" << "\n"; fstream << "P" << "Opening Balance" << "\n"; fstream << "M" << "Opening" << "\n"; fstream << "^" << "\n"; } sec = budget->securities.next(); } } else { fstream << "D" << writeQIFDate(date, qi.date_format) << "\n"; fstream << "T" << writeQIFValue(account->initialBalance(), qi.value_format, KGlobal::locale()->fracDigits()) << "\n"; fstream << "C" << "X" << "\n"; fstream << "P" << "Opening Balance" << "\n"; fstream << "L" << "[" << account->name() << "]" << "\n"; fstream << "^" << "\n"; } } void exportQIFAccount(QTextStream &fstream, qif_info&, Account *account) { if(account->type() == ACCOUNT_TYPE_ASSETS) fstream << "!Account" << "\n"; else fstream << "!Type:Cat" << "\n"; fstream << "N" << account->name() << "\n"; if(account->type() == ACCOUNT_TYPE_ASSETS) { fstream << "T"; switch(((AssetsAccount*) account)->accountType()) { case ASSETS_TYPE_CURRENT: {fstream << "Bank"; break;} case ASSETS_TYPE_SAVINGS: {fstream << "Bank"; break;} case ASSETS_TYPE_CREDIT_CARD: {fstream << "CCard"; break;} case ASSETS_TYPE_LIABILITIES: {fstream << "Oth L"; break;} case ASSETS_TYPE_SECURITIES: {fstream << "Invst"; break;} case ASSETS_TYPE_BALANCING: {fstream << "Oth A"; break;} case ASSETS_TYPE_CASH: {fstream << "Cash"; break;} } fstream << "\n"; } if(!account->description().isEmpty()) fstream << "D" << account->description() << "\n"; if(account->type() == ACCOUNT_TYPE_EXPENSES) fstream << "E" << "\n"; else if(account->type() == ACCOUNT_TYPE_INCOMES) fstream << "I" << "\n"; fstream << "^" << "\n"; } void exportQIFSecurity(QTextStream &fstream, qif_info&, Security *sec) { fstream << "!Type:Security" << "\n"; fstream << "N" << sec->name() << "\n"; fstream << "T"; switch(sec->type()) { case SECURITY_TYPE_BOND: {fstream << "Bond"; break;} case SECURITY_TYPE_STOCK: {fstream << "Stock"; break;} case SECURITY_TYPE_MUTUAL_FUND: {fstream << "Mutual Fund"; break;} case SECURITY_TYPE_OTHER: {fstream << "Other"; break;} } fstream << "\n"; if(!sec->description().isEmpty()) fstream << "D" << sec->description() << "\n"; fstream << "^" << "\n"; } void exportQIF(QTextStream &fstream, qif_info &qi, Budget *budget, bool export_cats) { if(qi.current_account) { if(export_cats) { QMap icats; QMap isubcats; QMap ecats; QMap esubcats; Income *inc = budget->incomes.first(); while(inc) { if(inc->to() == qi.current_account) { icats[inc->category()] = true; if(qi.subcategory_as_description && !inc->description().isEmpty()) isubcats[inc->category()->name() + ":" + inc->description()] = true; } inc = budget->incomes.next(); } Expense *exp = budget->expenses.first(); while(exp) { if(exp->from() == qi.current_account) { ecats[exp->category()] = true; if(qi.subcategory_as_description && !exp->description().isEmpty()) esubcats[exp->category()->name() + ":" + exp->description()] = true; } exp = budget->expenses.next(); } QMap::iterator iit_e = icats.end(); for(QMap::iterator iit = icats.begin(); iit != iit_e; ++iit) { exportQIFAccount(fstream, qi, iit.key()); } QMap::iterator sit_e = isubcats.end(); for(QMap::iterator sit = isubcats.begin(); sit != sit_e; ++sit) { fstream << "!Type:Cat" << "\n"; fstream << "N" << sit.key() << "\n"; fstream << "I" << "\n"; fstream << "^" << "\n"; } QMap::iterator eit_e = ecats.end(); for(QMap::iterator eit = ecats.begin(); eit != eit_e; ++eit) { exportQIFAccount(fstream, qi, eit.key()); } sit_e = esubcats.end(); for(QMap::iterator sit = esubcats.begin(); sit != sit_e; ++sit) { fstream << "!Type:Cat" << "\n"; fstream << "N" << sit.key() << "\n"; fstream << "E" << "\n"; fstream << "^" << "\n"; } Security *sec = budget->securities.first(); while(sec) { if(sec->account() == qi.current_account) { exportQIFSecurity(fstream, qi, sec); } sec = budget->securities.next(); } } exportQIFAccount(fstream, qi, qi.current_account); Transaction *trans = budget->transactions.first(); bool first = true; SplitTransaction *split = NULL; while(trans) { if(trans->fromAccount() == qi.current_account || trans->toAccount() == qi.current_account) { if(first) { exportQIFOpeningBalance(fstream, qi, qi.current_account, trans->date()); first = false; } if(trans->parentSplit() && trans->parentSplit()->account() == qi.current_account) { if(!split || split != trans->parentSplit()) { split = trans->parentSplit(); exportQIFSplitTransaction(fstream, qi, split); } } else { exportQIFTransaction(fstream, qi, trans); } } trans = budget->transactions.next(); } if(first) { exportQIFOpeningBalance(fstream, qi, qi.current_account, QDate::currentDate()); } Security *sec = budget->securities.first(); while(sec) { if(sec->account() == qi.current_account) { Income *inc = sec->dividends.first(); while(inc) { exportQIFTransaction(fstream, qi, inc); inc = sec->dividends.next(); } ReinvestedDividend *rediv = sec->reinvestedDividends.first(); while(rediv) { fstream << "D" << writeQIFDate(rediv->date, qi.date_format) << "\n"; fstream << "N" << "ReinvDiv" << "\n"; fstream << "Y" << sec->name() << "\n"; fstream << "Q" << writeQIFValue(rediv->shares, qi.value_format, sec->decimals()) << "\n"; fstream << "C" << "X" << "\n"; fstream << "^" << "\n"; rediv = sec->reinvestedDividends.next(); } } sec = budget->securities.next(); } } else { if(export_cats) { QMap isubcats; QMap esubcats; Income *inc = budget->incomes.first(); while(inc) { if(qi.subcategory_as_description && !inc->description().isEmpty()) isubcats[inc->category()->name() + ":" + inc->description()] = true; inc = budget->incomes.next(); } Expense *exp = budget->expenses.first(); while(exp) { if(qi.subcategory_as_description && !exp->description().isEmpty()) esubcats[exp->category()->name() + ":" + exp->description()] = true; exp = budget->expenses.next(); } IncomesAccount *iaccount = budget->incomesAccounts.first(); while(iaccount) { exportQIFAccount(fstream, qi, iaccount); iaccount = budget->incomesAccounts.next(); } QMap::iterator sit_e = isubcats.end(); for(QMap::iterator sit = isubcats.begin(); sit != sit_e; ++sit) { fstream << "!Type:Cat" << "\n"; fstream << "N" << sit.key() << "\n"; fstream << "I" << "\n"; fstream << "^" << "\n"; } ExpensesAccount *eaccount = budget->expensesAccounts.first(); while(eaccount) { exportQIFAccount(fstream, qi, eaccount); eaccount = budget->expensesAccounts.next(); } sit_e = esubcats.end(); for(QMap::iterator sit = esubcats.begin(); sit != sit_e; ++sit) { fstream << "!Type:Cat" << "\n"; fstream << "N" << sit.key() << "\n"; fstream << "E" << "\n"; fstream << "^" << "\n"; } Security *sec = budget->securities.first(); while(sec) { exportQIFSecurity(fstream, qi, sec); sec = budget->securities.next(); } } AssetsAccount *account = budget->assetsAccounts.first(); while(account) { qi.current_account = account; exportQIF(fstream, qi, budget, false); account = budget->assetsAccounts.next(); } } } bool exportQIFFile(Budget *budget, QWidget *parent, bool extra_parameters) { if(budget->accounts.count() <= 1) { return false; } ExportQIFDialog *dialog = new ExportQIFDialog(budget, parent, extra_parameters); bool ret = (dialog->exec() == QDialog::Accepted); dialog->deleteLater(); return ret; } #include "qifimportexport.moc" eqonomize-0.6/src/qifimportexport.h0000644000175000017500000001012311106577043016536 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef QIF_IMPORT_EXPORT_H #define QIF_IMPORT_EXPORT_H #include #include #include "budget.h" #include #include #include class Budget; class AssetsAccount; class KLineEdit; class KComboBox; class KUrlRequester; class QRadioButton; class QTreeWidget; class QTreeWidgetItem; struct qif_info { AssetsAccount *current_account; QMap unknown_defs; QMap unknown_defs_pre; bool unhandled; bool unknown; bool had_type, had_type_def, had_account_def; bool account_defined; bool had_transaction; int value_format, date_format, shares_format, price_format, percentage_format; char separator; bool p1, p2, p3, p4, ly; QString opening_balance_str; int accounts, categories, transactions, securities, security_transactions, duplicates, failed_transactions; bool payee_as_description, subcategory_as_description, subcategory_as_category, memo_as_description; int description_priority; }; class ImportQIFDialog : public QWizard { Q_OBJECT protected: Budget *budget; qif_info qi; bool b_extra; int next_id; KUrlRequester *fileEdit; QTreeWidget *defsView; KComboBox *defsCombo, *dateFormatCombo, *accountCombo, *descriptionPriorityCombo; KLineEdit *openingBalanceEdit; QRadioButton *payeeAsDescriptionButton, *payeeAsPayeeButton, *memoAsDescriptionButton, *memoAsCommentButton; QRadioButton *subcategoryAsDescriptionButton, *subcategoryAsCategoryButton, *subcategoryIgnoreButton; public: ImportQIFDialog(Budget *budg, QWidget *parent, bool extra_parameters); ~ImportQIFDialog(); void showPage(int index); int nextId() const; protected slots: void nextClicked(); void accept(); void onFileChanged(const QString&); void defSelectionChanged(); void defSelected(int); }; class ExportQIFDialog : public KDialog { Q_OBJECT protected: Budget *budget; qif_info qi; bool b_extra; QRadioButton *descriptionAsSubcategoryButton, *descriptionAsPayeeButton, *descriptionAsMemoButton, *descriptionIgnoreButton; KComboBox *accountCombo, *dateFormatCombo, *valueFormatCombo; KUrlRequester *fileEdit; public: ExportQIFDialog(Budget *budg, QWidget *parent, bool extra_parameters = false); ~ExportQIFDialog(); protected slots: void slotButtonClicked(int); void onFileChanged(const QString&); }; void importQIF(QTextStream &fstream, bool test, qif_info &qi, Budget *budget); bool importQIFFile(Budget *budget, QWidget *parent, bool extra_parameters = false); void exportQIF(QTextStream &fstream, qif_info &qi, Budget *budget, bool export_cats = true); bool exportQIFFile(Budget *budget, QWidget *parent, bool extra_parameters = false); #endif eqonomize-0.6/src/recurrence.cpp0000644000175000017500000011045611106577050015762 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "recurrence.h" #include "budget.h" #include #include #include #include int months_between_dates(const QDate &date1, const QDate &date2) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); if(calSys->year(date1) == calSys->year(date2)) { return calSys->month(date2) - calSys->month(date1); } int months = calSys->monthsInYear(date1) - calSys->month(date1); QDate yeardate; calSys->setYMD(yeardate, calSys->year(date1), 1, 1); yeardate = calSys->addYears(yeardate, 1); while(calSys->year(yeardate) != calSys->year(date2)) { months += calSys->monthsInYear(yeardate); yeardate = calSys->addYears(yeardate, 1); } months += calSys->month(date2); return months; } int weeks_between_dates(const QDate &date1, const QDate &date2) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); return (calSys->dayOfWeek(date1) - calSys->dayOfWeek(date2) + date1.daysTo(date2)) / 7; } int get_day_in_month(const QDate &date, int week, int day_of_week) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); if(week > 0) { int fwd = calSys->dayOfWeek(date); fwd -= calSys->day(date) % 7 - 1; if(fwd <= 0) fwd = 7 + fwd; int day = 1; if(fwd < day_of_week) { day += day_of_week - fwd; } else if(fwd > day_of_week) { day += 7 - (fwd - day_of_week); } day += (week - 1) * 7; if(day > calSys->daysInMonth(date)) return 0; return day; } else { int lwd = calSys->dayOfWeek(date); int day = calSys->daysInMonth(date); lwd += (day - calSys->day(date)) % 7; if(lwd > 7) lwd = lwd - 7; if(lwd > day_of_week) { day -= lwd - day_of_week; } else if(lwd < day_of_week) { day -= 7 - (day_of_week - lwd); } day -= (-week) * 7; if(day < 1) return 0; return day; } } int get_day_in_month(int year, int month, int week, int day_of_week) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); QDate date; calSys->setYMD(date, year, month, 1); return get_day_in_month(date, week, day_of_week); } Recurrence::Recurrence(Budget *parent_budget) : o_budget(parent_budget) { i_count = -1; } Recurrence::Recurrence(Budget *parent_budget, QDomElement *e, bool *valid) : o_budget(parent_budget) { if(valid) *valid = true; d_startdate = QDate::fromString(e->attribute("startdate"), Qt::ISODate); if(!e->attribute("enddate").isEmpty()) { d_enddate = QDate::fromString(e->attribute("enddate"), Qt::ISODate); } i_count = e->attribute("recurrences", "-1").toInt(); if(valid && !d_startdate.isValid()) { *valid = false; } if(!d_enddate.isValid() && !d_enddate.isNull()) d_enddate = QDate(); for(QDomNode n = e->firstChild(); !n.isNull(); n = n.nextSibling()) { if(n.isElement()) { QDomElement e2 = n.toElement(); if(e2.tagName() == "exception") { QDate date = QDate::fromString(e2.attribute("date"), Qt::ISODate); if(date.isValid() && date >= d_startdate && (d_enddate.isNull() || date <= d_enddate)) { exceptions.append(date); } } } } qSort(exceptions); } Recurrence::Recurrence(const Recurrence *rec) : o_budget(rec->budget()), d_startdate(rec->startDate()), d_enddate(rec->endDate()), i_count(rec->fixedOccurrenceCount()), exceptions(rec->exceptions) {} Recurrence::~Recurrence() {} void Recurrence::updateDates() { if(!d_startdate.isValid()) return; if(!d_enddate.isNull() && i_count <= 0) { d_enddate = prevOccurrence(d_enddate, true); while(exceptions.count() > 0) { if(exceptions.last() == d_enddate) { d_enddate = prevOccurrence(d_enddate, false); exceptions.pop_back(); } else if(exceptions.last() > d_enddate) { exceptions.pop_back(); } else { break; } } } //d_startdate = nextOccurrence(d_startdate, true); while(exceptions.count() > 0) { if(exceptions.first() == d_startdate) { d_startdate = nextOccurrence(d_startdate, false); exceptions.erase(exceptions.begin()); } else if(exceptions.first() < d_startdate) { exceptions.erase(exceptions.begin()); } else { break; } } if(i_count > 0) { d_enddate = QDate(); QDate new_enddate = d_startdate; for(int i = 1; i < i_count; i++) { new_enddate = nextOccurrence(new_enddate); if(new_enddate.isNull()) { i_count = i; break; } } d_enddate = new_enddate; if(d_enddate.isNull()) { d_enddate = d_startdate; } } if(d_enddate.isNull() && nextOccurrence(d_startdate).isNull()) { d_enddate = d_startdate; } } QDate Recurrence::firstOccurrence() const { return d_startdate; } QDate Recurrence::lastOccurrence() const { return d_enddate; } int Recurrence::countOccurrences(const QDate &startdate, const QDate &enddate) const { if(enddate < d_startdate) return 0; if(!d_enddate.isNull() && startdate > d_enddate) return 0; if(i_count > 0 && startdate <= d_startdate && enddate <= d_enddate) return i_count; QDate date1 = nextOccurrence(startdate, true); if(date1.isNull() || date1 > enddate) return 0; int n = 0; do { n++; date1 = nextOccurrence(date1); } while(!date1.isNull() && date1 <= enddate); return n; } int Recurrence::countOccurrences(const QDate &enddate) const { return countOccurrences(d_startdate, enddate); } bool Recurrence::removeOccurrence(const QDate &date) { addException(date); return true; } const QDate &Recurrence::endDate() const { return d_enddate; } const QDate &Recurrence::startDate() const { return d_startdate; } void Recurrence::setEndDate(const QDate &new_end_date) { i_count = -1; d_enddate = new_end_date; if(!new_end_date.isNull()) { d_enddate = prevOccurrence(d_enddate, true); while(exceptions.count() > 0) { if(exceptions.last() == d_enddate) { d_enddate = prevOccurrence(d_enddate, false); exceptions.pop_back(); } else if(exceptions.last() > d_enddate) { exceptions.pop_back(); } else { break; } } } else if(nextOccurrence(d_startdate).isNull()) { d_enddate = d_startdate; } } void Recurrence::setStartDate(const QDate &new_start_date) { d_startdate = new_start_date; bool set_end_date = false; if(!d_enddate.isNull() && d_startdate > d_enddate) { d_enddate = QDate(); set_end_date = true; } //d_startdate = nextOccurrence(d_startdate, true); while(exceptions.count() > 0) { if(exceptions.first() == d_startdate) { d_startdate = nextOccurrence(d_startdate, false); exceptions.erase(exceptions.begin()); } else if(exceptions.first() < d_startdate) { exceptions.erase(exceptions.begin()); } else { break; } } if(i_count > 0) setFixedOccurrenceCount(i_count); else if(set_end_date) d_enddate = d_startdate; if(d_enddate.isNull() && nextOccurrence(d_startdate).isNull()) { d_enddate = d_startdate; } } int Recurrence::fixedOccurrenceCount() const { return i_count; } void Recurrence::setFixedOccurrenceCount(int new_count) { if(new_count <= 0) { i_count = -1; setEndDate(d_enddate); } else { i_count = new_count; d_enddate = QDate(); QDate new_enddate = d_startdate; for(int i = 1; i < i_count; i++) { new_enddate = nextOccurrence(new_enddate); if(new_enddate.isNull()) { i_count = i; break; } } d_enddate = new_enddate; if(d_enddate.isNull()) { d_enddate = d_startdate; } } } void Recurrence::addException(const QDate &date) { if(hasException(date) || !date.isValid()) return; if(date == d_startdate) { d_startdate = nextOccurrence(d_startdate); if(d_startdate.isNull()) d_enddate = QDate(); return; } if(date == d_enddate) { d_enddate = prevOccurrence(d_enddate); if(d_enddate.isNull()) d_startdate = QDate(); return; } exceptions.append(date); qSort(exceptions); } int Recurrence::findException(const QDate &date) const { for(QVector::size_type i = 0; i < exceptions.count(); i++) { if(exceptions[i] == date) { return (int) i; } if(exceptions[i] > date) break; } return -1; } bool Recurrence::hasException(const QDate &date) const { return findException(date) >= 0; } bool Recurrence::removeException(const QDate &date) { for(QVector::iterator it = exceptions.begin(); it != exceptions.end(); ++it) { if(*it == date) { exceptions.erase(it); return true; } if(*it > date) break; } return false; } void Recurrence::clearExceptions() { exceptions.clear(); } Budget *Recurrence::budget() const {return o_budget;} void Recurrence::save(QDomElement *e) const { e->setAttribute("startdate", d_startdate.toString(Qt::ISODate)); if(d_enddate.isValid()) e->setAttribute("enddate", d_enddate.toString(Qt::ISODate)); for(QVector::size_type i = 0; i < exceptions.count(); i++) { QDomElement e2 = e->ownerDocument().createElement("exception"); e2.setAttribute("date", exceptions[i].toString(Qt::ISODate)); e->appendChild(e2); } } DailyRecurrence::DailyRecurrence(Budget *parent_budget) : Recurrence(parent_budget) { i_frequency = 1; } DailyRecurrence::DailyRecurrence(Budget *parent_budget, QDomElement *e, bool *valid) : Recurrence(parent_budget, e, valid) { i_frequency = e->attribute("frequency", "1").toInt(); if(valid && i_frequency < 1) { *valid = false; } updateDates(); } DailyRecurrence::DailyRecurrence(const DailyRecurrence *rec) : Recurrence(rec), i_frequency(rec->frequency()) {} DailyRecurrence::~DailyRecurrence() {} Recurrence *DailyRecurrence::copy() const {return new DailyRecurrence(this);} QDate DailyRecurrence::nextOccurrence(const QDate &date, bool include_equals) const { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); if(include_equals) { if(date == startDate()) return date; } QDate nextdate = date; if(!include_equals) nextdate = calSys->addDays(nextdate, 1); if(!endDate().isNull() && nextdate > endDate()) return QDate(); if(nextdate <= startDate()) return firstOccurrence(); if(i_frequency != 1) { int days = startDate().daysTo(nextdate); if(days % i_frequency != 0) { nextdate = calSys->addDays(nextdate, i_frequency - (days % i_frequency)); } } if(!endDate().isNull() && nextdate > endDate()) return QDate(); if(hasException(nextdate)) return nextOccurrence(nextdate); return nextdate; } QDate DailyRecurrence::prevOccurrence(const QDate &date, bool include_equals) const { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); if(!include_equals) { if(date > endDate()) return lastOccurrence(); } QDate prevdate = date; if(!include_equals) prevdate = calSys->addDays(prevdate, -1); if(prevdate < startDate()) return QDate(); if(prevdate == startDate()) return startDate(); if(i_frequency != 1) { int days = startDate().daysTo(prevdate); if(days % i_frequency != 0) { prevdate = calSys->addDays(prevdate, -(days % i_frequency)); } } if(prevdate < startDate()) return QDate(); if(hasException(prevdate)) return prevOccurrence(prevdate); return prevdate; } RecurrenceType DailyRecurrence::type() const { return RECURRENCE_TYPE_DAILY; } int DailyRecurrence::frequency() const { return i_frequency; } void DailyRecurrence::set(const QDate &new_start_date, const QDate &new_end_date, int new_frequency, int occurrences) { i_frequency = new_frequency; setStartDate(new_start_date); if(occurrences <= 0) setEndDate(new_end_date); else setFixedOccurrenceCount(occurrences); } void DailyRecurrence::save(QDomElement *e) const { Recurrence::save(e); e->setAttribute("frequency", i_frequency); } WeeklyRecurrence::WeeklyRecurrence(Budget *parent_budget) : Recurrence(parent_budget) { i_frequency = 1; b_daysofweek[0] = false; b_daysofweek[1] = false; b_daysofweek[2] = false; b_daysofweek[3] = false; b_daysofweek[4] = false; b_daysofweek[5] = false; b_daysofweek[6] = false; } WeeklyRecurrence::WeeklyRecurrence(Budget *parent_budget, QDomElement *e, bool *valid) : Recurrence(parent_budget, e, valid) { i_frequency = e->attribute("frequency", "1").toInt(); QString days = e->attribute("days"); b_daysofweek[0] = days.indexOf('1') >= 0; b_daysofweek[1] = days.indexOf('2') >= 0; b_daysofweek[2] = days.indexOf('3') >= 0; b_daysofweek[3] = days.indexOf('4') >= 0; b_daysofweek[4] = days.indexOf('5') >= 0; b_daysofweek[5] = days.indexOf('6') >= 0; b_daysofweek[6] = days.indexOf('7') >= 0; if(valid) { bool b = false; for(int i = 0; i < 7; i++) { if(b_daysofweek[i]) { b = true; break; } } if(!b) *valid = false; } if(valid && i_frequency < 1) { *valid = false; } updateDates(); } WeeklyRecurrence::WeeklyRecurrence(const WeeklyRecurrence *rec) : Recurrence(rec), i_frequency(rec->frequency()) { b_daysofweek[0] = rec->dayOfWeek(1); b_daysofweek[1] = rec->dayOfWeek(2); b_daysofweek[2] = rec->dayOfWeek(3); b_daysofweek[3] = rec->dayOfWeek(4); b_daysofweek[4] = rec->dayOfWeek(5); b_daysofweek[5] = rec->dayOfWeek(6); b_daysofweek[6] = rec->dayOfWeek(7); } WeeklyRecurrence::~WeeklyRecurrence() {} Recurrence *WeeklyRecurrence::copy() const {return new WeeklyRecurrence(this);} QDate WeeklyRecurrence::nextOccurrence(const QDate &date, bool include_equals) const { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); if(!include_equals) { if(date < startDate()) return firstOccurrence(); } else { if(date <= startDate()) return firstOccurrence(); } QDate nextdate = date; if(!include_equals) nextdate = calSys->addDays(nextdate, 1); if(!endDate().isNull() && nextdate > endDate()) return QDate(); if(i_frequency != 1 && calSys->weekNumber(nextdate) != calSys->weekNumber(startDate())) { int i = weeks_between_dates(startDate(), nextdate) % i_frequency; if(i != 0) { nextdate = calSys->addDays(nextdate, (i_frequency - i) * 7 - (calSys->dayOfWeek(nextdate) - 1)); } } int dow = calSys->dayOfWeek(nextdate); int i = dow; for(; i <= 7; i++) { if(b_daysofweek[i - 1]) { break; } } if(i > 7) { for(i = 1; i <= 7; i++) { if(b_daysofweek[i - 1]) { break; } } if(i > 7) return QDate(); } if(i < dow) { nextdate = calSys->addDays(nextdate, (i_frequency * 7) + i - dow); } else if(i > dow) { nextdate = calSys->addDays(nextdate, i - dow); } if(!endDate().isNull() && nextdate > endDate()) return QDate(); if(hasException(nextdate)) return nextOccurrence(nextdate); return nextdate; } QDate WeeklyRecurrence::prevOccurrence(const QDate &date, bool include_equals) const { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); if(!include_equals) { if(date > endDate()) return lastOccurrence(); } QDate prevdate = date; if(!include_equals) prevdate = calSys->addDays(prevdate, -1); if(prevdate < startDate()) return QDate(); if(prevdate == startDate()) return startDate(); if(i_frequency != 1 && calSys->weekNumber(prevdate) != calSys->weekNumber(startDate())) { int i = weeks_between_dates(startDate(), prevdate) % i_frequency; if(i != 0) { prevdate = calSys->addDays(prevdate, -(i * 7) + 7 - calSys->dayOfWeek(prevdate)); } } int dow_s = calSys->dayOfWeek(startDate()); bool s_week = calSys->weekNumber(prevdate) == calSys->weekNumber(startDate()); int dow = calSys->dayOfWeek(prevdate); int i = dow; for(; i <= 7; i++) { if(b_daysofweek[i - 1] || (s_week && dow_s == i)) { break; } } if(i > 7) { for(i = 1; i <= 7; i++) { if(b_daysofweek[i - 1] || (s_week && dow_s == i)) { break; } } if(i > 7) return QDate(); } if(i > dow) { prevdate = calSys->addDays(prevdate, -(i_frequency * 7) + dow - i); } else if(i < dow) { prevdate = calSys->addDays(prevdate, dow - i); } if(prevdate < startDate()) return QDate(); if(hasException(prevdate)) return prevOccurrence(prevdate); return prevdate; } RecurrenceType WeeklyRecurrence::type() const { return RECURRENCE_TYPE_WEEKLY; } int WeeklyRecurrence::frequency() const { return i_frequency; } bool WeeklyRecurrence::dayOfWeek(int i) const { if(i >= 1 && i <= 7) return b_daysofweek[i - 1]; return false; } void WeeklyRecurrence::set(const QDate &new_start_date, const QDate &new_end_date, bool d1, bool d2, bool d3, bool d4, bool d5, bool d6, bool d7, int new_frequency, int occurrences) { b_daysofweek[0] = d1; b_daysofweek[1] = d2; b_daysofweek[2] = d3; b_daysofweek[3] = d4; b_daysofweek[4] = d5; b_daysofweek[5] = d6; b_daysofweek[6] = d7; i_frequency = new_frequency; setStartDate(new_start_date); if(occurrences <= 0) setEndDate(new_end_date); else setFixedOccurrenceCount(occurrences); } void WeeklyRecurrence::save(QDomElement *e) const { Recurrence::save(e); e->setAttribute("frequency", i_frequency); QString days; if(b_daysofweek[0]) days += '1'; if(b_daysofweek[1]) days += '2'; if(b_daysofweek[2]) days += '3'; if(b_daysofweek[3]) days += '4'; if(b_daysofweek[4]) days += '5'; if(b_daysofweek[5]) days += '6'; if(b_daysofweek[6]) days += '7'; e->setAttribute("days", days); } MonthlyRecurrence::MonthlyRecurrence(Budget *parent_budget) : Recurrence(parent_budget) { i_day = 1; i_frequency = 1; i_week = 1; i_dayofweek = -1; wh_weekendhandling = WEEKEND_HANDLING_NONE; } MonthlyRecurrence::MonthlyRecurrence(Budget *parent_budget, QDomElement *e, bool *valid) : Recurrence(parent_budget, e, valid) { i_day = e->attribute("day", "1").toInt(); i_frequency = e->attribute("frequency", "1").toInt(); i_week = e->attribute("week", "1").toInt(); i_dayofweek = e->attribute("dayofweek", "-1").toInt(); wh_weekendhandling = (WeekendHandling) e->attribute("weekendhandling", "0").toInt(); if(valid && (i_day > 31 || i_day < -27 || i_frequency < 1 || i_week > 5 || i_week < -4 || i_dayofweek > 7)) { *valid = false; } updateDates(); } MonthlyRecurrence::MonthlyRecurrence(const MonthlyRecurrence *rec) : Recurrence(rec), i_frequency(rec->frequency()), i_day(rec->day()), i_week(rec->week()), i_dayofweek(rec->dayOfWeek()), wh_weekendhandling(rec->weekendHandling()) {} MonthlyRecurrence::~MonthlyRecurrence() {} Recurrence *MonthlyRecurrence::copy() const {return new MonthlyRecurrence(this);} QDate MonthlyRecurrence::nextOccurrence(const QDate &date, bool include_equals) const { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); if(!include_equals) { if(date < startDate()) return firstOccurrence(); } else { if(date <= startDate()) return firstOccurrence(); } QDate nextdate = date; if(!include_equals) nextdate = calSys->addDays(nextdate, 1); if(!endDate().isNull() && nextdate > endDate()) return QDate(); int prevday = -1; if(calSys->month(nextdate) == calSys->month(startDate())) { if(i_frequency > 1) prevday = 1; else prevday = calSys->day(nextdate); nextdate = calSys->addMonths(nextdate, i_frequency); calSys->setYMD(nextdate, calSys->year(nextdate), calSys->month(nextdate), 1); } else if(i_frequency != 1) { int i = months_between_dates(startDate(), nextdate) % i_frequency; if(i != 0) { if(i_frequency - i > 1) prevday = 1; else prevday = calSys->day(nextdate); nextdate = calSys->addMonths(nextdate, i_frequency - i); calSys->setYMD(nextdate, calSys->year(nextdate), calSys->month(nextdate), 1); } } int day = i_day; if(i_dayofweek > 0) day = get_day_in_month(nextdate, i_week, i_dayofweek); else if(i_day < 1) day = calSys->daysInMonth(nextdate) + i_day; if(wh_weekendhandling == WEEKEND_HANDLING_BEFORE) { QDate date; calSys->setYMD(date, calSys->year(nextdate), calSys->month(nextdate), day); int wday = calSys->dayOfWeek(date); if(wday == 6) day -= 1; else if(wday == 7) day -= 2; if(day <= 0 && prevday > 0 && prevday <= calSys->daysInMonth(calSys->addMonths(nextdate, -1)) + day) { nextdate = calSys->addMonths(nextdate, -1); day = calSys->daysInMonth(nextdate) + day; } } else if(wh_weekendhandling == WEEKEND_HANDLING_AFTER) { QDate date; calSys->setYMD(date, calSys->year(nextdate), calSys->month(nextdate), day); int wday = calSys->dayOfWeek(date); if(wday == 6) day += 2; else if(wday == 7) day += 1; if(day > calSys->daysInMonth(nextdate)) { day -= calSys->daysInMonth(nextdate); nextdate = calSys->addMonths(nextdate, 1); calSys->setYMD(nextdate, calSys->year(nextdate), calSys->month(nextdate), day); } } if(day <= 0 || calSys->day(nextdate) > day || day > calSys->daysInMonth(nextdate)) { do { if(i_frequency > 1) prevday = 1; else prevday = calSys->day(nextdate); nextdate = calSys->addMonths(nextdate, i_frequency); if(!endDate().isNull() && calSys->month(nextdate) > calSys->month(endDate())) return QDate(); day = i_day; if(i_dayofweek > 0) day = get_day_in_month(nextdate, i_week, i_dayofweek); else if(i_day < 1) day = calSys->daysInMonth(nextdate) + i_day; if(wh_weekendhandling == WEEKEND_HANDLING_BEFORE) { QDate date; calSys->setYMD(date, calSys->year(nextdate), calSys->month(nextdate), day); int wday = calSys->dayOfWeek(date); if(wday == 6) day -= 1; else if(wday == 7) day -= 2; if(day <= 0 && prevday > 0 && prevday <= calSys->daysInMonth(calSys->addMonths(nextdate, -1)) + day) { nextdate = calSys->addMonths(nextdate, -1); day = calSys->daysInMonth(nextdate) + day; } else { calSys->setYMD(nextdate, calSys->year(nextdate), calSys->month(nextdate), 1); } } else if(wh_weekendhandling == WEEKEND_HANDLING_AFTER) { QDate date; calSys->setYMD(date, calSys->year(nextdate), calSys->month(nextdate), day); int wday = calSys->dayOfWeek(date); if(wday == 6) day += 2; else if(wday == 7) day += 1; if(day > calSys->daysInMonth(nextdate)) { day -= calSys->daysInMonth(nextdate); nextdate = calSys->addMonths(nextdate, 1); calSys->setYMD(nextdate, calSys->year(nextdate), calSys->month(nextdate), day); } } } while(day <= 0 || day > calSys->daysInMonth(nextdate)); } calSys->setYMD(nextdate, calSys->year(nextdate), calSys->month(nextdate), day); if(!endDate().isNull() && nextdate > endDate()) return QDate(); if(hasException(nextdate)) return nextOccurrence(nextdate); return nextdate; } QDate MonthlyRecurrence::prevOccurrence(const QDate &date, bool include_equals) const { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); if(!include_equals) { if(date > endDate()) return lastOccurrence(); } QDate prevdate = date; if(!include_equals) prevdate = calSys->addDays(prevdate, -1); if(prevdate < startDate()) return QDate(); if(prevdate == startDate()) return startDate(); int prevday = -1; if(i_frequency != 1 && calSys->month(prevdate) != calSys->month(startDate())) { int i = months_between_dates(startDate(), prevdate) % i_frequency; if(i != 0) { if(i > 1) prevday = 1; else prevday = calSys->day(prevdate); prevdate = calSys->addMonths(prevdate, -i); calSys->setYMD(prevdate, calSys->year(prevdate), calSys->month(prevdate), calSys->daysInMonth(prevdate)); } } if(calSys->month(prevdate) == calSys->month(startDate())) return startDate(); int day = i_day; if(i_dayofweek > 0) day = get_day_in_month(prevdate, i_week, i_dayofweek); else if(i_day < 1) day = calSys->daysInMonth(prevdate) + i_day; if(wh_weekendhandling == WEEKEND_HANDLING_BEFORE) { QDate date; calSys->setYMD(date, calSys->year(prevdate), calSys->month(prevdate), day); int wday = calSys->dayOfWeek(date); if(wday == 6) day -= 1; else if(wday == 7) day -= 2; if(day <= 0) { prevdate = calSys->addMonths(prevdate, -1); day = calSys->daysInMonth(prevdate) + day; } } else if(wh_weekendhandling == WEEKEND_HANDLING_AFTER) { QDate date; calSys->setYMD(date, calSys->year(prevdate), calSys->month(prevdate), day); int wday = calSys->dayOfWeek(date); if(wday == 6) day += 2; else if(wday == 7) day += 1; if(day > calSys->daysInMonth(prevdate) && prevday > 0 && prevday >= day - calSys->daysInMonth(prevdate)) { day -= calSys->daysInMonth(prevdate); prevdate = calSys->addMonths(prevdate, 1); calSys->setYMD(prevdate, calSys->year(prevdate), calSys->month(prevdate), day); } } if(day <= 0 || calSys->day(prevdate) < day) { do { if(i_frequency > 1) prevday = 1; else prevday = calSys->day(prevdate); prevdate = calSys->addMonths(prevdate, -i_frequency); if(calSys->month(prevdate) == calSys->month(startDate())) return startDate(); if(calSys->month(prevdate) < calSys->month(startDate())) return QDate(); day = i_day; if(i_dayofweek > 0) day = get_day_in_month(prevdate, i_week, i_dayofweek); else if(i_day < 1) day = calSys->daysInMonth(prevdate) + i_day; if(wh_weekendhandling == WEEKEND_HANDLING_BEFORE) { QDate date; calSys->setYMD(date, calSys->year(prevdate), calSys->month(prevdate), day); int wday = calSys->dayOfWeek(date); if(wday == 6) day -= 1; else if(wday == 7) day -= 2; if(day <= 0) { prevdate = calSys->addMonths(prevdate, -1); day = calSys->daysInMonth(prevdate) + day; } } else if(wh_weekendhandling == WEEKEND_HANDLING_AFTER) { QDate date; calSys->setYMD(date, calSys->year(prevdate), calSys->month(prevdate), day); int wday = calSys->dayOfWeek(date); if(wday == 6) day += 2; else if(wday == 7) day += 1; if(day > calSys->daysInMonth(prevdate) && prevday > 0 && prevday >= day - calSys->daysInMonth(prevdate)) { day -= calSys->daysInMonth(prevdate); prevdate = calSys->addMonths(prevdate, 1); calSys->setYMD(prevdate, calSys->year(prevdate), calSys->month(prevdate), day); } else { calSys->setYMD(prevdate, calSys->year(prevdate), calSys->month(prevdate), calSys->daysInMonth(prevdate)); } } } while(day <= 0 || day > calSys->daysInMonth(prevdate)); } calSys->setYMD(prevdate, calSys->year(prevdate), calSys->month(prevdate), day); if(prevdate < startDate()) return QDate(); if(hasException(prevdate)) return prevOccurrence(prevdate); return prevdate; } RecurrenceType MonthlyRecurrence::type() const { return RECURRENCE_TYPE_MONTHLY; } int MonthlyRecurrence::frequency() const { return i_frequency; } int MonthlyRecurrence::day() const { return i_day; } WeekendHandling MonthlyRecurrence::weekendHandling() const { return wh_weekendhandling; } int MonthlyRecurrence::week() const { return i_week; } int MonthlyRecurrence::dayOfWeek() const { return i_dayofweek; } void MonthlyRecurrence::setOnDayOfWeek(const QDate &new_start_date, const QDate &new_end_date, int new_dayofweek, int new_week, int new_frequency, int occurrences) { i_week = new_week; i_frequency = new_frequency; i_dayofweek = new_dayofweek; wh_weekendhandling = WEEKEND_HANDLING_NONE; setStartDate(new_start_date); if(occurrences <= 0) setEndDate(new_end_date); else setFixedOccurrenceCount(occurrences); } void MonthlyRecurrence::setOnDay(const QDate &new_start_date, const QDate &new_end_date, int new_day, WeekendHandling new_weekendhandling, int new_frequency, int occurrences) { i_dayofweek = -1; i_day = new_day; i_frequency = new_frequency; wh_weekendhandling = new_weekendhandling; setStartDate(new_start_date); if(occurrences <= 0) setEndDate(new_end_date); else setFixedOccurrenceCount(occurrences); } void MonthlyRecurrence::save(QDomElement *e) const { Recurrence::save(e); if(i_dayofweek <= 0) { e->setAttribute("day", i_day); e->setAttribute("weekendhandling", wh_weekendhandling); } else { e->setAttribute("dayofweek", i_dayofweek); e->setAttribute("week", i_dayofweek); } e->setAttribute("frequency", i_frequency); } YearlyRecurrence::YearlyRecurrence(Budget *parent_budget) : Recurrence(parent_budget) { i_dayofmonth = 1; i_month = 1; i_frequency = 1; i_week = 1; i_dayofweek = -1; i_dayofyear = -1; wh_weekendhandling = WEEKEND_HANDLING_NONE; } YearlyRecurrence::YearlyRecurrence(Budget *parent_budget, QDomElement *e, bool *valid) : Recurrence(parent_budget, e, valid) { i_frequency = e->attribute("frequency", "1").toInt(); i_dayofmonth = e->attribute("dayofmonth", "1").toInt(); i_month = e->attribute("month", "1").toInt(); i_week = e->attribute("week", "1").toInt(); i_dayofweek = e->attribute("dayofweek", "-1").toInt(); i_dayofyear = e->attribute("dayofyear", "-1").toInt(); wh_weekendhandling = (WeekendHandling) e->attribute("weekendhandling", "0").toInt(); if(valid && (i_dayofmonth > 31 || i_frequency < 1 || i_week > 5 || i_week < -4 || i_dayofweek > 7)) { *valid = false; } updateDates(); } YearlyRecurrence::YearlyRecurrence(const YearlyRecurrence *rec) : Recurrence(rec), i_frequency(rec->frequency()), i_dayofmonth(rec->dayOfMonth()), i_month(rec->month()), i_week(rec->week()), i_dayofweek(rec->dayOfWeek()), i_dayofyear(rec->dayOfYear()), wh_weekendhandling(rec->weekendHandling()) {} YearlyRecurrence::~YearlyRecurrence() {} Recurrence *YearlyRecurrence::copy() const {return new YearlyRecurrence(this);} QDate YearlyRecurrence::nextOccurrence(const QDate &date, bool include_equals) const { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); if(!include_equals) { if(date < startDate()) return firstOccurrence(); } else { if(date <= startDate()) return firstOccurrence(); } QDate nextdate = date; if(!include_equals) nextdate = calSys->addDays(nextdate, 1); if(!endDate().isNull() && nextdate > endDate()) return QDate(); if(calSys->year(nextdate) == calSys->year(startDate())) { nextdate = calSys->addYears(nextdate, i_frequency); calSys->setYMD(nextdate, calSys->year(nextdate), 1, 1); } else if(i_frequency != 1) { int i = (calSys->year(nextdate) - calSys->year(startDate())) % i_frequency; if(i != 0) { nextdate = calSys->addYears(nextdate, i_frequency - i); calSys->setYMD(nextdate, calSys->year(nextdate), 1, 1); } } if(i_dayofyear > 0) { if(calSys->dayOfYear(nextdate) > i_dayofyear) { nextdate = calSys->addYears(nextdate, i_frequency); } if(i_dayofyear > calSys->daysInYear(nextdate)) { int i = 10; do { if(i == 0) return QDate(); nextdate = calSys->addYears(nextdate, i_frequency); i--; } while(i_dayofyear > calSys->daysInYear(nextdate)); } nextdate = calSys->addDays(nextdate, i_dayofyear - calSys->dayOfYear(nextdate)); } else { int day = i_dayofmonth; if(i_dayofweek > 0) day = get_day_in_month(calSys->year(nextdate), i_month, i_week, i_dayofweek); if(day == 0 || calSys->month(nextdate) > i_month || (calSys->month(nextdate) == i_month && calSys->day(nextdate) > day)) { do { nextdate = calSys->addYears(nextdate, i_frequency); day = get_day_in_month(calSys->year(nextdate), i_month, i_week, i_dayofweek); if(!endDate().isNull() && calSys->year(nextdate) > calSys->year(endDate())) return QDate(); } while(day == 0); } if(i_dayofweek <= 0) { calSys->setYMD(nextdate, calSys->year(nextdate), i_month, 1); if(day > calSys->daysInMonth(nextdate)) { int i = 10; do { if(i == 0) return QDate(); nextdate = calSys->addYears(nextdate, i_frequency); calSys->setYMD(nextdate, calSys->year(nextdate), i_month, 1); i--; } while(day > calSys->daysInMonth(nextdate)); } } calSys->setYMD(nextdate, calSys->year(nextdate), i_month, day); } if(!endDate().isNull() && nextdate > endDate()) return QDate(); if(hasException(nextdate)) return nextOccurrence(nextdate); return nextdate; } QDate YearlyRecurrence::prevOccurrence(const QDate &date, bool include_equals) const { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); if(!include_equals) { if(date > endDate()) return lastOccurrence(); } QDate prevdate = date; if(!include_equals) prevdate = calSys->addDays(prevdate, -1); if(prevdate < startDate()) return QDate(); if(prevdate == startDate()) return startDate(); if(i_frequency != 1) { int i = (calSys->year(prevdate) - calSys->year(startDate())) % i_frequency; if(i != 0) { prevdate = calSys->addYears(prevdate, - i); } } if(calSys->year(prevdate) == calSys->year(startDate())) return startDate(); if(i_dayofyear > 0) { if(calSys->dayOfYear(prevdate) < i_dayofyear) { prevdate = calSys->addYears(prevdate, -i_frequency); if(calSys->year(prevdate) == calSys->year(startDate())) return startDate(); } if(i_dayofyear > calSys->daysInYear(prevdate)) { do { prevdate = calSys->addYears(prevdate, -i_frequency); if(calSys->year(prevdate) <= calSys->year(startDate())) return startDate(); } while(i_dayofyear > calSys->daysInYear(prevdate)); } prevdate = calSys->addDays(prevdate, i_dayofyear - calSys->dayOfYear(prevdate)); } else { int day = i_dayofmonth; if(i_dayofweek > 0) day = get_day_in_month(calSys->year(prevdate), i_month, i_week, i_dayofweek); if(day <= 0 || calSys->month(prevdate) < i_month || (calSys->month(prevdate) == i_month && calSys->day(prevdate) < day)) { do { prevdate = calSys->addYears(prevdate, -i_frequency); if(i_dayofweek > 0) day = get_day_in_month(calSys->year(prevdate), i_month, i_week, i_dayofweek); if(calSys->year(prevdate) == calSys->year(startDate())) return startDate(); } while(day <= 0); } if(i_dayofweek <= 0) { calSys->setYMD(prevdate, calSys->year(prevdate), i_month, 1); if(day > calSys->daysInMonth(prevdate)) { do { prevdate = calSys->addYears(prevdate, -i_frequency); calSys->setYMD(prevdate, calSys->year(prevdate), i_month, 1); if(calSys->year(prevdate) <= calSys->year(startDate())) return startDate(); } while(day > calSys->daysInMonth(prevdate)); } } calSys->setYMD(prevdate, calSys->year(prevdate), i_month, day); } if(prevdate < startDate()) return QDate(); if(hasException(prevdate)) return prevOccurrence(prevdate); return prevdate; } RecurrenceType YearlyRecurrence::type() const { return RECURRENCE_TYPE_YEARLY; } int YearlyRecurrence::frequency() const { return i_frequency; } int YearlyRecurrence::dayOfYear() const { return i_dayofyear; } int YearlyRecurrence::month() const { return i_month; } int YearlyRecurrence::dayOfMonth() const { return i_dayofmonth; } WeekendHandling YearlyRecurrence::weekendHandling() const { return wh_weekendhandling; } int YearlyRecurrence::week() const { return i_week; } int YearlyRecurrence::dayOfWeek() const { return i_dayofweek; } void YearlyRecurrence::setOnDayOfWeek(const QDate &new_start_date, const QDate &new_end_date, int new_month, int new_dayofweek, int new_week, int new_frequency, int occurrences) { i_dayofyear = -1; wh_weekendhandling = WEEKEND_HANDLING_NONE; i_dayofweek = new_dayofweek; i_week = new_week; i_month = new_month; i_frequency = new_frequency; setStartDate(new_start_date); if(occurrences <= 0) setEndDate(new_end_date); else setFixedOccurrenceCount(occurrences); } void YearlyRecurrence::setOnDayOfMonth(const QDate &new_start_date, const QDate &new_end_date, int new_month, int new_day, WeekendHandling new_weekendhandling, int new_frequency, int occurrences) { i_dayofweek = -1; i_dayofyear = -1; i_dayofmonth = new_day; i_month = new_month; i_frequency = new_frequency; wh_weekendhandling = new_weekendhandling; setStartDate(new_start_date); if(occurrences <= 0) setEndDate(new_end_date); else setFixedOccurrenceCount(occurrences); } void YearlyRecurrence::setOnDayOfYear(const QDate &new_start_date, const QDate &new_end_date, int new_day, WeekendHandling new_weekendhandling, int new_frequency, int occurrences) { i_dayofyear = new_day; wh_weekendhandling = new_weekendhandling; i_frequency = new_frequency; setStartDate(new_start_date); if(occurrences <= 0) setEndDate(new_end_date); else setFixedOccurrenceCount(occurrences); } void YearlyRecurrence::save(QDomElement *e) const { Recurrence::save(e); if(i_dayofyear > 0) { e->setAttribute("dayofyear", i_dayofweek); e->setAttribute("weekendhandling", wh_weekendhandling); } else if(i_dayofweek > 0) { e->setAttribute("month", i_month); e->setAttribute("dayofweek", i_dayofweek); e->setAttribute("week", i_dayofweek); } else { e->setAttribute("month", i_month); e->setAttribute("dayofmonth", i_dayofmonth); e->setAttribute("weekendhandling", wh_weekendhandling); } e->setAttribute("frequency", i_frequency); } eqonomize-0.6/src/recurrence.h0000644000175000017500000001573311106577054015435 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef RECURRENCE_H #define RECURRENCE_H #include #include #include class Budget; class QDomElement; typedef enum { RECURRENCE_TYPE_DAILY, RECURRENCE_TYPE_WEEKLY, RECURRENCE_TYPE_MONTHLY, RECURRENCE_TYPE_YEARLY } RecurrenceType; class Recurrence { protected: Budget *o_budget; QDate d_startdate, d_enddate; int i_count; public: Recurrence(Budget *parent_budget); Recurrence(Budget *parent_budget, QDomElement *e, bool *valid); Recurrence(const Recurrence *rec); virtual ~Recurrence(); virtual Recurrence *copy() const = 0; void updateDates(); virtual QDate nextOccurrence(const QDate &date, bool include_equals = false) const = 0; virtual QDate prevOccurrence(const QDate &date, bool include_equals = false) const = 0; QDate firstOccurrence() const; QDate lastOccurrence() const; int countOccurrences(const QDate &startdate, const QDate &enddate) const; int countOccurrences(const QDate &enddate) const; bool removeOccurrence(const QDate &date); const QDate &endDate() const; const QDate &startDate() const; int fixedOccurrenceCount() const; void setFixedOccurrenceCount(int new_count); void setEndDate(const QDate &new_end_date); void setStartDate(const QDate &new_start_date); virtual RecurrenceType type() const = 0; void addException(const QDate &date); int findException(const QDate &date) const; bool hasException(const QDate &date) const; bool removeException(const QDate &date); void clearExceptions(); Budget *budget() const; virtual void save(QDomElement *e) const; QVector exceptions; }; class DailyRecurrence : public Recurrence { protected: int i_frequency; public: DailyRecurrence(Budget *parent_budget); DailyRecurrence(Budget *parent_budget, QDomElement *e, bool *valid); DailyRecurrence(const DailyRecurrence *rec); virtual ~DailyRecurrence(); Recurrence *copy() const; QDate nextOccurrence(const QDate &date, bool include_equals = false) const; QDate prevOccurrence(const QDate &date, bool include_equals = false) const; RecurrenceType type() const; int frequency() const; void set(const QDate &new_start_date, const QDate &new_end_date, int new_frequency, int occurrences = -1); void save(QDomElement *e) const; }; class WeeklyRecurrence : public Recurrence { protected: int i_frequency; bool b_daysofweek[7]; public: WeeklyRecurrence(Budget *parent_budget); WeeklyRecurrence(Budget *parent_budget, QDomElement *e, bool *valid); WeeklyRecurrence(const WeeklyRecurrence *rec); virtual ~WeeklyRecurrence(); Recurrence *copy() const; QDate nextOccurrence(const QDate &date, bool include_equals = false) const; QDate prevOccurrence(const QDate &date, bool include_equals = false) const; RecurrenceType type() const; int frequency() const; bool dayOfWeek(int i) const; void set(const QDate &new_start_date, const QDate &new_end_date, bool d1, bool d2, bool d3, bool d4, bool d5, bool d6, bool d7, int new_frequency, int occurrences = -1); void save(QDomElement *e) const; }; typedef enum { WEEKEND_HANDLING_NONE = 0, WEEKEND_HANDLING_BEFORE = 1, WEEKEND_HANDLING_AFTER = 2 } WeekendHandling; class MonthlyRecurrence : public Recurrence { protected: int i_frequency; int i_day; int i_week; int i_dayofweek; WeekendHandling wh_weekendhandling; public: MonthlyRecurrence(Budget *parent_budget); MonthlyRecurrence(Budget *parent_budget, QDomElement *e, bool *valid); MonthlyRecurrence(const MonthlyRecurrence *rec); virtual ~MonthlyRecurrence(); Recurrence *copy() const; QDate nextOccurrence(const QDate &date, bool include_equals = false) const; QDate prevOccurrence(const QDate &date, bool include_equals = false) const; RecurrenceType type() const; int frequency() const; int day() const; WeekendHandling weekendHandling() const; int week() const; int dayOfWeek() const; void setOnDayOfWeek(const QDate &new_start_date, const QDate &new_end_date, int new_dayofweek, int new_week, int new_frequency, int occurrences = -1); void setOnDay(const QDate &new_start_date, const QDate &new_end_date, int new_day, WeekendHandling new_weekendhandling, int new_frequency, int occurrences = -1); void save(QDomElement *e) const; }; class YearlyRecurrence : public Recurrence { protected: int i_frequency; int i_dayofmonth; int i_month; int i_week; int i_dayofweek; int i_dayofyear; WeekendHandling wh_weekendhandling; public: YearlyRecurrence(Budget *parent_budget); YearlyRecurrence(Budget *parent_budget, QDomElement *e, bool *valid); YearlyRecurrence(const YearlyRecurrence *rec); virtual ~YearlyRecurrence(); Recurrence *copy() const; QDate nextOccurrence(const QDate &date, bool include_equals = false) const; QDate prevOccurrence(const QDate &date, bool include_equals = false) const; RecurrenceType type() const; int frequency() const; int month() const; int dayOfMonth() const; int week() const; int dayOfWeek() const; int dayOfYear() const; WeekendHandling weekendHandling() const; void setOnDayOfWeek(const QDate &new_start_date, const QDate &new_end_date, int new_month, int new_dayofweek, int new_week, int new_frequency, int occurrences = -1); void setOnDayOfMonth(const QDate &new_start_date, const QDate &new_end_date, int new_month, int new_day, WeekendHandling new_weekendhandling, int new_frequency, int occurrences = -1); void setOnDayOfYear(const QDate &new_start_date, const QDate &new_end_date, int new_day, WeekendHandling new_weekendhandling, int new_frequency, int occurrences = -1); void save(QDomElement *e) const; }; #endif eqonomize-0.6/src/recurrenceeditwidget.cpp0000644000175000017500000007710511106753462020042 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "recurrenceeditwidget.h" #include "budget.h" #include "recurrence.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "kdateedit.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include EditExceptionsDialog::EditExceptionsDialog(QWidget *parent) : KDialog(parent, 0) { setCaption(i18n("Edit Exceptions")); setButtons(KDialog::Ok | KDialog::Cancel); setDefaultButton(KDialog::Cancel); setModal(true); setMainWidget(new QWidget(this)); QHBoxLayout *exceptionsLayout = new QHBoxLayout(mainWidget()); exceptionsList = new QListWidget(mainWidget()); exceptionsLayout->addWidget(exceptionsList); QVBoxLayout *buttonsLayout = new QVBoxLayout(); exceptionsLayout->addLayout(buttonsLayout); dateEdit = new KDateEdit(mainWidget()); dateEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); dateEdit->setDate(QDate::currentDate()); buttonsLayout->addWidget(dateEdit); addButton = new KPushButton(KStandardGuiItem::add(), mainWidget()); buttonsLayout->addWidget(addButton); changeButton = new KPushButton(KStandardGuiItem::apply(), mainWidget()); changeButton->setEnabled(false); buttonsLayout->addWidget(changeButton); deleteButton = new KPushButton(KStandardGuiItem::del(), mainWidget()); deleteButton->setEnabled(false); buttonsLayout->addWidget(deleteButton); buttonsLayout->addStretch(1); connect(exceptionsList, SIGNAL(itemSelectionChanged()), this, SLOT(onSelectionChanged())); connect(addButton, SIGNAL(clicked()), this, SLOT(addException())); connect(changeButton, SIGNAL(clicked()), this, SLOT(changeException())); connect(deleteButton, SIGNAL(clicked()), this, SLOT(deleteException())); } EditExceptionsDialog::~EditExceptionsDialog() { } void EditExceptionsDialog::setRecurrence(Recurrence *rec) { exceptionsList->clear(); if(rec) { for(QVector::size_type i = 0; i < rec->exceptions.size(); i++) { exceptionsList->addItem(KGlobal::locale()->formatDate(rec->exceptions[i], KLocale::ShortDate)); } exceptionsList->sortItems(); } saveValues(); } void EditExceptionsDialog::modifyExceptions(Recurrence *rec) { for(int i = 0; i < exceptionsList->count(); i++) { rec->addException(KGlobal::locale()->readDate(exceptionsList->item(i)->text())); } } bool EditExceptionsDialog::validValues() { return true; } void EditExceptionsDialog::saveValues() { savedExceptions.clear(); for(int i = 0; i < exceptionsList->count(); i++) { savedExceptions.append(exceptionsList->item(i)->text()); } } void EditExceptionsDialog::restoreValues() { exceptionsList->clear(); exceptionsList->addItems(savedExceptions); } void EditExceptionsDialog::slotButtonClicked(int button) { if(button == KDialog::Ok) { if(!validValues()) return; saveValues(); } else if(button == KDialog::Cancel) { restoreValues(); } KDialog::slotButtonClicked(button); } void EditExceptionsDialog::onSelectionChanged() { QList list = exceptionsList->selectedItems(); if(!list.isEmpty()) { changeButton->setEnabled(true); deleteButton->setEnabled(true); dateEdit->setDate(KGlobal::locale()->readDate(list.first()->text())); } else { changeButton->setEnabled(false); deleteButton->setEnabled(false); } } void EditExceptionsDialog::addException() { QDate date = dateEdit->date(); if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); return; } QString sdate = KGlobal::locale()->formatDate(date, KLocale::ShortDate); QList list = exceptionsList->findItems(sdate, Qt::MatchExactly); if(list.isEmpty()) { exceptionsList->addItem(sdate); exceptionsList->sortItems(); } } void EditExceptionsDialog::changeException() { QList list = exceptionsList->selectedItems(); if(list.isEmpty()) return; QDate date = dateEdit->date(); if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); return; } QString sdate = KGlobal::locale()->formatDate(date, KLocale::ShortDate); list.first()->setText(sdate); exceptionsList->sortItems(); } void EditExceptionsDialog::deleteException() { QList list = exceptionsList->selectedItems(); if(list.isEmpty()) return; delete list.first(); } EditRangeDialog::EditRangeDialog(const QDate &startdate, QWidget *parent) : KDialog(parent, 0), date(startdate) { setCaption(i18n("Edit Recurrence Range")); setButtons(KDialog::Ok | KDialog::Cancel); setDefaultButton(KDialog::Cancel); setModal(true); setMainWidget(new QWidget(this)); QGridLayout *rangeLayout = new QGridLayout(mainWidget()); startLabel = new QLabel(i18n("Begins on: %1").arg(KGlobal::locale()->formatDate(startdate)), mainWidget()); rangeLayout->addWidget(startLabel, 0, 0, 1, 3); rangeButtonGroup = new QButtonGroup(this); foreverButton = new QRadioButton(i18n("No ending date"), mainWidget()); rangeButtonGroup->addButton(foreverButton); rangeLayout->addWidget(foreverButton, 1, 0, 1, 3); fixedCountButton = new QRadioButton(i18n("End after"), mainWidget()); rangeButtonGroup->addButton(fixedCountButton); rangeLayout->addWidget(fixedCountButton, 2, 0); fixedCountEdit = new QSpinBox(mainWidget()); fixedCountEdit->setRange(1, 9999); rangeLayout->addWidget(fixedCountEdit, 2, 1); rangeLayout ->addWidget(new QLabel(i18n("occurrence(s)"), mainWidget()), 2, 2); endDateButton = new QRadioButton(i18n("End on"), mainWidget()); rangeButtonGroup->addButton(endDateButton); rangeLayout->addWidget(endDateButton, 3, 0); endDateEdit = new KDateEdit(mainWidget()); endDateEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); rangeLayout->addWidget(endDateEdit, 3, 1, 1, 2); setRecurrence(NULL); connect(fixedCountButton, SIGNAL(toggled(bool)), fixedCountEdit, SLOT(setEnabled(bool))); connect(endDateButton, SIGNAL(toggled(bool)), endDateEdit, SLOT(setEnabled(bool))); } EditRangeDialog::~EditRangeDialog() { } void EditRangeDialog::setStartDate(const QDate &startdate) { startLabel->setText(i18n("Begins on: %1").arg(KGlobal::locale()->formatDate(startdate))); date = startdate; if(!endDateButton->isChecked() && date > endDateEdit->date()) { endDateEdit->setDate(date); } } void EditRangeDialog::setRecurrence(Recurrence *rec) { if(rec && rec->fixedOccurrenceCount() > 0) { fixedCountButton->setChecked(true); fixedCountEdit->setValue(rec->fixedOccurrenceCount()); endDateEdit->setEnabled(false); fixedCountEdit->setEnabled(true); endDateEdit->setDate(date); } else if(rec && !rec->endDate().isNull()) { endDateButton->setChecked(true); endDateEdit->setDate(rec->endDate()); endDateEdit->setEnabled(true); fixedCountEdit->setEnabled(false); fixedCountEdit->setValue(1); } else { foreverButton->setChecked(true); endDateEdit->setEnabled(false); fixedCountEdit->setEnabled(false); endDateEdit->setDate(date); fixedCountEdit->setValue(1); } saveValues(); } int EditRangeDialog::fixedCount() { if(fixedCountButton->isChecked()) { return fixedCountEdit->value(); } return -1; } QDate EditRangeDialog::endDate() { if(endDateButton->isChecked()) { return endDateEdit->date(); } return QDate(); } void EditRangeDialog::slotButtonClicked(int button) { if(button == KDialog::Ok) { if(!validValues()) return; saveValues(); } else if(button == KDialog::Cancel) { restoreValues(); } KDialog::slotButtonClicked(button); } void EditRangeDialog::saveValues() { fixedCountEdit_value = fixedCountEdit->value(); endDateEdit_value = endDateEdit->date(); if(foreverButton->isChecked()) checkedButton = foreverButton; else if(endDateButton->isChecked()) checkedButton = endDateButton; else checkedButton = fixedCountButton; } void EditRangeDialog::restoreValues() { fixedCountEdit->setValue(fixedCountEdit_value); endDateEdit->setDate(endDateEdit_value); checkedButton->setChecked(true); } bool EditRangeDialog::validValues() { if(endDateButton->isChecked()) { if(!endDateEdit->date().isValid()) { KMessageBox::error(this, i18n("Invalid date.")); endDateEdit->setFocus(); return false; } if(endDateEdit->date() < date) { KMessageBox::error(this, i18n("End date before start date.")); endDateEdit->setFocus(); return false; } } return true; } RecurrenceEditWidget::RecurrenceEditWidget(const QDate &startdate, Budget *budg, QWidget *parent) : QWidget(parent), date(startdate), budget(budg) { QVBoxLayout *recurrenceLayout = new QVBoxLayout(this); recurrenceLayout->setContentsMargins(0, 0, 0, 0); recurrenceButton = new QCheckBox(i18n("Enable recurrance"), this); recurrenceLayout->addWidget(recurrenceButton); ruleGroup = new QGroupBox(i18n("Recurrence Rule"), this); QVBoxLayout *ruleGroup_layout = new QVBoxLayout(ruleGroup); typeCombo = new QComboBox(ruleGroup); typeCombo->setEditable(false); typeCombo->addItem(i18n("Daily")); typeCombo->addItem(i18n("Weekly")); typeCombo->addItem(i18n("Monthly")); typeCombo->addItem(i18n("Yearly")); typeCombo->setCurrentIndex(2); ruleGroup_layout->addWidget(typeCombo); ruleStack = new QStackedWidget(ruleGroup); ruleGroup_layout->addWidget(ruleStack); QWidget *dailyRuleWidget = new QWidget(ruleStack); ruleStack->addWidget(dailyRuleWidget); QWidget *weeklyRuleWidget = new QWidget(ruleStack); ruleStack->addWidget(weeklyRuleWidget); QWidget *monthlyRuleWidget = new QWidget(ruleStack); ruleStack->addWidget(monthlyRuleWidget); QWidget *yearlyRuleWidget = new QWidget(ruleStack); ruleStack->addWidget(yearlyRuleWidget); QVBoxLayout *dailyRuleLayout = new QVBoxLayout(dailyRuleWidget); QHBoxLayout *dailyFrequencyLayout = new QHBoxLayout(); dailyRuleLayout->addLayout(dailyFrequencyLayout); dailyFrequencyLayout->addWidget(new QLabel(i18n("Recur every"), dailyRuleWidget)); dailyFrequencyEdit = new QSpinBox(dailyRuleWidget); dailyFrequencyEdit->setRange(1, 9999); dailyFrequencyLayout->addWidget(dailyFrequencyEdit); dailyFrequencyLayout->addWidget(new QLabel(i18n("day(s)"), dailyRuleWidget)); dailyFrequencyLayout->addStretch(1); dailyRuleLayout->addStretch(1); QVBoxLayout *weeklyRuleLayout = new QVBoxLayout(weeklyRuleWidget); QHBoxLayout *weeklyFrequencyLayout = new QHBoxLayout(); weeklyRuleLayout->addLayout(weeklyFrequencyLayout); weeklyFrequencyLayout->addWidget(new QLabel(i18n("Recur every"), weeklyRuleWidget)); weeklyFrequencyEdit = new QSpinBox(weeklyRuleWidget); weeklyFrequencyEdit->setRange(1, 9999); weeklyFrequencyLayout->addWidget(weeklyFrequencyEdit); weeklyFrequencyLayout->addWidget(new QLabel(i18n("week(s) on:"), weeklyRuleWidget)); weeklyFrequencyLayout->addStretch(1); QHBoxLayout *weeklyDaysLayout = new QHBoxLayout(); weeklyRuleLayout->addLayout(weeklyDaysLayout); int weekStart=KGlobal::locale()->weekStartDay(); const KCalendarSystem *calSys = KGlobal::locale()->calendar(); for(int i = 0; i < 7; ++i ) { weeklyButtons[i] = new QCheckBox(calSys->weekDayName(i + 1, KCalendarSystem::ShortDayName), weeklyRuleWidget); } for(int i = weekStart - 1; i < 7; ++i ) { weeklyDaysLayout->addWidget(weeklyButtons[i]); } for(int i = 0; i < weekStart - 1; ++i ) { weeklyDaysLayout->addWidget(weeklyButtons[i]); } weeklyRuleLayout->addStretch(1); QVBoxLayout *monthlyRuleLayout = new QVBoxLayout(monthlyRuleWidget); QHBoxLayout *monthlyFrequencyLayout = new QHBoxLayout(); monthlyRuleLayout->addLayout(monthlyFrequencyLayout); monthlyFrequencyLayout->addWidget(new QLabel(i18n("Recur every"), monthlyRuleWidget)); monthlyFrequencyEdit = new QSpinBox(monthlyRuleWidget); monthlyFrequencyEdit->setRange(1, 9999); monthlyFrequencyLayout->addWidget(monthlyFrequencyEdit); monthlyFrequencyLayout->addWidget(new QLabel(i18n("month(s), after the start month"), monthlyRuleWidget)); monthlyFrequencyLayout->addStretch(1); QButtonGroup *monthlyButtonGroup = new QButtonGroup(this); QGridLayout *monthlyButtonLayout = new QGridLayout(); monthlyRuleLayout->addLayout(monthlyButtonLayout, 1); monthlyOnDayButton = new QRadioButton(i18n("Recur on the"), monthlyRuleWidget); monthlyOnDayButton->setChecked(true); monthlyButtonGroup->addButton(monthlyOnDayButton); monthlyButtonLayout->addWidget(monthlyOnDayButton, 0, 0); QBoxLayout *monthlyDayLayout = new QHBoxLayout(); monthlyDayCombo = new QComboBox(monthlyRuleWidget); monthlyDayCombo->addItem(i18n("1st")); monthlyDayCombo->addItem(i18n("2nd")); monthlyDayCombo->addItem(i18n("3rd")); monthlyDayCombo->addItem(i18n("4th")); monthlyDayCombo->addItem(i18n("5th")); monthlyDayCombo->addItem(i18n("6th")); monthlyDayCombo->addItem(i18n("7th")); monthlyDayCombo->addItem(i18n("8th")); monthlyDayCombo->addItem(i18n("9th")); monthlyDayCombo->addItem(i18n("10th")); monthlyDayCombo->addItem(i18n("11th")); monthlyDayCombo->addItem(i18n("12th")); monthlyDayCombo->addItem(i18n("13th")); monthlyDayCombo->addItem(i18n("14th")); monthlyDayCombo->addItem(i18n("15th")); monthlyDayCombo->addItem(i18n("16th")); monthlyDayCombo->addItem(i18n("17th")); monthlyDayCombo->addItem(i18n("18th")); monthlyDayCombo->addItem(i18n("19th")); monthlyDayCombo->addItem(i18n("20th")); monthlyDayCombo->addItem(i18n("21st")); monthlyDayCombo->addItem(i18n("22nd")); monthlyDayCombo->addItem(i18n("23rd")); monthlyDayCombo->addItem(i18n("24th")); monthlyDayCombo->addItem(i18n("25th")); monthlyDayCombo->addItem(i18n("26th")); monthlyDayCombo->addItem(i18n("27th")); monthlyDayCombo->addItem(i18n("28th")); monthlyDayCombo->addItem(i18n("29th")); monthlyDayCombo->addItem(i18n("30th")); monthlyDayCombo->addItem(i18n("31st")); monthlyDayCombo->addItem(i18n("Last")); monthlyDayCombo->addItem(i18n("2nd Last")); monthlyDayCombo->addItem(i18n("3rd Last")); monthlyDayCombo->addItem(i18n("4th Last")); monthlyDayCombo->addItem(i18n("5th Last")); monthlyDayCombo->setMaxVisibleItems(7); monthlyDayLayout->addWidget(monthlyDayCombo); monthlyDayLayout->addWidget(new QLabel(i18n("day"), monthlyRuleWidget)); monthlyWeekendCombo = new QComboBox(monthlyRuleWidget); monthlyWeekendCombo->addItem(i18n("possibly on weekend")); monthlyWeekendCombo->addItem(i18n("but before weekend")); monthlyWeekendCombo->addItem(i18n("but after weekend")); monthlyDayLayout->addWidget(monthlyWeekendCombo); monthlyDayLayout->addStretch(1); monthlyButtonLayout->addLayout(monthlyDayLayout, 0, 1); monthlyOnDayOfWeekButton = new QRadioButton(i18n("Recur on the"), monthlyRuleWidget); monthlyButtonGroup->addButton(monthlyOnDayOfWeekButton); monthlyButtonLayout->addWidget(monthlyOnDayOfWeekButton, 1, 0); QBoxLayout *monthlyWeekLayout = new QHBoxLayout(); monthlyWeekCombo = new QComboBox(monthlyRuleWidget); monthlyWeekCombo->addItem(i18n("1st")); monthlyWeekCombo->addItem(i18n("2nd")); monthlyWeekCombo->addItem(i18n("3rd")); monthlyWeekCombo->addItem(i18n("4th")); monthlyWeekCombo->addItem(i18n("5th")); monthlyWeekCombo->addItem(i18n("Last")); monthlyWeekCombo->addItem(i18n("2nd Last")); monthlyWeekCombo->addItem(i18n("3rd Last")); monthlyWeekCombo->addItem(i18n("4th Last")); monthlyWeekCombo->addItem(i18n("5th Last")); monthlyWeekLayout->addWidget(monthlyWeekCombo); monthlyDayOfWeekCombo = new QComboBox(monthlyRuleWidget); monthlyWeekLayout->addWidget(monthlyDayOfWeekCombo); monthlyWeekLayout->addStretch(1); monthlyButtonLayout->addLayout(monthlyWeekLayout, 1, 1); monthlyRuleLayout->addStretch(1); QVBoxLayout *yearlyRuleLayout = new QVBoxLayout(yearlyRuleWidget); QHBoxLayout *yearlyFrequencyLayout = new QHBoxLayout(); yearlyRuleLayout->addLayout(yearlyFrequencyLayout); yearlyFrequencyLayout->addWidget(new QLabel(i18n("Recur every"), yearlyRuleWidget)); yearlyFrequencyEdit = new QSpinBox(yearlyRuleWidget); yearlyFrequencyEdit->setRange(1, 9999); yearlyFrequencyLayout->addWidget(yearlyFrequencyEdit); yearlyFrequencyLayout->addWidget(new QLabel(i18n("year(s), after the start year"), yearlyRuleWidget)); yearlyFrequencyLayout->addStretch(1); QButtonGroup *yearlyButtonGroup = new QButtonGroup(this); QGridLayout *yearlyButtonLayout = new QGridLayout(); yearlyRuleLayout->addLayout(yearlyButtonLayout, 1); yearlyOnDayOfMonthButton = new QRadioButton(i18nc("part before XXX of 'Recur on day XXX of month YYY'", "Recur on day"), yearlyRuleWidget); yearlyButtonGroup->addButton(yearlyOnDayOfMonthButton); yearlyOnDayOfMonthButton->setChecked(true); yearlyButtonLayout->addWidget(yearlyOnDayOfMonthButton, 0, 0); QBoxLayout *yearlyMonthLayout = new QHBoxLayout(); yearlyDayOfMonthEdit = new QSpinBox(yearlyRuleWidget); yearlyDayOfMonthEdit->setRange(1, 31); yearlyMonthLayout->addWidget(yearlyDayOfMonthEdit); yearlyMonthLayout->addWidget(new QLabel(i18nc("part between XXX and YYY of 'Recur on day XXX of month YYY'", "of"), yearlyRuleWidget)); yearlyMonthCombo = new QComboBox(yearlyRuleWidget); yearlyMonthLayout->addWidget(yearlyMonthCombo); yearlyWeekendCombo_month = new QComboBox(yearlyRuleWidget); yearlyWeekendCombo_month->addItem(i18n("possibly on weekend")); yearlyWeekendCombo_month->addItem(i18n("but before weekend")); yearlyWeekendCombo_month->addItem(i18n("but after weekend")); yearlyMonthLayout->addWidget(yearlyWeekendCombo_month); yearlyMonthLayout->addStretch(1); yearlyButtonLayout->addLayout(yearlyMonthLayout, 0, 1); yearlyOnDayOfWeekButton = new QRadioButton(i18nc("Part before NNN in 'Recur on the NNN. WEEKDAY of MONTH'", "On the"), yearlyRuleWidget); yearlyButtonGroup->addButton(yearlyOnDayOfWeekButton); yearlyButtonLayout->addWidget(yearlyOnDayOfWeekButton, 1, 0); QBoxLayout *yearlyWeekLayout = new QHBoxLayout(); yearlyWeekCombo = new QComboBox(yearlyRuleWidget); yearlyWeekCombo->addItem(i18n("1st")); yearlyWeekCombo->addItem(i18n("2nd")); yearlyWeekCombo->addItem(i18n("3rd")); yearlyWeekCombo->addItem(i18n("4th")); yearlyWeekCombo->addItem(i18n("5th")); yearlyWeekCombo->addItem(i18n("Last")); yearlyWeekCombo->addItem(i18n("2nd Last")); yearlyWeekCombo->addItem(i18n("3rd Last")); yearlyWeekCombo->addItem(i18n("4th Last")); yearlyWeekCombo->addItem(i18n("5th Last")); yearlyWeekLayout->addWidget(yearlyWeekCombo); yearlyDayOfWeekCombo = new QComboBox(yearlyRuleWidget); yearlyWeekLayout->addWidget(yearlyDayOfWeekCombo); yearlyWeekLayout->addWidget(new QLabel(i18nc("part between WEEKDAY and MONTH in 'Recur on NNN. WEEKDAY of MONTH'", "of"), yearlyRuleWidget)); yearlyMonthCombo_week = new QComboBox(yearlyRuleWidget); yearlyWeekLayout->addWidget(yearlyMonthCombo_week); yearlyWeekLayout->addStretch(1); yearlyButtonLayout->addLayout(yearlyWeekLayout, 1, 1); yearlyOnDayOfYearButton = new QRadioButton(i18n("Recur on day #"), yearlyRuleWidget); yearlyButtonGroup->addButton(yearlyOnDayOfYearButton); yearlyButtonLayout->addWidget(yearlyOnDayOfYearButton, 2, 0); QBoxLayout *yearlyDayLayout = new QHBoxLayout(); yearlyDayOfYearEdit = new QSpinBox(yearlyRuleWidget); yearlyDayOfYearEdit->setRange(1, 366); yearlyDayLayout->addWidget(yearlyDayOfYearEdit); yearlyDayLayout->addWidget(new QLabel(i18nc("part after NNN of 'Recur on day #NNN of the year'", " of the year"), yearlyRuleWidget)); yearlyWeekendCombo_day = new QComboBox(yearlyRuleWidget); yearlyWeekendCombo_day->addItem(i18n("possibly on weekend")); yearlyWeekendCombo_day->addItem(i18n("but before weekend")); yearlyWeekendCombo_day->addItem(i18n("but after weekend")); yearlyDayLayout->addWidget(yearlyWeekendCombo_day); yearlyDayLayout->addStretch(1); yearlyButtonLayout->addLayout(yearlyDayLayout, 2, 1); yearlyRuleLayout->addStretch(1); recurrenceLayout->addWidget(ruleGroup); QHBoxLayout *buttonLayout = new QHBoxLayout(); recurrenceLayout->addLayout(buttonLayout); rangeButton = new KPushButton(i18n("Range..."), this); buttonLayout->addWidget(rangeButton); exceptionsButton = new KPushButton(i18n("Exceptions..."), this); buttonLayout->addWidget(exceptionsButton); recurrenceLayout->addStretch(1); ruleStack->setCurrentIndex(2); recurrenceButton->setChecked(false); ruleGroup->setEnabled(false); rangeButton->setEnabled(false); exceptionsButton->setEnabled(false); rangeDialog = new EditRangeDialog(date, this); rangeDialog->hide(); exceptionsDialog = new EditExceptionsDialog(this); exceptionsDialog->hide(); int months = 0; QDate date = QDate::currentDate(); for(int i = 0; i < 10; i++) { int months2 = calSys->monthsInYear(date); if(months2 > months) { int year = calSys->year(date); for(int i2 = months + 1; i2 <= months2; i2++) { yearlyMonthCombo_week->addItem(calSys->monthName(i2, year)); yearlyMonthCombo->addItem(calSys->monthName(i2, year)); } months = months2; } date = calSys->addYears(date, 1); } for(int i = 1; i <= 7; i++) { yearlyDayOfWeekCombo->addItem(calSys->weekDayName(i)); monthlyDayOfWeekCombo->addItem(calSys->weekDayName(i)); } connect(typeCombo, SIGNAL(activated(int)), ruleStack, SLOT(setCurrentIndex(int))); connect(rangeButton, SIGNAL(clicked()), this, SLOT(editRange())); connect(exceptionsButton, SIGNAL(clicked()), this, SLOT(editExceptions())); connect(recurrenceButton, SIGNAL(toggled(bool)), ruleGroup, SLOT(setEnabled(bool))); connect(recurrenceButton, SIGNAL(toggled(bool)), rangeButton, SLOT(setEnabled(bool))); connect(recurrenceButton, SIGNAL(toggled(bool)), exceptionsButton, SLOT(setEnabled(bool))); } RecurrenceEditWidget::~RecurrenceEditWidget() { } void RecurrenceEditWidget::editExceptions() { exceptionsDialog->exec(); exceptionsDialog->hide(); } void RecurrenceEditWidget::editRange() { rangeDialog->exec(); rangeDialog->hide(); } void RecurrenceEditWidget::setRecurrence(Recurrence *rec) { rangeDialog->setRecurrence(rec); exceptionsDialog->setRecurrence(rec); if(!rec) { recurrenceButton->setChecked(false); recurrenceButton->setChecked(false); ruleGroup->setEnabled(false); rangeButton->setEnabled(false); exceptionsButton->setEnabled(false); return; } switch(rec->type()) { case RECURRENCE_TYPE_DAILY: { DailyRecurrence *drec = (DailyRecurrence*) rec; dailyFrequencyEdit->setValue(drec->frequency()); typeCombo->setCurrentIndex(0); break; } case RECURRENCE_TYPE_WEEKLY: { WeeklyRecurrence *wrec = (WeeklyRecurrence*) rec; weeklyFrequencyEdit->setValue(wrec->frequency()); for(int i = 0; i < 7; i++) { weeklyButtons[i]->setChecked(wrec->dayOfWeek(i + 1)); } typeCombo->setCurrentIndex(1); break; } case RECURRENCE_TYPE_MONTHLY: { MonthlyRecurrence *mrec = (MonthlyRecurrence*) rec; monthlyFrequencyEdit->setValue(mrec->frequency()); if(mrec->dayOfWeek() > 0) { monthlyOnDayOfWeekButton->setChecked(true); monthlyDayOfWeekCombo->setCurrentIndex(mrec->dayOfWeek() - 1); int week = mrec->week(); if(week <= 0) week = 6 - week; monthlyWeekCombo->setCurrentIndex(week - 1); } else { monthlyOnDayButton->setChecked(true); int day = mrec->day(); if(day <= 0) day = 32 - day; monthlyDayCombo->setCurrentIndex(day - 1); monthlyWeekendCombo->setCurrentIndex(mrec->weekendHandling()); } typeCombo->setCurrentIndex(2); break; } case RECURRENCE_TYPE_YEARLY: { YearlyRecurrence *yrec = (YearlyRecurrence*) rec; yearlyFrequencyEdit->setValue(yrec->frequency()); if(yrec->dayOfYear() > 0) { yearlyOnDayOfYearButton->setChecked(true); yearlyDayOfYearEdit->setValue(yrec->dayOfYear()); yearlyWeekendCombo_day->setCurrentIndex(yrec->weekendHandling()); yearlyWeekendCombo_month->setCurrentIndex(yrec->weekendHandling()); } else if(yrec->dayOfWeek() > 0) { yearlyOnDayOfWeekButton->setChecked(true); yearlyDayOfWeekCombo->setCurrentIndex(yrec->dayOfWeek() - 1); int week = yrec->week(); if(week <= 0) week = 6 - week; yearlyWeekCombo->setCurrentIndex(week - 1); yearlyMonthCombo_week->setCurrentIndex(yrec->month() - 1); } else { yearlyOnDayOfMonthButton->setChecked(true); yearlyDayOfMonthEdit->setValue(yrec->dayOfMonth()); yearlyMonthCombo->setCurrentIndex(yrec->month() - 1); yearlyWeekendCombo_day->setCurrentIndex(yrec->weekendHandling()); yearlyWeekendCombo_month->setCurrentIndex(yrec->weekendHandling()); } typeCombo->setCurrentIndex(3); break; } } ruleStack->setCurrentIndex(typeCombo->currentIndex()); recurrenceButton->setChecked(true); ruleGroup->setEnabled(true); rangeButton->setEnabled(true); exceptionsButton->setEnabled(true); } Recurrence *RecurrenceEditWidget::createRecurrence() { if(!recurrenceButton->isChecked() || !validValues()) return NULL; switch(typeCombo->currentIndex()) { case 0: { DailyRecurrence *rec = new DailyRecurrence(budget); rec->set(date, rangeDialog->endDate(), dailyFrequencyEdit->value(), rangeDialog->fixedCount()); exceptionsDialog->modifyExceptions(rec); return rec; } case 1: { WeeklyRecurrence *rec = new WeeklyRecurrence(budget); rec->set(date, rangeDialog->endDate(), weeklyButtons[0]->isChecked(), weeklyButtons[1]->isChecked(), weeklyButtons[2]->isChecked(), weeklyButtons[3]->isChecked(), weeklyButtons[4]->isChecked(), weeklyButtons[5]->isChecked(), weeklyButtons[6]->isChecked(), weeklyFrequencyEdit->value(), rangeDialog->fixedCount()); exceptionsDialog->modifyExceptions(rec); return rec; } case 2: { MonthlyRecurrence *rec = new MonthlyRecurrence(budget); if(monthlyOnDayButton->isChecked()) { int day = monthlyDayCombo->currentIndex() + 1; if(day > 31) day = 32 - day; rec->setOnDay(date, rangeDialog->endDate(), day, (WeekendHandling) monthlyWeekendCombo->currentIndex(), monthlyFrequencyEdit->value(), rangeDialog->fixedCount()); } else { int week = monthlyWeekCombo->currentIndex() + 1; if(week > 5) week = 6 - week; rec->setOnDayOfWeek(date, rangeDialog->endDate(), monthlyDayOfWeekCombo->currentIndex() + 1, week, monthlyFrequencyEdit->value(), rangeDialog->fixedCount()); } exceptionsDialog->modifyExceptions(rec); return rec; } case 3: { YearlyRecurrence *rec = new YearlyRecurrence(budget); if(yearlyOnDayOfMonthButton->isChecked()) { rec->setOnDayOfMonth(date, rangeDialog->endDate(), yearlyMonthCombo->currentIndex() + 1, yearlyDayOfMonthEdit->value(), (WeekendHandling) yearlyWeekendCombo_month->currentIndex(), yearlyFrequencyEdit->value(), rangeDialog->fixedCount()); } else if(yearlyOnDayOfWeekButton->isChecked()) { int week = yearlyWeekCombo->currentIndex() + 1; if(week > 5) week = 6 - week; rec->setOnDayOfWeek(date, rangeDialog->endDate(), yearlyMonthCombo_week->currentIndex() + 1, yearlyDayOfWeekCombo->currentIndex() + 1, week, yearlyFrequencyEdit->value(), rangeDialog->fixedCount()); } else { rec->setOnDayOfYear(date, rangeDialog->endDate(), yearlyDayOfYearEdit->value(), (WeekendHandling) yearlyWeekendCombo_day->currentIndex(), yearlyFrequencyEdit->value(), rangeDialog->fixedCount()); } exceptionsDialog->modifyExceptions(rec); return rec; } } return NULL; } bool RecurrenceEditWidget::validValues() { if(!recurrenceButton->isChecked()) return true; switch(typeCombo->currentIndex()) { case 0: { break; } case 1: { bool b = false; for(int i = 0; i < 7; i++) { if(weeklyButtons[i]->isChecked()) { b = true; break; } } if(!b) { KMessageBox::error(this, i18n("No day of week selected for weekly recurrence.")); weeklyButtons[0]->setFocus(); return false; } break; } case 2: { if(KGlobal::locale()->calendarType() == "gregorian") { int i_frequency = monthlyFrequencyEdit->value(); if(i_frequency % 12 == 0) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); int i_dayofmonth = monthlyDayCombo->currentIndex() + 1; int i_month = calSys->month(date); if(i_dayofmonth <= 31 && ((i_month == 2 && i_dayofmonth > 29) || (i_dayofmonth > 30 && (i_month == 4 || i_month == 6 || i_month == 9 || i_month == 11)))) { KMessageBox::error(this, i18n("Selected day will never occur with selected frequency and start date.")); monthlyDayCombo->setFocus(); return false; } } } break; } case 3: { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); if(yearlyOnDayOfMonthButton->isChecked()) { int i_frequency = yearlyFrequencyEdit->value(); int i_dayofmonth = yearlyDayOfMonthEdit->value(); int i_month = yearlyMonthCombo->currentIndex() + 1; if(KGlobal::locale()->calendarType() == "gregorian") { if((i_month == 2 && i_dayofmonth > 29) || (i_dayofmonth > 30 && (i_month == 4 || i_month == 6 || i_month == 9 || i_month == 11))) { KMessageBox::error(this, i18n("Selected day does not exist in selected month.")); yearlyDayOfMonthEdit->setFocus(); return false; } else if(i_month != 2 || i_dayofmonth < 29) { break; } } QDate nextdate; calSys->setYMD(nextdate, calSys->year(date), i_month, 1); if(i_dayofmonth > calSys->daysInMonth(nextdate)) { int i = 10; do { if(i == 0) { KMessageBox::error(this, i18n("Selected day will never occur with selected frequency and start date.")); yearlyDayOfMonthEdit->setFocus(); return false; } nextdate = calSys->addYears(nextdate, i_frequency); calSys->setYMD(nextdate, calSys->year(nextdate), i_month, 1); i--; } while(i_dayofmonth > calSys->daysInMonth(nextdate)); } } else if(yearlyOnDayOfYearButton->isChecked()) { int i_frequency = yearlyFrequencyEdit->value(); int i_dayofyear = yearlyDayOfYearEdit->value(); if(i_dayofyear > calSys->daysInYear(date)) { QDate nextdate = date; int i = 10; do { if(i == 0) { KMessageBox::error(this, i18n("Selected day will never occur with selected frequency and start date.")); yearlyDayOfYearEdit->setFocus(); return false; } nextdate = calSys->addYears(nextdate, i_frequency); i--; } while(i_dayofyear > calSys->daysInYear(nextdate)); } } break; } } if(!rangeDialog->validValues()) return false; if(!exceptionsDialog->validValues()) return false; return true; } void RecurrenceEditWidget::setStartDate(const QDate &startdate) { if(!startdate.isValid()) return; date = startdate; rangeDialog->setStartDate(date); } #include "recurrenceeditwidget.moc" eqonomize-0.6/src/recurrenceeditwidget.h0000644000175000017500000001057011106577064017502 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef RECURRENCE_EDIT_WIDGET_H #define RECURRENCE_EDIT_WIDGET_H #include #include #include #include class Recurrence; class Budget; class QStackedWidget; class QCheckBox; class QSpinBox; class QComboBox; class QPushButton; class QGroupBox; class QRadioButton; class KDateEdit; class QLabel; class EditRangeDialog; class EditExceptionsDialog; class QButtonGroup; class QListWidget; class RecurrenceEditWidget : public QWidget { Q_OBJECT public: RecurrenceEditWidget(const QDate &startdate, Budget *budg, QWidget *parent = 0); ~RecurrenceEditWidget(); void setRecurrence(Recurrence *rec); Recurrence *createRecurrence(); bool validValues(); protected: QDate date; Budget *budget; QGroupBox *ruleGroup; QStackedWidget *ruleStack; QCheckBox *recurrenceButton; QComboBox *typeCombo; QPushButton *exceptionsButton, *rangeButton; QSpinBox *dailyFrequencyEdit; QCheckBox *weeklyButtons[7]; QSpinBox *weeklyFrequencyEdit; QRadioButton *monthlyOnDayButton, *monthlyOnDayOfWeekButton; QComboBox *monthlyDayCombo, *monthlyWeekendCombo, *monthlyWeekCombo, *monthlyDayOfWeekCombo; QSpinBox *monthlyFrequencyEdit; QSpinBox *yearlyFrequencyEdit, *yearlyDayOfYearEdit, *yearlyDayOfMonthEdit; QRadioButton *yearlyOnDayOfYearButton, *yearlyOnDayOfWeekButton, *yearlyOnDayOfMonthButton; QComboBox *yearlyMonthCombo_week, *yearlyWeekendCombo_month, *yearlyWeekendCombo_day, *yearlyDayOfWeekCombo, *yearlyWeekCombo, *yearlyMonthCombo; EditRangeDialog *rangeDialog; EditExceptionsDialog *exceptionsDialog; public slots: void editExceptions(); void editRange(); void setStartDate(const QDate&); }; class EditRangeDialog : public KDialog { Q_OBJECT protected: KDateEdit *endDateEdit; QSpinBox *fixedCountEdit; QRadioButton *foreverButton, *endDateButton, *fixedCountButton; QLabel *startLabel; QDate date; QButtonGroup *rangeButtonGroup; QRadioButton *checkedButton; QDate endDateEdit_value; int fixedCountEdit_value; public: EditRangeDialog(const QDate &startdate, QWidget *parent); ~EditRangeDialog(); void setStartDate(const QDate &startdate); void setRecurrence(Recurrence *rec); int fixedCount(); QDate endDate(); bool validValues(); void saveValues(); void restoreValues(); protected slots: void slotButtonClicked(int); }; class EditExceptionsDialog : public KDialog { Q_OBJECT protected: KDateEdit *dateEdit; QPushButton *changeButton, *addButton, *deleteButton; QListWidget *exceptionsList; QStringList savedExceptions; public: EditExceptionsDialog(QWidget *parent); ~EditExceptionsDialog(); void setRecurrence(Recurrence *rec); void modifyExceptions(Recurrence *rec); bool validValues(); void saveValues(); void restoreValues(); protected slots: void slotButtonClicked(int); void onSelectionChanged(); void addException(); void changeException(); void deleteException(); }; #endif eqonomize-0.6/src/security.cpp0000644000175000017500000004662411106577070015503 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "security.h" #include "budget.h" #include "recurrence.h" #include #include #include #include #include extern double yearsBetweenDates(const QDate &date1, const QDate &date2); void Security::init() { transactions.setAutoDelete(false); dividends.setAutoDelete(false); scheduledTransactions.setAutoDelete(false); scheduledDividends.setAutoDelete(false); tradedShares.setAutoDelete(false); reinvestedDividends.setAutoDelete(true); } Security::Security(Budget *parent_budget, AssetsAccount *parent_account, SecurityType initial_type, double initial_shares, int initial_decimals, QString initial_name, QString initial_description) : o_budget(parent_budget), i_id(-1), o_account(parent_account), st_type(initial_type), d_initial_shares(initial_shares), i_decimals(initial_decimals), s_name(initial_name.trimmed()), s_description(initial_description) { init(); } Security::Security(Budget *parent_budget, QDomElement *e, bool *valid) : o_budget(parent_budget) { init(); i_id = e->attribute("id").toInt(); QString type = e->attribute("type"); if(type == "bond") { st_type = SECURITY_TYPE_BOND; } else if(type == "stock") { st_type = SECURITY_TYPE_STOCK; } else if(type == "mutual fund") { st_type = SECURITY_TYPE_MUTUAL_FUND; } else { st_type = SECURITY_TYPE_OTHER; } d_initial_shares = e->attribute("initialshares").toDouble(); i_decimals = e->attribute("decimals", "4").toInt(); s_name = e->attribute("name").trimmed(); s_description = e->attribute("description"); int id_account = e->attribute("account").toInt(); if(parent_budget->assetsAccounts_id.contains(id_account)) { o_account = parent_budget->assetsAccounts_id[id_account]; if(valid) *valid = (o_account->accountType() == ASSETS_TYPE_SECURITIES); } else { o_account = NULL; if(valid) *valid =false; } for(QDomNode n = e->firstChild(); !n.isNull(); n = n.nextSibling()) { if(n.isElement()) { QDomElement e2 = n.toElement(); if(e2.tagName() == "quotation") { QDate date = QDate::fromString(e2.attribute("date"), Qt::ISODate); quotations[date] = e2.attribute("value").toDouble(); quotations_auto[date] = e2.attribute("auto").toInt(); } } } } Security::Security() : o_budget(NULL), i_id(-1), o_account(NULL), st_type(SECURITY_TYPE_STOCK), d_initial_shares(0.0), i_decimals(4) {init();} Security::Security(const Security *security) : o_budget(security->budget()), i_id(security->id()), o_account(security->account()), st_type(security->type()), d_initial_shares(security->initialShares()), i_decimals(security->decimals()), s_name(security->name()), s_description(security->description()) {init();} Security::~Security() {} const QString &Security::name() const {return s_name;} void Security::setName(QString new_name) {s_name = new_name.trimmed(); o_budget->securityNameModified(this);} const QString &Security::description() const {return s_description;} void Security::setDescription(QString new_description) {s_description = new_description;} Budget *Security::budget() const {return o_budget;} double Security::initialBalance() const { QMap::const_iterator it = quotations.begin(); if(it == quotations.end()) return 0.0; return it.value() * d_initial_shares; } double Security::initialShares() const {return d_initial_shares;} void Security::setInitialShares(double initial_shares) {d_initial_shares = initial_shares;} SecurityType Security::type() const {return st_type;} void Security::setType(SecurityType new_type) {st_type = new_type;} AssetsAccount *Security::account() const {return o_account;} void Security::setAccount(AssetsAccount *new_account) {o_account = new_account;} int Security::id() const {return i_id;} void Security::setId(int new_id) {i_id = new_id;} void Security::setQuotation(const QDate &date, double value, bool auto_added) { if(!auto_added) { quotations[date] = value; quotations_auto[date] = false; } else if(!quotations.count(date) || quotations_auto[date]) { quotations[date] = value; quotations_auto[date] = true; } } void Security::removeQuotation(const QDate &date, bool auto_added) { if(quotations.count(date) && (!auto_added || quotations_auto[date])) { quotations.remove(date); quotations_auto.remove(date); } } void Security::clearQuotations() { quotations.clear(); quotations_auto.clear(); } double Security::getQuotation(const QDate &date, QDate *actual_date) const { if(quotations.contains(date)) { if(actual_date) *actual_date = date; return quotations[date]; } QMap::const_iterator it_begin = quotations.begin(); QMap::const_iterator it = quotations.end(); if(it != it_begin) { --it; while(true) { if(it.key() <= date) { if(actual_date) *actual_date = it.key(); return it.value(); } if(it == it_begin) break; --it; } } if(actual_date) *actual_date = QDate(); return 0.0; } bool Security::hasQuotation(const QDate &date) const { return quotations.contains(date); } void Security::addReinvestedDividend(const QDate &date, double added_shares) { reinvestedDividends.inSort(new ReinvestedDividend(date, added_shares)); } int Security::decimals() const {return i_decimals;} void Security::setDecimals(int new_decimals) {i_decimals = new_decimals;} void Security::save(QDomElement *e) const { e->setAttribute("id", i_id); e->setAttribute("name", s_name); switch(st_type) { case SECURITY_TYPE_BOND: {e->setAttribute("type", "bond"); break;} case SECURITY_TYPE_STOCK: {e->setAttribute("type", "stock"); break;} case SECURITY_TYPE_MUTUAL_FUND: {e->setAttribute("type", "mutual fund"); break;} case SECURITY_TYPE_OTHER: {e->setAttribute("type", "other"); break;} } e->setAttribute("decimals", i_decimals); e->setAttribute("initialshares", QString::number(d_initial_shares, 'f', i_decimals)); if(!s_description.isEmpty()) e->setAttribute("description", s_description); e->setAttribute("account", o_account->id()); QMap::const_iterator it_end = quotations.end(); QMap::const_iterator it = quotations.begin(); QMap::const_iterator it_auto = quotations_auto.begin(); for(; it != it_end; ++it, ++it_auto) { QDomElement e2 = e->ownerDocument().createElement("quotation"); e2.setAttribute("value", QString::number(it.value(), 'f', KGlobal::locale()->fracDigits())); e2.setAttribute("date", it.key().toString(Qt::ISODate)); if(it_auto.value()) e2.setAttribute("auto", it_auto.value()); e->appendChild(e2); } } double Security::shares() { double n = d_initial_shares; SecurityTransaction *trans = transactions.first(); while(trans) { if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY) n += trans->shares(); else n -= trans->shares(); trans = transactions.next(); } SecurityTrade *ts = tradedShares.first(); while(ts) { if(ts->from_security == this) n -= ts->from_shares; else n += ts->to_shares; ts = tradedShares.next(); } ReinvestedDividend *rediv = reinvestedDividends.first(); while(rediv) { n += rediv->shares; rediv = reinvestedDividends.next(); } return n; } double Security::shares(const QDate &date, bool estimate, bool no_scheduled_shares) { double n = 0.0; if(quotations.begin() == quotations.end() || quotations.begin().key() <= date) n += d_initial_shares; SecurityTransaction *trans = transactions.first(); while(trans && trans->date() <= date) { if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY) n += trans->shares(); else n -= trans->shares(); trans = transactions.next(); } SecurityTrade *ts = tradedShares.first(); while(ts && ts->date <= date) { if(ts->from_security == this) n -= ts->from_shares; else n += ts->to_shares; ts = tradedShares.next(); } if(no_scheduled_shares) { ScheduledTransaction *strans = scheduledTransactions.first(); while(trans && trans->date() <= date) { int no = strans->recurrence()->countOccurrences(date); if(no > 0) { if(strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY) n += ((SecurityTransaction*) strans->transaction())->shares() * no; else n -= ((SecurityTransaction*) strans->transaction())->shares() * no; } strans = scheduledTransactions.next(); } } ReinvestedDividend *rediv = reinvestedDividends.first(); while(rediv && rediv->date <= date) { n += rediv->shares; rediv = reinvestedDividends.next(); } if(estimate && date > QDate::currentDate() && reinvestedDividends.count() > 0) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); QDate date1 = QDate::currentDate(); int days = date1.daysTo(date); int days2 = 0; if(quotations.begin() != quotations.end()) days2 = quotations.begin().key().daysTo(date1); if(days2 > days) { days2 = days; } int years = days2 / calSys->daysInYear(date1); if(years == 0) years = 1; QDate date2 = calSys->addYears(date1, -years); double n2 = 0.0; rediv = reinvestedDividends.first(); while(trans) { if(rediv->date > date2) { n2 += rediv->shares; } rediv = reinvestedDividends.next(); } if(n2 > 0.0) { n += (n2 * days) / date2.daysTo(date1); } } return n; } double Security::value() { return shares() * getQuotation(QDate::currentDate()); } double Security::value(const QDate &date, bool estimate, bool no_scheduled_shares) { if(estimate && date > QDate::currentDate()) return shares(date, estimate, no_scheduled_shares) * expectedQuotation(date); return shares(date, estimate, no_scheduled_shares) * getQuotation(date); } double Security::cost(const QDate &date, bool no_scheduled_shares) { double c = d_initial_shares; QMap::const_iterator it = quotations.begin(); if(it == quotations.end() || date < it.key()) c = 0.0; else c *= it.value(); SecurityTransaction *trans = transactions.first(); while(trans && trans->date() <= date) { if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY) c += trans->value(); else c -= trans->value(); trans = transactions.next(); } SecurityTrade *ts = tradedShares.first(); while(ts && ts->date <= date) { if(ts->from_security == this) c -= ts->value; else c += ts->value; ts = tradedShares.next(); } if(!no_scheduled_shares) { ScheduledTransaction *strans = scheduledTransactions.first(); while(strans && strans->transaction()->date() <= date) { int n = strans->recurrence()->countOccurrences(date); if(n > 0) { if(strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY) c += strans->transaction()->value() * n; else c -= strans->transaction()->value() * n; } strans = scheduledTransactions.next(); } } return c; } double Security::cost() { double c = d_initial_shares; QMap::const_iterator it = quotations.begin(); if(it == quotations.end()) c = 0.0; else c *= it.value(); SecurityTransaction *trans = transactions.first(); while(trans) { if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY) c += trans->value(); else c -= trans->value(); trans = transactions.next(); } SecurityTrade *ts = tradedShares.first(); while(ts) { if(ts->from_security == this) c -= ts->value; else c += ts->value; ts = tradedShares.next(); } return c; } double Security::profit() { double p = value() - cost(); Income *trans = dividends.first(); while(trans) { p += trans->income(); trans = dividends.next(); } return p; } double Security::profit(const QDate &date, bool estimate, bool no_scheduled_shares) { double p = value(date, estimate, no_scheduled_shares) - cost(date, no_scheduled_shares); Income *trans = dividends.first(); while(trans && trans->date() <= date) { p += trans->income(); trans = dividends.next(); } if(estimate && date > QDate::currentDate() && dividends.count() > 0) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); QDate date1 = QDate::currentDate(); int days = date1.daysTo(date); int days2 = 0; if(quotations.begin() != quotations.end()) days2 = quotations.begin().key().daysTo(date1); if(days2 > days) { days2 = days; } int years = days2 / calSys->daysInYear(date1); if(years == 0) years = 1; QDate date2 = calSys->addYears(date1, -years); double p2 = 0.0; trans = dividends.first(); while(trans) { if(trans->date() > date2) { p2 += trans->income(); } trans = dividends.next(); } if(p2 > 0.0) { p += (p2 * days) / date2.daysTo(date1); } } else { ScheduledTransaction *strans = scheduledDividends.first(); while(strans && strans->transaction()->date() <= date) { int n = strans->recurrence()->countOccurrences(date); if(n > 0) { p += strans->transaction()->value() * n; } strans = scheduledDividends.next(); } } return p; } double Security::profit(const QDate &date1, const QDate &date2, bool estimate, bool no_scheduled_shares) { return profit(date2, estimate, no_scheduled_shares) - profit(date1, estimate, no_scheduled_shares); } double Security::yearlyRate() { QMap::const_iterator it_begin = quotations.begin(); QMap::const_iterator it_end = quotations.end(); if(it_end == it_begin) return 0.0; it_end--; QDate date1 = it_begin.key(), date2 = QDate::currentDate(); double q1 = it_begin.value(), q2 = it_end.value(); int days = date1.daysTo(date2); if(it_end.key() != date2 && q1 != q2) { int days2 = it_end.key().daysTo(date2); q2 *= pow(q2 / q1, days2 / (days - days2)); } Income *trans = dividends.first(); while(trans) { double s = shares(trans->date()); if(s > 0.0) q2 += trans->income() / s; trans = dividends.next(); } double shares_change = 0.0; ReinvestedDividend *rediv = reinvestedDividends.first(); while(rediv) { double s = shares(rediv->date); if(s > 0.0) shares_change += rediv->shares / (s - rediv->shares); rediv = reinvestedDividends.next(); } if(date1 == date2) return 0.0; double change = q2 / q1 + shares_change; return pow(change, 1 / yearsBetweenDates(date1, date2)) - 1; } double Security::yearlyRate(const QDate &date) { QMap::const_iterator it_begin = quotations.begin(); if(it_begin == quotations.end()) return 0.0; QDate date1 = it_begin.key(); QDate date2 = date; if(date1 >= date2) return 0.0; QDate curdate = QDate::currentDate(); if(date2 > curdate) { double rate1 = yearlyRate(); double rate2 = yearlyRate(curdate, date2); int days1 = date1.daysTo(curdate); int days2 = curdate.daysTo(date2); return ((rate1 * days1) + (rate2 * days2)) / (days1 + days2); } QDate date2_q; double q1 = it_begin.value(), q2 = getQuotation(date2, &date2_q); int days = date1.daysTo(date2); if(date2 != date2_q && q1 != q2) { int days2 = date2_q.daysTo(date2); q2 *= pow(q2 / q1, days2 / (days - days2)); } Income *trans = dividends.first(); while(trans && trans->date() <= date2) { double s = shares(trans->date()); if(s > 0.0) q2 += trans->income() / s; trans = dividends.next(); } double shares_change = 0.0; ReinvestedDividend *rediv = reinvestedDividends.first(); while(rediv && rediv->date <= date2) { double s = shares(rediv->date); if(s > 0.0) shares_change += rediv->shares / (s - rediv->shares); rediv = reinvestedDividends.next(); } double change = q2 / q1 + shares_change; return pow(change, 1 / yearsBetweenDates(date1, date2)) - 1; } double Security::yearlyRate(const QDate &date1, const QDate &date2) { if(date1 > date2) return yearlyRate(date2, date1); if(date1 == date2) return 0.0; QMap::const_iterator it_begin = quotations.begin(); if(it_begin == quotations.end()) return 0.0; QDate curdate = QDate::currentDate(); if(date1 >= curdate) { return pow(1 + (profit(date1, date2, true, true) / value(date1, true, true)), 1 / (yearsBetweenDates(date1, date2))) - 1; } if(date2 > curdate) { double rate1 = yearlyRate(date1, curdate); double rate2 = yearlyRate(curdate, date2); int days1 = date1.daysTo(curdate); int days2 = curdate.daysTo(date2); return ((rate1 * days1) + (rate2 * days2)) / (days1 + days2); } if(date2 < it_begin.key()) { return 0.0; } if(date1 < it_begin.key()) { return yearlyRate(it_begin.key(), date2); } QDate date1_q, date2_q; double q1 = getQuotation(date1, &date1_q); double q2 = getQuotation(date2, &date2_q); int days = date1.daysTo(date2); if(q1 != q2) { double q1_bak = q1; if(date1 != date1_q) { double rate = q1 / q2; int days1 = date1_q.daysTo(date1); q1 *= pow(rate, days1 / (days - days1)); } if(date2 != date2_q) { double rate = q2 / q1_bak; int days2 = date2_q.daysTo(date2); q2 *= pow(rate, days2 / (days - days2)); } } Income *trans = dividends.first(); while(trans && trans->date() <= date2) { if(trans->date() >= date1) { double s = shares(trans->date()); if(s > 0.0) q2 += trans->income() / s; } trans = dividends.next(); } double shares_change = 0.0; ReinvestedDividend *rediv = reinvestedDividends.first(); while(rediv && rediv->date <= date2) { if(rediv->date >= date1) { double s = shares(rediv->date); if(s > 0.0) shares_change += rediv->shares / (s - rediv->shares); } rediv = reinvestedDividends.next(); } double change = q2 / q1 + shares_change; return pow(change, 1 / yearsBetweenDates(date1, date2)) - 1; } double Security::expectedQuotation(const QDate &date) { if(quotations.contains(date)) { return quotations[date]; } QMap::const_iterator it_begin = quotations.begin(); QMap::const_iterator it = quotations.end(); if(it == it_begin) return 0.0; --it; if(it == it_begin) return it_begin.value(); if(date < it_begin.key()) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); int days = date.daysTo(it_begin.key()); double q2 = expectedQuotation(calSys->addDays(it_begin.key(), days)); return it_begin.value() * (it_begin.value() / q2); } if(it.key() < date) { const KCalendarSystem *calSys = KGlobal::locale()->calendar(); int days = it.key().daysTo(date); double q1 = expectedQuotation(calSys->addDays(it.key(), -days)); return it.value() * (it.value() / q1); } --it; while(true) { if(it.key() < date) { it_begin = it; ++it; int days = it_begin.key().daysTo(date), days2 = it_begin.key().daysTo(it.key()); if(it.value() == it_begin.value()) return it.value(); double rate = it.value() / it_begin.value(); return it_begin.value() * pow(rate, days / days2); } if(it == it_begin) break; --it; } return 0.0; } eqonomize-0.6/src/security.h0000644000175000017500000001671411106577075015152 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SECURITY_H #define SECURITY_H #include #include #include #include #include "transaction.h" class AssetsAccount; class QDomElement; class Security; class Budget; typedef enum { SECURITY_TYPE_BOND, SECURITY_TYPE_STOCK, SECURITY_TYPE_MUTUAL_FUND, SECURITY_TYPE_OTHER } SecurityType; class ReinvestedDividend { public: ReinvestedDividend(const QDate &date_, double shares_) : date(date_), shares(shares_) {} QDate date; double shares; }; template class EqonomizeList : public QList { protected: bool b_auto_delete; int i_index; public: EqonomizeList() : QList(), b_auto_delete(false), i_index(0) {}; virtual ~EqonomizeList () {} void setAutoDelete(bool b) { b_auto_delete = b; } void clear() { if(b_auto_delete) { while(!QList::isEmpty()) delete QList::takeFirst(); } else { QList::clear(); } } bool removeRef(type value) { if(b_auto_delete) delete value; return QList::removeOne(value); } type first() { i_index = 0; if(QList::isEmpty()) return NULL; return QList::first(); } type getFirst() { return QList::first(); } type next() { i_index++; if(i_index >= QList::count()) return NULL; return QList::at(i_index); } type current() { if(i_index >= QList::count()) return NULL; return QList::at(i_index); } type previous() { if(i_index == 0) return NULL; i_index--; return QList::at(i_index); } }; static bool security_transaction_list_less_than(Transaction *t1, Transaction *t2) { return t1->date() < t2->date(); } template class SecurityTransactionList : public EqonomizeList { public: SecurityTransactionList() : EqonomizeList() {}; void sort() { qSort(QList::begin(), QList::end(), security_transaction_list_less_than); } void inSort(type value) { QList::append(value); sort(); } }; static bool scheduled_security_list_less_than(ScheduledTransaction *t1, ScheduledTransaction *t2) { return t1->transaction()->date() < t2->transaction()->date(); } template class ScheduledSecurityTransactionList : public EqonomizeList { public: ScheduledSecurityTransactionList() : EqonomizeList() {}; void sort() { qSort(QList::begin(), QList::end(), scheduled_security_list_less_than); } void inSort(type value) { QList::append(value); sort(); } }; static bool reinvested_dividend_list_less_than(ReinvestedDividend *t1, ReinvestedDividend *t2) { return t1->date < t2->date; } template class ReinvestedDividendList : public EqonomizeList { public: ReinvestedDividendList() : EqonomizeList() {}; void sort() { qSort(QList::begin(), QList::end(), reinvested_dividend_list_less_than); } void inSort(type value) { QList::append(value); sort(); } }; static bool traded_shares_list_less_than(SecurityTrade *t1, SecurityTrade *t2) { return t1->date < t2->date; } template class TradedSharesList : public EqonomizeList { public: TradedSharesList() : EqonomizeList() {}; void sort() { qSort(QList::begin(), QList::end(), traded_shares_list_less_than); } void inSort(type value) { QList::append(value); sort(); } }; class Security { protected: Budget *o_budget; int i_id; AssetsAccount *o_account; SecurityType st_type; double d_initial_shares; int i_decimals; QString s_name; QString s_description; void init(); public: Security(Budget *parent_budget, AssetsAccount *parent_account, SecurityType initial_type, double initial_shares = 0.0, int initial_decimals = 4, QString initial_name = QString::null, QString initial_description = QString::null); Security(Budget *parent_budget, QDomElement *e, bool *valid); Security(); Security(const Security *security); virtual ~Security(); const QString &name() const; void setName(QString new_name); const QString &description() const; void setDescription(QString new_description); Budget *budget() const; double initialBalance() const; double initialShares() const; void setInitialShares(double initial_shares); virtual SecurityType type() const; void setType(SecurityType new_type); int id() const; void setId(int new_id); bool hasQuotation(const QDate &date) const; void setQuotation(const QDate &date, double value, bool auto_added = false); void removeQuotation(const QDate &date, bool auto_added = false); void clearQuotations(); double getQuotation(const QDate &date, QDate *actual_date = NULL) const; AssetsAccount *account() const; void addReinvestedDividend(const QDate &date, double added_shares); int decimals() const; void setDecimals(int new_decimals); void setAccount(AssetsAccount *new_account); virtual void save(QDomElement *e) const; double shares(); double shares(const QDate &date, bool estimate = false, bool no_scheduled_shares = false); double value(); double value(const QDate &date, bool estimate = false, bool no_scheduled_shares = false); double cost(); double cost(const QDate &date, bool no_scheduled_shares = false); double profit(); double profit(const QDate &date, bool estimate = false, bool no_scheduled_shares = false); double profit(const QDate &date1, const QDate &date2, bool estimate = false, bool no_scheduled_shares = false); double yearlyRate(); double yearlyRate(const QDate &date); double yearlyRate(const QDate &date_from, const QDate &date_to); double expectedQuotation(const QDate &date); QMap quotations; QMap quotations_auto; TradedSharesList tradedShares; ReinvestedDividendList reinvestedDividends; SecurityTransactionList transactions; SecurityTransactionList dividends; ScheduledSecurityTransactionList scheduledTransactions; ScheduledSecurityTransactionList scheduledDividends; }; #endif eqonomize-0.6/src/transaction.cpp0000644000175000017500000010623211106577101016144 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "transaction.h" #include "account.h" #include "budget.h" #include "recurrence.h" #include "security.h" #include #include #include Transaction::Transaction(Budget *parent_budget, double initial_value, QDate initial_date, Account *from, Account *to, QString initial_description, QString initial_comment) : o_budget(parent_budget), d_value(initial_value), d_date(initial_date), o_from(from), o_to(to), s_description(initial_description.trimmed()), s_comment(initial_comment), d_quantity(1.0), o_split(NULL) { if(s_description.isNull()) s_description = emptystr; } Transaction::Transaction(Budget *parent_budget, QDomElement *e, bool *valid) : o_budget(parent_budget) { o_split = NULL; o_from = NULL; o_to = NULL; d_date = QDate::fromString(e->attribute("date"), Qt::ISODate); s_description = e->attribute("description", emptystr).trimmed(); s_comment = e->attribute("comment", emptystr); d_quantity = e->attribute("quantity", "1.0").toDouble(); if(valid) *valid = d_date.isValid(); } Transaction::Transaction() : o_budget(NULL), d_value(0.0), o_from(NULL), o_to(NULL), s_description(emptystr), d_quantity(1.0), o_split(NULL) {} Transaction::Transaction(const Transaction *transaction) : o_budget(transaction->budget()), d_value(transaction->value()), d_date(transaction->date()), o_from(transaction->fromAccount()), o_to(transaction->toAccount()), s_description(transaction->description()), s_comment(transaction->comment()), d_quantity(transaction->quantity()), o_split(NULL) {} Transaction::~Transaction() {} bool Transaction::equals(const Transaction *transaction) const { if(type() != transaction->type()) return false; if(fromAccount() != transaction->fromAccount()) return false; if(toAccount() != transaction->toAccount()) return false; if(value() != transaction->value()) return false; if(date() != transaction->date()) return false; if(quantity() != transaction->quantity()) return false; if(description() != transaction->description()) return false; if(comment() != transaction->comment() && comment().isEmpty() != transaction->comment().isEmpty()) return false; if(budget() != transaction->budget()) return false; return true; } SplitTransaction *Transaction::parentSplit() const {return o_split;} void Transaction::setParentSplit(SplitTransaction *parent) {o_split = parent;} double Transaction::value() const {return d_value;} void Transaction::setValue(double new_value) {d_value = new_value;} double Transaction::quantity() const {return d_quantity;} void Transaction::setQuantity(double new_quantity) {d_quantity = new_quantity;} const QDate &Transaction::date() const {return d_date;} void Transaction::setDate(QDate new_date) {QDate old_date = d_date; d_date = new_date; o_budget->transactionDateModified(this, old_date);} const QString &Transaction::description() const {return s_description;} void Transaction::setDescription(QString new_description) {s_description = new_description.trimmed();} const QString &Transaction::comment() const {return s_comment;} void Transaction::setComment(QString new_comment) {s_comment = new_comment;} Account *Transaction::fromAccount() const {return o_from;} void Transaction::setFromAccount(Account *new_from) {o_from = new_from;} Account *Transaction::toAccount() const {return o_to;} void Transaction::setToAccount(Account *new_to) {o_to = new_to;} Budget *Transaction::budget() const {return o_budget;} void Transaction::save(QDomElement *e) const { e->setAttribute("date", d_date.toString(Qt::ISODate)); if(!s_comment.isEmpty()) e->setAttribute("comment", s_comment); if(d_quantity != 1.0) e->setAttribute("quantity", QString::number(d_quantity, 'f', KGlobal::locale()->fracDigits())); } Expense::Expense(Budget *parent_budget, double initial_cost, QDate initial_date, ExpensesAccount *initial_category, AssetsAccount *initial_from, QString initial_description, QString initial_comment) : Transaction(parent_budget, initial_cost, initial_date, initial_from, initial_category, initial_description, initial_comment), s_payee(emptystr) { if(s_payee.isNull()) s_payee = emptystr; } Expense::Expense(Budget *parent_budget, QDomElement *e, bool *valid) : Transaction(parent_budget, e, valid) { int id_category = e->attribute("category").toInt(); int id_from = e->attribute("from").toInt(); if(parent_budget->expensesAccounts_id.contains(id_category) && parent_budget->assetsAccounts_id.contains(id_from)) { setCategory(parent_budget->expensesAccounts_id[id_category]); setFrom(parent_budget->assetsAccounts_id[id_from]); if(e->hasAttribute("income")) setCost(-e->attribute("income").toDouble()); else setCost(e->attribute("cost").toDouble()); s_payee = e->attribute("payee", emptystr); } else { if(valid) *valid =false; } } Expense::Expense() : Transaction(), s_payee(emptystr) {} Expense::Expense(const Expense *expense) : Transaction(expense), s_payee(expense->payee()) {} Expense::~Expense() {} Transaction *Expense::copy() const {return new Expense(this);} bool Expense::equals(const Transaction *transaction) const { if(!Transaction::equals(transaction)) return false; Expense *expense = (Expense*) transaction; if(s_payee != expense->payee()) return false; return true; } ExpensesAccount *Expense::category() const {return (ExpensesAccount*) toAccount();} void Expense::setCategory(ExpensesAccount *new_category) {setToAccount(new_category);} AssetsAccount *Expense::from() const {return (AssetsAccount*) fromAccount();} void Expense::setFrom(AssetsAccount *new_from) {setFromAccount(new_from);} double Expense::cost() const {return value();} void Expense::setCost(double new_cost) {setValue(new_cost);} const QString &Expense::payee() const {return s_payee;} void Expense::setPayee(QString new_payee) {s_payee = new_payee;} TransactionType Expense::type() const {return TRANSACTION_TYPE_EXPENSE;} void Expense::save(QDomElement *e) const { Transaction::save(e); if(cost() < 0.0) e->setAttribute("income", QString::number(-cost(), 'f', KGlobal::locale()->fracDigits())); else e->setAttribute("cost", QString::number(cost(), 'f', KGlobal::locale()->fracDigits())); e->setAttribute("category", category()->id()); e->setAttribute("from", from()->id()); if(!s_description.isEmpty()) e->setAttribute("description", s_description); if(!s_payee.isEmpty()) e->setAttribute("payee", s_payee); } Income::Income(Budget *parent_budget, double initial_income, QDate initial_date, IncomesAccount *initial_category, AssetsAccount *initial_to, QString initial_description, QString initial_comment) : Transaction(parent_budget, initial_income, initial_date, initial_category, initial_to, initial_description, initial_comment), o_security(NULL), s_payer(emptystr) { if(s_payer.isNull()) s_payer = emptystr; } Income::Income(Budget *parent_budget, QDomElement *e, bool *valid) : Transaction(parent_budget, e, valid) { int id_category = e->attribute("category").toInt(); int id_to = e->attribute("to").toInt(); if(parent_budget->incomesAccounts_id.contains(id_category) && parent_budget->assetsAccounts_id.contains(id_to)) { setCategory(parent_budget->incomesAccounts_id[id_category]); setTo(parent_budget->assetsAccounts_id[id_to]); if(e->hasAttribute("cost")) setIncome(-e->attribute("cost").toDouble()); else setIncome(e->attribute("income").toDouble()); } else { if(valid) *valid =false; } int id = e->attribute("security", "-1").toInt(); if(id >= 0 && parent_budget->securities_id.contains(id)) { o_security = parent_budget->securities_id[id]; } else { o_security = NULL; } if(o_security) { setDescription(QString(i18n("Dividend: %1")).arg(o_security->name())); s_payer = o_security->name(); } else { s_payer = e->attribute("payer", emptystr); } } Income::Income() : Transaction(), o_security(NULL), s_payer(emptystr) {} Income::Income(const Income *income_) : Transaction(income_), o_security(income_->security()), s_payer(income_->payer()) {} Income::~Income() {} Transaction *Income::copy() const {return new Income(this);} bool Income::equals(const Transaction *transaction) const { if(!Transaction::equals(transaction)) return false; Income *income = (Income*) transaction; if(s_payer != income->payer()) return false; if(o_security != income->security()) return false; return true; } IncomesAccount *Income::category() const {return (IncomesAccount*) fromAccount();} void Income::setCategory(IncomesAccount *new_category) {setFromAccount(new_category);} AssetsAccount *Income::to() const {return (AssetsAccount*) toAccount();} void Income::setTo(AssetsAccount *new_to) {setToAccount(new_to);} double Income::income() const {return value();} void Income::setIncome(double new_income) {setValue(new_income);} const QString &Income::payer() const {return s_payer;} void Income::setPayer(QString new_payer) {s_payer = new_payer;} TransactionType Income::type() const {return TRANSACTION_TYPE_INCOME;} void Income::setSecurity(Security *parent_security) { o_security = parent_security; if(o_security) { setDescription(QString(i18n("Dividend: %1")).arg(o_security->name())); } } Security *Income::security() const {return o_security;} void Income::save(QDomElement *e) const { Transaction::save(e); if(income() < 0.0 && !o_security) e->setAttribute("cost", QString::number(-income(), 'f', KGlobal::locale()->fracDigits())); else e->setAttribute("income", QString::number(income(), 'f', KGlobal::locale()->fracDigits())); e->setAttribute("category", category()->id()); e->setAttribute("to", to()->id()); if(o_security) { e->setAttribute("security", o_security->id()); } else { if(!s_description.isEmpty()) e->setAttribute("description", s_description); if(!s_payer.isEmpty()) e->setAttribute("payer", s_payer); } } Transfer::Transfer(Budget *parent_budget, double initial_amount, QDate initial_date, AssetsAccount *initial_from, AssetsAccount *initial_to, QString initial_description, QString initial_comment) : Transaction(parent_budget, initial_amount < 0.0 ? -initial_amount : initial_amount, initial_date, initial_amount < 0.0 ? initial_to : initial_from, initial_amount < 0.0 ? initial_from : initial_to, initial_description, initial_comment) {} Transfer::Transfer(Budget *parent_budget, QDomElement *e, bool *valid, bool internal_is_balancing) : Transaction(parent_budget, e, valid) { if(internal_is_balancing) {return;} int id_from = e->attribute("from").toInt(); int id_to = e->attribute("to").toInt(); if(parent_budget->assetsAccounts_id.contains(id_from) && parent_budget->assetsAccounts_id.contains(id_to)) { setAmount(e->attribute("amount").toDouble()); if(amount() < 0.0) { setAmount(-amount()); setFrom(parent_budget->assetsAccounts_id[id_to]); setTo(parent_budget->assetsAccounts_id[id_from]); } else { setFrom(parent_budget->assetsAccounts_id[id_from]); setTo(parent_budget->assetsAccounts_id[id_to]); } } else { if(valid) *valid =false; } } Transfer::Transfer() : Transaction() {} Transfer::Transfer(const Transfer *transfer) : Transaction(transfer) {} Transfer::~Transfer() {} Transaction *Transfer::copy() const {return new Transfer(this);} AssetsAccount *Transfer::to() const {return (AssetsAccount*) toAccount();} void Transfer::setTo(AssetsAccount *new_to) {setToAccount(new_to);} AssetsAccount *Transfer::from() const {return (AssetsAccount*) fromAccount();} void Transfer::setFrom(AssetsAccount *new_from) {setFromAccount(new_from);} double Transfer::amount() const {return value();} void Transfer::setAmount(double new_amount) { if(new_amount < 0.0) { setValue(-new_amount); AssetsAccount *from_bak = from(); setFrom(to()); setTo(from_bak); } else { setValue(new_amount); } } TransactionType Transfer::type() const {return TRANSACTION_TYPE_TRANSFER;} void Transfer::save(QDomElement *e) const { Transaction::save(e); e->setAttribute("amount", QString::number(amount(), 'f', KGlobal::locale()->fracDigits())); e->setAttribute("from", from()->id()); e->setAttribute("to", to()->id()); if(!s_description.isEmpty()) e->setAttribute("description", s_description); } Balancing::Balancing(Budget *parent_budget, double initial_amount, QDate initial_date, AssetsAccount *initial_account, QString initial_comment) : Transfer(parent_budget, initial_amount < 0.0 ? -initial_amount : initial_amount, initial_date, initial_amount < 0.0 ? initial_account : parent_budget->balancingAccount, initial_amount < 0.0 ? parent_budget->balancingAccount : initial_account, initial_comment) { setDescription(i18n("Account balancing")); } Balancing::Balancing(Budget *parent_budget, QDomElement *e, bool *valid) : Transfer(parent_budget, e, valid, true) { if(s_description.isEmpty()) setDescription(i18n("Account balancing")); d_value = e->attribute("amount").toDouble(); if(d_value < 0.0) { d_value = -d_value; setToAccount(parent_budget->balancingAccount); setFromAccount(NULL); } else { setFromAccount(parent_budget->balancingAccount); setToAccount(NULL); } int id_account = e->attribute("account").toInt(); if(parent_budget->assetsAccounts_id.contains(id_account)) { setAccount(parent_budget->assetsAccounts_id[id_account]); } else { if(valid) *valid =false; } } Balancing::Balancing() : Transfer() {} Balancing::Balancing(const Balancing *balancing) : Transfer(balancing) {} Balancing::~Balancing() {} Transaction *Balancing::copy() const {return new Balancing(this);} AssetsAccount *Balancing::account() const {return toAccount() == o_budget->balancingAccount ? (AssetsAccount*) fromAccount() : (AssetsAccount*) toAccount();} void Balancing::setAccount(AssetsAccount *new_account) {toAccount() == o_budget->balancingAccount ? setFromAccount(new_account) : setToAccount(new_account);} void Balancing::save(QDomElement *e) const { Transaction::save(e); e->setAttribute("amount", QString::number(toAccount() == o_budget->balancingAccount ? -amount() : amount(), 'f', KGlobal::locale()->fracDigits())); e->setAttribute("account", account()->id()); if(s_description != i18n("Account balancing")) e->setAttribute("description", s_description); } SecurityTransaction::SecurityTransaction(Security *parent_security, double initial_value, double initial_shares, double initial_share_value, QDate initial_date, QString initial_comment) : Transaction(parent_security->budget(), initial_value, initial_date, NULL, NULL, QString::null, initial_comment), o_security(parent_security), d_shares(initial_shares), d_share_value(initial_share_value) { } SecurityTransaction::SecurityTransaction(Budget *parent_budget, QDomElement *e, bool *valid) : Transaction(parent_budget, e, valid) { d_shares = e->attribute("shares").toDouble(); d_share_value = e->attribute("sharevalue", "-1.0").toDouble(); int id = e->attribute("security").toInt(); if(parent_budget->securities_id.contains(id)) { o_security = parent_budget->securities_id[id]; } else { if(valid) *valid =false; } } SecurityTransaction::SecurityTransaction() : Transaction(), o_security(NULL), d_shares(0.0), d_share_value(0.0) {} SecurityTransaction::SecurityTransaction(const SecurityTransaction *transaction) : Transaction(transaction), o_security(transaction->security()), d_shares(transaction->shares()), d_share_value(transaction->shareValue()) {} SecurityTransaction::~SecurityTransaction() {} bool SecurityTransaction::equals(const Transaction *transaction) const { if(!Transaction::equals(transaction)) return false; SecurityTransaction *sectrans = (SecurityTransaction*) transaction; if(d_shares != sectrans->shares()) return false; if(d_share_value != sectrans->shareValue()) return false; if(o_security != sectrans->security()) return false; return true; } double SecurityTransaction::shares() const {return d_shares;} double SecurityTransaction::shareValue() const {return d_share_value;} void SecurityTransaction::setShares(double new_shares) { d_shares = new_shares; } void SecurityTransaction::setShareValue(double new_share_value) { d_share_value = new_share_value; if(o_security) o_security->setQuotation(d_date, d_share_value, true); } Account *SecurityTransaction::fromAccount() const {return o_security->account();} Account *SecurityTransaction::toAccount() const {return o_security->account();} void SecurityTransaction::setSecurity(Security *parent_security) { o_security = parent_security; } Security *SecurityTransaction::security() const {return o_security;} void SecurityTransaction::save(QDomElement *e) const { Transaction::save(e); e->setAttribute("shares", QString::number(d_shares, 'f', o_security->decimals())); e->setAttribute("sharevalue", QString::number(d_share_value, 'f', KGlobal::locale()->fracDigits())); e->setAttribute("security", o_security->id()); } SecurityBuy::SecurityBuy(Security *parent_security, double initial_value, double initial_shares, double initial_share_value, QDate initial_date, Account *from_account, QString initial_comment) : SecurityTransaction(parent_security, initial_value, initial_shares, initial_share_value, initial_date, initial_comment) { setAccount(from_account); if(o_security) { setDescription(QString(i18n("Security: %1 (bought)")).arg(o_security->name())); } } SecurityBuy::SecurityBuy(Budget *parent_budget, QDomElement *e, bool *valid) : SecurityTransaction(parent_budget, e, valid) { int id_account = e->attribute("account").toInt(); d_value = e->attribute("cost").toDouble(); if(d_share_value < 0.0) d_share_value = d_value / d_shares; if(budget()->assetsAccounts_id.contains(id_account)) { setAccount(budget()->assetsAccounts_id[id_account]); } else if(budget()->incomesAccounts_id.contains(id_account)) { setAccount(budget()->incomesAccounts_id[id_account]); } else { if(valid) *valid =false; } if(o_security) { setDescription(QString(i18n("Security: %1 (bought)")).arg(o_security->name())); } } SecurityBuy::SecurityBuy() : SecurityTransaction() {} SecurityBuy::SecurityBuy(const SecurityBuy *transaction) : SecurityTransaction(transaction) { setAccount(transaction->account()); } SecurityBuy::~SecurityBuy() {} Transaction *SecurityBuy::copy() const {return new SecurityBuy(this);} Account *SecurityBuy::fromAccount() const {return Transaction::fromAccount();} Account *SecurityBuy::account() const {return fromAccount();} void SecurityBuy::setAccount(Account *new_account) {setFromAccount(new_account);} TransactionType SecurityBuy::type() const {return TRANSACTION_TYPE_SECURITY_BUY;} void SecurityBuy::save(QDomElement *e) const { SecurityTransaction::save(e); e->setAttribute("cost", QString::number(d_value, 'f', KGlobal::locale()->fracDigits())); e->setAttribute("account", account()->id()); } SecuritySell::SecuritySell(Security *parent_security, double initial_value, double initial_shares, double initial_share_value, QDate initial_date, Account *to_account, QString initial_comment) : SecurityTransaction(parent_security, initial_value, initial_shares, initial_share_value, initial_date, initial_comment) { setAccount(to_account); if(o_security) { setDescription(QString(i18n("Security: %1 (sold)")).arg(o_security->name())); } } SecuritySell::SecuritySell(Budget *parent_budget, QDomElement *e, bool *valid) : SecurityTransaction(parent_budget, e, valid) { int id_account = e->attribute("account").toInt(); d_value = e->attribute("income").toDouble(); if(d_share_value < 0.0) d_share_value = d_value / d_shares; if(budget()->assetsAccounts_id.contains(id_account)) { setAccount(budget()->assetsAccounts_id[id_account]); } else if(budget()->expensesAccounts_id.contains(id_account)) { setAccount(budget()->expensesAccounts_id[id_account]); } else { if(valid) *valid =false; } if(o_security) { setDescription(QString(i18n("Security: %1 (sold)")).arg(o_security->name())); } } SecuritySell::SecuritySell() : SecurityTransaction() {} SecuritySell::SecuritySell(const SecuritySell *transaction) : SecurityTransaction(transaction) { setAccount(transaction->account()); } SecuritySell::~SecuritySell() {} Transaction *SecuritySell::copy() const {return new SecuritySell(this);} Account *SecuritySell::toAccount() const {return Transaction::toAccount();} Account *SecuritySell::account() const {return toAccount();} void SecuritySell::setAccount(Account *new_account) {setToAccount(new_account);} TransactionType SecuritySell::type() const {return TRANSACTION_TYPE_SECURITY_SELL;} void SecuritySell::save(QDomElement *e) const { SecurityTransaction::save(e); e->setAttribute("income", QString::number(d_value, 'f', KGlobal::locale()->fracDigits())); e->setAttribute("account", account()->id()); } ScheduledTransaction::ScheduledTransaction(Budget *parent_budget) : o_budget(parent_budget) { o_trans = NULL; o_rec = NULL; } ScheduledTransaction::ScheduledTransaction(Budget *parent_budget, Transaction *trans, Recurrence *rec) : o_budget(parent_budget) { o_trans = trans; o_rec = rec; if(o_trans && o_rec) o_trans->setDate(o_rec->startDate()); } ScheduledTransaction::ScheduledTransaction(Budget *parent_budget, QDomElement *e, bool *valid) : o_budget(parent_budget) { if(valid) *valid = true; o_rec = NULL; o_trans = NULL; for(QDomNode n = e->firstChild(); !n.isNull(); n = n.nextSibling()) { if(n.isElement()) { QDomElement e2 = n.toElement(); if(e2.tagName() == "transaction") { QString type = e2.attribute("type"); bool valid2 = true; if(type == "expense") { if(o_trans) delete o_trans; o_trans = new Expense(parent_budget, &e2, &valid2); } else if(type == "income") { if(o_trans) delete o_trans; o_trans = new Income(parent_budget, &e2, &valid2); } else if(type == "dividend") { if(o_trans) delete o_trans; o_trans = new Income(parent_budget, &e2, &valid2); if(!((Income*) o_trans)->security()) valid2 = false; } else if(type == "transfer") { if(o_trans) delete o_trans; o_trans = new Transfer(parent_budget, &e2, &valid2); } else if(type == "balancing") { if(o_trans) delete o_trans; o_trans = new Balancing(parent_budget, &e2, &valid2); } else if(type == "security_buy") { if(o_trans) delete o_trans; o_trans = new SecurityBuy(parent_budget, &e2, &valid2); } else if(type == "security_sell") { if(o_trans) delete o_trans; o_trans = new SecuritySell(parent_budget, &e2, &valid2); } if(!valid2) { delete o_trans; o_trans = NULL; } } else if(e2.tagName() == "recurrence") { QString type = e2.attribute("type"); bool valid2 = true; if(type == "daily") { if(o_rec) delete o_rec; o_rec = new DailyRecurrence(parent_budget, &e2, &valid2); } else if(type == "weekly") { if(o_rec) delete o_rec; o_rec = new WeeklyRecurrence(parent_budget, &e2, &valid2); } else if(type == "monthly") { if(o_rec) delete o_rec; o_rec = new MonthlyRecurrence(parent_budget, &e2, &valid2); } else if(type == "yearly") { if(o_rec) delete o_rec; o_rec = new YearlyRecurrence(parent_budget, &e2, &valid2); } if(!valid2) { delete o_rec; o_rec = NULL; } } } } if(!o_trans && valid) *valid = false; if(o_rec && o_trans) o_trans->setDate(o_rec->startDate()); } ScheduledTransaction::ScheduledTransaction(const ScheduledTransaction *strans) : o_budget(strans->budget()), o_trans(NULL), o_rec(NULL) { if(strans->transaction()) o_trans = strans->transaction()->copy(); if(strans->recurrence()) o_rec = strans->recurrence()->copy(); } ScheduledTransaction::~ScheduledTransaction() { if(o_trans) delete o_trans; if(o_rec) delete o_rec; } ScheduledTransaction *ScheduledTransaction::copy() const {return new ScheduledTransaction(this);} Transaction *ScheduledTransaction::realize(const QDate &date) { if(!o_trans) return NULL; if(o_rec && !o_rec->removeOccurrence(date)) return NULL; if(!o_rec && date != o_trans->date()) return NULL; Transaction *trans = o_trans->copy(); if(o_rec) { o_trans->setDate(o_rec->startDate()); o_budget->scheduledTransactionDateModified(this); } trans->setDate(date); return trans; } Transaction *ScheduledTransaction::transaction() const { return o_trans; } Recurrence *ScheduledTransaction::recurrence() const { return o_rec; } void ScheduledTransaction::setRecurrence(Recurrence *rec, bool delete_old) { if(o_rec && delete_old) delete o_rec; o_rec = rec; if(o_trans && o_rec) o_trans->setDate(o_rec->startDate()); if(o_rec) o_budget->scheduledTransactionDateModified(this); } void ScheduledTransaction::setTransaction(Transaction *trans, bool delete_old) { if(o_trans && delete_old) delete o_trans; o_trans = trans; if(o_rec && o_trans) o_trans->setDate(o_rec->startDate()); else if(o_trans) o_budget->scheduledTransactionDateModified(this); } Budget *ScheduledTransaction::budget() const {return o_budget;} void ScheduledTransaction::save(QDomElement *e) const { if(!o_trans) return; QDomElement e2 = e->ownerDocument().createElement("transaction"); switch(o_trans->type()) { case TRANSACTION_TYPE_TRANSFER: { if(o_trans->fromAccount() == o_budget->balancingAccount) e2.setAttribute("type", "balancing"); else e2.setAttribute("type", "transfer"); break; } case TRANSACTION_TYPE_INCOME: { if(((Income*) o_trans)->security()) { e2.setAttribute("type", "dividend"); } else { e2.setAttribute("type", "income"); } break; } case TRANSACTION_TYPE_EXPENSE: { e2.setAttribute("type", "expense"); break; } case TRANSACTION_TYPE_SECURITY_BUY: { e2.setAttribute("type", "security_buy"); break; } case TRANSACTION_TYPE_SECURITY_SELL: { e2.setAttribute("type", "security_sell"); break; } } o_trans->save(&e2); e->appendChild(e2); if(o_rec) { e2 = e->ownerDocument().createElement("recurrence"); switch(o_rec->type()) { case RECURRENCE_TYPE_DAILY: { e2.setAttribute("type", "daily"); break; } case RECURRENCE_TYPE_WEEKLY: { e2.setAttribute("type", "weekly"); break; } case RECURRENCE_TYPE_MONTHLY: { e2.setAttribute("type", "monthly"); break; } case RECURRENCE_TYPE_YEARLY: { e2.setAttribute("type", "yearly"); break; } } o_rec->save(&e2); e->appendChild(e2); } } QDate ScheduledTransaction::firstOccurrence() const { if(o_rec) return o_rec->firstOccurrence(); if(o_trans) return o_trans->date(); return QDate(); } bool ScheduledTransaction::isOneTimeTransaction() const { return !o_rec || o_rec->firstOccurrence() == o_rec->lastOccurrence(); } void ScheduledTransaction::setDate(const QDate &newdate) { if(o_rec) { o_rec->setStartDate(newdate); if(o_trans) o_trans->setDate(o_rec->startDate()); o_budget->scheduledTransactionDateModified(this); } else if(o_trans && newdate != o_trans->date()) { o_trans->setDate(newdate); o_budget->scheduledTransactionDateModified(this); } } void ScheduledTransaction::addException(const QDate &exceptiondate) { if(!o_rec) return; if(o_trans && exceptiondate == o_rec->startDate()) { o_rec->addException(exceptiondate); o_trans->setDate(o_rec->startDate()); o_budget->scheduledTransactionDateModified(this); } else { o_rec->addException(exceptiondate); } } SplitTransaction::SplitTransaction(Budget *parent_budget, QDate initial_date, AssetsAccount *initial_account, QString initial_description) : o_budget(parent_budget), d_date(initial_date), o_account(initial_account), s_description(initial_description.trimmed()) {} SplitTransaction::SplitTransaction(Budget *parent_budget, QDomElement *e, bool *valid) : o_budget(parent_budget) { o_account = NULL; d_date = QDate::fromString(e->attribute("date"), Qt::ISODate); s_description = e->attribute("description", emptystr).trimmed(); s_comment = e->attribute("comment", emptystr); int id = e->attribute("account").toInt(); if(d_date.isValid() && parent_budget->assetsAccounts_id.contains(id)) { o_account = parent_budget->assetsAccounts_id[id]; for(QDomNode n = e->firstChild(); !n.isNull(); n = n.nextSibling()) { if(n.isElement()) { QDomElement e2 = n.toElement(); if(e2.tagName() == "transaction") { QString type = e2.attribute("type"); e2.setAttribute("date", d_date.toString(Qt::ISODate)); bool valid2 = true; Transaction *trans = NULL; if(type == "expense") { e2.setAttribute("from", id); trans = new Expense(parent_budget, &e2, &valid2); } else if(type == "income") { e2.setAttribute("to", id); trans = new Income(parent_budget, &e2, &valid2); } else if(type == "dividend") { e2.setAttribute("to", id); trans = new Income(parent_budget, &e2, &valid2); if(!((Income*) trans)->security()) valid2 = false; } else if(type == "balancing") { e2.setAttribute("account", id); trans = new Balancing(parent_budget, &e2, &valid2); } else if(type == "transfer") { if(e2.hasAttribute("to")) e2.setAttribute("from", id); else e2.setAttribute("to", id); trans = new Transfer(parent_budget, &e2, &valid2); } else if(type == "security_buy") { e2.setAttribute("account", id); trans = new SecurityBuy(parent_budget, &e2, &valid2); } else if(type == "security_sell") { e2.setAttribute("account", id); trans = new SecuritySell(parent_budget, &e2, &valid2); } if(!valid2) { delete trans; trans = NULL; } if(trans) { trans->setParentSplit(this); splits.push_back(trans); } } } } } else { if(valid) *valid =false; } } SplitTransaction::SplitTransaction() : o_budget(NULL), o_account(NULL) {} SplitTransaction::~SplitTransaction() { clear(); } double SplitTransaction::value() const { double d_value = 0.0; QVector::size_type c = splits.size(); for(QVector::size_type i = 0; i < c; i++) { Transaction *trans = splits[i]; if(trans->fromAccount() == o_account) d_value -= trans->value(); if(trans->toAccount() == o_account) d_value += trans->value(); } return d_value; } void SplitTransaction::addTransaction(Transaction *trans) { trans->setDate(d_date); switch(trans->type()) { case TRANSACTION_TYPE_EXPENSE: { ((Expense*) trans)->setFrom(o_account); break; } case TRANSACTION_TYPE_INCOME: { ((Income*) trans)->setTo(o_account); break; } case TRANSACTION_TYPE_TRANSFER: { if(!((Transfer*) trans)->from()) { ((Transfer*) trans)->setFrom(o_account); } else { ((Transfer*) trans)->setTo(o_account); } break; } case TRANSACTION_TYPE_SECURITY_BUY: {} case TRANSACTION_TYPE_SECURITY_SELL: { ((SecurityTransaction*) trans)->setAccount(o_account); break; } } splits.push_back(trans); trans->setParentSplit(this); } void SplitTransaction::removeTransaction(Transaction *trans, bool keep) { QVector::iterator it_e = splits.end(); for(QVector::iterator it = splits.begin(); it != it_e; ++it) { if(*it == trans) { splits.erase(it); break; } } trans->setParentSplit(NULL); o_budget->removeTransaction(trans, keep); } void SplitTransaction::clear(bool keep) { QVector::iterator it_e = splits.end(); for(QVector::iterator it = splits.begin(); it != it_e; ++it) { (*it)->setParentSplit(NULL); if(!keep) o_budget->removeTransaction(*it); } splits.clear(); } const QDate &SplitTransaction::date() const {return d_date;} void SplitTransaction::setDate(QDate new_date) { QDate old_date = d_date; d_date = new_date; o_budget->splitTransactionDateModified(this, old_date); QVector::size_type c = splits.count(); for(QVector::size_type i = 0; i < c; i++) { splits[i]->setDate(d_date); } } const QString &SplitTransaction::description() const {return s_description;} void SplitTransaction::setDescription(QString new_description) {s_description = new_description.trimmed();} const QString &SplitTransaction::comment() const {return s_comment;} void SplitTransaction::setComment(QString new_comment) {s_comment = new_comment;} AssetsAccount *SplitTransaction::account() const {return o_account;} void SplitTransaction::setAccount(AssetsAccount *new_account) { QVector::size_type c = splits.count(); for(QVector::size_type i = 0; i < c; i++) { Transaction *trans = splits[i]; switch(trans->type()) { case TRANSACTION_TYPE_EXPENSE: { ((Expense*) trans)->setFrom(new_account); break; } case TRANSACTION_TYPE_INCOME: { ((Income*) trans)->setTo(new_account); break; } case TRANSACTION_TYPE_TRANSFER: { if(((Transfer*) trans)->from() == o_account) { ((Transfer*) trans)->setFrom(new_account); } else { ((Transfer*) trans)->setTo(new_account); } break; } case TRANSACTION_TYPE_SECURITY_BUY: {} case TRANSACTION_TYPE_SECURITY_SELL: { ((SecurityTransaction*) trans)->setAccount(new_account); break; } } } o_account = new_account; } Budget *SplitTransaction::budget() const {return o_budget;} void SplitTransaction::save(QDomElement *e) const { e->setAttribute("date", d_date.toString(Qt::ISODate)); e->setAttribute("account", o_account->id()); if(!s_description.isEmpty()) e->setAttribute("description", s_description); if(!s_comment.isEmpty()) e->setAttribute("comment", s_comment); QVector::size_type c = splits.count(); for(QVector::size_type i = 0; i < c; i++) { QDomElement e2 = e->ownerDocument().createElement("transaction"); Transaction *trans = splits[i]; trans->save(&e2); e2.removeAttribute("date"); switch(trans->type()) { case TRANSACTION_TYPE_TRANSFER: { if(trans->fromAccount() == o_budget->balancingAccount) { e2.setAttribute("type", "balancing"); e2.removeAttribute("account"); } else { e2.setAttribute("type", "transfer"); if(((Transfer*) trans)->from() == o_account) { e2.removeAttribute("from"); } else { e2.removeAttribute("to"); } } break; } case TRANSACTION_TYPE_INCOME: { if(((Income*) trans)->security()) { e2.setAttribute("type", "dividend"); } else { e2.setAttribute("type", "income"); } e2.removeAttribute("to"); break; } case TRANSACTION_TYPE_EXPENSE: { e2.setAttribute("type", "expense"); e2.removeAttribute("from"); break; } case TRANSACTION_TYPE_SECURITY_BUY: { e2.setAttribute("type", "security_buy"); e2.removeAttribute("account"); break; } case TRANSACTION_TYPE_SECURITY_SELL: { e2.setAttribute("type", "security_sell"); e2.removeAttribute("account"); break; } default: {} } e->appendChild(e2); } } eqonomize-0.6/src/transaction.h0000644000175000017500000002603111106577105015613 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef TRANSACTION_H #define TRANSACTION_H #include #include #include extern QString emptystr; class Account; class ExpensesAccount; class IncomesAccount; class AssetsAccount; class Budget; class Recurrence; class QDomElement; class ScheduledTransaction; class Security; class SplitTransaction; typedef enum { TRANSACTION_TYPE_EXPENSE, TRANSACTION_TYPE_INCOME, TRANSACTION_TYPE_TRANSFER, TRANSACTION_TYPE_SECURITY_BUY, TRANSACTION_TYPE_SECURITY_SELL } TransactionType; typedef enum { TRANSACTION_STATUS_NONE, TRANSACTION_STATUS_CLEARED, TRANSACTION_STATUS_RECONCILED } TransactionStatus; class Transaction { protected: Budget *o_budget; double d_value; QDate d_date; Account *o_from; Account *o_to; QString s_description; QString s_comment; double d_quantity; SplitTransaction *o_split; //TransactionStatus ts_status; public: Transaction(Budget *parent_budget, double initial_value, QDate initial_date, Account *from, Account *to, QString initial_description = emptystr, QString initial_comment = emptystr); Transaction(Budget *parent_budget, QDomElement *e, bool *valid); Transaction(); Transaction(const Transaction *transaction); virtual ~Transaction(); virtual Transaction *copy() const = 0; virtual bool equals(const Transaction *transaction) const; SplitTransaction *parentSplit() const; void setParentSplit(SplitTransaction *parent); virtual double value() const; void setValue(double new_value); virtual double quantity() const; void setQuantity(double new_quantity); const QDate &date() const; void setDate(QDate new_date); virtual const QString &description() const; void setDescription(QString new_description); virtual const QString &comment() const; void setComment(QString new_comment); virtual Account *fromAccount() const; void setFromAccount(Account *new_from); virtual Account *toAccount() const; void setToAccount(Account *new_to); Budget *budget() const; virtual TransactionType type() const = 0; virtual void save(QDomElement *e) const; }; class Expense : public Transaction { protected: QString s_payee; public: Expense(Budget *parent_budget, double initial_cost, QDate initial_date, ExpensesAccount *initial_category, AssetsAccount *initial_from, QString initial_description = emptystr, QString initial_comment = emptystr); Expense(Budget *parent_budget, QDomElement *e, bool *valid); Expense(); Expense(const Expense *expense); virtual ~Expense(); Transaction *copy() const; bool equals(const Transaction *transaction) const; ExpensesAccount *category() const; void setCategory(ExpensesAccount *new_category); AssetsAccount *from() const; void setFrom(AssetsAccount *new_from); double cost() const; void setCost(double new_cost); const QString &payee() const; void setPayee(QString new_payee); TransactionType type() const; void save(QDomElement *e) const; }; class Income : public Transaction { protected: Security *o_security; QString s_payer; public: Income(Budget *parent_budget, double initial_income, QDate initial_date, IncomesAccount *initial_category, AssetsAccount *initial_to, QString initial_description = emptystr, QString initial_comment = emptystr); Income(Budget *parent_budget, QDomElement *e, bool *valid); Income(); Income(const Income *income_); virtual ~Income(); Transaction *copy() const; bool equals(const Transaction *transaction) const; IncomesAccount *category() const; void setCategory(IncomesAccount *new_category); AssetsAccount *to() const; void setTo(AssetsAccount *new_to); double income() const; void setIncome(double new_income); const QString &payer() const; void setPayer(QString new_payer); TransactionType type() const; void save(QDomElement *e) const; void setSecurity(Security *parent_security); Security *security() const; }; class Transfer : public Transaction { public: Transfer(Budget *parent_budget, double initial_amount, QDate initial_date, AssetsAccount *initial_from, AssetsAccount *initial_to, QString initial_description = emptystr, QString initial_comment = emptystr); Transfer(Budget *parent_budget, QDomElement *e, bool *valid, bool internal_is_balancing = false); Transfer(); Transfer(const Transfer *transfer); virtual ~Transfer(); virtual Transaction *copy() const; AssetsAccount *to() const; void setTo(AssetsAccount *new_to); AssetsAccount *from() const; void setFrom(AssetsAccount *new_from); double amount() const; void setAmount(double new_amount); TransactionType type() const; virtual void save(QDomElement *e) const; }; class Balancing : public Transfer { public: Balancing(Budget *parent_budget, double initial_amount, QDate initial_date, AssetsAccount *initial_account, QString initial_comment = emptystr); Balancing(Budget *parent_budget, QDomElement *e, bool *valid); Balancing(); Balancing(const Balancing *balancing); virtual ~Balancing(); Transaction *copy() const; AssetsAccount *account() const; void setAccount(AssetsAccount *new_account); void save(QDomElement *e) const; }; class SecurityTransaction : public Transaction { protected: Security *o_security; double d_shares, d_share_value; public: SecurityTransaction(Security *parent_security, double initial_value, double initial_shares, double initial_share_value, QDate initial_date, QString initial_comment = emptystr); SecurityTransaction(Budget *parent_budget, QDomElement *e, bool *valid); SecurityTransaction(); SecurityTransaction(const SecurityTransaction *transaction); virtual ~SecurityTransaction(); virtual Transaction *copy() const = 0; bool equals(const Transaction *transaction) const; virtual Account *fromAccount() const; virtual Account *toAccount() const; virtual Account *account() const = 0; virtual void setAccount(Account *account) = 0; virtual TransactionType type() const = 0; void save(QDomElement *e) const; double shareValue() const; double shares() const; void setShareValue(double new_share_value); void setShares(double new_shares); void setSecurity(Security *parent_security); Security *security() const; }; class SecurityBuy : public SecurityTransaction { public: SecurityBuy(Security *parent_security, double initial_value, double initial_shares, double initial_share_value, QDate initial_date, Account *from_account, QString initial_comment = emptystr); SecurityBuy(Budget *parent_budget, QDomElement *e, bool *valid); SecurityBuy(); SecurityBuy(const SecurityBuy *transaction); virtual ~SecurityBuy(); Transaction *copy() const; Account *account() const; void setAccount(Account *account); Account *fromAccount() const; TransactionType type() const; void save(QDomElement *e) const; }; class SecuritySell : public SecurityTransaction { public: SecuritySell(Security *parent_security, double initial_value, double initial_shares, double initial_share_value, QDate initial_date, Account *to_account, QString initial_comment = emptystr); SecuritySell(Budget *parent_budget, QDomElement *e, bool *valid); SecuritySell(); SecuritySell(const SecuritySell *transaction); virtual ~SecuritySell(); Transaction *copy() const; Account *account() const; void setAccount(Account *account); Account *toAccount() const; TransactionType type() const; void save(QDomElement *e) const; }; class ScheduledTransaction { protected: Budget *o_budget; Transaction *o_trans; Recurrence *o_rec; public: ScheduledTransaction(Budget *parent_budget); ScheduledTransaction(Budget *parent_budget, Transaction *trans, Recurrence *rec); ScheduledTransaction(Budget *parent_budget, QDomElement *e, bool *valid); ScheduledTransaction(const ScheduledTransaction *strans); virtual ~ScheduledTransaction(); ScheduledTransaction *copy() const; Transaction *realize(const QDate &date); Transaction *transaction() const; Recurrence *recurrence() const; void setRecurrence(Recurrence *rec, bool delete_old = true); void setTransaction(Transaction *trans, bool delete_old = true); Budget *budget() const; virtual void save(QDomElement *e) const; QDate firstOccurrence() const; bool isOneTimeTransaction() const; void setDate(const QDate &newdate); void addException(const QDate &exceptiondate); }; class SplitTransaction { protected: Budget *o_budget; QDate d_date; AssetsAccount *o_account; QString s_description; QString s_comment; public: SplitTransaction(Budget *parent_budget, QDate initial_date, AssetsAccount *initial_account, QString initial_description = emptystr); SplitTransaction(Budget *parent_budget, QDomElement *e, bool *valid); SplitTransaction(); ~SplitTransaction(); double value() const; void addTransaction(Transaction *trans); void removeTransaction(Transaction *trans, bool keep = false); void clear(bool keep = false); const QDate &date() const; void setDate(QDate new_date); const QString &description() const; void setDescription(QString new_description); const QString &comment() const; void setComment(QString new_comment); AssetsAccount *account() const; void setAccount(AssetsAccount *new_account); Budget *budget() const; void save(QDomElement *e) const; QVector splits; }; class SecurityTrade { public: SecurityTrade(const QDate &date_, double value_, double from_shares_, Security *from_security_, double to_shares_, Security *to_security_) : date(date_), value(value_), from_shares(from_shares_), to_shares(to_shares_), from_security(from_security_), to_security(to_security_) {} QDate date; double value, from_shares, to_shares; Security *from_security, *to_security; }; #endif eqonomize-0.6/src/transactioneditwidget.cpp0000600000175000017500000014476511106577111020224 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "transactioneditwidget.h" #include "budget.h" #include "recurrence.h" #include "eqonomizevalueedit.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "kdateedit.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern double monthsBetweenDates(const QDate &date1, const QDate &d2); #define TEROWCOL(row, col) row % rows, ((row / rows) * 2) + col TransactionEditWidget::TransactionEditWidget(bool auto_edit, bool extra_parameters, int transaction_type, bool split, bool transfer_to, Security *sec, SecurityValueDefineType security_value_type, bool select_security, Budget *budg, QWidget *parent) : QWidget(parent), transtype(transaction_type), budget(budg), security(sec), b_autoedit(auto_edit), b_extra(extra_parameters) { value_set = false; shares_set = false; sharevalue_set = false; b_sec = (transtype == TRANSACTION_TYPE_SECURITY_BUY || transtype == TRANSACTION_TYPE_SECURITY_SELL); QVBoxLayout *editVLayout = new QVBoxLayout(this); editVLayout->setContentsMargins(0, 0, 0, 0); int cols = 1; if(auto_edit) cols = 2; int rows = 6; if(b_sec && security_value_type == SECURITY_ALL_VALUES) rows = 7; else if(b_extra && !security && !select_security && (transtype == TRANSACTION_TYPE_EXPENSE || transtype == TRANSACTION_TYPE_INCOME)) rows = 8; if(rows % cols > 0) rows += rows / cols + 1; else rows = rows / cols; QGridLayout *editLayout = new QGridLayout(); editVLayout->addLayout(editLayout); dateEdit = NULL; sharesEdit = NULL; quotationEdit = NULL; valueEdit = NULL; descriptionEdit = NULL; payeeEdit = NULL; quantityEdit = NULL; toCombo = NULL; fromCombo = NULL; securityCombo = NULL; int i = 0; if(b_sec) { int decimals = 4; editLayout->addWidget(new QLabel(i18n("Security:"), this), TEROWCOL(i, 0)); if(select_security) { securityCombo = new KComboBox(this); securityCombo->setEditable(false); Security *c_sec = budget->securities.first(); int i2 = 0; while(c_sec) { securityCombo->addItem(c_sec->name()); if(c_sec == security) securityCombo->setCurrentIndex(i2); c_sec = budget->securities.next(); i2++; } editLayout->addWidget(securityCombo, TEROWCOL(i, 1)); if(!security) security = selectedSecurity(); } else { editLayout->addWidget(new QLabel(security->name(), this), TEROWCOL(i, 1)); } if(security) decimals = security->decimals(); i++; if(security_value_type != SECURITY_SHARES_AND_QUOTATION) { if(transtype == TRANSACTION_TYPE_SECURITY_BUY) editLayout->addWidget(new QLabel(i18n("Cost:"), this), TEROWCOL(i, 0)); else editLayout->addWidget(new QLabel(i18n("Income:"), this), TEROWCOL(i, 0)); valueEdit = new EqonomizeValueEdit(false, this); editLayout->addWidget(valueEdit, TEROWCOL(i, 1)); i++; } if(security_value_type != SECURITY_VALUE_AND_QUOTATION) { if(transtype == TRANSACTION_TYPE_SECURITY_BUY) { editLayout->addWidget(new QLabel(i18n("Shares bought:"), this), TEROWCOL(i, 0)); sharesEdit = new EqonomizeValueEdit(0.0, decimals, false, false, this); editLayout->addWidget(sharesEdit, TEROWCOL(i, 1)); i++; } else { editLayout->addWidget(new QLabel(i18n("Shares sold:"), this), TEROWCOL(i, 0)); QHBoxLayout *sharesLayout = new QHBoxLayout(); sharesEdit = new EqonomizeValueEdit(0.0, decimals, false, false, this); sharesEdit->setSizePolicy(QSizePolicy::Expanding, sharesEdit->sizePolicy().verticalPolicy()); sharesLayout->addWidget(sharesEdit); maxSharesButton = new QPushButton(i18n("All"), this); maxSharesButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); sharesLayout->addWidget(maxSharesButton); editLayout->addLayout(sharesLayout, TEROWCOL(i, 1)); i++; } } if(security_value_type != SECURITY_VALUE_AND_SHARES) { editLayout->addWidget(new QLabel(i18n("Price per share:"), this), TEROWCOL(i, 0)); quotationEdit = new EqonomizeValueEdit(false, this); editLayout->addWidget(quotationEdit, TEROWCOL(i, 1)); i++; } if(!split) { editLayout->addWidget(new QLabel(i18n("Date:"), this), TEROWCOL(i, 0)); dateEdit = new KDateEdit(this); dateEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); editLayout->addWidget(dateEdit, TEROWCOL(i, 1)); } i++; } else { if(transtype == TRANSACTION_TYPE_INCOME && (security || select_security)) { editLayout->addWidget(new QLabel(i18n("Security:"), this), TEROWCOL(i, 0)); if(select_security) { securityCombo = new KComboBox(this); securityCombo->setEditable(false); Security *c_sec = budget->securities.first(); int i2 = 0; while(c_sec) { securityCombo->addItem(c_sec->name()); if(c_sec == security) securityCombo->setCurrentIndex(i2); c_sec = budget->securities.next(); i2++; } editLayout->addWidget(securityCombo, TEROWCOL(i, 1)); if(!security) security = selectedSecurity(); } else { editLayout->addWidget(new QLabel(security->name(), this), TEROWCOL(i, 1)); } } else { editLayout->addWidget(new QLabel(i18n("Description:"), this), TEROWCOL(i, 0)); descriptionEdit = new KLineEdit(this); descriptionEdit->setCompletionMode(KGlobalSettings::CompletionPopup); editLayout->addWidget(descriptionEdit, TEROWCOL(i, 1)); } i++; if(transtype == TRANSACTION_TYPE_TRANSFER) { editLayout->addWidget(new QLabel(i18n("Amount:"), this), TEROWCOL(i, 0)); } else if(transtype == TRANSACTION_TYPE_INCOME) { editLayout->addWidget(new QLabel(i18n("Income:"), this), TEROWCOL(i, 0)); } else { editLayout->addWidget(new QLabel(i18n("Cost:"), this), TEROWCOL(i, 0)); } valueEdit = new EqonomizeValueEdit(true, this); editLayout->addWidget(valueEdit, TEROWCOL(i, 1)); i++; if(b_extra && !select_security && !security && (transtype == TRANSACTION_TYPE_EXPENSE || transtype == TRANSACTION_TYPE_INCOME)) { editLayout->addWidget(new QLabel(i18n("Quantity:"), this), TEROWCOL(i, 0)); quantityEdit = new EqonomizeValueEdit(INT_MIN / 100 + 1.0, INT_MAX / 100 - 1.0, 1.0, 1.0, 2, false, this); editLayout->addWidget(quantityEdit, TEROWCOL(i, 1)); i++; } if(!split) { editLayout->addWidget(new QLabel(i18n("Date:"), this), TEROWCOL(i, 0)); dateEdit = new KDateEdit(this); dateEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); editLayout->addWidget(dateEdit, TEROWCOL(i, 1)); i++; } } switch(transtype) { case TRANSACTION_TYPE_TRANSFER: { if(!split || transfer_to) { editLayout->addWidget(new QLabel(i18n("From:"), this), TEROWCOL(i, 0)); fromCombo = new KComboBox(this); fromCombo->setEditable(false); editLayout->addWidget(fromCombo, TEROWCOL(i, 1)); i++; } if(!split || !transfer_to) { editLayout->addWidget(new QLabel(i18n("To:"), this), TEROWCOL(i, 0)); toCombo = new KComboBox(this); toCombo->setEditable(false); editLayout->addWidget(toCombo, TEROWCOL(i, 1)); i++; } break; } case TRANSACTION_TYPE_INCOME: { editLayout->addWidget(new QLabel(i18n("Category:"), this), TEROWCOL(i, 0)); fromCombo = new KComboBox(this); fromCombo->setEditable(false); editLayout->addWidget(fromCombo, TEROWCOL(i, 1)); i++; if(!split) { editLayout->addWidget(new QLabel(i18n("To account:"), this), TEROWCOL(i, 0)); toCombo = new KComboBox(this); toCombo->setEditable(false); editLayout->addWidget(toCombo, TEROWCOL(i, 1)); i++; } if(b_extra && !select_security && !security) { editLayout->addWidget(new QLabel(i18n("Payer:"), this), TEROWCOL(i, 0)); payeeEdit = new KLineEdit(this); payeeEdit->setCompletionMode(KGlobalSettings::CompletionPopup); editLayout->addWidget(payeeEdit, TEROWCOL(i, 1)); i++; } break; } case TRANSACTION_TYPE_SECURITY_BUY: { if(!split) { editLayout->addWidget(new QLabel(i18n("From account:"), this), TEROWCOL(i, 0)); fromCombo = new KComboBox(this); fromCombo->setEditable(false); editLayout->addWidget(fromCombo, TEROWCOL(i, 1)); i++; } break; } case TRANSACTION_TYPE_SECURITY_SELL: { if(!split) { editLayout->addWidget(new QLabel(i18n("To account:"), this), TEROWCOL(i, 0)); toCombo = new KComboBox(this); toCombo->setEditable(false); editLayout->addWidget(toCombo, TEROWCOL(i, 1)); i++; } break; } default: { editLayout->addWidget(new QLabel(i18n("Category:"), this), TEROWCOL(i, 0)); toCombo = new KComboBox(this); toCombo->setEditable(false); editLayout->addWidget(toCombo, TEROWCOL(i, 1)); i++; if(!split) { editLayout->addWidget(new QLabel(i18n("From account:"), this), TEROWCOL(i, 0)); fromCombo = new KComboBox(this); fromCombo->setEditable(false); editLayout->addWidget(fromCombo, TEROWCOL(i, 1)); i++; } if(b_extra) { editLayout->addWidget(new QLabel(i18n("Payee:"), this), TEROWCOL(i, 0)); payeeEdit = new KLineEdit(this); payeeEdit->setCompletionMode(KGlobalSettings::CompletionPopup); editLayout->addWidget(payeeEdit, TEROWCOL(i, 1)); i++; } } } editLayout->addWidget(new QLabel(i18n("Comments:"), this), TEROWCOL(i, 0)); commentsEdit = new KLineEdit(this); editLayout->addWidget(commentsEdit, TEROWCOL(i, 1)); i++; bottom_widget = new KHBox(this); editVLayout->addWidget(bottom_widget); editVLayout->addStretch(1); description_changed = false; if(descriptionEdit) descriptionEdit->completionObject()->setIgnoreCase(true); if(payeeEdit) payeeEdit->completionObject()->setIgnoreCase(true); if(dateEdit) connect(dateEdit, SIGNAL(dateChanged(const QDate&)), this, SIGNAL(dateChanged(const QDate&))); if(b_sec) { switch(security_value_type) { case SECURITY_ALL_VALUES: { connect(valueEdit, SIGNAL(returnPressed()), sharesEdit, SLOT(setFocus())); connect(valueEdit, SIGNAL(returnPressed()), sharesEdit, SLOT(selectAll())); connect(sharesEdit, SIGNAL(returnPressed()), quotationEdit, SLOT(setFocus())); connect(sharesEdit, SIGNAL(returnPressed()), quotationEdit, SLOT(selectAll())); if(dateEdit) { connect(quotationEdit, SIGNAL(returnPressed()), dateEdit, SLOT(setFocus())); connect(quotationEdit, SIGNAL(returnPressed()), dateEdit->lineEdit(), SLOT(selectAll())); } if(transtype == TRANSACTION_TYPE_SECURITY_SELL) connect(maxSharesButton, SIGNAL(clicked()), this, SLOT(maxShares())); break; } case SECURITY_SHARES_AND_QUOTATION: { connect(sharesEdit, SIGNAL(returnPressed()), quotationEdit, SLOT(setFocus())); connect(sharesEdit, SIGNAL(returnPressed()), quotationEdit, SLOT(selectAll())); if(dateEdit) { connect(quotationEdit, SIGNAL(returnPressed()), dateEdit, SLOT(setFocus())); connect(quotationEdit, SIGNAL(returnPressed()), dateEdit->lineEdit(), SLOT(selectAll())); } if(transtype == TRANSACTION_TYPE_SECURITY_SELL) connect(maxSharesButton, SIGNAL(clicked()), this, SLOT(maxShares())); break; } case SECURITY_VALUE_AND_SHARES: { connect(valueEdit, SIGNAL(returnPressed()), sharesEdit, SLOT(setFocus())); connect(valueEdit, SIGNAL(returnPressed()), sharesEdit, SLOT(selectAll())); if(dateEdit) { connect(sharesEdit, SIGNAL(returnPressed()), dateEdit, SLOT(setFocus())); connect(sharesEdit, SIGNAL(returnPressed()), dateEdit->lineEdit(), SLOT(selectAll())); } if(transtype == TRANSACTION_TYPE_SECURITY_SELL) connect(maxSharesButton, SIGNAL(clicked()), this, SLOT(maxShares())); break; } case SECURITY_VALUE_AND_QUOTATION: { connect(valueEdit, SIGNAL(returnPressed()), quotationEdit, SLOT(setFocus())); connect(valueEdit, SIGNAL(returnPressed()), quotationEdit, SLOT(selectAll())); if(dateEdit) { connect(quotationEdit, SIGNAL(returnPressed()), dateEdit, SLOT(setFocus())); connect(quotationEdit, SIGNAL(returnPressed()), dateEdit->lineEdit(), SLOT(selectAll())); } break; } } if(valueEdit) connect(valueEdit, SIGNAL(valueChanged(double)), this, SLOT(valueChanged(double))); if(sharesEdit) connect(sharesEdit, SIGNAL(valueChanged(double)), this, SLOT(sharesChanged(double))); if(quotationEdit) connect(quotationEdit, SIGNAL(valueChanged(double)), this, SLOT(quotationChanged(double))); } else { if(quantityEdit) { connect(valueEdit, SIGNAL(returnPressed()), quantityEdit, SLOT(setFocus())); connect(valueEdit, SIGNAL(returnPressed()), quantityEdit, SLOT(selectAll())); if(dateEdit) { connect(quantityEdit, SIGNAL(returnPressed()), dateEdit, SLOT(setFocus())); connect(quantityEdit, SIGNAL(returnPressed()), dateEdit->lineEdit(), SLOT(selectAll())); } } else { if(dateEdit) { connect(valueEdit, SIGNAL(returnPressed()), dateEdit, SLOT(setFocus())); connect(valueEdit, SIGNAL(returnPressed()), dateEdit->lineEdit(), SLOT(selectAll())); } } if(descriptionEdit) { connect(descriptionEdit, SIGNAL(returnPressed()), valueEdit, SLOT(setFocus())); connect(descriptionEdit, SIGNAL(returnPressed()), valueEdit, SLOT(selectAll())); connect(descriptionEdit, SIGNAL(lostFocus()), this, SLOT(setDefaultValue())); connect(descriptionEdit, SIGNAL(textChanged(const QString&)), this, SLOT(descriptionChanged(const QString&))); } } if(b_autoedit && dateEdit) connect(dateEdit->lineEdit(), SIGNAL(returnPressed()), this, SIGNAL(addmodify())); if(payeeEdit) connect(payeeEdit, SIGNAL(returnPressed()), commentsEdit, SLOT(setFocus())); if(b_autoedit) connect(commentsEdit, SIGNAL(returnPressed()), this, SIGNAL(addmodify())); if(securityCombo) connect(securityCombo, SIGNAL(activated(int)), this, SLOT(securityChanged())); } void TransactionEditWidget::currentDateChanged(const QDate &olddate, const QDate &newdate) { if(dateEdit && olddate == dateEdit->date() && valueEdit && valueEdit->value() == 0.0 && descriptionEdit && descriptionEdit->text().isEmpty()) { dateEdit->setDate(newdate); } } void TransactionEditWidget::securityChanged() { security = selectedSecurity(); if(security) { if(sharesEdit) sharesEdit->setPrecision(security->decimals()); if(sharesEdit && security && shares_date.isValid()) sharesEdit->setMaxValue(security->shares(shares_date)); } } void TransactionEditWidget::valueChanged(double value) { if(!quotationEdit || !sharesEdit || !valueEdit) return; value_set = true; if(shares_set && !sharevalue_set) { quotationEdit->blockSignals(true); quotationEdit->setValue(value / sharesEdit->value()); quotationEdit->blockSignals(false); } else if(!shares_set && sharevalue_set) { sharesEdit->blockSignals(true); sharesEdit->setValue(value / quotationEdit->value()); sharesEdit->blockSignals(false); } } void TransactionEditWidget::sharesChanged(double value) { if(!quotationEdit || !sharesEdit || !valueEdit) return; shares_set = true; if(value_set && !sharevalue_set) { quotationEdit->blockSignals(true); quotationEdit->setValue(valueEdit->value() / value); quotationEdit->blockSignals(false); } else if(!value_set && sharevalue_set) { valueEdit->blockSignals(true); valueEdit->setValue(value * quotationEdit->value()); valueEdit->blockSignals(false); } } void TransactionEditWidget::quotationChanged(double value) { if(!quotationEdit || !sharesEdit || !valueEdit) return; sharevalue_set = true; if(value_set && !shares_set) { sharesEdit->blockSignals(true); sharesEdit->setValue(valueEdit->value() / value); sharesEdit->blockSignals(false); } else if(!value_set && shares_set) { valueEdit->blockSignals(true); valueEdit->setValue(value * sharesEdit->value()); valueEdit->blockSignals(false); } } void TransactionEditWidget::setMaxShares(double max) { if(sharesEdit) sharesEdit->setMaxValue(max); } void TransactionEditWidget::setMaxSharesDate(QDate quotation_date) { shares_date = quotation_date; if(sharesEdit && security && shares_date.isValid()) sharesEdit->setMaxValue(security->shares(shares_date)); } void TransactionEditWidget::maxShares() { if(selectedSecurity() && sharesEdit) sharesEdit->setValue(selectedSecurity()->shares(dateEdit->date())); } QWidget *TransactionEditWidget::bottomWidget() { return bottom_widget; } void TransactionEditWidget::focusDescription() { if(!descriptionEdit) { if(valueEdit) valueEdit->setFocus(); else sharesEdit->setFocus(); } else { descriptionEdit->setFocus(); } } QDate TransactionEditWidget::date() { if(!dateEdit) return QDate(); return dateEdit->date(); } void TransactionEditWidget::descriptionChanged(const QString&) { description_changed = true; } void TransactionEditWidget::setDefaultValue() { if(descriptionEdit && description_changed && !descriptionEdit->text().isEmpty() && valueEdit && valueEdit->value() == 0.0) { Transaction *trans = default_values[descriptionEdit->text()]; if(trans) { valueEdit->setValue(trans->value()); if(toCombo) { for(QVector::size_type i = 0; i < tos.size(); i++) { if(trans->toAccount() == tos[i]) { toCombo->setCurrentIndex(i); break; } } } if(fromCombo) { for(QVector::size_type i = 0; i < froms.size(); i++) { if(trans->fromAccount() == froms[i]) { fromCombo->setCurrentIndex(i); break; } } } if(quantityEdit) { if(trans->quantity() <= 0.0) quantityEdit->setValue(1.0); else quantityEdit->setValue(trans->quantity()); } if(payeeEdit && trans->type() == TRANSACTION_TYPE_EXPENSE) payeeEdit->setText(((Expense*) trans)->payee()); if(payeeEdit && trans->type() == TRANSACTION_TYPE_INCOME) payeeEdit->setText(((Income*) trans)->payer()); } } } void TransactionEditWidget::updateFromAccounts(Account *exclude_account) { if(!fromCombo) return; fromCombo->clear(); froms.clear(); Account *account; switch(transtype) { case TRANSACTION_TYPE_TRANSFER: { account = budget->assetsAccounts.first(); while(account) { if(account != exclude_account && (b_autoedit || ((AssetsAccount*) account)->accountType() != ASSETS_TYPE_SECURITIES)) { fromCombo->addItem(account->name()); froms.push_back(account); } account = budget->assetsAccounts.next(); } for(QVector::size_type i = 0; i < froms.size(); i++) { if(froms[i] != budget->balancingAccount && ((AssetsAccount*) froms[i])->accountType() != ASSETS_TYPE_SECURITIES) { fromCombo->setCurrentIndex((int) i); break; } } break; } case TRANSACTION_TYPE_EXPENSE: { account = budget->assetsAccounts.first(); while(account) { if(account != exclude_account && account != budget->balancingAccount && ((AssetsAccount*) account)->accountType() != ASSETS_TYPE_SECURITIES) { fromCombo->addItem(account->name()); froms.push_back(account); } account = budget->assetsAccounts.next(); } for(QVector::size_type i = 0; i < froms.size(); i++) { if(froms[i] != budget->balancingAccount && ((AssetsAccount*) froms[i])->accountType() != ASSETS_TYPE_SECURITIES) { fromCombo->setCurrentIndex((int) i); break; } } break; } case TRANSACTION_TYPE_INCOME: { account = budget->incomesAccounts.first(); while(account) { if(account != exclude_account) { fromCombo->addItem(account->name()); froms.push_back(account); } account = budget->incomesAccounts.next(); } break; } case TRANSACTION_TYPE_SECURITY_BUY: { account = budget->assetsAccounts.first(); while(account) { if(account != exclude_account && account != budget->balancingAccount && ((AssetsAccount*) account)->accountType() != ASSETS_TYPE_SECURITIES) { fromCombo->addItem(account->name()); froms.push_back(account); } account = budget->assetsAccounts.next(); } account = budget->incomesAccounts.first(); while(account) { if(account != exclude_account) { fromCombo->addItem(account->name()); froms.push_back(account); account = budget->incomesAccounts.next(); } } break; } case TRANSACTION_TYPE_SECURITY_SELL: { break; } } } void TransactionEditWidget::updateToAccounts(Account *exclude_account) { if(!toCombo) return; toCombo->clear(); tos.clear(); Account *account; switch(transtype) { case TRANSACTION_TYPE_TRANSFER: { account = budget->assetsAccounts.first(); while(account) { if(account != exclude_account && (b_autoedit || ((AssetsAccount*) account)->accountType() != ASSETS_TYPE_SECURITIES)) { toCombo->addItem(account->name()); tos.push_back(account); } account = budget->assetsAccounts.next(); } for(QVector::size_type i = 0; i < tos.size(); i++) { if(tos[i] != budget->balancingAccount && ((AssetsAccount*) tos[i])->accountType() != ASSETS_TYPE_SECURITIES) { toCombo->setCurrentIndex((int) i); break; } } break; } case TRANSACTION_TYPE_INCOME: { account = budget->assetsAccounts.first(); while(account) { if(account != exclude_account && account != budget->balancingAccount && (b_autoedit || ((AssetsAccount*) account)->accountType() != ASSETS_TYPE_SECURITIES)) { toCombo->addItem(account->name()); tos.push_back(account); } account = budget->assetsAccounts.next(); } for(QVector::size_type i = 0; i < tos.size(); i++) { if(tos[i] != budget->balancingAccount && ((AssetsAccount*) tos[i])->accountType() != ASSETS_TYPE_SECURITIES) { toCombo->setCurrentIndex((int) i); break; } } break; } case TRANSACTION_TYPE_EXPENSE: { account = budget->expensesAccounts.first(); while(account) { if(account != exclude_account) { toCombo->addItem(account->name()); tos.push_back(account); } account = budget->expensesAccounts.next(); } break; } case TRANSACTION_TYPE_SECURITY_BUY: { break; } case TRANSACTION_TYPE_SECURITY_SELL: { account = budget->assetsAccounts.first(); while(account) { if(account != exclude_account && account != budget->balancingAccount && ((AssetsAccount*) account)->accountType() != ASSETS_TYPE_SECURITIES) { toCombo->addItem(account->name()); tos.push_back(account); } account = budget->assetsAccounts.next(); } break; } } } void TransactionEditWidget::updateAccounts(Account *exclude_account) { updateFromAccounts(exclude_account); updateToAccounts(exclude_account); } void TransactionEditWidget::transactionAdded(Transaction *trans) { if(descriptionEdit && trans->type() == transtype && (transtype != TRANSACTION_TYPE_INCOME || !((Income*) trans)->security())) { if(!trans->description().isEmpty()) { descriptionEdit->completionObject()->addItem(trans->description()); default_values[trans->description()] = trans; } if(payeeEdit && transtype == TRANSACTION_TYPE_EXPENSE && !((Expense*) trans)->payee().isEmpty()) payeeEdit->completionObject()->addItem(((Expense*) trans)->payee()); if(payeeEdit && transtype == TRANSACTION_TYPE_INCOME && !((Income*) trans)->security() && !((Income*) trans)->payer().isEmpty()) payeeEdit->completionObject()->addItem(((Income*) trans)->payer()); } } void TransactionEditWidget::transactionModified(Transaction *trans) { if(descriptionEdit && trans->type() == transtype && (transtype != TRANSACTION_TYPE_INCOME || !((Income*) trans)->security())) { if(!trans->description().isEmpty()) { descriptionEdit->completionObject()->addItem(trans->description()); default_values[trans->description()] = trans; } if(payeeEdit && transtype == TRANSACTION_TYPE_EXPENSE && !((Expense*) trans)->payee().isEmpty()) payeeEdit->completionObject()->addItem(((Expense*) trans)->payee()); if(payeeEdit && transtype == TRANSACTION_TYPE_INCOME && !((Income*) trans)->security() && !((Income*) trans)->payer().isEmpty()) payeeEdit->completionObject()->addItem(((Income*) trans)->payer()); } } bool TransactionEditWidget::checkAccounts() { switch(transtype) { case TRANSACTION_TYPE_TRANSFER: { if(fromCombo && fromCombo->count() == 0) { KMessageBox::error(this, i18n("No suitable account available.")); return false; } if(toCombo && toCombo->count() == 0) { KMessageBox::error(this, i18n("No suitable account available.")); return false; } break; } case TRANSACTION_TYPE_INCOME: { if(fromCombo && fromCombo->count() == 0) { KMessageBox::error(this, i18n("No income category available.")); return false; } if(toCombo && toCombo->count() == 0) { KMessageBox::error(this, i18n("No suitable account available.")); return false; } break; } case TRANSACTION_TYPE_SECURITY_BUY: { if(fromCombo && fromCombo->count() == 0) { KMessageBox::error(this, i18n("No suitable account or income category available.")); return false; } break; } case TRANSACTION_TYPE_SECURITY_SELL: { if(toCombo && toCombo->count() == 0) { KMessageBox::error(this, i18n("No suitable account available.")); return false; } break; } default: { if(toCombo && toCombo->count() == 0) { KMessageBox::error(this, i18n("No expense category available.")); return false; } if(fromCombo && fromCombo->count() == 0) { KMessageBox::error(this, i18n("No suitable account available.")); return false; } break; } } if(securityCombo && securityCombo->count() == 0) { KMessageBox::error(this, i18n("No security available.")); return false; } return true; } bool TransactionEditWidget::validValues(bool) { if(dateEdit && !dateEdit->date().isValid()) { KMessageBox::error(this, i18n("Invalid date.")); dateEdit->setFocus(); dateEdit->lineEdit()->selectAll(); return false; } if(!checkAccounts()) return false; if(toCombo && fromCombo && tos[toCombo->currentIndex()] == froms[fromCombo->currentIndex()]) { KMessageBox::error(this, i18n("Cannot transfer money to and from the same account.")); return false; } switch(transtype) { case TRANSACTION_TYPE_TRANSFER: { if((toCombo && tos[toCombo->currentIndex()]->type() == ACCOUNT_TYPE_ASSETS && ((AssetsAccount*) tos[toCombo->currentIndex()])->accountType() == ASSETS_TYPE_SECURITIES) || (fromCombo && froms[fromCombo->currentIndex()]->type() == ACCOUNT_TYPE_ASSETS && ((AssetsAccount*) froms[fromCombo->currentIndex()])->accountType() == ASSETS_TYPE_SECURITIES)) { KMessageBox::error(this, i18n("Cannot create a regular transfer to/from a securities account.")); return false; } break; } case TRANSACTION_TYPE_INCOME: { if(toCombo && tos[toCombo->currentIndex()]->type() == ACCOUNT_TYPE_ASSETS && ((AssetsAccount*) tos[toCombo->currentIndex()])->accountType() == ASSETS_TYPE_SECURITIES) { KMessageBox::error(this, i18n("Cannot create a regular income to a securities account.")); return false; } break; } case TRANSACTION_TYPE_SECURITY_BUY: {} case TRANSACTION_TYPE_SECURITY_SELL: { if(sharesEdit && sharesEdit->value() == 0.0) { KMessageBox::error(this, i18n("Zero shares not allowed.")); return false; } if(valueEdit && valueEdit->value() == 0.0) { KMessageBox::error(this, i18n("Zero value not allowed.")); return false; } if(quotationEdit && quotationEdit->value() == 0.0) { KMessageBox::error(this, i18n("Zero price per share not allowed.")); return false; } /*if(ask_questions && sharesEdit && selectedSecurity() && sharesEdit->value() > selectedSecurity()->shares(dateEdit->date())) { if(KMessageBox::warningContinueCancel(this, i18n("Number of sold shares are greater than available shares at selected date. Do you want to create the transaction nevertheless?")) == KMessageBox::Cancel) { return false; } }*/ break; } default: { if(fromCombo && froms[fromCombo->currentIndex()]->type() == ACCOUNT_TYPE_ASSETS && ((AssetsAccount*) froms[fromCombo->currentIndex()])->accountType() == ASSETS_TYPE_SECURITIES) { KMessageBox::error(this, i18n("Cannot create a regular expense from a securities account.")); return false; } break; } } return true; } bool TransactionEditWidget::modifyTransaction(Transaction *trans) { if(!validValues()) return false; bool b_transsec = (trans->type() == TRANSACTION_TYPE_SECURITY_BUY || trans->type() == TRANSACTION_TYPE_SECURITY_SELL); if(b_sec) { if(trans->type() != transtype) return false; if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY) { if(fromCombo) ((SecurityTransaction*) trans)->setAccount(froms[fromCombo->currentIndex()]); } else { if(toCombo) ((SecurityTransaction*) trans)->setAccount(tos[toCombo->currentIndex()]); } if(dateEdit) trans->setDate(dateEdit->date()); double shares = 0.0, value = 0.0, share_value = 0.0; if(valueEdit) value = valueEdit->value(); if(sharesEdit) shares = sharesEdit->value(); if(quotationEdit) share_value = quotationEdit->value(); if(!quotationEdit) share_value = value / shares; else if(!sharesEdit) shares = value / share_value; else if(!valueEdit) value = shares * share_value; ((SecurityTransaction*) trans)->setValue(value); ((SecurityTransaction*) trans)->setShares(shares); ((SecurityTransaction*) trans)->setShareValue(share_value); trans->setComment(commentsEdit->text()); return true; } else if(b_transsec) { return false; } if(dateEdit) trans->setDate(dateEdit->date()); if(fromCombo) trans->setFromAccount(froms[fromCombo->currentIndex()]); if(toCombo) trans->setToAccount(tos[toCombo->currentIndex()]); trans->setValue(valueEdit->value()); if(descriptionEdit && (trans->type() != TRANSACTION_TYPE_INCOME || !((Income*) trans)->security())) trans->setDescription(descriptionEdit->text()); trans->setComment(commentsEdit->text()); if(quantityEdit) trans->setQuantity(quantityEdit->value()); if(payeeEdit && trans->type() == TRANSACTION_TYPE_EXPENSE) ((Expense*) trans)->setPayee(payeeEdit->text()); if(payeeEdit && trans->type() == TRANSACTION_TYPE_INCOME) ((Income*) trans)->setPayer(payeeEdit->text()); return true; } Security *TransactionEditWidget::selectedSecurity() { if(securityCombo) { int i = securityCombo->currentIndex(); if(i >= 0) { Security *c_sec = budget->securities.first(); while(i > 0 && c_sec) { c_sec = budget->securities.next(); i--; } return c_sec; } } return security; } Transaction *TransactionEditWidget::createTransaction() { if(!validValues()) return NULL; Transaction *trans; if(transtype == TRANSACTION_TYPE_TRANSFER) { Transfer *transfer = new Transfer(budget, valueEdit->value(), dateEdit ? dateEdit->date() : QDate(), fromCombo ? (AssetsAccount*) froms[fromCombo->currentIndex()] : NULL, toCombo ? (AssetsAccount*) tos[toCombo->currentIndex()] : NULL, descriptionEdit->text(), commentsEdit->text()); trans = transfer; } else if(transtype == TRANSACTION_TYPE_INCOME) { Income *income = new Income(budget, valueEdit->value(), dateEdit ? dateEdit->date() : QDate(), fromCombo ? (IncomesAccount*) froms[fromCombo->currentIndex()] : NULL, toCombo ? (AssetsAccount*) tos[toCombo->currentIndex()] : NULL, descriptionEdit ? descriptionEdit->text() : QString::null, commentsEdit->text()); if(selectedSecurity()) income->setSecurity(selectedSecurity()); if(quantityEdit) income->setQuantity(quantityEdit->value()); if(payeeEdit) income->setPayer(payeeEdit->text()); trans = income; } else if(transtype == TRANSACTION_TYPE_SECURITY_BUY) { if(!selectedSecurity()) return NULL; double shares = 0.0, value = 0.0, share_value = 0.0; if(valueEdit) value = valueEdit->value(); if(sharesEdit) shares = sharesEdit->value(); if(quotationEdit) share_value = quotationEdit->value(); if(!quotationEdit) share_value = value / shares; else if(!sharesEdit) shares = value / share_value; else if(!valueEdit) value = shares * share_value; SecurityBuy *secbuy = new SecurityBuy(selectedSecurity(), value, shares, share_value, dateEdit ? dateEdit->date() : QDate(), fromCombo ? froms[fromCombo->currentIndex()] : NULL, commentsEdit->text()); trans = secbuy; } else if(transtype == TRANSACTION_TYPE_SECURITY_SELL) { if(!selectedSecurity()) return NULL; double shares = 0.0, value = 0.0, share_value = 0.0; if(valueEdit) value = valueEdit->value(); if(sharesEdit) shares = sharesEdit->value(); if(quotationEdit) share_value = quotationEdit->value(); if(!quotationEdit) share_value = value / shares; else if(!sharesEdit) shares = value / share_value; else if(!valueEdit) value = shares * share_value; SecuritySell *secsell = new SecuritySell(selectedSecurity(), value, shares, share_value, dateEdit ? dateEdit->date() : QDate(), toCombo ? tos[toCombo->currentIndex()] : NULL, commentsEdit->text()); trans = secsell; } else { Expense *expense = new Expense(budget, valueEdit->value(), dateEdit ? dateEdit->date() : QDate(), toCombo ? (ExpensesAccount*) tos[toCombo->currentIndex()] : NULL, fromCombo ? (AssetsAccount*) froms[fromCombo->currentIndex()] : NULL, descriptionEdit->text(), commentsEdit->text()); if(quantityEdit) expense->setQuantity(quantityEdit->value()); if(payeeEdit) expense->setPayee(payeeEdit->text()); trans = expense; } return trans; } void TransactionEditWidget::transactionRemoved(Transaction *trans) { if(descriptionEdit && trans->type() == transtype && !trans->description().isEmpty() && default_values[trans->description()] == trans) { switch(transtype) { case TRANSACTION_TYPE_EXPENSE: { Expense *expense = budget->expenses.first(); while(expense) { if(expense != trans && expense->description() == trans->description()) { default_values[expense->description()] = expense; break; } expense = budget->expenses.next(); } break; } case TRANSACTION_TYPE_INCOME: { Income *income = budget->incomes.first(); while(income) { if(income != trans && income->description() == trans->description()) { default_values[income->description()] = income; break; } income = budget->incomes.next(); } break; } case TRANSACTION_TYPE_TRANSFER: { Transfer *transfer= budget->transfers.first(); while(transfer) { if(transfer != trans && transfer->description() == trans->description()) { default_values[transfer->description()] = transfer; break; } transfer = budget->transfers.next(); } break; } default: {} } } } void TransactionEditWidget::transactionsReset() { if(!descriptionEdit) return; descriptionEdit->completionObject()->clear(); if(payeeEdit) payeeEdit->completionObject()->clear(); default_values.clear(); switch(transtype) { case TRANSACTION_TYPE_EXPENSE: { Expense *expense = budget->expenses.first(); while(expense) { if(!expense->description().isEmpty()) { descriptionEdit->completionObject()->addItem(expense->description()); default_values[expense->description()] = expense; } if(payeeEdit && !expense->payee().isEmpty()) { payeeEdit->completionObject()->addItem(expense->payee()); } expense = budget->expenses.next(); } break; } case TRANSACTION_TYPE_INCOME: { Income *income = budget->incomes.first(); while(income) { if(!income->security() && !income->description().isEmpty()) { descriptionEdit->completionObject()->addItem(income->description()); default_values[income->description()] = income; } if(payeeEdit && !income->security() && !income->payer().isEmpty()) { payeeEdit->completionObject()->addItem(income->payer()); } income = budget->incomes.next(); } break; } case TRANSACTION_TYPE_TRANSFER: { Transfer *transfer= budget->transfers.first(); while(transfer) { if(!transfer->description().isEmpty()) { descriptionEdit->completionObject()->addItem(transfer->description()); default_values[transfer->description()] = transfer; } transfer = budget->transfers.next(); } break; } default: {} } } void TransactionEditWidget::setCurrentToItem(int index) { if(toCombo) toCombo->setCurrentIndex(index); } void TransactionEditWidget::setCurrentFromItem(int index) { if(fromCombo) fromCombo->setCurrentIndex(index); } void TransactionEditWidget::setAccount(Account *account) { if(fromCombo && (transtype == TRANSACTION_TYPE_EXPENSE || transtype == TRANSACTION_TYPE_TRANSFER || transtype == TRANSACTION_TYPE_SECURITY_BUY)) { for(QVector::size_type i = 0; i < froms.size(); i++) { if(account == froms[i]) { fromCombo->setCurrentIndex(i); break; } } } else if(toCombo) { for(QVector::size_type i = 0; i < tos.size(); i++) { if(account == tos[i]) { toCombo->setCurrentIndex(i); break; } } } } int TransactionEditWidget::currentToItem() { if(!toCombo) return -1; return toCombo->currentIndex(); } int TransactionEditWidget::currentFromItem() { if(!fromCombo) return -1; return fromCombo->currentIndex(); } void TransactionEditWidget::setTransaction(Transaction *trans) { if(valueEdit) valueEdit->blockSignals(true); if(sharesEdit) sharesEdit->blockSignals(true); if(quotationEdit) quotationEdit->blockSignals(true); if(trans == NULL) { value_set = false; shares_set = false; sharevalue_set = false; description_changed = false; if(dateEdit) dateEdit->setDate(QDate::currentDate()); if(b_sec) { if(sharesEdit) sharesEdit->setValue(0.0); if(quotationEdit) quotationEdit->setValue(0.0); if(valueEdit) valueEdit->setValue(0.0); if(valueEdit) valueEdit->setFocus(); else sharesEdit->setFocus(); } else { if(descriptionEdit) { descriptionEdit->clear(); descriptionEdit->setFocus(); } else { valueEdit->setFocus(); } valueEdit->setValue(0.0); } commentsEdit->clear(); if(quantityEdit) quantityEdit->setValue(1.0); if(payeeEdit) payeeEdit->clear(); if(dateEdit) emit dateChanged(trans->date()); } else { value_set = true; shares_set = true; sharevalue_set = true; if(dateEdit) dateEdit->setDate(trans->date()); commentsEdit->setText(trans->comment()); if(toCombo && (!b_sec || transtype == TRANSACTION_TYPE_SECURITY_SELL)) { for(QVector::size_type i = 0; i < tos.size(); i++) { if(trans->toAccount() == tos[i]) { toCombo->setCurrentIndex(i); break; } } } if(fromCombo && (!b_sec || transtype == TRANSACTION_TYPE_SECURITY_BUY)) { for(QVector::size_type i = 0; i < froms.size(); i++) { if(trans->fromAccount() == froms[i]) { fromCombo->setCurrentIndex(i); break; } } } if(b_sec) { if(transtype != trans->type()) return; //if(transtype == TRANSACTION_TYPE_SECURITY_SELL) setMaxShares(((SecurityTransaction*) trans)->security()->shares(QDate::currentDate()) + ((SecurityTransaction*) trans)->shares()); if(sharesEdit) sharesEdit->setValue(((SecurityTransaction*) trans)->shares()); if(quotationEdit) quotationEdit->setValue(((SecurityTransaction*) trans)->shareValue()); if(valueEdit) valueEdit->setValue(trans->value()); if(valueEdit) valueEdit->setFocus(); else sharesEdit->setFocus(); } else { if(descriptionEdit) { descriptionEdit->setText(trans->description()); description_changed = false; descriptionEdit->setFocus(); descriptionEdit->selectAll(); } else { valueEdit->setFocus(); } valueEdit->setValue(trans->value()); if(quantityEdit) quantityEdit->setValue(trans->quantity()); if(payeeEdit && trans->type() == TRANSACTION_TYPE_EXPENSE) payeeEdit->setText(((Expense*) trans)->payee()); if(payeeEdit && trans->type() == TRANSACTION_TYPE_INCOME) payeeEdit->setText(((Income*) trans)->payer()); } if(dateEdit) emit dateChanged(trans->date()); } if(valueEdit) valueEdit->blockSignals(false); if(sharesEdit) sharesEdit->blockSignals(false); if(quotationEdit) quotationEdit->blockSignals(false); } void TransactionEditWidget::setScheduledTransaction(ScheduledTransaction *strans, const QDate &date) { if(strans == NULL) { setTransaction(NULL); } else { setTransaction(strans->transaction()); if(dateEdit) dateEdit->setDate(date); } } TransactionEditDialog::TransactionEditDialog(bool extra_parameters, int transaction_type, bool split, bool transfer_to, Security *security, SecurityValueDefineType security_value_type, bool select_security, Budget *budg, QWidget *parent) : KDialog(parent, 0){ setButtons(KDialog::Ok | KDialog::Cancel); setDefaultButton(KDialog::Cancel); setModal(true); switch(transaction_type) { case TRANSACTION_TYPE_EXPENSE: {setPlainCaption(i18n("Edit Expense")); break;} case TRANSACTION_TYPE_INCOME: { if(security || select_security) setPlainCaption(i18n("Edit Dividend")); else setPlainCaption(i18n("Edit Income")); break; } case TRANSACTION_TYPE_TRANSFER: {setPlainCaption(i18n("Edit Transfer")); break;} case TRANSACTION_TYPE_SECURITY_BUY: {setPlainCaption(i18n("Edit Securities Bought")); break;} case TRANSACTION_TYPE_SECURITY_SELL: {setPlainCaption(i18n("Edit Securities Sold")); break;} } editWidget = new TransactionEditWidget(false, extra_parameters, transaction_type, split, transfer_to, security, security_value_type, select_security, budg, this); editWidget->transactionsReset(); setMainWidget(editWidget); } void TransactionEditDialog::slotButtonClicked(int button) { if(button != KDialog::Ok || editWidget->validValues(true)) { KDialog::slotButtonClicked(button); } } MultipleTransactionsEditDialog::MultipleTransactionsEditDialog(bool extra_parameters, int transaction_type, Budget *budg, QWidget *parent) : KDialog(parent), transtype(transaction_type), budget(budg), b_extra(extra_parameters) { setCaption(i18n("Modify Transactions")); setButtons(KDialog::Ok | KDialog::Cancel); setDefaultButton(KDialog::Cancel); setModal(true); setMainWidget(new QWidget(this)); int rows = 4; if(b_extra && (transtype == TRANSACTION_TYPE_EXPENSE || transtype == TRANSACTION_TYPE_INCOME)) rows= 5; else if(transtype == TRANSACTION_TYPE_TRANSFER) rows = 3; else rows = 2; QGridLayout *editLayout = new QGridLayout(mainWidget()); descriptionButton = new QCheckBox(i18n("Description:"), mainWidget()); descriptionButton->setChecked(false); editLayout->addWidget(descriptionButton, 0, 0); descriptionEdit = new KLineEdit(mainWidget()); descriptionEdit->setEnabled(false); editLayout->addWidget(descriptionEdit, 0, 1); valueButton = NULL; valueEdit = NULL; if(transtype == TRANSACTION_TYPE_EXPENSE || transtype == TRANSACTION_TYPE_INCOME || transtype == TRANSACTION_TYPE_TRANSFER) { if(transtype == TRANSACTION_TYPE_TRANSFER) valueButton = new QCheckBox(i18n("Amount:"), mainWidget()); else if(transtype == TRANSACTION_TYPE_INCOME) valueButton = new QCheckBox(i18n("Income:"), mainWidget()); else valueButton = new QCheckBox(i18n("Cost:"), mainWidget()); valueButton->setChecked(false); editLayout->addWidget(valueButton, 1, 0); valueEdit = new EqonomizeValueEdit(false, mainWidget()); valueEdit->setEnabled(false); editLayout->addWidget(valueEdit, 1, 1); } dateButton = new QCheckBox(i18n("Date:"), mainWidget()); dateButton->setChecked(false); editLayout->addWidget(dateButton, 2, 0); dateEdit = new KDateEdit(mainWidget()); dateEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); dateEdit->setEnabled(false); editLayout->addWidget(dateEdit, 2, 1); categoryButton = NULL; categoryCombo = NULL; if(transtype == TRANSACTION_TYPE_EXPENSE || transtype == TRANSACTION_TYPE_INCOME) { categoryButton = new QCheckBox(i18n("Category:"), mainWidget()); categoryButton->setChecked(false); editLayout->addWidget(categoryButton, 3, 0); categoryCombo = new KComboBox(mainWidget()); categoryCombo->setEditable(false); categoryCombo->setEnabled(false); updateAccounts(); editLayout->addWidget(categoryCombo, 3, 1); connect(categoryButton, SIGNAL(toggled(bool)), categoryCombo, SLOT(setEnabled(bool))); } payeeButton = NULL; payeeEdit = NULL; if(b_extra && (transtype == TRANSACTION_TYPE_EXPENSE || transtype == TRANSACTION_TYPE_INCOME)) { if(transtype == TRANSACTION_TYPE_INCOME) payeeButton = new QCheckBox(i18n("Payer:"), mainWidget()); else payeeButton = new QCheckBox(i18n("Payee:"), mainWidget()); payeeButton->setChecked(false); editLayout->addWidget(payeeButton, 4, 0); payeeEdit = new KLineEdit(mainWidget()); payeeEdit->setEnabled(false); editLayout->addWidget(payeeEdit, 4, 1); connect(payeeButton, SIGNAL(toggled(bool)), payeeEdit, SLOT(setEnabled(bool))); } connect(descriptionButton, SIGNAL(toggled(bool)), descriptionEdit, SLOT(setEnabled(bool))); if(valueButton) connect(valueButton, SIGNAL(toggled(bool)), valueEdit, SLOT(setEnabled(bool))); connect(dateButton, SIGNAL(toggled(bool)), dateEdit, SLOT(setEnabled(bool))); } void MultipleTransactionsEditDialog::setTransaction(Transaction *trans) { if(trans) { descriptionEdit->setText(trans->description()); dateEdit->setDate(trans->date()); if(valueEdit) valueEdit->setValue(trans->value()); if(transtype == TRANSACTION_TYPE_EXPENSE) { for(QVector::size_type i = 0; i < categories.size(); i++) { if(((Expense*) trans)->category() == categories[i]) { categoryCombo->setCurrentIndex(i); break; } } if(payeeEdit) payeeEdit->setText(((Expense*) trans)->payee()); } else if(transtype == TRANSACTION_TYPE_INCOME) { for(QVector::size_type i = 0; i < categories.size(); i++) { if(((Income*) trans)->category() == categories[i]) { categoryCombo->setCurrentIndex(i); break; } } if(payeeEdit) payeeEdit->setText(((Income*) trans)->payer()); } } else { descriptionEdit->clear(); dateEdit->setDate(QDate::currentDate()); if(valueEdit) valueEdit->setValue(0.0); if(payeeEdit) payeeEdit->clear(); } } void MultipleTransactionsEditDialog::setScheduledTransaction(ScheduledTransaction *strans, const QDate &date) { if(strans) setTransaction(strans->transaction()); else setTransaction(NULL); dateEdit->setDate(date); } void MultipleTransactionsEditDialog::updateAccounts() { if(!categoryCombo) return; categoryCombo->clear(); categories.clear(); switch(transtype) { case TRANSACTION_TYPE_INCOME: { Account *account = budget->incomesAccounts.first(); while(account) { categoryCombo->addItem(account->name()); categories.push_back(account); account = budget->incomesAccounts.next(); } break; } case TRANSACTION_TYPE_EXPENSE: { Account *account = budget->expensesAccounts.first(); while(account) { categoryCombo->addItem(account->name()); categories.push_back(account); account = budget->expensesAccounts.next(); } break; } default: {} } } bool MultipleTransactionsEditDialog::modifyTransaction(Transaction *trans) { if(!validValues()) return false; bool b_descr = true, b_value = true; switch(trans->type()) { case TRANSACTION_TYPE_EXPENSE: { if(transtype == trans->type() && categoryButton->isChecked()) ((Expense*) trans)->setCategory((ExpensesAccount*) categories[categoryCombo->currentIndex()]); if(payeeEdit && payeeButton->isChecked()) ((Expense*) trans)->setPayee(payeeEdit->text()); break; } case TRANSACTION_TYPE_INCOME: { if(((Income*) trans)->security()) b_descr = false; else if(payeeEdit && payeeButton->isChecked()) ((Income*) trans)->setPayer(payeeEdit->text()); if(transtype == trans->type() && categoryButton->isChecked()) ((Income*) trans)->setCategory((IncomesAccount*) categories[categoryCombo->currentIndex()]); break; } case TRANSACTION_TYPE_TRANSFER: { break; } case TRANSACTION_TYPE_SECURITY_BUY: { if(transtype == TRANSACTION_TYPE_INCOME && categoryButton->isChecked()) ((SecurityTransaction*) trans)->setAccount(categories[categoryCombo->currentIndex()]); b_descr = false; b_value = false; break; } case TRANSACTION_TYPE_SECURITY_SELL: { if(transtype == TRANSACTION_TYPE_INCOME && categoryButton->isChecked()) ((SecurityTransaction*) trans)->setAccount(categories[categoryCombo->currentIndex()]); b_descr = false; b_value = false; break; } } if(b_descr && descriptionButton->isChecked()) trans->setDescription(descriptionEdit->text()); if(valueEdit && b_value && valueButton->isChecked()) trans->setValue(valueEdit->value()); if(dateButton->isChecked() && !trans->parentSplit()) trans->setDate(dateEdit->date()); return true; } bool MultipleTransactionsEditDialog::checkAccounts() { switch(transtype) { case TRANSACTION_TYPE_INCOME: { if(!categoryButton->isChecked()) return true; if(categoryCombo->count() == 0) { KMessageBox::error(this, i18n("No income category available.")); return false; } break; } case TRANSACTION_TYPE_EXPENSE: { if(!categoryButton->isChecked()) return true; if(categoryCombo->count() == 0) { KMessageBox::error(this, i18n("No expense category available.")); return false; } break; } default: {} } return true; } bool MultipleTransactionsEditDialog::validValues() { if(dateButton->isChecked() && !dateEdit->date().isValid()) { KMessageBox::error(this, i18n("Invalid date.")); dateEdit->setFocus(); dateEdit->lineEdit()->selectAll(); return false; } if(!checkAccounts()) return false; return true; } void MultipleTransactionsEditDialog::slotButtonClicked(int button) { if(button == KDialog::Ok) { if(!descriptionButton->isChecked() && (!valueButton || !valueButton->isChecked()) && !dateButton->isChecked() && (!categoryButton || !categoryButton->isChecked()) && (!payeeButton || !payeeButton->isChecked())) { KDialog::slotButtonClicked(KDialog::Cancel); } else if(validValues()) { KDialog::slotButtonClicked(KDialog::Ok); } } else { KDialog::slotButtonClicked(button); } } QDate MultipleTransactionsEditDialog::date() { if(!dateButton->isChecked()) return QDate(); return dateEdit->date(); } #include "transactioneditwidget.moc" eqonomize-0.6/src/transactioneditwidget.h0000600000175000017500000001247111106577115017661 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef TRANSACTION_EDIT_WIDGET_H #define TRANSACTION_EDIT_WIDGET_H #include #include #include #include #include #include class Budget; class Account; class KLineEdit; class EqonomizeValueEdit; class KDateEdit; class KComboBox; class QPushButton; class QLabel; class QCheckBox; class Transaction; class Security; class ScheduledTransaction; typedef enum { SECURITY_ALL_VALUES, SECURITY_SHARES_AND_QUOTATION, SECURITY_VALUE_AND_SHARES, SECURITY_VALUE_AND_QUOTATION } SecurityValueDefineType; class TransactionEditWidget : public QWidget { Q_OBJECT public: TransactionEditWidget(bool auto_edit, bool extra_parameters, int transaction_type, bool split, bool transfer_to, Security *security, SecurityValueDefineType security_value_type, bool select_security, Budget *budg, QWidget *parent = 0); void setTransaction(Transaction *trans); void setScheduledTransaction(ScheduledTransaction *strans, const QDate &date); void updateFromAccounts(Account *exclude_account = NULL); void updateToAccounts(Account *exclude_account = NULL); void updateAccounts(Account *exclude_account = NULL); void transactionsReset(); void setCurrentToItem(int index); void setCurrentFromItem(int index); void setAccount(Account *account); int currentToItem(); int currentFromItem(); void focusDescription(); QWidget *bottomWidget(); void transactionRemoved(Transaction *trans); void transactionAdded(Transaction *trans); void transactionModified(Transaction *trans); bool modifyTransaction(Transaction *trans); Transaction *createTransaction(); bool validValues(bool ask_questions = false); QDate date(); Security *selectedSecurity(); void setMaxShares(double max); void setMaxSharesDate(QDate quotation_date); bool checkAccounts(); void currentDateChanged(const QDate &olddate, const QDate &newdate); protected: QHash default_values; int transtype; bool description_changed; Budget *budget; Security *security; bool b_autoedit, b_sec, b_extra; bool value_set, shares_set, sharevalue_set; QDate shares_date; QVector froms, tos; KLineEdit *descriptionEdit, *commentsEdit, *payeeEdit; KComboBox *fromCombo, *toCombo, *securityCombo; EqonomizeValueEdit *valueEdit, *sharesEdit, *quotationEdit, *quantityEdit; QPushButton *maxSharesButton; KDateEdit *dateEdit; QWidget *bottom_widget; signals: void addmodify(); void dateChanged(const QDate&); public slots: void valueChanged(double); void securityChanged(); void sharesChanged(double); void quotationChanged(double); void descriptionChanged(const QString&); void setDefaultValue(); void maxShares(); }; class TransactionEditDialog : public KDialog { Q_OBJECT public: TransactionEditDialog(bool extra_parameters, int transaction_type, bool split, bool transfer_to, Security *security, SecurityValueDefineType security_value_type, bool select_security, Budget *budg, QWidget *parent); TransactionEditWidget *editWidget; protected slots: void slotButtonClicked(int); }; class MultipleTransactionsEditDialog : public KDialog { Q_OBJECT public: MultipleTransactionsEditDialog(bool extra_parameters, int transaction_type, Budget *budg, QWidget *parent = 0); void setTransaction(Transaction *trans); void setScheduledTransaction(ScheduledTransaction *strans, const QDate &date); void updateAccounts(); bool modifyTransaction(Transaction *trans); bool validValues(); bool checkAccounts(); QDate date(); QCheckBox *descriptionButton, *valueButton, *categoryButton, *dateButton, *payeeButton; protected: int transtype; Budget *budget; bool b_extra; QVector categories; KLineEdit *descriptionEdit, *payeeEdit; KComboBox *categoryCombo; EqonomizeValueEdit *valueEdit; KDateEdit *dateEdit; protected slots: void slotButtonClicked(int); }; #endif eqonomize-0.6/src/transactionfilterwidget.cpp0000644000175000017500000006551011106577121020563 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "transactionfilterwidget.h" #include "budget.h" #include "eqonomizevalueedit.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "kdateedit.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern double monthsBetweenDates(const QDate &date1, const QDate &date2); extern double yearsBetweenDates(const QDate &date1, const QDate &date2); TransactionFilterWidget::TransactionFilterWidget(bool extra_parameters, int transaction_type, Budget *budg, QWidget *parent) : QWidget(parent), transtype(transaction_type), budget(budg), b_extra(extra_parameters) { payeeEdit = NULL; int rows = 5; if(b_extra && (transtype == TRANSACTION_TYPE_EXPENSE || transtype == TRANSACTION_TYPE_INCOME)) rows = 6; QGridLayout *filterLayout = new QGridLayout(this); filterLayout->setContentsMargins(0, 0, 0, 0); dateFromButton = new QCheckBox(i18n("From:"), this); dateFromButton->setChecked(false); filterLayout->addWidget(dateFromButton, 0, 0); dateFromEdit = new KDateEdit(this); dateFromEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); dateFromEdit->setEnabled(false); filterLayout->addWidget(dateFromEdit, 0, 1); filterLayout->addWidget(new QLabel(i18n("To:"), this), 0, 2); dateToEdit = new KDateEdit(this); dateToEdit->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow); filterLayout->addWidget(dateToEdit, 0, 3); QDate curdate = QDate::currentDate(); from_date.setYMD(curdate.year(), curdate.month(), 1); dateFromEdit->setDate(from_date); to_date = curdate; dateToEdit->setDate(to_date); if(transtype == TRANSACTION_TYPE_TRANSFER) { filterLayout->addWidget(new QLabel(i18n("From:"), this), 2, 0); fromCombo = new KComboBox(this); fromCombo->setEditable(false); filterLayout->addWidget(fromCombo, 2, 1); filterLayout->addWidget(new QLabel(i18n("To:"), this), 2, 2); toCombo = new KComboBox(this); toCombo->setEditable(false); filterLayout->addWidget(toCombo, 2, 3); minButton = new QCheckBox(i18n("Min amount:"), this); maxButton = new QCheckBox(i18n("Max amount:"), this); } else if(transtype == TRANSACTION_TYPE_INCOME) { filterLayout->addWidget(new QLabel(i18n("Category:"), this), 2, 0); fromCombo = new KComboBox(this); fromCombo->setEditable(false); filterLayout->addWidget(fromCombo, 2, 1); filterLayout->addWidget(new QLabel(i18n("To account:"), this), 2, 2); toCombo = new KComboBox(this); toCombo->setEditable(false); filterLayout->addWidget(toCombo, 2, 3); minButton = new QCheckBox(i18n("Min income:"), this); maxButton = new QCheckBox(i18n("Max income:"), this); } else { filterLayout->addWidget(new QLabel(i18n("Category:"), this), 2, 0); toCombo = new KComboBox(this); toCombo->setEditable(false); filterLayout->addWidget(toCombo, 2, 1); filterLayout->addWidget(new QLabel(i18n("From account:"), this), 2, 2); fromCombo = new KComboBox(this); fromCombo->setEditable(false); filterLayout->addWidget(fromCombo, 2, 3); minButton = new QCheckBox(i18n("Min cost:"), this); maxButton = new QCheckBox(i18n("Max cost:"), this); } filterLayout->addWidget(minButton, 1, 0); minEdit = new EqonomizeValueEdit(false, this); minEdit->setEnabled(false); filterLayout->addWidget(minEdit, 1, 1); filterLayout->addWidget(maxButton, 1, 2); maxEdit = new EqonomizeValueEdit(false, this); maxEdit->setEnabled(false); QSizePolicy sp = maxEdit->sizePolicy(); sp.setHorizontalPolicy(QSizePolicy::Expanding); maxEdit->setSizePolicy(sp); filterLayout->addWidget(maxEdit, 1, 3); filterLayout->addWidget(new QLabel(i18n("Description:"), this), 3, 0); descriptionEdit = new KLineEdit(this); descriptionEdit->setCompletionMode(KGlobalSettings::CompletionPopup); filterLayout->addWidget(descriptionEdit, 3, 1); if(b_extra && (transtype == TRANSACTION_TYPE_EXPENSE || transtype == TRANSACTION_TYPE_INCOME)) { if(transtype == TRANSACTION_TYPE_INCOME) filterLayout->addWidget(new QLabel(i18n("Payer:"), this), 3, 2); else filterLayout->addWidget(new QLabel(i18n("Payee:"), this), 3, 2); payeeEdit = new KLineEdit(this); payeeEdit->setCompletionMode(KGlobalSettings::CompletionPopup); filterLayout->addWidget(payeeEdit, 3, 3); } QHBoxLayout *filterExcludeLayout = new QHBoxLayout(); group = new QButtonGroup(this); includeButton = new QRadioButton(i18n("Include"), this); includeButton->setChecked(true); group->addButton(includeButton); filterExcludeLayout->addWidget(includeButton); excludeButton = new QRadioButton(i18n("Exclude"), this); group->addButton(excludeButton); filterExcludeLayout->addWidget(excludeButton); filterExcludeLayout->addItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum)); clearButton = new KPushButton(KStandardGuiItem::clear(), this); clearButton->setEnabled(false); filterExcludeLayout->addWidget(clearButton); if(payeeEdit) { filterLayout->addLayout(filterExcludeLayout, 4, 0, 1, 4); filterLayout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Expanding), 5, 0, 1, 4); } else { filterLayout->addLayout(filterExcludeLayout, 3, 2, 1, 2); filterLayout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Expanding), 4, 0, 1, 4); } fromCombo->addItem(i18n("All")); toCombo->addItem(i18n("All")); descriptionEdit->completionObject()->setIgnoreCase(true); if(payeeEdit) payeeEdit->completionObject()->setIgnoreCase(true); if(payeeEdit) { connect(payeeEdit, SIGNAL(textChanged(const QString&)), this, SIGNAL(filter())); connect(payeeEdit, SIGNAL(textChanged(const QString&)), this, SLOT(checkEnableClear())); } connect(clearButton, SIGNAL(clicked()), this, SLOT(clearFilter())); connect(group, SIGNAL(buttonClicked(int)), this, SIGNAL(filter())); connect(dateFromButton, SIGNAL(toggled(bool)), dateFromEdit, SLOT(setEnabled(bool))); connect(dateFromButton, SIGNAL(toggled(bool)), this, SIGNAL(filter())); connect(dateFromButton, SIGNAL(toggled(bool)), this, SLOT(checkEnableClear())); connect(dateFromEdit, SIGNAL(dateChanged(const QDate&)), this, SLOT(fromChanged(const QDate&))); connect(dateToEdit, SIGNAL(dateChanged(const QDate&)), this, SLOT(toChanged(const QDate&))); connect(dateToEdit, SIGNAL(dateChanged(const QDate&)), this, SLOT(checkEnableClear())); connect(toCombo, SIGNAL(activated(int)), this, SIGNAL(filter())); connect(fromCombo, SIGNAL(activated(int)), this, SIGNAL(filter())); connect(toCombo, SIGNAL(activated(int)), this, SLOT(checkEnableClear())); connect(fromCombo, SIGNAL(activated(int)), this, SLOT(checkEnableClear())); connect(toCombo, SIGNAL(activated(int)), this, SIGNAL(toActivated(int))); connect(fromCombo, SIGNAL(activated(int)), this, SIGNAL(fromActivated(int))); connect(descriptionEdit, SIGNAL(textChanged(const QString&)), this, SIGNAL(filter())); connect(descriptionEdit, SIGNAL(textChanged(const QString&)), this, SLOT(checkEnableClear())); connect(minButton, SIGNAL(toggled(bool)), this, SIGNAL(filter())); connect(minButton, SIGNAL(toggled(bool)), this, SLOT(checkEnableClear())); connect(minButton, SIGNAL(toggled(bool)), minEdit, SLOT(setEnabled(bool))); connect(minEdit, SIGNAL(valueChanged(double)), this, SIGNAL(filter())); connect(maxButton, SIGNAL(toggled(bool)), this, SIGNAL(filter())); connect(maxButton, SIGNAL(toggled(bool)), this, SLOT(checkEnableClear())); connect(maxButton, SIGNAL(toggled(bool)), maxEdit, SLOT(setEnabled(bool))); connect(maxEdit, SIGNAL(valueChanged(double)), this, SIGNAL(filter())); } TransactionFilterWidget::~TransactionFilterWidget() { delete group; } void TransactionFilterWidget::currentDateChanged(const QDate &olddate, const QDate &newdate) { if(olddate == to_date) { dateToEdit->blockSignals(true); dateToEdit->setDate(newdate); dateToEdit->blockSignals(false); toChanged(newdate); } } void TransactionFilterWidget::clearFilter() { dateFromButton->blockSignals(true); dateToEdit->blockSignals(true); minButton->blockSignals(true); maxButton->blockSignals(true); fromCombo->blockSignals(true); toCombo->blockSignals(true); descriptionEdit->blockSignals(true); if(payeeEdit) payeeEdit->blockSignals(true); dateFromButton->setChecked(false); dateFromEdit->setEnabled(false); to_date = QDate::currentDate(); dateToEdit->setDate(to_date); minButton->setChecked(false); minEdit->setEnabled(false); maxButton->setChecked(false); maxEdit->setEnabled(false); fromCombo->setCurrentIndex(0); toCombo->setCurrentIndex(0); descriptionEdit->setText(QString::null); if(payeeEdit) payeeEdit->setText(QString::null); dateFromButton->blockSignals(false); dateToEdit->blockSignals(false); minButton->blockSignals(false); maxButton->blockSignals(false); fromCombo->blockSignals(false); toCombo->blockSignals(false); descriptionEdit->blockSignals(false); if(payeeEdit) payeeEdit->blockSignals(false); clearButton->setEnabled(false); emit filter(); } void TransactionFilterWidget::checkEnableClear() { clearButton->setEnabled(dateFromButton->isChecked() || minButton->isChecked() || maxButton->isChecked() || fromCombo->currentIndex() || toCombo->currentIndex() || !descriptionEdit->text().isEmpty() || (payeeEdit && !payeeEdit->text().isEmpty()) || to_date != QDate::currentDate()); } void TransactionFilterWidget::setFilter(QDate fromdate, QDate todate, double min, double max, Account *from_account, Account *to_account, QString description, QString payee, bool exclude) { dateFromButton->blockSignals(true); dateFromEdit->blockSignals(true); dateToEdit->blockSignals(true); minButton->blockSignals(true); maxButton->blockSignals(true); minEdit->blockSignals(true); maxEdit->blockSignals(true); fromCombo->blockSignals(true); toCombo->blockSignals(true); descriptionEdit->blockSignals(true); if(payeeEdit) payeeEdit->blockSignals(true); excludeButton->blockSignals(true); includeButton->blockSignals(true); dateToEdit->setDate(todate); to_date = todate; if(fromdate.isNull()) { dateFromButton->setChecked(false); dateFromEdit->setEnabled(false); if(dateFromEdit->date() > todate) { dateFromEdit->setDate(todate); from_date = todate; } } else { dateFromButton->setChecked(true); dateFromEdit->setEnabled(true); dateFromEdit->setDate(fromdate); from_date = fromdate; } if(min < 0.0) { minButton->setChecked(false); minEdit->setEnabled(false); } else { minButton->setChecked(true); minEdit->setEnabled(true); minEdit->setValue(min); } if(max < 0.0) { maxButton->setChecked(false); maxEdit->setEnabled(false); } else { maxButton->setChecked(true); maxEdit->setEnabled(true); maxEdit->setValue(max); } if(from_account) { for(QVector::size_type i = 0; i < froms.size(); i++) { if(froms[i] == from_account) { fromCombo->setCurrentIndex(i + 1); emit fromActivated(i + 1); break; } } } else { fromCombo->setCurrentIndex(0); emit fromActivated(0); } if(to_account) { for(QVector::size_type i = 0; i < tos.size(); i++) { if(tos[i] == to_account) { toCombo->setCurrentIndex(i + 1); emit toActivated(i + 1); break; } } } else { toCombo->setCurrentIndex(0); emit toActivated(0); } descriptionEdit->setText(description); if(payeeEdit) descriptionEdit->setText(payee); excludeButton->setChecked(exclude); checkEnableClear(); dateFromButton->blockSignals(false); dateFromEdit->blockSignals(false); dateToEdit->blockSignals(false); minButton->blockSignals(false); maxButton->blockSignals(false); minEdit->blockSignals(false); maxEdit->blockSignals(false); fromCombo->blockSignals(false); toCombo->blockSignals(false); descriptionEdit->blockSignals(false); if(payeeEdit) payeeEdit->blockSignals(false); excludeButton->blockSignals(false); includeButton->blockSignals(false); emit filter(); } void TransactionFilterWidget::updateFromAccounts() { fromCombo->clear(); froms.clear(); fromCombo->addItem(i18n("All")); Account *account; switch(transtype) { case TRANSACTION_TYPE_TRANSFER: { account = budget->assetsAccounts.first(); while(account) { fromCombo->addItem(account->name()); froms.push_back(account); account = budget->assetsAccounts.next(); } break; } case TRANSACTION_TYPE_EXPENSE: { account = budget->assetsAccounts.first(); while(account) { if(account != budget->balancingAccount && ((AssetsAccount*) account)->accountType() != ASSETS_TYPE_SECURITIES) { fromCombo->addItem(account->name()); froms.push_back(account); } account = budget->assetsAccounts.next(); } break; } case TRANSACTION_TYPE_INCOME: { account = budget->incomesAccounts.first(); while(account) { fromCombo->addItem(account->name()); froms.push_back(account); account = budget->incomesAccounts.next(); } break; } } } void TransactionFilterWidget::updateToAccounts() { toCombo->clear(); tos.clear(); toCombo->addItem(i18n("All")); Account *account; switch(transtype) { case TRANSACTION_TYPE_TRANSFER: { account = budget->assetsAccounts.first(); while(account) { toCombo->addItem(account->name()); tos.push_back(account); account = budget->assetsAccounts.next(); } break; } case TRANSACTION_TYPE_INCOME: { account = budget->assetsAccounts.first(); while(account) { if(account != budget->balancingAccount) { toCombo->addItem(account->name()); tos.push_back(account); } account = budget->assetsAccounts.next(); } break; } case TRANSACTION_TYPE_EXPENSE: { account = budget->expensesAccounts.first(); while(account) { toCombo->addItem(account->name()); tos.push_back(account); account = budget->expensesAccounts.next(); } break; } } } void TransactionFilterWidget::updateAccounts() { updateFromAccounts(); updateToAccounts(); } bool TransactionFilterWidget::filterTransaction(Transaction *trans, bool checkdate) { if(trans->type() == TRANSACTION_TYPE_SECURITY_BUY || trans->type() == TRANSACTION_TYPE_SECURITY_SELL) { if(transtype == TRANSACTION_TYPE_TRANSFER && ((SecurityTransaction*) trans)->account()->type() != ACCOUNT_TYPE_ASSETS) return true; if(transtype == TRANSACTION_TYPE_EXPENSE && ((SecurityTransaction*) trans)->account()->type() != ACCOUNT_TYPE_EXPENSES) return true; if(transtype == TRANSACTION_TYPE_INCOME && ((SecurityTransaction*) trans)->account()->type() != ACCOUNT_TYPE_INCOMES) return true; } else if(trans->type() != transtype) { return true; } if(includeButton->isChecked()) { if(toCombo->currentIndex() > 0 && tos[toCombo->currentIndex() - 1] != trans->toAccount()) { return true; } if(fromCombo->currentIndex() > 0 && froms[fromCombo->currentIndex() - 1] != trans->fromAccount()) { return true; } #if QT_VERSION >= 0x030200 if(!descriptionEdit->text().isEmpty() && !trans->description().startsWith(descriptionEdit->text(), Qt::CaseInsensitive)) { #else if(!descriptionEdit->text().isEmpty() && !trans->description().startsWith(descriptionEdit->text())) { #endif return true; } #if QT_VERSION >= 0x030200 if(payeeEdit && transtype == TRANSACTION_TYPE_EXPENSE && !payeeEdit->text().isEmpty() && !((Expense*) trans)->payee().startsWith(payeeEdit->text(), Qt::CaseInsensitive)) { #else if(payeeEdit && transtype == TRANSACTION_TYPE_EXPENSE && !payeeEdit->text().isEmpty() && !((Expense*) trans)->payee().startsWith(payeeEdit->text())) { #endif return true; } #if QT_VERSION >= 0x030200 if(payeeEdit && transtype == TRANSACTION_TYPE_INCOME && !payeeEdit->text().isEmpty() && !((Income*) trans)->payer().startsWith(payeeEdit->text(), Qt::CaseInsensitive)) { #else if(payeeEdit && transtype == TRANSACTION_TYPE_INCOME && !payeeEdit->text().isEmpty() && !((Income*) trans)->payer().startsWith(payeeEdit->text())) { #endif return true; } } else { if(toCombo->currentIndex() > 0 && tos[toCombo->currentIndex() - 1] == trans->toAccount()) { return true; } if(fromCombo->currentIndex() > 0 && froms[fromCombo->currentIndex() - 1] == trans->fromAccount()) { return true; } #if QT_VERSION >= 0x030200 if(!descriptionEdit->text().isEmpty() && trans->description().startsWith(descriptionEdit->text(), Qt::CaseInsensitive)) { #else if(!descriptionEdit->text().isEmpty() && trans->description().startsWith(descriptionEdit->text())) { #endif return true; } #if QT_VERSION >= 0x030200 if(payeeEdit && transtype == TRANSACTION_TYPE_EXPENSE && !payeeEdit->text().isEmpty() && ((Expense*) trans)->payee().startsWith(payeeEdit->text(), Qt::CaseInsensitive)) { #else if(payeeEdit && transtype == TRANSACTION_TYPE_EXPENSE && !payeeEdit->text().isEmpty() && ((Expense*) trans)->payee().startsWith(payeeEdit->text())) { #endif return true; } #if QT_VERSION >= 0x030200 if(payeeEdit && transtype == TRANSACTION_TYPE_INCOME && !payeeEdit->text().isEmpty() && ((Income*) trans)->payer().startsWith(payeeEdit->text(), Qt::CaseInsensitive)) { #else if(payeeEdit && transtype == TRANSACTION_TYPE_INCOME && !payeeEdit->text().isEmpty() && ((Income*) trans)->payer().startsWith(payeeEdit->text())) { #endif return true; } } if(minButton->isChecked() && trans->value() < minEdit->value()) { return true; } if(maxButton->isChecked() && trans->value() > maxEdit->value()) { return true; } if(checkdate && dateFromButton->isChecked() && trans->date() < from_date) { return true; } if(checkdate && trans->date() > to_date) { return true; } return false; } QDate TransactionFilterWidget::startDate() { if(!dateFromButton->isChecked()) return QDate(); return from_date; } QDate TransactionFilterWidget::endDate() { return to_date; } void TransactionFilterWidget::transactionsReset() { descriptionEdit->completionObject()->clear(); if(payeeEdit) payeeEdit->completionObject()->clear(); switch(transtype) { case TRANSACTION_TYPE_EXPENSE: { Expense *expense = budget->expenses.first(); while(expense) { if(!expense->description().isEmpty()) { descriptionEdit->completionObject()->addItem(expense->description()); } if(payeeEdit && !expense->payee().isEmpty()) { payeeEdit->completionObject()->addItem(expense->payee()); } expense = budget->expenses.next(); } break; } case TRANSACTION_TYPE_INCOME: { Income *income = budget->incomes.first(); while(income) { if(!income->description().isEmpty()) { descriptionEdit->completionObject()->addItem(income->description()); } if(payeeEdit && !income->payer().isEmpty()) { payeeEdit->completionObject()->addItem(income->payer()); } income = budget->incomes.next(); } break; } case TRANSACTION_TYPE_TRANSFER: { Transfer *transfer= budget->transfers.first(); while(transfer) { if(!transfer->description().isEmpty()) { descriptionEdit->completionObject()->addItem(transfer->description()); } transfer = budget->transfers.next(); } break; } } } void TransactionFilterWidget::transactionAdded(Transaction *trans) { if(descriptionEdit && trans->type() == transtype && (transtype != TRANSACTION_TYPE_INCOME || !((Income*) trans)->security())) { if(!trans->description().isEmpty()) descriptionEdit->completionObject()->addItem(trans->description()); if(payeeEdit && transtype == TRANSACTION_TYPE_EXPENSE && !((Expense*) trans)->payee().isEmpty()) payeeEdit->completionObject()->addItem(((Expense*) trans)->payee()); if(payeeEdit && transtype == TRANSACTION_TYPE_INCOME && !((Income*) trans)->payer().isEmpty()) payeeEdit->completionObject()->addItem(((Income*) trans)->payer()); } } void TransactionFilterWidget::transactionModified(Transaction *trans) { if(descriptionEdit && trans->type() == transtype && (transtype != TRANSACTION_TYPE_INCOME || !((Income*) trans)->security())) { if(!trans->description().isEmpty()) descriptionEdit->completionObject()->addItem(trans->description()); if(payeeEdit && transtype == TRANSACTION_TYPE_EXPENSE && !((Expense*) trans)->payee().isEmpty()) payeeEdit->completionObject()->addItem(((Expense*) trans)->payee()); if(payeeEdit && transtype == TRANSACTION_TYPE_INCOME && !((Income*) trans)->payer().isEmpty()) payeeEdit->completionObject()->addItem(((Income*) trans)->payer()); } } void TransactionFilterWidget::toChanged(const QDate &date) { bool error = false; if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); error = true; } if(!error && dateFromEdit->date() > date) { if(dateFromButton->isChecked()) { KMessageBox::error(this, i18n("To date is before from date.")); } from_date = date; dateFromEdit->blockSignals(true); dateFromEdit->setDate(from_date); dateFromEdit->blockSignals(false); } if(error) { dateToEdit->setFocus(); dateToEdit->blockSignals(true); dateToEdit->setDate(to_date); dateToEdit->blockSignals(false); dateToEdit->lineEdit()->selectAll(); return; } to_date = date; emit filter(); } void TransactionFilterWidget::fromChanged(const QDate &date) { bool error = false; if(!date.isValid()) { KMessageBox::error(this, i18n("Invalid date.")); error = true; } if(!error && date > dateToEdit->date()) { KMessageBox::error(this, i18n("From date is after to date.")); to_date = date; dateToEdit->blockSignals(true); dateToEdit->setDate(to_date); dateToEdit->blockSignals(false); } if(error) { dateFromEdit->setFocus(); dateFromEdit->blockSignals(true); dateFromEdit->setDate(from_date); dateFromEdit->blockSignals(false); dateFromEdit->lineEdit()->selectAll(); return; } from_date = date; if(dateFromButton->isChecked()) emit filter(); } double TransactionFilterWidget::countYears() { QDate first_date = firstDate(); if(first_date.isNull()) return 0.0; return yearsBetweenDates(first_date, to_date); } double TransactionFilterWidget::countMonths() { QDate first_date = firstDate(); if(first_date.isNull()) return 0.0; return monthsBetweenDates(first_date, to_date); } int TransactionFilterWidget::countDays() { QDate first_date = firstDate(); if(first_date.isNull()) return 0; return first_date.daysTo(to_date) + 1; } QDate TransactionFilterWidget::firstDate() { if(dateFromButton->isChecked()) return from_date; QDate first_date; switch(transtype) { case TRANSACTION_TYPE_EXPENSE: { if(!budget->expenses.isEmpty()) first_date = budget->expenses.getFirst()->date(); SecurityTransaction *sectrans = budget->securityTransactions.first(); while(sectrans) { if(!first_date.isNull() && sectrans->date() >= first_date) break; if(sectrans->account()->type() == ACCOUNT_TYPE_EXPENSES) { first_date = sectrans->date(); break; } sectrans = budget->securityTransactions.next(); } if(first_date.isNull()) { ScheduledTransaction *strans = budget->scheduledTransactions.first(); while(strans) { if(strans->transaction()->type() == TRANSACTION_TYPE_EXPENSE || ((strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL || strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY) && ((SecurityTransaction*) strans->transaction())->account()->type() == ACCOUNT_TYPE_EXPENSES)) { first_date = strans->transaction()->date(); break; } strans = budget->scheduledTransactions.next(); } } break; } case TRANSACTION_TYPE_INCOME: { if(!budget->incomes.isEmpty()) first_date = budget->incomes.getFirst()->date(); SecurityTransaction *sectrans = budget->securityTransactions.first(); while(sectrans) { if(!first_date.isNull() && sectrans->date() >= first_date) break; if(sectrans->account()->type() == ACCOUNT_TYPE_INCOMES) { first_date = sectrans->date(); break; } sectrans = budget->securityTransactions.next(); } if(first_date.isNull()) { ScheduledTransaction *strans = budget->scheduledTransactions.first(); while(strans) { if(strans->transaction()->type() == TRANSACTION_TYPE_INCOME || ((strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL || strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY) && ((SecurityTransaction*) strans->transaction())->account()->type() == ACCOUNT_TYPE_INCOMES)) { first_date = strans->transaction()->date(); break; } strans = budget->scheduledTransactions.next(); } } break; } case TRANSACTION_TYPE_TRANSFER: { if(!budget->transfers.isEmpty()) first_date = budget->transfers.getFirst()->date(); SecurityTransaction *sectrans = budget->securityTransactions.first(); while(sectrans) { if(!first_date.isNull() && sectrans->date() >= first_date) break; if(sectrans->account()->type() == ACCOUNT_TYPE_ASSETS) { first_date = sectrans->date(); break; } sectrans = budget->securityTransactions.next(); } if(first_date.isNull()) { ScheduledTransaction *strans = budget->scheduledTransactions.first(); while(strans) { if(strans->transaction()->type() == TRANSACTION_TYPE_TRANSFER || ((strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL || strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY) && ((SecurityTransaction*) strans->transaction())->account()->type() == ACCOUNT_TYPE_ASSETS)) { first_date = strans->transaction()->date(); break; } strans = budget->scheduledTransactions.next(); } } break; } default: {break;} } return first_date; } #include "transactionfilterwidget.moc" eqonomize-0.6/src/transactionfilterwidget.h0000600000175000017500000000647311106577125020227 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef TRANSACTION_FILTER_WIDGET_H #define TRANSACTION_FILTER_WIDGET_H #include #include #include class Budget; class Transaction; class Account; class KLineEdit; class KDateEdit; class KComboBox; class QPushButton; class QLabel; class QCheckBox; class QRadioButton; class EqonomizeValueEdit; class QButtonGroup; class TransactionFilterWidget : public QWidget { Q_OBJECT public: TransactionFilterWidget(bool extra_parameters, int transaction_type, Budget *budg, QWidget *parent = 0); ~TransactionFilterWidget(); bool filterTransaction(Transaction *trans, bool checkdate = true); void updateFromAccounts(); void updateToAccounts(); void updateAccounts(); void transactionsReset(); void transactionAdded(Transaction*); void transactionModified(Transaction*); double countYears(); double countMonths(); int countDays(); QDate startDate(); QDate endDate(); void currentDateChanged(const QDate &olddate, const QDate &newdate); void setFilter(QDate fromdate, QDate todate, double min = -1.0, double max = -1.0, Account *from_account = NULL, Account *to_account = NULL, QString description = QString::null, QString payee = QString::null, bool exclude = false); protected: QDate firstDate(); int transtype; Budget *budget; bool b_extra; QVector froms, tos; KComboBox *fromCombo, *toCombo; QCheckBox *minButton, *maxButton, *dateFromButton; EqonomizeValueEdit *minEdit, *maxEdit; KDateEdit *dateFromEdit, *dateToEdit; KLineEdit *descriptionEdit, *payeeEdit; QDate from_date, to_date; QRadioButton *includeButton, *excludeButton; QPushButton *clearButton; QButtonGroup *group; protected slots: void toChanged(const QDate&); void fromChanged(const QDate&); void clearFilter(); void checkEnableClear(); signals: void filter(); void toActivated(int); void fromActivated(int); }; #endif eqonomize-0.6/src/transactionlistwidget.cpp0000644000175000017500000014433711106754237020263 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "transactionlistwidget.h" #include "budget.h" #include "recurrence.h" #include "transactioneditwidget.h" #include "transactionfilterwidget.h" #include "editscheduledtransactiondialog.h" #include "eqonomize.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern double monthsBetweenDates(const QDate &date1, const QDate &date2); class TransactionListViewItem : public QTreeWidgetItem { protected: Transaction *o_trans; ScheduledTransaction *o_strans; QDate d_date; public: TransactionListViewItem(const QDate &trans_date, Transaction *trans, ScheduledTransaction *strans, QString, QString=QString::null, QString=QString::null, QString=QString::null, QString=QString::null, QString=QString::null, QString=QString::null, QString=QString::null); bool operator<(const QTreeWidgetItem &i_pre) const; Transaction *transaction() const; ScheduledTransaction *scheduledTransaction() const; const QDate &date() const; void setDate(const QDate &newdate); }; TransactionListWidget::TransactionListWidget(bool extra_parameters, int transaction_type, Budget *budg, Eqonomize *main_win, QWidget *parent) : QWidget(parent), transtype(transaction_type), budget(budg), mainWin(main_win), b_extra(extra_parameters) { current_value = 0.0; current_quantity = 0.0; selected_trans = NULL; listPopupMenu = NULL; QVBoxLayout *transactionsLayout = new QVBoxLayout(this); transactionsLayout->setContentsMargins(0, 0, 0, 0); QVBoxLayout *transactionsViewLayout = new QVBoxLayout(); transactionsLayout->addLayout(transactionsViewLayout); transactionsView = new EqonomizeTreeWidget(this); transactionsView->setSortingEnabled(true); transactionsView->sortByColumn(0, Qt::DescendingOrder); transactionsView->setAllColumnsShowFocus(true); QStringList headers; headers << i18n("Date"); headers << i18n("Description"); comments_col = 5; switch(transtype) { case TRANSACTION_TYPE_EXPENSE: { headers << i18n("Cost"); headers << i18n("Category"); headers << i18n("From Account"); if(b_extra) { headers << i18n("Payee"); comments_col = 6; } from_col = 4; to_col = 3; break; } case TRANSACTION_TYPE_INCOME: { headers << i18n("Income"); headers << i18n("Category"); headers << i18n("To Account"); if(b_extra) { headers << i18n("Payer"); comments_col = 6; } from_col = 3; to_col = 4; break; } default: { headers << i18n("Amount"); headers << i18n("From"); headers << i18n("To"); from_col = 3; to_col = 4; break; } } headers << i18n("Comments"); transactionsView->setColumnCount(comments_col + 1); transactionsView->setHeaderLabels(headers); transactionsView->setRootIsDecorated(false); transactionsView->setSelectionMode(QAbstractItemView::ExtendedSelection); transactionsViewLayout->addWidget(transactionsView); statLabel = new QLabel(this); transactionsViewLayout->addWidget(statLabel); QSizePolicy sp = transactionsView->sizePolicy(); sp.setVerticalPolicy(QSizePolicy::MinimumExpanding); transactionsView->setSizePolicy(sp); tabs = new KTabWidget(this); tabs->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); editWidget = new TransactionEditWidget(true, b_extra, transtype, false, false, NULL, SECURITY_SHARES_AND_QUOTATION, false, budget, this); editInfoLabel = new QLabel(QString::null, editWidget->bottomWidget()); KDialogButtonBox *buttons = new KDialogButtonBox(editWidget->bottomWidget()); addButton = buttons->addButton(KStandardGuiItem::guiItem(KStandardGuiItem::Add), QDialogButtonBox::ActionRole); modifyButton = buttons->addButton(KStandardGuiItem::apply().text(), QDialogButtonBox::ActionRole); modifyButton->setEnabled(false); removeButton = buttons->addButton(KStandardGuiItem::guiItem(KStandardGuiItem::Delete), QDialogButtonBox::ActionRole); removeButton->setEnabled(false); filterWidget = new TransactionFilterWidget(b_extra, transtype, budget, this); tabs->addTab(editWidget, i18n("New/Edit Expense")); tabs->addTab(filterWidget, i18n("Filter")); transactionsLayout->addWidget(tabs); updateStatistics(); connect(addButton, SIGNAL(clicked()), this, SLOT(addTransaction())); connect(modifyButton, SIGNAL(clicked()), this, SLOT(modifyTransaction())); connect(editWidget, SIGNAL(addmodify()), this, SLOT(addModifyTransaction())); connect(removeButton, SIGNAL(clicked()), this, SLOT(removeTransaction())); connect(filterWidget, SIGNAL(filter()), this, SLOT(filterTransactions())); connect(filterWidget, SIGNAL(toActivated(int)), this, SLOT(filterCategoryActivated(int))); connect(filterWidget, SIGNAL(fromActivated(int)), this, SLOT(filterFromActivated(int))); connect(transactionsView, SIGNAL(itemSelectionChanged()), this, SLOT(transactionSelectionChanged())); transactionsView->setContextMenuPolicy(Qt::CustomContextMenu); connect(transactionsView, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(popupListMenu(const QPoint&))); connect(transactionsView, SIGNAL(doubleClicked(QTreeWidgetItem*, int)), this, SLOT(transactionExecuted(QTreeWidgetItem*))); connect(transactionsView, SIGNAL(returnPressed(QTreeWidgetItem*)), this, SLOT(transactionExecuted(QTreeWidgetItem*))); } //QSize TransactionListWidget::minimumSizeHint() const {return filterWidget->minimumSizeHint().expandedTo(editWidget->minimumSizeHint());} //QSize TransactionListWidget::sizeHint() const {return QSize(filterWidget->sizeHint().expandedTo(editWidget->sizeHint()).width() + 12, QWidget::sizeHint().height());} QSize TransactionListWidget::minimumSizeHint() const {return QWidget::minimumSizeHint();} QSize TransactionListWidget::sizeHint() const {return minimumSizeHint();} void TransactionListWidget::currentDateChanged(const QDate &olddate, const QDate &newdate) { QList selection = transactionsView->selectedItems(); if(selection.isEmpty()) editWidget->currentDateChanged(olddate, newdate); filterWidget->currentDateChanged(olddate, newdate); } void TransactionListWidget::transactionExecuted(QTreeWidgetItem*) { editTransaction(); } void TransactionListWidget::updateStatistics() { int i_count_frac = 0; double intpart = 0.0; if(modf(current_quantity, &intpart) != 0.0) i_count_frac = 2; statLabel->setText(QString("
%1 %5   %2 %6   %3 %7   %4 %8
").arg(i18n("Quantity:")).arg(i18n("Total:")).arg(i18n("Average:")).arg(i18n("Monthly:")).arg(KGlobal::locale()->formatNumber(current_quantity, i_count_frac)).arg(KGlobal::locale()->formatMoney(current_value)).arg(KGlobal::locale()->formatMoney(current_quantity == 0.0 ? 0.0 : current_value / current_quantity)).arg(KGlobal::locale()->formatMoney(current_value == 0.0 ? current_value : current_value / filterWidget->countMonths()))); } void TransactionListWidget::popupListMenu(const QPoint &p) { if(!listPopupMenu) { listPopupMenu = new QMenu(this); switch(transtype) { case TRANSACTION_TYPE_EXPENSE: {listPopupMenu->addAction(mainWin->ActionNewExpense); listPopupMenu->addAction(mainWin->ActionNewRefund); break;} case TRANSACTION_TYPE_INCOME: {listPopupMenu->addAction(mainWin->ActionNewIncome); listPopupMenu->addAction(mainWin->ActionNewRepayment); break;} case TRANSACTION_TYPE_TRANSFER: {listPopupMenu->addAction(mainWin->ActionNewTransfer); break;} } listPopupMenu->addAction(mainWin->ActionNewSplitTransaction); listPopupMenu->addSeparator(); listPopupMenu->addAction(mainWin->ActionEditTransaction); listPopupMenu->addAction(mainWin->ActionEditScheduledTransaction); listPopupMenu->addAction(mainWin->ActionEditSplitTransaction); listPopupMenu->addAction(mainWin->ActionJoinTransactions); listPopupMenu->addAction(mainWin->ActionSplitUpTransaction); listPopupMenu->addSeparator(); listPopupMenu->addAction(mainWin->ActionDeleteTransaction); listPopupMenu->addAction(mainWin->ActionDeleteScheduledTransaction); listPopupMenu->addAction(mainWin->ActionDeleteSplitTransaction); } listPopupMenu->popup(transactionsView->viewport()->mapToGlobal(p)); } extern QString htmlize_string(QString str); bool TransactionListWidget::isEmpty() { return transactionsView->topLevelItemCount() == 0; } bool TransactionListWidget::exportList(QTextStream &outf, int fileformat) { switch(fileformat) { case 'h': { outf.setCodec("UTF-8"); outf << "" << '\n'; outf << "" << '\n'; outf << "\t" << '\n'; outf << "\t\t"; switch(transtype) { case TRANSACTION_TYPE_EXPENSE: {outf << htmlize_string(i18n("Expenses")); break;} case TRANSACTION_TYPE_INCOME: {outf << htmlize_string(i18n("Incomes")); break;} default: {outf << htmlize_string(i18n("Transfers")); break;} } outf << "" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t" << '\n'; outf << "\t" << '\n'; outf << "\t" << '\n'; outf << "\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t\t" << '\n'; QTreeWidgetItem *header = transactionsView->headerItem(); outf << "\t\t\t\t\t"; outf << ""; outf << ""; outf << ""; outf << ""; if(comments_col == 6) outf << ""; outf << ""; if(comments_col == 6) outf << ""; outf << "\n"; outf << "\t\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; outf << "\t\t\t" << '\n'; QTreeWidgetItemIterator it(transactionsView); TransactionListViewItem *i = (TransactionListViewItem*) *it; while(i) { Transaction *trans = i->transaction(); outf << "\t\t\t\t" << '\n'; outf << "\t\t\t\t\t"; outf << ""; outf << ""; outf << ""; outf << ""; int i_count_frac = 0; double intpart = 0.0; if(modf(trans->quantity(), &intpart) != 0.0) i_count_frac = 2; if(comments_col == 6) outf << ""; outf << ""; if(comments_col == 6) outf << ""; outf << "\n"; outf << "\t\t\t\t" << '\n'; ++it; i = (TransactionListViewItem*) *it; } outf << "\t\t\t" << '\n'; outf << "\t\t
"; switch(transtype) { case TRANSACTION_TYPE_EXPENSE: {outf << htmlize_string(i18n("Expenses")); break;} case TRANSACTION_TYPE_INCOME: {outf << htmlize_string(i18n("Incomes")); break;} default: {outf << htmlize_string(i18n("Transfers")); break;} } outf << "
" << htmlize_string(header->text(0)) << "" << htmlize_string(header->text(1)) << "" << htmlize_string(header->text(2)) << "" << htmlize_string(header->text(3)) << "" << htmlize_string(header->text(4)) << "" << htmlize_string(i18n("Quantity")) << "" << htmlize_string(header->text(5)) << "" << htmlize_string(header->text(6)) << "
" << htmlize_string(KGlobal::locale()->formatDate(trans->date(), KLocale::ShortDate)) << "" << htmlize_string(trans->description()) << "" << htmlize_string(i->text(2)) << "" << htmlize_string(i->text(3)) << "" << htmlize_string(i->text(4)) << "" << htmlize_string(KGlobal::locale()->formatNumber(trans->quantity(), i_count_frac)) << "" << htmlize_string(i->text(5)) << "" << htmlize_string(i->text(6)) << "
" << '\n'; outf << "\t\t
"; int i_count_frac = 0; double intpart = 0.0; if(modf(current_quantity, &intpart) != 0.0) i_count_frac = 2; outf << htmlize_string(i18n("Quantity:")) << " " << htmlize_string(KGlobal::locale()->formatNumber(current_quantity, i_count_frac)); outf << ", "; switch(transtype) { case TRANSACTION_TYPE_EXPENSE: { outf << htmlize_string(i18n("Total cost:")) << " "; break; } case TRANSACTION_TYPE_INCOME: { outf << htmlize_string(i18n("Total income:")) << " "; break; } default: { outf << htmlize_string(i18n("Total amount:")) << " "; break; } } outf << htmlize_string(KGlobal::locale()->formatMoney(current_value)); outf << ", "; outf << htmlize_string(i18n("Average:")) << " " << htmlize_string(KGlobal::locale()->formatMoney(current_value == 0.0 ? current_value : current_value / current_quantity)); outf << ", "; outf << htmlize_string(i18n("Monthly average:")) << " " << htmlize_string(KGlobal::locale()->formatMoney(current_value == 0.0 ? current_value : current_value / filterWidget->countMonths())); outf << "
\n"; outf << "\t" << '\n'; outf << "" << '\n'; break; } case 'c': { //outf.setEncoding(Q3TextStream::Locale); QTreeWidgetItem *header = transactionsView->headerItem(); outf << "\"" << header->text(0) << "\",\"" << header->text(1) << "\",\"" << header->text(2) << "\",\"" << header->text(3) << "\",\"" << header->text(4); if(comments_col == 6) outf << "\",\"" << i18n("Quantity"); outf << "\",\"" << header->text(5); if(comments_col == 6) outf << "\",\"" << header->text(6); outf << "\"\n"; QTreeWidgetItemIterator it(transactionsView); TransactionListViewItem *i = (TransactionListViewItem*) *it; while(i) { Transaction *trans = i->transaction(); outf << "\"" << KGlobal::locale()->formatDate(trans->date(), KLocale::ShortDate) << "\",\"" << trans->description() << "\",\"" << i->text(2) << "\",\"" << i->text(3) << "\",\"" << i->text(4); if(comments_col == 6) outf << "\",\"" << KGlobal::locale()->formatNumber(trans->quantity(), 2); outf << "\",\"" << i->text(5); if(comments_col == 6) outf << "\",\"" << i->text(6); outf << "\"\n"; ++it; i = (TransactionListViewItem*) *it; } break; } } return true; } void TransactionListWidget::transactionsReset() { filterWidget->transactionsReset(); editWidget->transactionsReset(); editClear(); filterTransactions(); } void TransactionListWidget::addTransaction() { Transaction *trans = editWidget->createTransaction(); if(!trans) return; editClear(); ScheduledTransaction *strans = NULL; if(trans->date() > QDate::currentDate()) { strans = new ScheduledTransaction(budget, trans, NULL); budget->addScheduledTransaction(strans); } else { budget->addTransaction(trans); } if(strans) mainWin->scheduledTransactionAdded(strans); else mainWin->transactionAdded(trans); } void TransactionListWidget::editScheduledTransaction() { QList selection = transactionsView->selectedItems(); if(selection.count() == 1) { TransactionListViewItem *i = (TransactionListViewItem*) selection.first(); if(i->scheduledTransaction()) { mainWin->editScheduledTransaction(i->scheduledTransaction()); } } } void TransactionListWidget::editSplitTransaction() { QList selection = transactionsView->selectedItems(); if(selection.count() >= 1) { TransactionListViewItem *i = (TransactionListViewItem*) selection.first(); if(i->transaction()->parentSplit()) { if(mainWin->editSplitTransaction(i->transaction()->parentSplit())) editClear(); } } } void TransactionListWidget::editTransaction() { QList selection = transactionsView->selectedItems(); if(selection.count() == 1) { TransactionListViewItem *i = (TransactionListViewItem*) selection.first(); if(i->scheduledTransaction()) { if(i->scheduledTransaction()->isOneTimeTransaction()) { if(mainWin->editScheduledTransaction(i->scheduledTransaction())) editClear(); } else { if(mainWin->editOccurrence(i->scheduledTransaction(), i->date())) transactionSelectionChanged(); } } else { if(mainWin->editTransaction(i->transaction())) transactionSelectionChanged(); } } else if(selection.count() > 1) { bool warned1 = false, warned2 = false, warned3 = false, warned4 = false; MultipleTransactionsEditDialog *dialog = new MultipleTransactionsEditDialog(b_extra, transtype, budget, this); TransactionListViewItem *i = (TransactionListViewItem*) transactionsView->currentItem(); if(!i->isSelected()) i = (TransactionListViewItem*) selection.first(); if(i) { if(i->scheduledTransaction()) dialog->setScheduledTransaction(i->scheduledTransaction(), i->date()); else dialog->setTransaction(i->transaction()); } bool equal_date = true, equal_description = true, equal_value = true, equal_category = (transtype != TRANSACTION_TYPE_TRANSFER), equal_payee = (dialog->payeeButton != NULL); Transaction *comptrans = NULL; Account *compcat = NULL; QDate compdate; for(int index = 0; index < selection.size(); index++) { TransactionListViewItem *i = (TransactionListViewItem*) selection.at(index); if(!comptrans) { comptrans = i->transaction(); compdate = i->date(); if(i->transaction()->parentSplit()) equal_date = false; if(i->transaction()->type() != TRANSACTION_TYPE_EXPENSE && i->transaction()->type() != TRANSACTION_TYPE_INCOME) equal_payee = false; if(i->transaction()->type() == TRANSACTION_TYPE_INCOME) { compcat = ((Income*) i->transaction())->category(); } else if(i->transaction()->type() == TRANSACTION_TYPE_EXPENSE) { compcat = ((Expense*) i->transaction())->category(); } else if(i->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || i->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) { equal_value = false; equal_description = false; compcat = ((SecurityTransaction*) i->transaction())->account(); if(compcat->type() == ACCOUNT_TYPE_ASSETS) { equal_category = false; } } } else { if(equal_date && (compdate != i->date() || i->transaction()->parentSplit())) { equal_date = false; } if(equal_description && (i->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || i->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL || comptrans->description() != i->transaction()->description())) { equal_description = false; } if(equal_payee && (i->transaction()->type() != comptrans->type() || (comptrans->type() == TRANSACTION_TYPE_EXPENSE && ((Expense*) comptrans)->payee() != ((Expense*) i->transaction())->payee()) || (comptrans->type() == TRANSACTION_TYPE_INCOME && ((Income*) comptrans)->payer() != ((Income*) i->transaction())->payer()))) { equal_payee = false; } if(equal_value && (i->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || i->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL || comptrans->value() != i->transaction()->value())) { equal_value = false; } if(equal_category) { if(i->transaction()->type() == TRANSACTION_TYPE_INCOME) { if(compcat != ((Income*) i->transaction())->category()) { equal_category = false; } } else if(i->transaction()->type() == TRANSACTION_TYPE_EXPENSE) { if(compcat != ((Expense*) i->transaction())->category()) { equal_category = false; } } else if(i->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || i->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) { if(compcat != ((SecurityTransaction*) i->transaction())->account()) { equal_category = false; } } } } } if(equal_description) dialog->descriptionButton->setChecked(true); if(equal_payee) dialog->payeeButton->setChecked(true); if(equal_value) dialog->valueButton->setChecked(true); if(equal_date) dialog->dateButton->setChecked(true); if(equal_category && dialog->categoryButton) dialog->categoryButton->setChecked(true); if(dialog->exec() == QDialog::Accepted) { QDate date = dialog->date(); bool future = !date.isNull() && date > QDate::currentDate(); for(int index = 0; index < selection.size(); index++) { TransactionListViewItem *i = (TransactionListViewItem*) selection.at(index); if(!warned1 && (i->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || i->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL)) { if(dialog->valueButton->isChecked()) { KMessageBox::error(this, i18n("Cannot set the value of security transactions using the dialog for modifying multiple transactions.")); warned1 = true; } } if(!warned2 && (i->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || i->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL || (i->transaction()->type() == TRANSACTION_TYPE_INCOME && ((Income*) i->transaction())->security()))) { if(dialog->descriptionButton->isChecked()) { KMessageBox::error(this, i18n("Cannot change description of dividends and security transactions.")); warned2 = true; } } if(!warned3 && dialog->payeeButton && (i->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || i->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL || (i->transaction()->type() == TRANSACTION_TYPE_INCOME && ((Income*) i->transaction())->security()))) { if(dialog->payeeButton->isChecked()) { KMessageBox::error(this, i18n("Cannot change payer of dividends and security transactions.")); warned3 = true; } } if(!warned4 && i->transaction()->parentSplit()) { if(dialog->dateButton->isChecked()) { KMessageBox::error(this, i18n("Cannot change date of transactions that are part of a split transaction.")); warned4 = true; } } ScheduledTransaction *strans = i->scheduledTransaction(); if(strans && strans->isOneTimeTransaction() && (date.isNull() || date == strans->transaction()->date())) { ScheduledTransaction *old_strans = strans->copy(); Transaction *trans = strans->transaction(); if(dialog->modifyTransaction(trans)) { mainWin->scheduledTransactionModified(strans, old_strans); } delete old_strans; } else if(strans) { date = i->date(); Transaction *trans = strans->transaction()->copy(); trans->setDate(date); if(dialog->modifyTransaction(trans)) { if(future) { ScheduledTransaction *strans_new = new ScheduledTransaction(budget, trans, NULL); budget->addScheduledTransaction(strans_new); mainWin->scheduledTransactionAdded(strans_new); } else { budget->addTransaction(trans); mainWin->transactionAdded(trans); } if(strans->isOneTimeTransaction()) { budget->removeScheduledTransaction(strans, true); mainWin->scheduledTransactionRemoved(strans); delete strans; } else { ScheduledTransaction *old_strans = strans->copy(); strans->addException(date); mainWin->scheduledTransactionModified(strans, old_strans); delete old_strans; } } else { delete trans; } } else { Transaction *trans = i->transaction(); Transaction *oldtrans = trans->copy(); if(dialog->modifyTransaction(trans)) { if(future && !trans->parentSplit()) { budget->removeTransaction(trans, true); mainWin->transactionRemoved(trans); strans = new ScheduledTransaction(budget, trans, NULL); budget->addScheduledTransaction(strans); mainWin->scheduledTransactionAdded(strans); } else { mainWin->transactionModified(trans, oldtrans); } } delete oldtrans; } } transactionSelectionChanged(); } dialog->deleteLater(); } } void TransactionListWidget::modifyTransaction() { QList selection = transactionsView->selectedItems(); if(selection.isEmpty()) return; if(selection.count() > 1) { editTransaction(); return; } TransactionListViewItem *i = (TransactionListViewItem*) selection.first(); if(!i) return; if(((TransactionListViewItem*) i)->transaction()->parentSplit()) { editSplitTransaction(); return; } if(((TransactionListViewItem*) i)->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || ((TransactionListViewItem*) i)->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) { editTransaction(); return; } if(!editWidget->validValues(true)) return; if(i->scheduledTransaction()) { if(i->scheduledTransaction()->isOneTimeTransaction()) { Transaction *trans = i->scheduledTransaction()->transaction()->copy(); if(!editWidget->modifyTransaction(trans)) { delete trans; return; } mainWin->removeScheduledTransaction(i->scheduledTransaction()); ScheduledTransaction *strans = NULL; if(trans->date() > QDate::currentDate()) { strans = new ScheduledTransaction(budget, trans, NULL); budget->addScheduledTransaction(strans); } else { budget->addTransaction(trans); } if(strans) mainWin->scheduledTransactionAdded(strans); else mainWin->transactionAdded(trans); QTreeWidgetItemIterator it(transactionsView); TransactionListViewItem *i = (TransactionListViewItem*) *it; while(i) { if(i->transaction() == trans) { transactionsView->setCurrentItem(i); i->setSelected(true); break; } ++it; i = (TransactionListViewItem*) *it; } return; } else { if(editWidget->validValues()) { ScheduledTransaction *curstranscopy = i->scheduledTransaction(); QDate curdate_copy = i->date(); ScheduledTransaction *oldstrans = curstranscopy->copy(); curstranscopy->addException(curdate_copy); mainWin->scheduledTransactionModified(curstranscopy, oldstrans); delete oldstrans; } return; } } if(editWidget->date() > QDate::currentDate()) { Transaction *newtrans = i->transaction()->copy(); if(editWidget->modifyTransaction(newtrans)) { ScheduledTransaction *strans = new ScheduledTransaction(budget, newtrans, NULL); removeTransaction(); budget->addScheduledTransaction(strans); mainWin->scheduledTransactionAdded(strans); QTreeWidgetItemIterator it(transactionsView); TransactionListViewItem *i = (TransactionListViewItem*) *it; while(i) { if(i->scheduledTransaction() == strans) { transactionsView->setCurrentItem(i); i->setSelected(true); break; } ++it; i = (TransactionListViewItem*) *it; } } else { delete newtrans; } } else { Transaction *oldtrans = i->transaction()->copy(); if(editWidget->modifyTransaction(i->transaction())) { mainWin->transactionModified(i->transaction(), oldtrans); } delete oldtrans; } } void TransactionListWidget::removeScheduledTransaction() { QList selection = transactionsView->selectedItems(); if(selection.count() == 1) { TransactionListViewItem *i = (TransactionListViewItem*) selection.first(); if(i->scheduledTransaction()) { mainWin->removeScheduledTransaction(i->scheduledTransaction()); editClear(); } } } void TransactionListWidget::removeSplitTransaction() { QList selection = transactionsView->selectedItems(); if(selection.count() >= 1) { TransactionListViewItem *i = (TransactionListViewItem*) selection.first(); if(i->transaction()->parentSplit()) { SplitTransaction *split = i->transaction()->parentSplit(); if(KMessageBox::warningContinueCancel(this, i18n("Are you sure you want to delete all (%1) transactions in the selected split transaction?").arg(split->splits.count())) == KMessageBox::Cancel) { return; } budget->removeSplitTransaction(split, true); mainWin->splitTransactionRemoved(split); delete split; editClear(); } } } void TransactionListWidget::splitUpTransaction() { QList selection = transactionsView->selectedItems(); if(selection.count() >= 1) { TransactionListViewItem *i = (TransactionListViewItem*) selection.first(); if(i->transaction()->parentSplit()) { mainWin->splitUpTransaction(i->transaction()->parentSplit()); transactionSelectionChanged(); } } } void TransactionListWidget::joinTransactions() { QList selection = transactionsView->selectedItems(); SplitTransaction *split = NULL; for(int index = 0; index < selection.size(); index++) { TransactionListViewItem *i = (TransactionListViewItem*) selection.at(index); Transaction *trans = i->transaction(); if(trans && (!i->scheduledTransaction() && !trans->parentSplit())) { if(!split) { if((trans->type() == TRANSACTION_TYPE_SECURITY_BUY || trans->type() == TRANSACTION_TYPE_SECURITY_SELL) && ((SecurityTransaction*) trans)->account()->type() == ACCOUNT_TYPE_ASSETS) split = new SplitTransaction(budget, i->transaction()->date(), (AssetsAccount*) ((SecurityTransaction*) trans)->account()); else if(trans->fromAccount()->type() == ACCOUNT_TYPE_ASSETS) split = new SplitTransaction(budget, i->transaction()->date(), (AssetsAccount*) trans->fromAccount()); else split = new SplitTransaction(budget, i->transaction()->date(), (AssetsAccount*) trans->toAccount()); } split->splits.push_back(trans); } } if(!split) return; if(mainWin->editSplitTransaction(split)) { editClear(); } else { split->clear(true); delete split; } } void TransactionListWidget::removeTransaction() { QList selection = transactionsView->selectedItems(); if(selection.count() > 1) { if(KMessageBox::warningContinueCancel(this, i18n("Are you sure you want to delete all (%1) selected transactions?").arg(selection.count())) == KMessageBox::Cancel) { return; } } transactionsView->clearSelection(); for(int index = 0; index < selection.size(); index++) { TransactionListViewItem *i = (TransactionListViewItem*) selection.at(index); if(i->scheduledTransaction()) { ScheduledTransaction *strans = i->scheduledTransaction(); if(strans->isOneTimeTransaction()) { budget->removeScheduledTransaction(strans, true); mainWin->scheduledTransactionRemoved(strans); delete strans; } else { ScheduledTransaction *oldstrans = strans->copy(); strans->addException(i->date()); mainWin->scheduledTransactionModified(strans, oldstrans); delete oldstrans; } } else { Transaction *trans = i->transaction(); budget->removeTransaction(trans, true); mainWin->transactionRemoved(trans); delete trans; } } } void TransactionListWidget::addModifyTransaction() { addTransaction(); } void TransactionListWidget::appendFilterTransaction(Transaction *trans, bool update_total_value) { if(!filterWidget->filterTransaction(trans)) { QTreeWidgetItem *i = new TransactionListViewItem(trans->date(), trans, NULL, KGlobal::locale()->formatDate(trans->date(), KLocale::ShortDate), QString::null, KGlobal::locale()->formatMoney(trans->value())); transactionsView->insertTopLevelItem(0, i); i->setTextAlignment(2, Qt::AlignRight); i->setTextAlignment(3, Qt::AlignCenter); i->setTextAlignment(4, Qt::AlignCenter); if(trans == selected_trans) { transactionsView->blockSignals(true); i->setSelected(true); transactionsView->blockSignals(false); } if(trans->parentSplit()) i->setText(1, trans->description() + "*"); else i->setText(1, trans->description()); i->setText(from_col, trans->fromAccount()->name()); i->setText(to_col, trans->toAccount()->name()); if(comments_col == 6 && trans->type() == TRANSACTION_TYPE_EXPENSE) i->setText(5, ((Expense*) trans)->payee()); else if(comments_col == 6 && trans->type() == TRANSACTION_TYPE_INCOME) i->setText(5, ((Income*) trans)->payer()); i->setText(comments_col, trans->comment()); current_value += trans->value(); current_quantity += trans->quantity(); if(update_total_value) { updateStatistics(); transactionsView->setSortingEnabled(true); } } } void TransactionListWidget::appendFilterScheduledTransaction(ScheduledTransaction *strans, bool update_total_value) { if(!filterWidget->filterTransaction(strans->transaction(), false)) { QDate date = filterWidget->startDate(); QDate enddate = filterWidget->endDate(); if(strans->isOneTimeTransaction()) { if(date.isNull()) date = strans->firstOccurrence(); else if(date > strans->firstOccurrence()) date = QDate(); else date = strans->firstOccurrence(); } else { if(date.isNull()) date = strans->recurrence()->firstOccurrence(); else date = strans->recurrence()->nextOccurrence(date, true); } if(date.isNull() || date > enddate) update_total_value = false; Transaction *trans = strans->transaction(); while(!date.isNull() && date <= enddate) { QTreeWidgetItem *i = NULL; i = new TransactionListViewItem(date, trans, strans, QString::null, trans->description(), KGlobal::locale()->formatMoney(trans->value())); transactionsView->insertTopLevelItem(0, i); i->setTextAlignment(2, Qt::AlignRight); i->setTextAlignment(3, Qt::AlignCenter); i->setTextAlignment(4, Qt::AlignCenter); if(strans->recurrence()) i->setText(0, KGlobal::locale()->formatDate(date, KLocale::ShortDate) + "**"); else i->setText(0, KGlobal::locale()->formatDate(date, KLocale::ShortDate)); i->setText(from_col, trans->fromAccount()->name()); i->setText(to_col, trans->toAccount()->name()); if(comments_col == 6 && trans->type() == TRANSACTION_TYPE_EXPENSE) i->setText(5, ((Expense*) trans)->payee()); else if(comments_col == 6 && trans->type() == TRANSACTION_TYPE_INCOME) i->setText(5, ((Income*) trans)->payer()); i->setText(comments_col, trans->comment()); current_value += trans->value(); current_quantity += trans->quantity(); if(!strans->isOneTimeTransaction()) date = strans->recurrence()->nextOccurrence(date); else break; } if(update_total_value) { updateStatistics(); transactionsView->setSortingEnabled(true); } } } void TransactionListWidget::onSplitRemoved(SplitTransaction *split) { QTreeWidgetItemIterator it(transactionsView); TransactionListViewItem *i = (TransactionListViewItem*) *it; while(i) { if(i->transaction()->parentSplit() == split) { i->setText(1, i->transaction()->description()); } ++it; i = (TransactionListViewItem*) *it; } } void TransactionListWidget::onTransactionAdded(Transaction *trans) { appendFilterTransaction(trans, true); filterWidget->transactionAdded(trans); editWidget->transactionAdded(trans); } void TransactionListWidget::onTransactionModified(Transaction *trans, Transaction *oldtrans) { current_value -= oldtrans->value(); current_quantity -= oldtrans->quantity(); bool b_filter = filterWidget->filterTransaction(trans); if(!b_filter) { current_value += trans->value(); current_quantity += trans->quantity(); } QTreeWidgetItemIterator it(transactionsView); TransactionListViewItem *i = (TransactionListViewItem*) *it; while(i) { if(i->transaction() == trans) { break; } ++it; i = (TransactionListViewItem*) *it; } if(i && b_filter) { delete i; i = NULL; } updateStatistics(); if(i) { i->setDate(trans->date()); i->setText(0, KGlobal::locale()->formatDate(trans->date(), KLocale::ShortDate)); if(trans->parentSplit()) i->setText(1, trans->description() + "*"); else i->setText(1, trans->description()); i->setText(2, KGlobal::locale()->formatMoney(trans->value())); i->setText(from_col, trans->fromAccount()->name()); i->setText(to_col, trans->toAccount()->name()); if(comments_col == 6 && trans->type() == TRANSACTION_TYPE_EXPENSE) i->setText(5, ((Expense*) trans)->payee()); else if(comments_col == 6 && trans->type() == TRANSACTION_TYPE_INCOME) i->setText(5, ((Income*) trans)->payer()); i->setText(comments_col, trans->comment()); } if(oldtrans->description() != trans->description()) filterWidget->transactionModified(trans); editWidget->transactionModified(trans); } void TransactionListWidget::onTransactionRemoved(Transaction *trans) { QTreeWidgetItemIterator it(transactionsView); TransactionListViewItem *i = (TransactionListViewItem*) *it; while(i) { if(i->transaction() == trans) { delete i; current_value -= trans->value(); current_quantity -= trans->quantity(); updateStatistics(); break; } ++it; i = (TransactionListViewItem*) *it; } editWidget->transactionRemoved(trans); } void TransactionListWidget::onScheduledTransactionAdded(ScheduledTransaction *strans) { appendFilterScheduledTransaction(strans, true); filterWidget->transactionAdded(strans->transaction()); editWidget->transactionAdded(strans->transaction()); } void TransactionListWidget::onScheduledTransactionModified(ScheduledTransaction *strans, ScheduledTransaction *oldstrans) { QTreeWidgetItemIterator it(transactionsView); TransactionListViewItem *i = (TransactionListViewItem*) *it; while(i) { if(i->scheduledTransaction() == strans) { current_value -= oldstrans->transaction()->value(); current_quantity -= oldstrans->transaction()->quantity(); QTreeWidgetItem *i_del = i; ++it; i = (TransactionListViewItem*) *it; delete i_del; } else { ++it; i = (TransactionListViewItem*) *it; } } appendFilterScheduledTransaction(strans, true); updateStatistics(); if(oldstrans->transaction()->description() != strans->transaction()->description()) filterWidget->transactionModified(strans->transaction()); editWidget->transactionModified(strans->transaction()); } void TransactionListWidget::editClear() { transactionsView->clearSelection(); editInfoLabel->setText(QString::null); editWidget->setTransaction(NULL); } void TransactionListWidget::onScheduledTransactionRemoved(ScheduledTransaction *strans) { QTreeWidgetItemIterator it(transactionsView); TransactionListViewItem *i = (TransactionListViewItem*) *it; while(i) { if(i->scheduledTransaction() == strans) { current_value -= strans->transaction()->value(); current_quantity -= strans->transaction()->quantity(); QTreeWidgetItem *i_del = i; ++it; i = (TransactionListViewItem*) *it; delete i_del; } else { ++it; i = (TransactionListViewItem*) *it; } } updateStatistics(); editWidget->transactionRemoved(strans->transaction()); } void TransactionListWidget::filterTransactions() { QList selection = transactionsView->selectedItems(); selected_trans = NULL; if(selection.count() == 1) { TransactionListViewItem *i = (TransactionListViewItem*) selection.first(); if(!i->scheduledTransaction()) {selected_trans = i->transaction();} } transactionsView->clear(); current_value = 0.0; current_quantity = 0.0; switch(transtype) { case TRANSACTION_TYPE_EXPENSE: { Expense *expense = budget->expenses.first(); while(expense) { appendFilterTransaction(expense, false); expense = budget->expenses.next(); } SecurityTransaction *sectrans = budget->securityTransactions.first(); while(sectrans) { if(sectrans->account()->type() == ACCOUNT_TYPE_EXPENSES) { appendFilterTransaction(sectrans, false); } sectrans = budget->securityTransactions.next(); } ScheduledTransaction *strans = budget->scheduledTransactions.first(); while(strans) { if(strans->transaction()->type() == TRANSACTION_TYPE_EXPENSE || ((strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) && ((SecurityTransaction*) strans->transaction())->account()->type() == ACCOUNT_TYPE_EXPENSES)) { appendFilterScheduledTransaction(strans, false); } strans = budget->scheduledTransactions.next(); } break; } case TRANSACTION_TYPE_INCOME: { Income *income = budget->incomes.first(); while(income) { appendFilterTransaction(income, false); income = budget->incomes.next(); } SecurityTransaction *sectrans = budget->securityTransactions.first(); while(sectrans) { if(sectrans->account()->type() == ACCOUNT_TYPE_INCOMES) { appendFilterTransaction(sectrans, false); } sectrans = budget->securityTransactions.next(); } ScheduledTransaction *strans = budget->scheduledTransactions.first(); while(strans) { if(strans->transaction()->type() == TRANSACTION_TYPE_INCOME || ((strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) && ((SecurityTransaction*) strans->transaction())->account()->type() == ACCOUNT_TYPE_INCOMES)) { appendFilterScheduledTransaction(strans, false); } strans = budget->scheduledTransactions.next(); } break; } default: { Transfer *transfer = budget->transfers.first(); while(transfer) { appendFilterTransaction(transfer, false); transfer = budget->transfers.next(); } SecurityTransaction *sectrans = budget->securityTransactions.first(); while(sectrans) { if(sectrans->account()->type() == ACCOUNT_TYPE_ASSETS) { appendFilterTransaction(sectrans, false); } sectrans = budget->securityTransactions.next(); } ScheduledTransaction *strans = budget->scheduledTransactions.first(); while(strans) { if(strans->transaction()->type() == TRANSACTION_TYPE_TRANSFER || ((strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || strans->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) && ((SecurityTransaction*) strans->transaction())->account()->type() == ACCOUNT_TYPE_ASSETS)) { appendFilterScheduledTransaction(strans, false); } strans = budget->scheduledTransactions.next(); } break; } } selected_trans = NULL; selection = transactionsView->selectedItems(); if(selection.count() == 0) { editInfoLabel->setText(""); } updateStatistics(); transactionsView->setSortingEnabled(true); } void TransactionListWidget::currentTransactionChanged(QTreeWidgetItem *i) { if(i == NULL) { editWidget->setTransaction(NULL); editInfoLabel->setText(QString::null); } else if(((TransactionListViewItem*) i)->transaction()->parentSplit()) { editWidget->setTransaction(((TransactionListViewItem*) i)->transaction()); SplitTransaction *split = ((TransactionListViewItem*) i)->transaction()->parentSplit(); if(split->description().isEmpty() || split->description().length() > 10) editInfoLabel->setText(i18n("* Part of split transaction")); else editInfoLabel->setText(i18n("* Part of split (%1)").arg(split->description())); } else if(((TransactionListViewItem*) i)->scheduledTransaction()) { editWidget->setScheduledTransaction(((TransactionListViewItem*) i)->scheduledTransaction(), ((TransactionListViewItem*) i)->date()); if(((TransactionListViewItem*) i)->scheduledTransaction()->isOneTimeTransaction()) editInfoLabel->setText(QString::null); else editInfoLabel->setText(i18n("** Recurring (editing occurrance)")); } else { editWidget->setTransaction(((TransactionListViewItem*) i)->transaction()); editInfoLabel->setText(QString::null); } } void TransactionListWidget::transactionSelectionChanged() { QList selection = transactionsView->selectedItems(); if(selection.count() == 0) { editInfoLabel->setText(QString::null); modifyButton->setEnabled(false); removeButton->setEnabled(false); currentTransactionChanged(NULL); } else { QTreeWidgetItem *i = selection.first(); if(selection.count() > 1) { modifyButton->setText(i18n("Modify...")); } else if(((TransactionListViewItem*) i)->transaction()->parentSplit() || ((TransactionListViewItem*) i)->transaction()->type() == TRANSACTION_TYPE_SECURITY_BUY || ((TransactionListViewItem*) i)->transaction()->type() == TRANSACTION_TYPE_SECURITY_SELL) { modifyButton->setText(i18n("Edit...")); } else { modifyButton->setText(KStandardGuiItem::apply().text()); } modifyButton->setEnabled(true); removeButton->setEnabled(true); if(transactionsView->currentItem()->isSelected()) { currentTransactionChanged(transactionsView->currentItem()); } else if(selection.count() == 1) { currentTransactionChanged(i); } } updateTransactionActions(); } void TransactionListWidget::newRefundRepayment() { QList selection = transactionsView->selectedItems(); if(selection.count() == 1) { TransactionListViewItem *i = (TransactionListViewItem*) selection.first(); if((i->transaction()->type() == TRANSACTION_TYPE_EXPENSE && i->transaction()->value() > 0.0) || (i->transaction()->type() == TRANSACTION_TYPE_INCOME && i->transaction()->value() > 0.0 && !((Income*) i->transaction())->security())) { mainWin->newRefundRepayment(i->transaction()); } } } void TransactionListWidget::updateTransactionActions() { QList selection = transactionsView->selectedItems(); bool b_transaction = false, b_scheduledtransaction = false, b_split = false; bool refundable = false, repayable = false; if(selection.count() == 1) { TransactionListViewItem *i = (TransactionListViewItem*) selection.first(); b_split = i->transaction() && i->transaction()->parentSplit(); b_scheduledtransaction = !b_split && i->scheduledTransaction() && i->scheduledTransaction()->recurrence(); b_transaction = !b_scheduledtransaction || !i->scheduledTransaction()->isOneTimeTransaction(); refundable = (i->transaction()->type() == TRANSACTION_TYPE_EXPENSE && i->transaction()->value() > 0.0); repayable = (i->transaction()->type() == TRANSACTION_TYPE_INCOME && i->transaction()->value() > 0.0 && !((Income*) i->transaction())->security()); } else if(selection.count() > 1) { b_transaction = true; } bool b_join = (selection.count() > 0); b_split = b_join; for(int index = 0; index < selection.size(); index++) { TransactionListViewItem *i = (TransactionListViewItem*) selection.at(index); Transaction *trans = i->transaction(); if(i->scheduledTransaction() || trans->parentSplit()) { b_join = false; break; } } SplitTransaction *split = NULL; for(int index = 0; index < selection.size(); index++) { TransactionListViewItem *i = (TransactionListViewItem*) selection.at(index); Transaction *trans = i->transaction(); if(!split) split = trans->parentSplit(); if(!trans->parentSplit() || trans->parentSplit() != split) { b_split = false; break; } } mainWin->ActionNewRefund->setEnabled(refundable); mainWin->ActionNewRepayment->setEnabled(repayable); mainWin->ActionNewRefundRepayment->setEnabled(refundable || repayable); mainWin->ActionEditTransaction->setEnabled(b_transaction); mainWin->ActionDeleteTransaction->setEnabled(b_transaction); mainWin->ActionEditScheduledTransaction->setEnabled(b_scheduledtransaction); mainWin->ActionDeleteScheduledTransaction->setEnabled(b_scheduledtransaction); mainWin->ActionEditSplitTransaction->setEnabled(b_split); mainWin->ActionDeleteSplitTransaction->setEnabled(b_split); mainWin->ActionJoinTransactions->setEnabled(b_join); mainWin->ActionSplitUpTransaction->setEnabled(b_split); } void TransactionListWidget::filterCategoryActivated(int index) { if(index > 0) editWidget->setCurrentToItem(index - 1); } void TransactionListWidget::filterFromActivated(int index) { if(index > 0) editWidget->setCurrentFromItem(index - 1); } void TransactionListWidget::onDisplay() { if(tabs->currentWidget() == editWidget) editWidget->focusDescription(); } void TransactionListWidget::updateFromAccounts() { editWidget->updateFromAccounts(); filterWidget->updateFromAccounts(); } void TransactionListWidget::updateToAccounts() { editWidget->updateToAccounts(); filterWidget->updateToAccounts(); } void TransactionListWidget::updateAccounts() { editWidget->updateAccounts(); filterWidget->updateAccounts(); } void TransactionListWidget::setCurrentEditToItem(int index) { editWidget->setCurrentToItem(index); } void TransactionListWidget::setCurrentEditFromItem(int index) { editWidget->setCurrentFromItem(index); } int TransactionListWidget::currentEditToItem() { return editWidget->currentToItem(); } int TransactionListWidget::currentEditFromItem() { return editWidget->currentFromItem(); } void TransactionListWidget::showFilter() {tabs->setCurrentWidget(filterWidget);} void TransactionListWidget::showEdit() {tabs->setCurrentWidget(editWidget);} void TransactionListWidget::setFilter(QDate fromdate, QDate todate, double min, double max, Account *from_account, Account *to_account, QString description, QString payee, bool exclude) { filterWidget->setFilter(fromdate, todate, min, max, from_account, to_account, description, payee, exclude); } TransactionListViewItem::TransactionListViewItem(const QDate &trans_date, Transaction *trans, ScheduledTransaction *strans, QString s1, QString s2, QString s3, QString s4, QString s5, QString s6, QString s7, QString s8) : QTreeWidgetItem(), o_trans(trans), o_strans(strans), d_date(trans_date) { setText(0, s1); setText(1, s2); setText(2, s3); setText(3, s4); setText(4, s5); setText(5, s6); setText(6, s7); setText(7, s8); } bool TransactionListViewItem::operator<(const QTreeWidgetItem &i_pre) const { int col = 0; if(treeWidget()) col = treeWidget()->sortColumn(); TransactionListViewItem *i = (TransactionListViewItem*) &i_pre; if(col == 0) { return d_date < i->date(); } else if(col == 2) { return o_trans->value() < i->transaction()->value(); } return QTreeWidgetItem::operator<(i_pre); } Transaction *TransactionListViewItem::transaction() const { return o_trans; } ScheduledTransaction *TransactionListViewItem::scheduledTransaction() const { return o_strans; } const QDate &TransactionListViewItem::date() const { return d_date; } void TransactionListViewItem::setDate(const QDate &newdate) { d_date = newdate; } #include "transactionlistwidget.moc" eqonomize-0.6/src/transactionlistwidget.h0000644000175000017500000001074711106577135017725 0ustar hannahanna/*************************************************************************** * Copyright (C) 2008 by Hanna K. * * hanna_k@fmgirl.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef TRANSACTION_LIST_WIDGET_H #define TRANSACTION_LIST_WIDGET_H #include #include #include #include class Budget; class QLabel; class TransactionFilterWidget; class TransactionEditWidget; class QTabWidget; class QTreeWidget; class Transaction; class SplitTransaction; class ScheduledTransaction; class QPushButton; class QMenu; class QTreeWidgetItem; class Account; class Eqonomize; class TransactionListWidget : public QWidget { Q_OBJECT public: TransactionListWidget(bool extra_parameters, int transaction_type, Budget *budg, Eqonomize *main_win, QWidget *parent = 0); void transactionsReset(); void updateFromAccounts(); void updateToAccounts(); void updateAccounts(); void onDisplay(); void appendFilterTransaction(Transaction*, bool); void appendFilterScheduledTransaction(ScheduledTransaction *strans, bool update_total_value); void setCurrentEditToItem(int index); void setCurrentEditFromItem(int index); int currentEditToItem(); int currentEditFromItem(); QSize minimumSizeHint() const; QSize sizeHint() const; void setFilter(QDate fromdate, QDate todate, double min = -1.0, double max = -1.0, Account *from_account = NULL, Account *to_account = NULL, QString description = QString::null, QString payee = QString::null, bool exclude = false); bool exportList(QTextStream &outf, int fileformat); bool isEmpty(); void currentDateChanged(const QDate &olddate, const QDate &newdate); protected: int transtype; int from_col, to_col, comments_col; Budget *budget; Eqonomize *mainWin; bool b_extra; QTabWidget *tabs; QTreeWidget *transactionsView; QLabel *statLabel; QPushButton *addButton, *modifyButton, *removeButton; QMenu *listPopupMenu; TransactionFilterWidget *filterWidget; TransactionEditWidget *editWidget; QLabel *editInfoLabel; double current_value, current_quantity; Transaction *selected_trans; public slots: void editClear(); void updateStatistics(); void updateTransactionActions(); void editTransaction(); void newRefundRepayment(); void editScheduledTransaction(); void editSplitTransaction(); void splitUpTransaction(); void joinTransactions(); void onSplitRemoved(SplitTransaction*); void onTransactionAdded(Transaction*); void onTransactionModified(Transaction*, Transaction*); void onTransactionRemoved(Transaction*); void onScheduledTransactionAdded(ScheduledTransaction*); void onScheduledTransactionModified(ScheduledTransaction*, ScheduledTransaction*); void onScheduledTransactionRemoved(ScheduledTransaction*); void filterTransactions(); void currentTransactionChanged(QTreeWidgetItem*); void transactionSelectionChanged(); void filterCategoryActivated(int); void filterFromActivated(int); void addTransaction(); void modifyTransaction(); void removeTransaction(); void removeSplitTransaction(); void removeScheduledTransaction(); void addModifyTransaction(); void popupListMenu(const QPoint&); void showFilter(); void showEdit(); void transactionExecuted(QTreeWidgetItem*); }; #endif eqonomize-0.6/src/x-eqonomize.desktop0000644000175000017500000000023311106526724016760 0ustar hannahanna[Desktop Entry] Encoding=UTF-8 Comment=Eqonomize! File Comment[sv]=Eqonomize!-fil Icon=eqz Type=MimeType MimeType=application/x-eqonomize; Patterns=*.eqz;