
    G	/iK                     P   d dl mZ d dlmZ 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 d dlmZmZ d d	lmZ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 d dlm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z( d dl)m*Z* d dl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7  G d d      Z8y)    )HTTPException)SessionN)datetime)BytesIO)A4)colors)getSampleStyleSheetParagraphStyle)SimpleDocTemplate	ParagraphSpacerTable
TableStyleImage	PageBreak)inch)TblCorporateConceptOffice)TblConceptOffice)TblStoreLevelStaffNeeds)TblCompetitorAnalysisComparison)
TblUtility)TblOperatingExpenses)
TblSummary)TblGroup)CorporateConceptOfficeConceptOfficeStoreLevelStaffNeedsTrainingTalentManagementUtilityOperatingExpensesSummaryModule8ReportPreview)JWTPayloadSchema)SummaryCreatec                   \    e Zd ZdedefdZdedefdZdede	fdZ
dede	fd	Zded
e	fdZy)Module8ReportServicedbtokenc                      || _         || _        y )N)r'   r(   )selfr'   r(   s      F/var/www/html/retail-simulation-api/app/api/module_8_report/service.py__init__zModule8ReportService.__init__%   s    
    group_idreturnc                 f  K   |st        dd      | j                  j                  t              j	                  |      j                         }|st        dd      d }d }d	 }| j                  j                  t              j	                  |      j                         }| j                  j                  t              j	                  |      j                         }| j                  j                  t              j	                  |      j                         }| j                  j                  t              j	                  |      j                         }	| j                  j                  t              j	                  |      j                         }
| j                  j                  t              j	                  |      j                         }| j                  j                  t              j	                  |      j                         }i }|D ]  } ||j                        }||vr> ||j                        | ||j                         d
dd
d
 ||j"                        d||<   |j$                  dk(  r ||j&                        ||   d<   |j$                  dk(  s ||j&                        ||   d<    |j)                         D cg c]  }t+        di | }}t-        ||D cg c]  }t/        di |j0                   c}xs t/               g|D cg c]  }t3        di |j0                   c}xs t3               g|xs t+               g|	rt5        di |	j0                  n	t5               |
