o
    r– j\I  ã                   @   s&  d dl Z d dlZd dl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 dlmZ d dlmZmZmZmZmZmZ d d	lmZ d d
lmZ d dlmZ edd ee  d¡dZedƒZejdd dZdede fdd„Z!de"de"fdd„Z#de"de defdd„Z$de"de de"fdd „Z%dS )!é    N)ÚPath)ÚOpenAI)ÚA4)ÚgetSampleStyleSheetÚParagraphStyle)Úinch)Úcolors)ÚSimpleDocTemplateÚ	ParagraphÚSpacerÚTableÚ
TableStyleÚ
HRFlowable)Údatetime)ÚRequest)Úload_dotenvT)ÚoverrideÚOPENAI_API_KEY)Úapi_keyÚreports)Úexist_oku¤  You are a senior pharma quality investigator writing a GMP-compliant investigation report.

STRICT RULES â€” NEVER BREAK THESE:
1. NEVER say product was not impacted without checking LIMS results first
2. If ANY LIMS result shows Status=Fail â€” impact_assessment MUST say product was impacted with exact test name and value
3. NEVER use generic phrases â€” always use exact values from the data
4. Severity MUST come from Deviation Report severity field â€” not your own judgment
5. ref_id MUST come from Deviation_ID in the Deviation Report
6. Duration MUST be calculated from Equipment Log timestamps â€” not estimated
7. Root cause MUST reference exact maintenance log observations â€” thermocouple, calibration dates, drift values
8. Operator MUST be included from Equipment Log Operator_ID field
9. Batch disposition MUST come from Deviation Report Batch_Disposition field
10. CAPA actions MUST reference actual work order IDs and actions from Maintenance Log

Return JSON only with this exact structure:
{
  "report_metadata": {
    "ref_id": string,
    "revision": "Rev 01",
    "status": "Audit Ready",
    "severity": one of ["Critical", "High", "Medium", "Low"],
    "generated_date": string,
    "batch_id": string,
    "product_name": string,
    "plant": string,
    "confidential": true
  },
  "ai_generated_summary": string,
  "approval_workflow": {
    "qa_reviewer": {
      "name": string,
      "status": one of ["Approved", "Pending", "Rejected"],
      "note": string or null
    },
    "qa_head": {
      "name": string,
      "status": one of ["Approved", "Pending Final Sign Off", "Rejected"]
    }
  },
  "compliance_tags": array of strings,
  "sections": {
    "incident_overview": {
      "batch_number": string,
      "incident_date": string,
      "deviation_type": string,
      "department": string
    },
    "detected_deviations": [
      {
        "signal_exception": string,
        "duration": string,
        "peak_value": string,
        "limit": string,
        "is_deviation": true or false
      }
    ],
    "executive_summary": string,
    "deviation_description": string,
    "timeline": [
      {
        "timestamp": string,
        "event": string,
        "severity": one of ["critical", "warning", "info"]
      }
    ],
    "scope_of_review": string,
    "exceptions_summary": string,
    "root_cause_analysis": {
      "probable_cause": string,
      "methodology": string,
      "conclusion": string
    },
    "capa_summary": string,
    "impact_assessment": string,
    "conclusion": string,
    "regulatory_compliance": [
      {
        "standard": string,
        "status": one of ["Compliant", "Non-Compliant", "Under Review"]
      }
    ]
  },
  "compliance_checklist": [
    {
      "standard": string,
      "description": string,
      "status": one of ["pass", "warn", "fail"]
    }
  ],
  "evidence_coverage_score": number 0-100,
  "confidence_label": one of ["High Confidence", "Medium Confidence", "Low Confidence"],
  "ai_insight": string,
  "export_options": ["Export as PDF", "Export as Word", "Submit to Regulatory"]
}

Section writing rules:

ref_id: use Deviation_ID from Deviation Report exactly e.g. DEV-2024-0312
severity: copy exactly from Deviation Report Severity field

executive_summary (4-5 sentences):
- Name exact batch, product, plant, date
- Name exact parameters that deviated with exact values and limits
- Reference exact equipment ID
- State LIMS outcome â€” if assay failed state exact % and OOS reference
- State batch disposition from Deviation Report

deviation_description (5-6 sentences):
- Exact timestamp of first deviation from Equipment Log
- Exact operator ID from Equipment Log
- Progressive temperature rise with timestamps from Equipment Log
- Exact peak value reached
- What action was taken and when â€” from Deviation Report Immediate_Actions

