
    )5i(                        d dl mZmZmZmZ d dlmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZmZ d dlmZ ded	ee   d
eeef   defdZdee   deeef   fdZddddddee   dee   dee   dee   dee   dededeeef   fdZy)    )ListDictAnyOptional)date)Counterdefaultdict)DocumentAnalyst) build_company_consistency_report)calculate_credit_scoreScoringInput)make_credit_decisionfieldprofilesconsistencyreturnc                    |D cg c]  }|d   dk7  s| }}|s(t        d |D        d      }|r|j                  |       S dS t        t              }|D ]3  }|j                  |       }|||xx   |j                  dd      z  cc<   5 |syt	        |j                         d       \  }}	| d	k(  r"|j                  d
i       j                  d      sy| dk(  r(|j                  d
i       j                  dd      }
|
dk  ry|S c c}w )u   
    Extrai o valor canónico para um campo a partir dos perfis (incluindo input),
    utilizando ponderação pela confiança de cada fonte.
    O relatório de consistência é usado para validar a homogeneidade.
    sourceinputc              3   2   K   | ]  }|d    dk(  s|  yw)r   r   N ).0ps     KC:\Users\dkayr\PycharmProjects\Credit_Scoring_plataform\src\app\pipeline.py	<genexpr>z0_get_canonical_value_weighted.<locals>.<genexpr>   s     LAQx[G5Kas   N
confidence      ?c                     | d   S )N   r   )xs    r   <lambda>z/_get_canonical_value_weighted.<locals>.<lambda>(   s    AaD    )keynuitidentitynuit_consistentcompany_namecompany_name_similarityr   g?)nextgetr	   floatmaxitems)r   r   r   r   doc_profilesinput_profileconfidence_sumvalbest_val_sims              r   _get_canonical_value_weightedr5      s     (Bx!1X;'+AAxLBLLdS+8}  'BdB !'NeeEl?3155s#;; 
  n**,.AKHa {z2>BBCTUooj"-112KQO9
 OC Cs
   DDdocument_resultsc                 <   ddddddddddd
}| D ]  }|j                   dk(  s|j                  j                  di       }|r|j                  d      |d<   |j                  d      |d	<   |j                  d
      |d<   |j                  d      |d<   |j                  d      |d<   |j                  d      |d<   |j                  d      |d<   |j                  d      |d<   |j                  d      |d<   |d   dk(  r|j                  dd      dkD  rd|d<    |S  |S )u   
    Extrai informações bancárias de documentos do tipo extrato.
    Retorna um dicionário com chaves padronizadas, incluindo flag de validade.
    NF)
monthly_revenueaverage_balancetotal_creditsdays_analyzedrecords_countrecommended_limitsstatement_scorefluxo_liquidoanalysis_statushas_valid_extratoextrato_bancariobank_statement_featuresmedia_entradas_mensalr8   saldo_medior9   total_creditosr:   period_daysr;   r<   recommended_max_by_termr=   r>   r?   r@   OKr   TrA   )document_type_detectedfeaturesr*   )r6   bank_featuresresultextrato_featuress       r   _extract_bank_featuresrO   ;   sg     ""M #((,>>%223LbQ3C3G3GH_3`/03C3G3G3V/01A1E1EFV1Wo.1A1E1Em1To.1A1E1Eo1Vo.6F6J6JKd6e233C3G3GHY3Z/01A1E1Eo1Vo.3C3G3GHY3Z/0 ""34<)--oqAAE9=M"56' #& r"   N)input_company_name
input_nuitinput_meses_atividadefaturamento_mensalfilesrP   rQ   rR   rS   valor_credito
prazo_diasc                    t               }|j                  |       }g }	g }
|D ]W  }|j                  j                  d      }|s!|j                  }d|vrd|d<   |	j                  |       |
j                  |       Y d||dd|d|s|rdndi d	}|
j                  |       t        |		      }t        d
|
|      }t        d|
|      }t        d|
|      }|rWt        j                         }|j                  |j                  z
  dz  |j                  |j                  z
  z   }t        d|      }nt        d|
|      }||xs d}t        |      }||d   r|j                  d      }t        |||xs d|||t        |            }t!        ||||      }t#        |j$                  |j&                  |j(                  |j*                  i |j,                  ||||d      }||j&                  |j.                  |j0                  d||||dS )u   
    Pipeline oficial end-to-end do Credit Scoring.

    Funciona exclusivamente com documentos, usando inputs manuais apenas como fallback.
    O relatório de consistência é gerado apenas a partir dos documentos.
    company_profiler   r   r   N
user_inputg        )	r   r'   r$   entity_typeincorporation_datecompany_age_monthsissuerr   raw)r   r'   r$   r[      r   r\   rA   r8   )r'   r$   meses_atividaderS   rU   rV   documentos_submetidos)scoring_inputr6   company_consistency_reportrL   )company_consistencyrU   rV   rL   )score
risk_classr   reasonsfeatures_used)rf   recommended_max_valuerecommended_term_days)decisionriskre   rd   	documentsrL   )r
   analyze_documentsrK   r*   __dict__appendr   r5   r   todayyearmonthr,   rO   r   lenr   r   re   rf   r   rg   rh   ri   rj   )rT   rP   rQ   rR   rS   rU   rV   analystr6   document_profilesall_profilesrprofileprofile_dictr/   rd   canonical_namecanonical_nuitcanonical_incorporationrq   delta_monthscanonical_monthsrL   rb   score_outputrk   s                             r   run_credit_pipeliner   c   ss   ( G007
 L**..!23"++L</-0\*$$\2-  *"30JcS
M &
 ;DUV
 3><QdeN26<I\]N <<PR^`st 



%<%A%AARG5;;YpYvYvKvwq,/ 99M|]pq#49
 ++;<M !m4G&H*../@A
 !#(-A-#!"23M *#)#6#	L $  ****$$
((
#6*$*
H$ &11%1%G%G%1%G%G

 2%& r"   )typingr   r   r   r   datetimer   collectionsr   r	   6src.infra.document_analysis.analyzers.document_analystr
   >src.infra.document_analysis.reports.company_consistency_reportr   src.core.scoring.scoring_enginer   r   !src.core.decision.decision_enginer   strr5   rO   intr+   r   r   r"   r   <module>r      s    , ,  , R C( (T
 (QUVY[^V^Q_ (dg (V%T#Y %4S> %V )- $+/*.M9M !M 	M
 $C=M !M M M 
#s(^Mr"   