D cg c]  }t7        di |j0                   c}xs t7               g|D cg c]  }t9        di |j0                   c}xs t9               g|rt;        di |j0                  n	t;               t<        j>                  jA                         	      S c c}w c c}w c c}w c c}w c c}w w)Ni  zgroup_id is required)status_codedetail)r.   i  zGroup ID not found in databasec                     | dvr| S dS )N)N nullzN/A vs    r+   safe_strz:Module8ReportService._fetch_module8_data.<locals>.safe_str2   s    !331>>r-   c                 0    	 t        | xs d      S #  Y yxY w)Nr   g        )floatr7   s    r+   
safe_floatz<Module8ReportService._fetch_module8_data.<locals>.safe_float5   s    QV!}$    c                 0    	 t        | xs d      S #  Y yxY w)Nr   )intr7   s    r+   safe_intz:Module8ReportService._fetch_module8_data.<locals>.safe_int;   s    16{"r=   r   Combined)store_iddesignationaverage_salarycountstore_formate_typeformat_a_countformat_b_countr.   zStore Format ArG   zStore Format BrH   )	r.   corporate_concept_officeconcept_officestore_level_staff_needstraining_talent_management	utilitiesoperating_expensessummarylast_updatedr6   )!r   r'   queryr   	filter_byfirstr   allr   r   r   r   r   r   rC   rB   rD   r.   rF   rE   valuesr   r"   r   __dict__r   r   r   r    r!   pd	Timestampnow)r*   r.   group_existsr9   r<   r@   rI   rJ   store_level_staff_rawtraining_talentrM   rN   rO   
staff_dictstaffrC   datastore_level_staffcuos                        r+   _fetch_module8_dataz(Module8ReportService._fetch_module8_data)   s    C8NOO ww}}X.88(8KQQSC8XYY	?		 $(77==1J#K#U#U_g#U#h#l#l#n '78BBHBUYY[ $.E F P PZb P c g g i''--(GHRR\dRekkmGGMM*-777JNNP	!WW]]+?@JJT\J]aac''--
+55x5HNNP 
*E"5#4#45K*, ( 8#.&01E1E&F*4&'&' ( 8	+
;' ''+;;<DU[[<Q
;'(89))-==<DU[[<Q
;'(89# +& GQFWFWFYZFYd19D9FYZ $Tl%mTlq&<&Jqzz&JTl%m  &L  sI  sK  rLAOPAM7AJJ7PeUbUdTe$5$Q:N:P9Q_n'?'[/BZBZ'[  uM  uO6?@iw,,i@OWYKI[\I[A 1 ?AJJ ?I[\uarat`u3:G/g../	))+

 
	
 [
 &nP A\sJ   J"P1%,P1P#P1/P
P1P":AP1;P'P1*P,A+P1r_   c                    t               }t        |t        dt        z  dt        z        }g }t	               }	 t        ddd      }d|_        |j                  |       |j                  t        dd	             |j                  t        d
|d                |j                  t        dd             |j                  t        d|d                |j                  t        dd	             g dg}|j                  D ]  }|j                  |j                  xs dt        |j                  xs d      t        |j                  xs d      t        |j                  xs d      t        |j                   xs d      t        |j"                  xs d      t        |j$                  xs d      g        t'        |      }	|	j)                  t+        ddddt,        j.                  fdddddddddg
             |j                  |	       |j                  t        dd             |j                  t        d|d                |j                  t        dd	             g dg}
|j0                  D ]  }|
j                  |j                  xs dt        |j                  xs d      t        |j                  xs d      t        |j                  xs d      t        |j                   xs d      t        |j"                  xs d      t        |j$                  xs d      g        t'        |
      }|j)                  t+        ddddt,        j.                  fdddddddddg
             |j                  |       |j                  t        dd             |d   }d |_        d	|_        t7        d!|d   d d	d"      }|j                  t        d#|d                |j                  t        dd	             t        d$|      t        d%|      t        d&|      t        d'|      t        d(|      t        d)|      g}|g}|j8                  D ]  }t        |j:                  xs d|      t        t        |j<                  xs d      |      t        t        |j>                  xs d      |      t        |j@                  xs d|      t        t        |jB                  xs d      |      t        t        |jD                  xs d      |      g}|j                  |        t'        |d*      }|j)                  t+        ddddt,        j.                  fd+dddt,        j.                  fdd,d-d.dddddddg             |j                  |       |j                  t        dd             |j                  t        d/|d                |j                  t        dd	             t        d0|      t        |jF                  jH                  xs d|      gt        d1|      t        |jF                  jJ                  xs d|      gt        d2|      t        |jF                  jL                  xs d|      gg}t'        |      }|j)                  t+        ddddt,        j.                  fd+dddt,        j.                  fd3ddddddddg             |j                  |       |j                  t        dd             |j                  tO                      |j                  t        d4|d                |j                  t        dd	             t        d5|      t        d6|      t        d7|      t        d8|      t        d'|      g}|g}|jP                  D ]  }t        |jR                  xs d|      t        t        |jT                  xs d      |      t        |jV                  xs d|      t        |jX                  xs d|      t        |jZ                  xs d|      g}|j                  |        t'        |d*      }|j)                  t+        ddddt,        j.                  fd+dddt,        j.                  fdd,d-d.dddddddg             |j                  |       |j                  t        dd             |j                  t        d9|d                |j                  t        dd	             t        d:|      t        d;|      t        d8|      t        d'|      g}|g}|j\                  D ]  }t        |j^                  xs d|      t        t        |j`                  xs d      |      t        |jX                  xs d|      t        |jZ                  xs d|      g}|j                  |        t'        |d*      }|j)                  t+        ddddt,        j.                  fd+dddt,        j.                  fdd,d-d.dddddddg             |j                  |       |j                  t        dd             |j                  t        d<|d                |j                  t        dd	             t        d=|      t        t        |jb                  jd                  xs d      |      gt        d>|      t        t        |jb                  jf                  xs d      |      gg}t'        |      }|j)                  t+        ddddt,        j.                  fd3ddddddddg
             |j                  |       |j                  t        dd             |j                  t        d?|jh                  jk                  d@       |d                |jm                  |       |jo                  d       tq        jr                         jk                  dA      }dB|jt                   dC| dD}dE| }tw        jx                  tv        jz                  j}                  |      dFG       t        |dH      5 }|j                  |j                                dIdIdI       tv        jz                  j                  dJ|      S #  Y xY w# 1 sw Y   1xY w)Kz(Generate PDF report and return file pathg      ?)pagesize	topMarginbottomMarginzTS Logo.png   K   )widthheightLEFT   
   z,<b>Module 8: Services & Utilities Report</b>Title   zCorporate Concept OfficeHeading2)zRole CategoryzCost To CompanyY1Y2Y3Y4Y5r5   r   GRIDr   r   r{   )FONTNAMEry   r{   r   Helvetica-Bold)FONTSIZEry   rz      )ALIGNry   rz   CENTER)VALIGNry   rz   MIDDLE)LEFTPADDINGry   rz      )RIGHTPADDINGry   rz   r   )
