
    G	/iu                     |   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 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+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; d dl<m=Z= d dl>m?Z?  G d d      Z@y)    )HTTPException)SessionN)datetime)BytesIO)A4)colors)getSampleStyleSheetParagraphStyle)SimpleDocTemplate	ParagraphSpacerTable
TableStyleImage)inch)TblAdaptingSupplyChain)TblCategoryWishInventory)TblCashConversionCycle)TblShrinkageAreasReasons)TblComparativeAnalysis)TblOnlinePreSelectService)TblSales)TblDigitalAsset)TblRecurringOperating)
TblSummary)TblGroup)SupplyChainAdaptationCategoryInventoryCashConversionCycleShrinkageDataComparativeAnalysisOnlinePreSelectServiceOnlineSalesDigitalAssetRecurringOperatingSummaryModule9ReportPreview)JWTPayloadSchema)SummaryCreatec                   l    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dede
fdZy)Module9ReportServicedbtokenc                      || _         || _        y )N)r,   r-   )selfr,   r-   s      F/var/www/html/retail-simulation-api/app/api/module_9_report/service.py__init__zModule9ReportService.__init__+   s    
    group_idreturnc                 @   K   | j                  |       d{   S 7 w)z Get Module 9 report preview dataN)_fetch_module9_data)r/   r3   s     r0   get_report_previewz'Module9ReportService.get_report_preview/   s     --h7777s   c                   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                         }| j                  j                  t              j	                  |      j                         }| j                  j                  t              j	                  |      j                         }| j                  j                  t               j#                  t         j$                  |k(  t         j&                  j)                  d             j                         }g }|D ]  }d
}t+        |d      rW|j,                  rKt/        |j,                  t0              rdj3                  |j,                        }nt5        |j,                        }|j7                  t9        |j:                  xs d ||       ||j<                         ||j>                         ||j@                        |j$                  xs d              g }|D ]\  }|j7                  tC        |jD                  xs d ||jF                         ||jH                        |j$                  xs d             ^ d }|r\tK        |jL                  xs d ||jN                         ||jP                         ||jR                        |j$                  xs d      }d }|	r\tU        |	jV                  xs d ||	jX                         ||	jZ                         ||	j\                        |	j$                  xs d      }g }|
D ]m  }|j7                  t_        |j`                  xs d ||jb                         ||jd                         ||jf                        |j$                  xs d             o g }|D ]\  }|j7                  ti        |jj                  xs d ||jl                         ||jn                        |j$                  xs d             ^ d }|rtq        |jr                  xs d ||jt                         ||jv                         ||jx                         ||jz                         ||j|                         ||j~                         ||j                         ||j                        |j$                  xs d
      }g }|D ]m  }|j7                  t        |j                  xs d ||j                         ||j                         ||j                        |j$                  xs d             o g }|D ]m  }|j7                  t        |j                  xs d ||j                         ||j                         ||j                        |j$                  xs d             o d }|rKt        |j                  xs d ||j&                         ||j                        |j$                  xs d      }t        ||xs t9               g|xs tC               g|||xs t_               g|xs ti               g||xs t               g|xs t               g|t        j                  j                               S w)Ni  zgroup_id is required)status_codedetail)r3   i  zGroup ID not found in databasec                     | dvr| S dS )N)N nullzN/A vs    r0   safe_strz:Module9ReportService._fetch_module9_data.<locals>.safe_str<   s    !331>>r2   c                 0    	 t        | xs d      S #  Y yxY w)Nr   g        )floatr?   s    r0   
safe_floatz<Module9ReportService._fetch_module9_data.<locals>.safe_float?   s    QV!}$    c                 0    	 t        | xs d      S #  Y yxY w)Nr   )intr?   s    r0   safe_intz:Module9ReportService._fetch_module9_data.<locals>.safe_intE   s    16{"rE   r<   what_are_some_categoriesz, r   )adapting_idrI   remarks_about_these_categoriesdo_you_think_you_needat_which_point_and_whyr3   )category_wish_id	inventorycredit_periodr3   )cash_idinventory_purchase_timingsales_to_cash_gapcash_flow_challengesr3   )shrinkage_id	shrinkageshrinkage_do_you_envisionshrinkage_in_your_storesr3   )comparative_id
attributesown_brand_physical_storeown_brand_online_storer3   )	online_idtype	check_boxr3   )
sales_idaverage_traffic_expectedaverage_remarknumber_of_transaction_per_monthnumber_remarkaverage_transaction_valuetransaction_remarkcogscogs_remarkr3   )
digital_iditemestimate_costremarkr3   )recurring_idexpenses_typepercentage_of__salesremarksr3   )
summary_idbackend_submissionsbackend_summariser3   )r3   supply_chain_adaptationcategory_inventorycash_conversion_cycleshrinkage_datacomparative_analysisonline_pre_select_serviceonline_salesdigital_assetrecurring_operatingsummarylast_updated)Sr   r,   queryr   	filter_byfirstr   allr   r   r   r   r   r   r   r   r   filterr3   rr   isnothasattrrI   
isinstancelistjoinstrappendr   rJ   rK   rL   rM   r   rN   rO   rP   r   rQ   rR   rS   rT   r    rU   rV   rW   rX   r!   rY   rZ   r[   r\   r"   r]   r^   r_   r#   r`   ra   rb   rc   rd   re   rf   rg   rh   r$   ri   rj   rk   rl   r%   rm   rn   ro   rp   r&   rq   rs   r'   pd	Timestampnow)r/   r3   group_existsrA   rD   rH   adapting_supplyru   cash_conversionrV   rx   online_pre_selectsalesr{   r|   r}   supply_chain_adaptationsrj   categories_strcategory_inventories	cash_convrw   comparative_analysesonline_pre_servicesrz   digital_assetsrecurring_operatingssummary_datas                               r0   r6   z(Module9ReportService._fetch_module9_data3   s    C8NOO ww}}X.88(8KQQSC8XYY	?		 ''--(>?IIS[I\``b!WW]]+CDNNX`Naeeg''--(>?IIS[I\bbdGGMM":;EExEX^^`	#ww}}-CDNNX`Naeeg GGMM*CDNNX`Naeegh'1181DJJLo6@@(@SWWY"ggmm,ABLLV^L_cce''--
+228+**006
 %' 	 $& #DNt78T=Z=Zd;;TB%)YYt/L/L%MN%()F)F%GN$++,A ,,1)1.)A/78[8[/\&.t/I/I&J'/0K0K'L+!-  $$  "&D ''(9!%!6!6!;!"4>>2&t'9'9:+!	)  ' 	+'//41*2?3\3\*]"*?+L+L"M%-o.R.R%S(116QI *&338q$Y%8%89*293V3V*W)1)2T2T)U"++0qN  "(D ''(;#227a#DOO4)1$2O2O)P'/0K0K'L+!)  ) !%D&&'=..-Adii("4>>2+!	(  & &,1)1%2P2P)Q'(<(<=089^9^0_&u':':;*4U5T5T*U#+E,D,D#E

+$U%6%67,1L !D!!,??/adii((););<,+!#  "  "'D ''(:!..3!&t'9'9:%/0I0I%J .+!)  ( ""--2$,W-H-H$I"*7+D+D"E )).Q	L $$<$YAVAX@Y3L8I8K7L"+)!5!P:M:O9P&9&W>T>V=W%(<\^,< 4 N9K9M8N ))+
 	
s   `<`>datac                 "   t               }t        |t        dt        z  dt        z        }g }t	               }|d   }d|_        d|_        t        d|d   ddd      }	 t        d	d
d      }d|_	        |j                  |       |j                  t        dd             |j                  t        d|d                |j                  t        dd             t        d|      t        d|      t        d|      t        d|      g}	|	g}
|j                  D ]y  }t        |j                  xs d|      t        |j                  xs d|      t        |j                   xs d|      t        |j"                  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        d*|      gg}|j.                  D ]W  }|j                  t        t1        |j2                  xs d+      |      t        t1        |j4                  xs d+      |      g       Y 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             |j6                  rt        d/|      t        |j6                  j8                  xs d|      gt        d0|      t        |j6                  j:                  xs d|      gt        d1|      t        |j6                  j<                  xs d|      gg}nGt        d/|      t        d|      gt        d0|      t        d|      gt        d1|      t        d|      gg}t%        |      }|j'                  t)        ddddt*        j,                  fddddt*        j,                  fd,d2d3d4d5d%d6g	             |j                  |       |j                  t        dd             |j                  t        d7|d(                |j                  t        dd             |j>                  rt        d8|      t        t1        |j>                  j@                  xs d+      |      gt        d9|      t        |j>                  jB                  xs d|      gt        d:|      t        |j>                  jD                  xs d|      gg}nGt        d8|      t        d|      gt        d9|      t        d|      gt        d:|      t        d|      gg}t%        |      }|j'                  t)        ddddt*        j,                  fddddt*        j,                  fd,d2d3d4d5d%d6g	             |j                  |       |j                  t        dd             |j                  t        d;|d(                |j                  t        dd             t        d<|      t        d=|      t        d>|      g}|g}|jF                  D ]`  }t        |jH                  xs d|      t        |jJ                  xs d|      t        |jL                  xs d|      g}|j                  |       b t%        |d      }|j'                  t)        ddddt*        j,                  fddddt*        j,                  fddddd?d@d4d5d$d%g             |j                  |       |j                  t        dd             |j                  t        dA|d(                |j                  t        dd             t        dB|      t        dC|      g}|g}|jN                  D ]G  }t        |jP                  xs d|      t        |jR                  xs d|      g}|j                  |       I t%        |d      }|j'                  t)        ddddt*        j,                  fddddt*        j,                  fddddd?d@d4d5d$d%g             |j                  |       |j                  t        dd             |j                  t        dD|d(                |j                  t        dd             |jT                  rt        dE|      t        t1        |jT                  jV                  xs d+      |      gt        dF|      t        |jT                  jX                  xs d|      gt        dG|      t        t1        |jT                  jZ                  xs d+      |      gt        dH|      t        |jT                  j\                  xs d|      gt        dI|      t        t1        |jT                  j^                  xs d+      |      gt        dJ|      t        |jT                  j`                  xs d|      gt        dK|      t        t1        |jT                  jb                  xs d+      |      gt        dL|      t        |jT                  jd                  xs d|      gg}nt        dE|      t        d|      gt        dF|      t        d|      gt        dG|      t        d|      gt        dH|      t        d|      gt        dI|      t        d|      gt        dJ|      t        d|      gt        dK|      t        d|      gt        dL|      t        d|      gg}t%        |      }|j'                  t)        ddddt*        j,                  fddddt*        j,                  fd,d2d3d4d5d%d6g	             |j                  |       |j                  t        dd             |j                  t        dM|d(                |j                  t        dd             t        dN|      t        dO|      t        dP|      g}|g}|jf                  D ]i  }t        |jh                  xs d|      t        t1        |jj                  xs d+      |      t        |jl                  xs d|      g}|j                  |       k t%        |d      }|j'                  t)        ddddt*        j,                  fddddt*        j,                  fddddd?d@d4d5d$d%g             |j                  |       |j                  t        dd             |j                  t        dQ|d(                |j                  t        dd             t        dR|      t        dS|      t        dT|      g}|g} |jn                  D ]i  }t        |jp                  xs d|      t        t1        |jr                  xs d+      |      t        |jt                  xs d|      g}| j                  |       k t%        | d      }!|!j'                  t)        ddddt*        j,                  fddddt*        j,                  fddddd?d@d4d5d$d%g             |j                  |!       |j                  t        dd             |j                  t        dU|d(                |j                  t        dd             |jv                  rst        dV|      t        t1        |jv                  jx                  xs d      |      gt        dW|      t        t1        |jv                  jz                  xs d      |      gg}"n0t        dV|      t        d|      gt        dW|      t        d|      gg}"t%        |"      }#|#j'                  t)        ddddt*        j,                  fddddt*        j,                  fd,d2d3d4d5d%d6g	             |j                  |#       |j                  t        dd             |j                  t        dX|j|                  j                  dY       |d                |j                  |       |j                  d+       t        j                         j                  dZ      }$d[|j                   d\|$ d]}%d^|% }&t        j                  t        j                  j                  |&      d_`       t        |&da      5 }'|'j                  |j                                dbdbdb       t        j                  j                  dc|%      S #  Y xY w# 1 sw Y   1xY w)dz(Generate PDF report and return file pathg      ?)pagesize	topMarginbottomMarginNormal   
   FlexibleStyleCJK)parentfontSizeleadingwordWrapzTS Logo.png   K   )widthheightLEFT   z.<b>Module 9: Backend & Supply Chain Report</b>Title   