detected_deviations duration:
- Calculate from Equipment Log â€” time from first Alert status to process stopped
- Do NOT estimate â€” use actual timestamps

root_cause_analysis.probable_cause:
- Reference exact equipment ID
- Reference calibration due date and overdue days from Maintenance Log
- Reference thermocouple drift value (+XÂ°C) from Maintenance Log breakdown inspection
- Reference work order ID

root_cause_analysis.conclusion (4-5 sentences):
- Name the exact root cause with evidence
- Reference Maintenance Log dates and observations
- Reference Equipment Log notes at Alert rows
- Reference calibration overdue status

impact_assessment â€” CRITICAL RULE:
- CHECK LIMS results first â€” if any Status=Fail â†’ product WAS impacted
- State exact test name, result value, specification, OOS reference number
- State batch disposition â€” HOLD or released
- If assay failed â€” state this clearly: "Assay result of X% is below specification of Y%-Z%"
- NEVER say "no impact" if LIMS has any Fail result

capa_summary:
- List actual CAPA actions from Maintenance Log Action_Taken field
- Reference work order IDs
- Reference new parts installed
- Reference requalification report if available

conclusion:
- State current batch status from Deviation Report Batch_Disposition
- State OOS investigation reference if LIMS failed
- State whether equipment was returned to service

Data to generate report from:
<content>
ÚrequestÚreturnc                 C   s   t | jƒ d¡S )Nú/)ÚstrÚbase_urlÚrstrip)r   © r   ú*/var/www/html/fyndo/pharma/fyndo/report.pyÚget_base_url­   s   r   Údatac              
   Ã   s    z5t j| dd}t d|d d… ¡}tjjjddddœd	|dœgd