TOPPADDINGry   rz   r   )BOTTOMPADDINGry   rz   r   )WORDWRAPry   rz   TzConcept OfficeNormalr   CenteredStyle)parentfontSizeleading	alignmentzStore Level Staff NeedsDesignationzAverage SalaryCountzStore Format TypezFormat A CountzFormat B Count)
repeatRowsBOX)r   ry   r}   r   )r|   r   rn   rz   	Helvetica)r   r   rz   r   zTraining Talent Managementz!<b>Name Of Reference Retailer</b>z#<b>Employee Management Activity</b>z<b>Policies Plan Activities</b>)r|   ry   )r   r{   r~   	UtilitieszUtility NamezCost Per MonthzKey Usage ParametersRemarkzOperating ExpenseszOperating Expenses TypezPercentage Of Sales Per Yearr!   zService SubmissionszService SummarisezLast Updated: z%Y-%m-%d %H:%M:%Sz%Y%m%d_%H%M%Smodule8_complete_report_group__z.pdfzuploaded_files/T)exist_okwbNuploaded_files)Cr   r   r   r   r	   r   hAlignappendr   r   rI   role_categorystrcost_to_companyy1y2y3y4y5r   setStyler   r   blackrJ   r   r   r
   rK   rC   rD   rE   rF   rG   rH   rL   name_of_reference_retaileremployee_management_activitypoliceis_plan_activitiesr   rM   utility_namecost_per_monthkey_usage_parametersremarkstore_format_typerN   operating_expenses_typepercentage_of_sales_per_yearrO   service_submissionsservice_summariserP   strftimebuildseekr   rY   r.   osmakedirspathdirnameopenwritegetvaluejoin) r*   r_   bufferdocstorystyleslogo	corp_datacorp
