
    A]Wj              	          S r SSKrSSKrSSKrSSKrSSKrSSKrSSKr	\R                  R                  \R                  R                  \5      5      r\R                  R                  \S5      rSrSrSrSS/S	 S
4SS/S S4S/ SQS S4S/ SQS S4SS/S S4SS/S S
4/r\" SS5       V s/ s H  o S PM     sn rS rS r\S :X  a  \" 5         ggs  sn f )!u  Лист «План-факт»: план из финмодели Марса ↔ факт из Финтабло, по месяцам (весь год).

План — финмодель (янв–апр = факт, май+ = план). Факт — Финтабло.
Плановые строки суммирую так, чтобы совпадали по составу с фактом
(напр. «ЗП бэк-офис» = бэк + фаундеры + админы + аутсорс).

Запуск: python3 plan_fact.py
    Nzgsheets_sa.jsonz,1C0z2ONr-QrLozztfTCjkFqBteKLZyxFW5yg9RIhbLvA,1orFwTHu_qKAagxd3eMU7LyaFsVNkt94gf03QFIZwO4A
2015808034u   Выручка   c                 &    U R                  SS5      $ )N   Приток        getfs    /home/rasp/finsync/plan_fact.py<lambda>r      s    ~s9S    T   ЗП педагогов   c                 &    U R                  SS5      $ )Nr   r   r	   r   s    r   r   r      s    QUUC\^a=br   F"   Аренда и помещение)      )   c                 &    U R                  SS5      $ )Nr   r   r	   r   s    r   r   r      s    155ImorCsr   u8   ЗП бэк+админы+фаундеры+аутсорс)       #   c                 &    U R                  SS5      $ )Nu   ЗП бэк-офисаr   r	   r   s    r   r   r      s    YZY^Y^_wy|Y}r   u   Итого расходы-   c                 J   ^  [        U 4S j[        R                   5       5      $ )Nc              3   H   >#    U  H  nTR                  US 5      v   M     g7fr   Nr	   .0lr   s     r   	<genexpr><lambda>.<locals>.<genexpr>   s      AfYeTU!%%3--Ye   ")sumcf	OUT_LINESr   s   `r   r   r      s    cAfY[YeYeAf>fr   u   Прибыль1   c                 p   ^  T R                  SS5      [        U 4S j[        R                   5       5      -
  $ )Nr   r   c              3   H   >#    U  H  nTR                  US 5      v   M     g7fr   r	   r    s     r   r#   r$      s'     Y~q}lmZ[Z_Z_`acfZgZgq}r%   )r
   r&   r'   r(   r   s   `r   r   r      s(    ~s9SVYY~qsq}q}Y~V~9~r         02dc                     U =(       d    SR                  SS5      R                  SS5      R                  SS5      n [        R                  " SU 5      nU(       a  [        US   5      $ S$ )	N      ,.z-?\d+\.?\d*r   r   )replacerefindallfloat)smms     r   _numr;       sW    	
b&"%--c26>>sCHA	NA	&B5A<&3&r   c                  ^  ^ ^!^"^#^$^%^& S[          S[         3n [        [        R                  " [
        R                  " [        R                  R                  U SS9R                  5       R                  S5      5      5      5      m#[        R                  " 5       u  nm U Vs1 s H  o"S S iM	     snm"U#4S jm$[         Vs/ s H  o3 S3PM	     nnS	/S