CategorieszRemarks About CategorieszDo You Think You NeedzAt Which Point And Whyr=   )
repeatRowsGRIDr   r   r   BOX)FONTNAMEr   r   r   zHelvetica-Bold)FONTSIZEr   r   r   )r   r   r   r   	Helvetica)r   r   r   r   )LEFTPADDINGr   r      )RIGHTPADDINGr   r   r   )
TOPPADDINGr   r   r   )BOTTOMPADDINGr   r   r   )VALIGNr   r   MIDDLE)ALIGNr   r   r   )WORDWRAPr   r   TzCategory InventoryHeading2	InventoryzCredit Periodr   )r   r   r   r   )r   r   r   CENTERzCash Conversion Cyclez <b>Inventory Purchase Timing</b>z<b>Sales To Cash Gap</b>z<b>Cash Flow Challenges</b>)r   r   r      )r   r   r   r   )r   r   r      )r   r   r   r   )r   r   r   TOPzShrinkage Dataz<b>Shrinkage</b>z <b>Shrinkage Do You Envision</b>z<b>Shrinkage In Your Stores</b>zComparative Analysis
AttributeszOwn Brand Physical StorezOwn Brand Online Store)r   r   r   r   )r   r   r   r   zOnline Pre Select ServiceTypez	Check BoxzOnline Salesz<b>Average Traffic Expected</b>z<b>Average Remark</b>z&<b>Number Of Transaction Per Month</b>z<b>Number Remark</b>z <b>Average Transaction Value</b>z<b>Transaction Remark</b>z<b>COGS</b>z<b>COGS Remark</b>zDigital AssetItemzEstimate CostRemarkzRecurring OperatingzExpenses TypezPercentage Of SalesRemarksr&   z<b>Backend Submissions</b>z<b>Backend Summarise</b>zLast Updated: z%Y-%m-%d %H:%M:%Sz%Y%m%d_%H%M%Smodule9_complete_report_group__z.pdfzuploaded_files/T)exist_okwbNuploaded_files)Mr   r   r   r   r	   r   r   r
   r   hAlignr   r   r   rt   rI   rK   rL   rM   r   setStyler   r   blackru   r   rO   rP   rv   rR   rS   rT   rw   rV   rW   rX   rx   rZ   r[   r\   ry   r^   r_   rz   ra   rb   rc   rd   re   rf   rg   rh   r{   rj   rk   rl   r|   rn   ro   rp   r}   rr   rs   r~   strftimebuildseekr   r   r3   osmakedirspathdirnameopenwritegetvaluer   )(r/   r   bufferdocstorystylesnormal_styleflexible_stylelogoheader_cells
table_rowsrj   rowsupply_tablecat_data	cat_table	cash_data
cash_tableshrink_datashrink_tablecomp_header	comp_rows
comp_tableonline_headeronline_rowsonline_table
sales_datasales_tabledigital_headerdigital_rowsdigital_tablerecurring_headerrecurring_rowsrecurring_tabler   summary_table	timestampfilenamefilepathfs(                                           r0   _generate_pdf_reportz)Module9ReportService._generate_pdf_report   s   s4xVYZ^V^_$&h' !! (F8$4U
	c"=D DKLLLL2'
 	YOQWX_Q`abVAr]# lN30.A-~>.?	
 #^
00D$77A6>R$==GX$44>O$55?P	C c" 1 ZA6jVXsFLL9FHa6;,7-01/22/0*
  	  	\"VAr]# 	Y3VJ5GHIVAr]# k>2o~6
  ++DOO#dnn12NC#d005A6G  , (O	:VXsFLL9;-1201/20'
  	 	YVAr]# 	Y6z8JKLVAr]#%%=~NPYZ^ZtZt  [O  [O  [Y  SY  [i  Qj  k5~F	RVRlRlR~R~  SI  CI  KY  IZ  [8.I9UYUoUo  VE  VE  VO  IO  Q_  L`  aI =~NPYZ`bpPqr5~F	RXZhHij8.I9U[]kKlmI 9%
JVXsFLL9FHa6-01/2//
(
 
 
	 	Z VAr]# 	Y/
1CDEVAr]#-~>	#dNaNaNkNkNpopJq  tB  AC  D=~NPYZ^ZmZm  [H  [H  [R  LR  Tb  Qc  d<nMyY]YlYl  ZF  ZF  ZP  JP  R`  Pa  bK -~>	&R`@ab=~NPYZ`bpPqr<nMyY_aoOpqK [)jVXsFLL9FHa6-01/2//
*
 
 
	 	\"VAr]# 	Y5vj7IJKVAr]# lN30.A.?
 !M	--D$//3V^D$77A6>R$55?PC
 S! . 93
JVXsFLL9FHa6;,7-01/22/(
  	 	Z VAr]# 	Y:F:<NOPVAr]# fn-k>2

 %o22D$))-v~>$..2FNCC s# 3 [Q7jVXsFLL9FHa6;,7-01/22/*
  	 	\"VAr]# 	Y~vj/ABCVAr]#<nMyY\]a]n]n  ^H  ^H  ^M  LM  ZN  P^  P_  `2NCYtO`O`OoOoOysy  |J  FK  LC^TV_`cdhdudu  eV  eV  e[  Z[  a\  ^l  Wm  n1>BIdN_N_NmNmNwqw  zH  EI  J=~NPYZ]^b^o^o  _J  _J  _O  NO  [P  R`  Qa  b6GSWSdSdSwSw  TB  |B  DR  JS  T=.99SIZIZI_I_IdcdEegu;vw/@)DL]L]LiLiLsms  vD  CE  F	J <nMyY_aoOpq2NCYvWeEfgC^TV_`fhvVwx1>BIfVdDef=~NPYZ`bpPqr6GSY[iIjk=.99V^;\]/@)FTbBcd	J J'ZVXsFLL9FHa6-01/2//
)
 
 
	 	[!VAr]# 	Yz0BCDVAr]# fn-o~6h/
 ''&&D$))-v~>#d005A6G$++/@C
 $ ' lq9zVXsFLL9FHa6;,7-01/22/+
   	 	]#VAr]# 	Y4fZ6HIJVAr]# o~6+^<i0
 ++,,D$,,6G#d77<1=~N$,,0&.AC
 !!#& -  1=  VXsFLL9FHa6;,7-01/22/-
 " 	 	_%VAr]# 	Yy&*<=>VAr]#<<7H)TWX\XdXdXxXx  YC  }C  UD  FT  KU  V5~F	RUVZVbVbVtVtV~x~R  BP  IQ  RL 7H)TZ\jJkl5~F	RXZhHijL
 l+zVXsFLL9FHa6-01/2//
