o
    @i(                     @   s  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dZdee deeef fd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dZdS )    )ListDictAnyOptional)date)Counterdefaultdict)DocumentAnalyst) build_company_consistency_report)calculate_credit_scoreScoringInput)make_credit_decisionfieldprofilesconsistencyreturnc                 C   s   dd |D }|st dd |D d}|r|| S dS tt}|D ]}|| }|dur9||  |dd7  < q"|s>dS t| dd	 d
\}}	| dkrY|di dsYdS | dkrm|di dd}
|
dk rmdS |S )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.
    c                 S   s   g | ]
}|d  dkr|qS )sourceinput .0pr   r   //var/www/Credit_scoring_API/src/app/pipeline.py
<listcomp>   s    z1_get_canonical_value_weighted.<locals>.<listcomp>c                 s   s     | ]}|d  dkr|V  qdS )r   r   Nr   r   r   r   r   	<genexpr>   s    z0_get_canonical_value_weighted.<locals>.<genexpr>N
confidence      ?c                 S   s   | d S )N   r   )xr   r   r   <lambda>(   s    z/_get_canonical_value_weighted.<locals>.<lambda>)keynuitidentityZnuit_consistentcompany_nameZcompany_name_similarityr   g?)nextgetr   floatmaxitems)r   r   r   Zdoc_profilesinput_profileZconfidence_sumr   valZbest_val_simr   r   r   _get_canonical_value_weighted   s(   
r-   document_resultsc                 C   s   ddddddddddd
}| D ]d}|j dkrs|jdi }|rp|d|d< |d|d	< |d
|d< |d|d< |d|d< |d|d< |d|d< |d|d< |d|d< |d dkrp|dddkrpd|d<  |S q|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_extratoZextrato_bancariobank_statement_featuresZmedia_entradas_mensalr/   Zsaldo_medior0   Ztotal_creditosr1   Zperiod_daysr2   r3   Zrecommended_max_by_termr4   r5   r6   r7   OKr   Tr8   )Zdocument_type_detectedfeaturesr%   )r.   bank_featuresresultZextrato_featuresr   r   r   _extract_bank_features;   s>   
r>   N)input_company_name
input_nuitinput_meses_atividadefaturamento_mensalfilesr?   r@   rA   rB   valor_credito
prazo_diasc                 C   s  t  }|| }g }	g }
|D ]}|jd}|r-|j}d|vr#d|d< |	| |
| qd||dd|d|s9|r;dndi d	}|
| t|	d	}td
|
|}td|
|}td|
|}|rvt	 }|j
|j
 d |j|j  }td|}ntd|
|}|du r|pd}t|}|du r|d r|d}t|||pd|||t|d}t||||d}t|j|j|j|ji |j||||dd}||j|j|j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.
    Zcompany_profiler   r   r   NZ
user_inputg        )	r   r#   r!   Zentity_typeincorporation_datecompany_age_monthsZissuerr   raw)r   r#   r!   rF      r   rG   r8   r/   )r#   r!   Zmeses_atividaderB   rD   rE   Zdocumentos_submetidos)scoring_inputr.   Zcompany_consistency_reportr<   )company_consistencyrD   rE   r<   )score
risk_classr   reasonsfeatures_used)rM   recommended_max_valuerecommended_term_days)decisionriskrL   rK   	documentsr<   )r	   Zanalyze_documentsr;   r%   __dict__appendr
   r-   r   todayyearmonthr'   r>   r   lenr   r   rL   rM   r   rN   rO   rP   rQ   )rC   r?   r@   rA   rB   rD   rE   Zanalystr.   Zdocument_profilesZall_profilesrZprofileZprofile_dictr)   rK   Zcanonical_nameZcanonical_nuitZcanonical_incorporationrW   Zdelta_monthsZcanonical_monthsr<   rJ   Zscore_outputrR   r   r   r   run_credit_pipelinec   s   







r\   )typingr   r   r   r   datetimer   collectionsr   r   Z6src.infra.document_analysis.analyzers.document_analystr	   Z>src.infra.document_analysis.reports.company_consistency_reportr
   Zsrc.core.scoring.scoring_enginer   r   Z!src.core.decision.decision_enginer   strr-   r>   intr&   r\   r   r   r   r   <module>   s<    &++
	