/S-  -   /nUR                  S/S
/S-  -   5        UR                  S
/S-  5        UR                  S/U-   5        [!        U5      n/ / / / / S.n["         GH  u  nm%m!n	[         Vs/ s H  n[%        T$" T%U5      5      PM     n
n[         Vs/ s H!  o3T";   a  [%        T!" T U S3   5      5      OS
PM#     nn['        [        5       VVs/ s H  u  pUT";   a	  X   X   -
  OS
PM     nnnUR                  U /S
/S-  -   5        US   R                  [!        U5      5        UR                  S/U
-   5        US   R                  [!        U5      5        UR                  S/U-   5        US   R                  [!        U5      5        UR                  S/U-   5        U	(       a  US   OUS   R                  [!        U5      5        UR                  S
/S-  5        GM     [(        R*                  " [,        S9nUR/                  [0        5      n UR3                  S5      nUR8                  m&UR;                  5       n[=        U&4S jUS    5       S 5      nS!S"T&0S#0 0S#S$.0/nU[?        U5       Vs/ s H
  nS%T&S S&.0PM     sn-  nURA                  S'U05        URC                  5         URE                  US(5        [!        U5      nS)S)S)S*.nS+U 3S,S-S.00S/.S0U 3S1S2S3S4.0S/.S5S,S6S7S8.0S/.S9U S:U 3S;S<S=S*.S6US>.S?S@.S/.S9U 3SASB0S/./nUS    H&  nUR                  S9U S:U 3SCSDSES*.SFS60SG.S/.5        M(     US    H!  nUR                  S9U S:U 3S,SFS600S/.5        M#     US   US   -    H!  nUR                  S9U S:U 3S,SHS600S/.5        M#     URG                  U5        URI                  US)S9  SIT&SJS S)SK.SLSM0SLSN.0/nS,SOSPSQSQS*.00nS,SOSQSRSSS*.00nU&4ST jnUS    H5  nUR                  U" USUU5      5        UR                  U" USVU5      5        M7     US    H5  nUR                  U" USVU5      5        UR                  U" USUU5      5        M7     URA                  S'U05        [K        SWURL                  SX5        ["         Hl  u  nm%m!n[O        U"U$U%4SY j[         5       5      n[O        U U!U"4SZ j[         5       5      n[K        S[US\ S]US^ S_US^ S`UU-
  Sa 3RQ                  SbSc5      5        Mn     g s  snf s  snf s  snf s  snf s  snnf ! [(        R4                   a!    UR7                  S[!        U5      S-   SS9n GN+f = fs  snf )dNz'https://docs.google.com/spreadsheets/d/z/export?format=csv&gid=r   )timeoutzutf-8   c                    > [        U5      S-   nSnU  H:  nU[        T5      :  a  TU   O/ nU[        U5      :  d  M*  U[        XR   5      -  nM<     U$ )Nr,   r   )intlenr;   )rlistr:   colr9   rrow	plan_rowss         r   plan_valmain.<locals>.plan_val-   sW    "gkA"#c)n"4)A,"CSX~T#(^#  r   z.26uU   ПЛАН-ФАКТ  ·  план из финмодели ↔ факт Финтаблоr0      uh   план: янв–апр = факт, май+ = план;  факт тянется из Финтаблоr-   u!   Показатель / месяц)planfact
delta_good	delta_badname.2026rN   u      планrJ   u      фактrK   u      Δ факт−планrL   rM   )filenameu   План-факт      )rowscolsc              3      >#    U  H7  nUS    S   T:X  d  M  [        UR                  S/ 5      =(       d    / 5      v   M9     g7f)
propertiessheetIdconditionalFormatsN)rA   r
   )r!   r9   sids     r   r#   main.<locals>.<genexpr>R   sB      5<aL/),3 :s155-r28b99<s
   A+Asheetsr   
repeatCellrW   userEnteredFormat)rangecellfieldsdeleteConditionalFormatRule)rW   indexrequestsA1r,   )redgreenbluezA1:N
textFormatfontSize
   )r^   formatzB5:NnumberFormatNUMBERz#,##0)typepatternzA1:N1T   )boldri   Az:NgQ?gQ?g
ףp=
?)rq   foregroundColorCENTER)backgroundColorrh   horizontalAlignmentrv   LEFTg?gq=
ףp?gGz?rq   )ru   rh   italicupdateDimensionPropertiesCOLUMNS)rW   	dimension
startIndexendIndex	pixelSize   )r^   rV   r`   rs   g
ףp=
?g)\(?g?gQ?c                 >   > STU S-
  U SSS./USS0/S.US.S	.S
S.0$ )NaddConditionalFormatRuler,   rR   )rW   startRowIndexendRowIndexstartColumnIndexendColumnIndexuserEnteredValue0)rn   values)	conditionrk   )rangesbooleanRuler   )rulerb    )rD   condfmtrY   s      r   r   main.<locals>.rulev   sT    *#&Qq,-E F26DVX[C\B])^jmn6p 	-  	r   NUMBER_LESSNUMBER_GREATERu   OK →u"   | вкладка План-фактc              3   D   >#    U  H  oT;   d  M
  T" TU5      v   M     g 7f)Nr   )r!   r:   haverG   prowss     r   r#   rZ      s"     Eh*###hs   	  c              3   N   >#    U  H  oT;   d  M
  T" TU S 3   5      v   M     g7f)rO   Nr   )r!   r:   rK   ffnr   s     r   r#   rZ      s+     I(BDj'DB4u&''(s   	%%z  34u
    план z>13,.0fu    | факт u    | Δ z>+12,.0fr3   r2   ))FM_IDFM_GIDlistcsvreaderioStringIOurllibrequesturlopenreaddecoder'   fact_by_monthMONTHS12appendrA   METRICSround	enumerategspreadservice_accountSA_FILEopen_by_keySHEET_ID	worksheetWorksheetNotFoundadd_worksheetidfetch_sheet_metadatanextr^   batch_updateclearupdatebatch_formatfreezeprinturlr&   r5   )'r   monthsmor:   mlrS   
header_rowmetarN   more_betterpvfvidvgcshwsmdncreset_nrowWfmtsrD   reqsREDGRNr   mbpr   rK   r   r   rF   rG   r   rY   s'                                   @@@@@@@r   mainr   &   s   3E7:QRXQY
ZCSZZsB/446==gF!H I JI##%LFD#$VrrFV$D  (	(xD*xB	(deikhloqhqqrDKK{|  AC  @D  GI  @I  I  JKKr	KK45:;TJ"2rRD)0%eS+3;<8ReHUB'(8<MUVXrd
eCt5\*+,BXVAJ8ATUATtruru}3ATUvK2$)+,d6l.A.A#d).L]Ob()4<+>+>s4y+I]Ob()4<+>+>s4y+I01B67*l	[0AII#d)TRD2I *1 
	 	 '	2B		!BP\\-. %%C		 	 	"B	 52h< 567
9By#&6ATVX@Yexyz{E	UZ[]U^_U^PQ,#.JKU^__EOOZ'(HHJIIdDt9DAq)A-L:r:J+KL-NXZa<b+cdlTr4R%STj\J<0'+dDI#'A>W_=a 	b j\"/Df.MND &\!Bqcl'+dDI!4.7* + 	,  &\!Bqcl|fd^6TUV ,${"33!Bqcl|hPTEU6VWX 4OODII:AI& ) yWXY"C(K+A B CD +TDRV-WX
YC+TDRV-WX
YC ,DM3/0$++d1FVX[>\2]  +D,c23T[[aX[A\5] OOZ&'	(BFF@A 'eS"EhEEI(II4):a[QwKvaPQcRZ^\ddehjmno !(q % 
) =VU $$ P1D	ABOP `s6    W?WW"-(W')W,*W2 X*21X'&X'__main__)__doc__osr   r   urllib.requestr   r6   r   cashflowr'   pathdirnameabspath__file__HEREjoinr   r   r   r   r   r^   r   r;   r   __name__)r:   s   0r   <module>r      s   ' & &  	wwrwwx01
'',,t.
/96	 rd/SUYZ2$3bdij)<9suz{?O}  @E  F B44fhmnrd/~  AE  F #(2,/,B#hK,/'`pF zF Y 0s   .C