didd}|jd j	j
}t  |¡}|W S  tyO } zdt|ƒdœW  Y d }~S d }~ww )Né   )Úindentz	<content>i'  zgpt-4oÚsystemuÕ  You are a senior pharma quality investigator.
CRITICAL INSTRUCTIONS:
- Always check LIMS results before writing impact assessment
- If LIMS has any Fail result â€” product was impacted â€” say so with exact values
- Never say product was not impacted without evidence
- Use exact values from data â€” no generic statements
- Severity comes from Deviation Report â€” not your judgment
- ref_id comes from Deviation_ID in Deviation Report
Return JSON only. No extra text.)ÚroleÚcontentÚuserÚtypeÚjson_objectr   )ÚmodelÚmessagesÚresponse_formatÚtemperatureÚerror)Ústatusr-   )ÚjsonÚdumpsÚREPORT_PROMPTÚreplaceÚclientÚchatÚcompletionsÚcreateÚchoicesÚmessager%   ÚloadsÚ	Exceptionr   )r    Údata_strÚpromptÚresponseÚrawÚresultÚer   r   r   Úgenerate_report_json±   s.   €þþóë
€ÿrA   ÚreportÚfilenamec           &         s,	  t | }tt|ƒtdt dt dt dt d}tƒ }g ‰t d¡}t d¡}t d¡}td|d dd	|d
dd}td|d d|dd}	td|d dd	|ddd‰td|d d|ddd‰ td|d d|d	ddd}
|  	di ¡}|  	di ¡}|  	dg ¡}| 	dd ¡ 
¡ }ˆ td!|› d"|ƒ¡ ˆ td#| 	d$d%¡› d&| 	d'd(¡› d&| 	d)¡r©d*nd+› |	ƒ¡ ˆ td,| 	d-d.¡› d/| 	d0t ¡  d1¡¡› |	ƒ¡ ˆ td2dƒ¡ d3| 	d4d5¡d6| 	d7d5¡gd8| 	d9d5¡d:|gg}t|d;t d<t d;t d<t gd=}| td>d?d@|fdAdBdCdDd?d@|fdEd?d@dFt dG¡fdHgƒ¡ ˆ |¡ ˆ td2dƒ¡ ˆ tdId2t dG¡dJ¡ |  	dKd+¡}|rVˆ td2dƒ¡ ˆ tdLˆƒ¡ ˆ t|ˆ ƒ¡ ‡ ‡‡fdMdN„}| 	dOi ¡}|rÝˆ td2dƒ¡ ˆ tdPˆƒ¡ ˆ tdIdFt dG¡dJ¡ ˆ td2dƒ¡ g dQ¢| 	dRd5¡| 	dSd5¡| 	dTd5¡| 	dUd5¡gg}t|dVt dVt dt dVt gd=}| td>d?dWt dG¡fdXdCdDd?d@|fdEd?d@dFt dG¡fdYgƒ¡ ˆ |¡ | 	dZg ¡}|rnˆ td2dƒ¡ ˆ td[ˆƒ¡ ˆ tdIdFt dG¡dJ¡ ˆ td2dƒ¡ g d\¢g}|D ]}| | 	d]d5¡| 	d^d5¡| 	d_d5¡| 	d`d5¡g¡ qt|d<t d;t dat dt gd=}| td>d?dWt dG¡fdXdCdDd?d@|fdEd?d@dFt dG¡fdYdbdcd@tj|gfgƒ¡ ˆ |¡ |ddde| 	dfd+¡ƒ |d
dg| 	dhd+¡ƒ ˆ td2dƒ¡ ˆ tdiˆƒ¡ ˆ tdIdFt dG¡dJ¡ ˆ td2dƒ¡ | 	dji ¡}|rdkdlg| 	dmd5¡| 	dnd5¡gdod+g| 	dpd5¡d+gg}t|dqt dqt gd=}| td>d?dWt dG¡fd>drdst dG¡fdXdtdCdDd?d@|fdEd?d@dFt dG¡fdYdudvg
ƒ¡ ˆ |¡ |ddw| 	dxd+¡ƒ |dydz| 	d{d+¡ƒ |dd|| 	d}d+¡ƒ |d~d| 	d€d+¡ƒ |dd| 	dpd+¡ƒ | 	d‚g ¡}|r¹ˆ td2dƒ¡ ˆ tdƒˆƒ¡ ˆ tdIdFt dG¡dJ¡ ˆ td2dƒ¡ d„d…gg}|D ]}| | 	d†d5¡| 	d-d5¡g¡ qmt|d
t d‡t gd=} |  td>d?dWt dG¡fdXdCdDd?d@|fdEd?d@dFt dG¡fdYdbdcd@tj|gfgƒ¡ ˆ | ¡ |rHˆ td2dƒ¡ ˆ tdˆˆƒ¡ ˆ tdIdFt dG¡dJ¡ ˆ td2dƒ¡ g d‰¢g}!|D ]#}"|"d- dŠkród‹n
|"d- dŒkrüdndŽ}#|! |"d† |"d |#g¡ qèt|!dt d
t d;t gd=}$|$ td>d?dWt dG¡fdXdCdDd?d@|fdEd?d@dFt dG¡fdHdbdcd@tj|gfgƒ¡ ˆ |$¡ ˆ td2dƒ¡ ˆ tdId2t dG¡dJ¡ ˆ td2dƒ¡ ˆ td|  	d‘d’¡› d“|  	d”d+¡› |
ƒ¡ |  	d•d+¡}%|%rˆ td–|%› ˆ ƒ¡ | ˆ¡ |S )—Ng      è?)ÚpagesizeÚrightMarginÚ
leftMarginÚ	topMarginÚbottomMarginz#1a1916z#7a7869z#f5f4f0ÚTitleÚNormalé   úHelvetica-Boldé   é   )ÚparentÚfontSizeÚfontNameÚ	textColorÚ
spaceAfterÚleadingÚSubé
   r!   )rO   rP   rR   rS   ÚH1é   é   é   )rO   rP   rQ   rR   ÚspaceBeforerS   ÚBodyé   )rO   rP   rR   rT   rS   ÚLabelé   )rO   rP   rR   rQ   rS   rT   Úreport_metadataÚsectionsÚcompliance_checklistÚseverityÚCriticalz-INVESTIGATION REPORT  <font color="#c0392b">[z SEVERITY]</font>zRef ID: Úref_idzDEV-2024-00001z  |  ÚrevisionzRev 01ÚconfidentialÚCONFIDENTIALÚ zStatus: r.   zAudit Readyz  |  Generated: Úgenerated_datez%Y-%m-%dé   zBatch IDÚbatch_idu   â€”ÚProductÚproduct_nameÚPlantÚplantÚSeverityg333333ó?g      @)Ú	colWidthsÚ