+
 
  
	 	]#VAr]# 	Y0A0A0J0JK^0_/`acijrcstu		%A LLN++O<	3DMM?!I;dS$XJ/
BGGOOH-=(D!QGGFOO%& " ww||,h77g	^ "!s    AAE D AE'EAE$E'AE0c                    K   | j                  |       d{   }| j                  |      }| j                  ||       |S 7 )w)z3Generate PDF and save to database, return file pathN)r6   r  _save_file_path_to_db)r/   r3   report_data	file_paths       r0   generate_and_save_pdfz*Module9ReportService.generate_and_save_pdfl  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_m9z6DEBUG: 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)r3   group_id_modr   z+DEBUG: Created new record with summary_id: z$ERROR saving file path to database: r   N)printr,   r   r   r   r  r   r   commitrefreshaddrq   	Exceptionrollback	traceback	print_exc)r/   r3   r  r  existing_summarynew_summaryer  s           r0   r
  z*Module9ReportService._save_file_path_to_dbs  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(   r1   rG   r'   r7   r6   r   r  r  r
  r>   r2   r0   r+   r+   *   s    7 +; 8 89M 8l
# l
:N l
\I8)= I8# I8VC C "c "c "r2   r+   )Afastapir   sqlalchemy.ormr   pandasr   r   r   ior   reportlab.lib.pagesizesr   reportlab.libr   reportlab.lib.stylesr	   r
   reportlab.platypusr   r   r   r   r   r   reportlab.lib.unitsr   %app.models.main.adapting_supply_chainr   'app.models.main.category_wish_inventoryr   %app.models.main.cash_conversion_cycler   'app.models.main.shrinkage_areas_reasonsr   $app.models.main.comparative_analysisr   1app.models.main.online_pre_selected_service_levelr   app.models.main.salesr   )app.models.main.digital_asset_acquisitionr   ,app.models.main.recurring_operating_expensesr   app.models.main.summaryr   app.models.main.groupr   app.api.module_9_report.schemar   r   r   r    r!   r"   r#   r$   r%   r&   r'   app.dependency.authanticationr(   app.api.summary.schemar)   r+   r>   r2   r0   <module>r7     sr    ! "  	   &   D ] ] $ H L H L G W * E N . *    ; 0e	" e	"r2   