3ih0dZddlZddlmZmZmZmZmZmZm Z m Z m Z m Z m Z ddlmZddlmZmZddlmZmZddlmZmZmZej4eZGdd eZy) zd Transactions Tab - Transaction Log. Displays transaction history with filters and action buttons. N) QWidget QVBoxLayout QHBoxLayout QPushButton QComboBox QTableWidgetQTableWidgetItemQLabel QHeaderView QMessageBoxQMenu)Qt)QColorQBrush)format_currency format_date)BuyTransactionDialogSellTransactionDialogDividendDialogc`eZdZdZfdZdZd dZdZdZdZ dZ d Z d Z d Z d ZxZS)TransactionsTabz!Transaction log tab with filters.cpt|||_|j|j y)ze Initialize transactions tab. Args: parent: MainWindow instance N)super__init__parentinit_ui load_data)selfr __class__s F/mnt/ssd/data/python-lab/portfolio-manager/src/gui/transactions_tab.pyrzTransactionsTab.__init__s*    c^ t|}t}td|_|jjj |j td|_|jjj |jtd|_ |jjj |j|j|j|j|j|j|j|j|jtdt|_|jj!gd|jj"j |j$|j|j|jtdt|_|j&j)d|j&j"j |j$|j|j&|j+|t-|_|j.j1d|j.j3gd |j.j5d |j.j7t,j8j:|j.j=t,j>j@|j.jCd |j.jE}|jGd tHjJjL|jGd tHjJjL|jGd tHjJjL|jGdtHjJjL|jGdtHjJjL|jGdtHjJjL|jGdtHjJjN|j.jQtRjTjV|j.jXj |jZ|j|j.td|_.|j|j\y)zInitialize user interface.u💰 Buyu 💸 Sellu 💵 DividendzType:)AllBUYSELLDIVIDENDzTicker:r#)DateTickerTypeQuantityu Price €u Amount €NotesTrzTotal transactions: 0N)/rrrbtn_buyclickedconnecton_buy_clickedbtn_sellon_sell_clicked btn_dividendon_dividend_clicked addWidget addStretchr rcombo_type_filteraddItemscurrentTextChanged apply_filterscombo_ticker_filteraddItem addLayoutrtablesetColumnCountsetHorizontalHeaderLabelssetAlternatingRowColorssetSelectionBehaviorSelectionBehavior SelectRowssetSelectionMode SelectionModeSingleSelectionsetSortingEnabledhorizontalHeadersetSectionResizeModer ResizeModeResizeToContentsStretchsetContextMenuPolicyrContextMenuPolicyCustomContextMenucustomContextMenuRequestedshow_context_menu lbl_summary)rlayout btn_layoutheaders r rzTransactionsTab.init_ui%sT"!] ":.  $$T%8%89#K0  %%d&:&:;'8 !!))$*B*BCT\\*T]]+T../ VG_-!* ''(JK 1199$:L:LMT334VI./#,;    ((/   33;;D$>$N$NO $$T*,,.##A{'='='N'NO##A{'='='N'NO##A{'='='N'NO##A{'='='N'NO##A{'='='N'NO##A{'='='N'NO##A{'='='E'EF ''(<(<(N(NO --55d6L6LM$""9:))*r!c tjd|d|d |jjj ||}|j ||j |jjdt|tjdt|dy #t$rG}tjd|d tj|d d t|Yd }~y d }~wwxYw)z Load and display transactions. Args: tx_type: Filter by transaction type (None for all) ticker: Filter by ticker (None for all) zLoading transactions (type=z , ticker=z)...)tickertx_typezTotal transactions: zLoaded z transactionszError loading transactions: Texc_infoErrorzFailed to load transactions: N)loggerdebugrtransaction_managerget_transaction_history update_tableupdate_ticker_filterrYsetTextleninfo Exceptionerrorr criticalstr)rr_r^ transactionses r rzTransactionsTab.load_datals  27)9VHDQR ;;::RRSL   l +  % % '    $ $';C ))"*:*:*E*EHXHXHeHe*ef+C0))"*:*:*F*FG JJ  sAx 0wKE -U3K.@A ++B,<,<,G,G"JZJZJgJg,gh-c2 ++B,<,<,H,HI JJ  sAz 2\F*?6+BCK  ( ()9)9)D)DrGWGWGdGd)d e JJ  sA{ 3FF7B'-2E JJ  sA'7'> ?o7 @r $$T* Q < <=r!c|jj}|jjj }|jj d|jj |jjd|jjt||jj|}|dk\r|jj||jj dy)z2Update ticker filter dropdown with unique tickers.Tr#rFN) rA currentTextr db_managerget_all_tickers blockSignalsclearrBr>sortedfindTextsetCurrentIndex)rcurrent_tickertickersindexs r rhz$TransactionsTab.update_ticker_filters11==?++((88:   --d3   &&(   ((/   ))&/:((11.A A:  $ $ 4 4U ;   --e4r!c|jj}|jj}|dk(rd}|dk(rd}|j||y)zApply type and ticker filters.r#N)r_r^)r=rrAr)rr_r^s r r@zTransactionsTab.apply_filterssU((446))557 e G U?F wv6r!ct|j}|jr[|j|jjj|jj j ddyy)zOpen Buy Transaction dialog.zBuy transaction recorded N)rrexecr snapshot_tab status_bar showMessage)rdialogs r r6zTransactionsTab.on_buy_clickeds[%dkk2 ;;= NN  KK $ $ . . 0 KK " " . ./I4 P r!c|jjjDcgc]$}|jdkDs|jdk7s#|&}}|st j |ddyt|j}|jr[|j|jjj|jjjddyycc}w)zOpen Sell Transaction dialog.rCashz No HoldingszNo holdings available to sell.NzSell transaction recordedr) r portfolioholdingsrw asset_typer informationrrrrrr)rhrrs r r8zTransactionsTab.on_sell_clickeds ${{44==k!aTUT`T`djTjAkk  # #0  &t{{3 ;;= NN  KK $ $ . . 0 KK " " . ./JD Q lsC)C)C)c8|jjj}|stj|ddyt |j}|j r7|j|jjjddyy)zOpen Dividend dialog.z No Tickersz+No holdings available. Add a holding first.NzDividend recordedr) rrrr rrrrrr)rrrs r r:z#TransactionsTab.on_dividend_clickeds|++((88:  # #=   , ;;= NN  KK " " . ./BD I r!cjjj}|sy|dj}jj |dj t jjt}|jd}|jjfd|jjjj|y)z] Show context menu for table. Args: pos: Click position NrzDelete Transactionc&jS)N)delete_transaction)rtx_idsr z3TransactionsTab.show_context_menu..Es0G0G0Nr!)rDselectionModel selectedRowsritemdatarrrr addAction triggeredr5rviewport mapToGlobal)rpos selected_rowsrmenu delete_actionrs` @r rXz!TransactionsTab.show_context_menu2s 113@@B  A""$ Q',,R__-E-EFT{';< ''(NO $**%%'33C89r!c dtj|ddtjjtjjz}|tjjk(ru |j j j||j|j jjddtjd|y y #t$rG}tjd|dtj|d d t!|Yd }~y d }~wwxYw) zb Delete a transaction. Args: tx_id: Transaction ID to delete zConfirm Deletez~Delete this transaction? WARNING: This does NOT reverse the transaction effects on holdings. Manual adjustment may be needed.zTransaction deletedrzTransaction deleted: ID zError deleting transaction: Tr`rbzFailed to delete transaction: N)r questionStandardButtonYesNorrerrrrrcrkrlrmrnro)rrreplyrqs r rz"TransactionsTab.delete_transactionIs$$   P  & & * *[-G-G-J-J J   K..22 2  //BB5I  &&223H$O 6ug>? 3  ;A3?$ O$$5c!fX> s*A3C D/(=D**D/)NN)__name__ __module__ __qualname____doc__rrrrgrhr@r6r8r:rXr __classcell__)rs@r rrsE+ E+N"HD>L5. 7 QR.J*:.r!r)rloggingPyQt6.QtWidgetsrrrrrrr r r r r PyQt6.QtCorer PyQt6.QtGuirrsrc.utils.formattersrrsrc.gui.dialogsrrr getLoggerrrcrr!r rsT  &=WW   8 $OgOr!