BACKGROUND©r   r   ©éÿÿÿÿrv   )ÚFONTNAMErt   )r   rv   rL   )rw   )r!   r   )r!   rv   rL   )ÚFONTSIZErt   ru   é	   Ú	TEXTCOLORÚGRIDç      à?ú#e2e0d8)ÚPADDINGrt   ru   rZ   ú100%©ÚwidthÚ	thicknessÚcolorÚai_generated_summaryzAI Generated Summaryc                    st   ˆ  tddƒ¡ ˆ  t| › d|› ˆƒ¡ ˆ  tddt d¡d¡ ˆ  tddƒ¡ |r8ˆ  tt|ƒˆ ƒ¡ d S d S )	Nrk   rV   z. r   r|   r}   r€   rZ   )Úappendr   r
   r   r   ÚHexColorr   )ÚnumberÚtitler%   ©Ú
body_styleÚh1_styleÚstoryr   r   Úadd_section$  s   ÿz!generate_pdf.<locals>.add_sectionÚincident_overviewz01. Incident Overview)zBATCH NUMBERzINCIDENT DATEzDEVIATION TYPEÚ
DEPARTMENTÚbatch_numberÚincident_dateÚdeviation_typeÚ
departmentg      ü?©rv   r   )rw   rt   r”   rL   )r~   rt   ru   r]   Údetected_deviationsz02. Detected Deviations)zSIGNAL/EXCEPTIONÚDURATIONz
PEAK VALUEÚLIMITÚsignal_exceptionÚdurationÚ
peak_valueÚlimitg      ø?ÚROWBACKGROUNDS)r   rk   é   zExecutive SummaryÚexecutive_summaryzDeviation DescriptionÚdeviation_descriptionz05. Root Cause AnalysisÚroot_cause_analysiszPROBABLE CAUSEÚMETHODOLOGYÚprobable_causeÚmethodologyÚ
CONCLUSIONÚ
conclusiong      @©r   r!   ©rv   r!   )rw   r¦   r§   rL   )ÚSPANr¦   )rk   r!   )r¨   )r   r   )rk   r   zScope of ReviewÚscope_of_reviewé   Ú
ExceptionsÚexceptions_summaryÚCAPAÚcapa_summaryry   zImpact AssessmentÚimpact_assessmentÚ
ConclusionÚregulatory_compliancez11. Regulatory ComplianceÚStandardÚStatusÚstandardgš™™™™™	@zCompliance Checklist)r²   ÚDescriptionr³   Úpassu   âœ“ PassÚwarnu
   âš  Reviewu   âœ— FailÚdescriptionzEvidence Coverage Score: Úevidence_coverage_scorer   u   % â€” Úconfidence_labelÚ
ai_insightzAI Insight: )ÚREPORTS_DIRr	   r   r   r   r   r   r†   r   ÚgetÚupperr…   r
   r   ÚnowÚstrftimer   r   ÚsetStyler   r   ÚwhiteÚbuild)&rB   rC   ÚfilepathÚdocÚstylesÚdarkÚmutedÚlight_bgÚtitle_styleÚ	sub_styleÚlabel_styleÚmetara   Ú	checklistrc   Ú
batch_dataÚbatch_tableÚ
ai_summaryr   ÚincÚinc_dataÚ	inc_tableÚdevsÚdev_dataÚdÚ	dev_tableÚrcaÚrca_dataÚ	rca_tableÚreg_complianceÚreg_dataÚrÚ	reg_tableÚ
check_dataÚitemÚstatus_textÚcheck_tabler»   r   r‰   r   Úgenerate_pdfÖ   s–  ú	



þ
ÿ
þ
ÿ
þ
þ2þ(þþ$

ù
		



üþ$	
ú






ü$
ù
	ü
ö

"
ù
	
(
ù
	þ
rä   r   c                 Ã   st   t | ƒI d H }| di ¡ dd¡}t ¡  d¡}d|› d|› d}t||ƒ ||d< |› d	|› |d
< d|d< |S )Nr`   rl   ÚBATCHz%Y%m%d_%H%M%SÚInvestigation_Report_Ú_z.pdfÚpdf_filenamez/reports/download/Údownload_urlÚ	completedr.   )rA   r½   r   r¿   rÀ   rä   )r    r   Úreport_jsonrl   Ú	timestamprC   r   r   r   Úgenerate_full_reportÃ  s   €
rí   )&Úosr/   Úpathlibr   Úopenair   Úreportlab.lib.pagesizesr   Úreportlab.lib.stylesr   r   Úreportlab.lib.unitsr   Úreportlab.libr   Úreportlab.platypusr	   r
   r   r   r   r   r   Úfastapir   Údotenvr   Úgetenvr3   r¼   Úmkdirr1   r   r   ÚdictrA   rä   rí   r   r   r   r   Ú<module>   s.     
 % n