corp_tableconcept_dataconceptconcept_tablenormal_stylecentered_styleheader_cells
table_rowsr^   rowstaff_tabletraining_datatraining_tableutil
util_tableopop_tablesummary_datasummary_table	timestampfilenamefilepathfs                                    r+   _generate_pdf_reportz)Module8ReportService._generate_pdf_reportn   so   s4xVYZ^V^_$&	c"=D DKLLLL2'
 	YMvV]_`VAr]# 	Y96*;MNOVAr]#WX	11D"",fD((-A.DGGLq!DGGLq!DGGLq!DGGLq!DGGLq!  2 9%
JVXsFLL9;-1201/20(
  	 	Z VAr]# 	Y/
1CDEVAr]#Z[**G%%/G++0q1GJJO!$GJJO!$GJJO!$GJJO!$GJJO!$!  + l+zVXsFLL9;-1201/20+
   	 	]#VAr]# h' !! (F8$4a

 	Y8&:LMNVAr]# m\2&5g|,)<8&5&5
 #^
11E%++5v|D#e227a8,G#ekk.Q/>%22<flK#e227a8,G#e227a8,GC c" 2 J15ZVXsFLL9FHa6;,7-01/2210)
  	  	[!VAr]# 	Y;VJ=OPQVAr]# :NKt66QQ[U[]kln<nMt66SS]W]_mnp8.It66OOYSY[ijl
 }-
VXsFLL9FHa6;-01/2120,
 ! 	 	^$VAr]# 	Y[!Y{F:,>?@VAr]# nn5&7,n=h/)>:
 #^
NND$++5v~F#d116Q7H$33=v~N$++/@$00:FNKC c" # :!4
JVXsFLL9FHa6;,7-01/2210(
  	  	Z VAr]# 	Y3VJ5GHIVAr]# /@4nEh/)>:	
 #^
))B"44>O#b==BC^T"))-v~>"..8&.I	C c" * 2*VXsFLL9FHa6;,7-01/2210&
  	  	XVAr]# 	Yy&*<=>VAr]# ,n=yT\\MmMmMwqwIx  {I  @J  K*N;Ys4<<KiKiKsmsGt  wE  >F  G

 l+zVXsFLL9;-12/2010+
   	 	]#VAr]# 	Y0A0A0J0JK^0_/`acijrcstu		%A LLN++O<	3DMM?!I;dS$XJ/
BGGOOH-=(D!QGGFOO%& " ww||,h77u	l "!s   Aq  q q q)c                    K   | j                  |       d{   }| j                  |      }| j                  ||       |S 7 )w)z3Generate PDF and save to database, return file pathN)rd   r   _save_file_path_to_db)r*   r.   report_data	file_paths       r+   generate_and_save_pdfz*Module8ReportService.generate_and_save_pdf  sD      44X>>--k:	""8Y7 ?s   AA*Ar   c                    	 d| d}t        d|        | j                  j                  t              j	                  t        j
                  |k(        j                         }|rSt        d       ||_        | j                  j                          | j                  j                  |       t        d       yt        d       t        |||      }| j                  j                  |       | j                  j                          | j                  j                  |       t        d|j                          y# t        $ rF}| j                  j                          t        d	|        d
dl}|j                          Y d}~yd}~ww xY w)z;Save or update file path in summary table with group_id_modg_m8z6DEBUG: Looking for existing record with group_id_mod: z5DEBUG: Found existing record, updating uploaded_filesz"DEBUG: Updated record successfullyz1DEBUG: No existing record found, creating new one)r.   group_id_modr   z+DEBUG: Created new record with summary_id: z$ERROR saving file path to database: r   N)printr'   rQ   r   filterr   rS   r   commitrefreshadd
summary_id	Exceptionrollback	traceback	print_exc)r*   r.   r   r   existing_summarynew_summaryer   s           r+   r   z*Module8ReportService._save_file_path_to_db  s:   	"xj,LJ<.YZ#ww}}Z8??
@W@W[g@ghnnpMO2; /  01:<IK(%!-#,
 K( ,CKDZDZC[\] 	"GG8<=!!		"s   B5D: 8BD: :	F	<FF	N)__name__
__module____qualname__r   r#   r,   r?   r"   rd   r   r   r   r   r6   r-   r+   r&   r&   $   sl    7 +; C
# C
:N C
Jg8)= g8# g8R	C C "c "c "r-   r&   )9fastapir   sqlalchemy.ormr   pandasrW   r   r   ior   reportlab.lib.pagesizesr   reportlab.libr   reportlab.lib.stylesr	   r
   reportlab.platypusr   r   r   r   r   r   r   reportlab.lib.unitsr   (app.models.main.corporate_concept_officer   app.models.main.concept_officer   'app.models.main.store_level_staff_needsr   .app.models.main.competitor_analysis_comparisonr   app.models.main.utilityr   "app.models.main.operating_expensesr   app.models.main.summaryr   app.models.main.groupr   app.api.module_8_report.schemar   r   r   r   r   r    r!   r"   app.dependency.authanticationr#   app.api.summary.schemar$   r&   r6   r-   r+   <module>r     sg    ! "  	   &   D h h h $ N ; K Z . C . *	 	 	 ; 0V" V"r-   