
    jp              
          d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	Z	 ed      Z
e
dz  Ze
dz  ZdZi d	g d
dddgdddgdddgdg ddddgdg ddg ddddgd d!d"gd#d$d%gd&g d'd(d)d*gd+d)d*gd,d-gd.d-gd/d0d1gi d2g d3d4g d5d6d7d8gd9g d:d;g d<d=d>gd?d@dAgdBg dCdDdEgdFdGdHgdIdJgdKdLdMgdNdOdPgdQg dRdSdTgdUg dVdWdXdYgg dZg d[g d\g d]g d^d_gd`dagdbgdcZg dddedfgg dgdhZdi Zdj Zdk Zdl Zdm Zdn Zdo ZdydpZdq Zdr Zds Zdt Zdu Zdv Zdw Zedxk(  r e        yy)zu   
TMED-II Phase III — Package List vs Master Schedule Cross-Reference

Parses master_schedule.tsv (our plan) and 6 packing list xlsx files (Daniel Lee),
cross-references them, and outputs results to Google Sheets.

Audit fixes applied: F-01 through F-09.
    N)defaultdict)Pathz3/home/borbolla/clawd/projects/HTS/TMED-II-Phase-IIIz0bidding/our-quote/breakdowns/master_schedule.tsvzproject/package_lists,1Tvt3fAZdwR7DAhBmnJ3AbzWdUJi2wagcG2P4xLQvgUQu   보빈공급기)zBobbin LifterzBobbin CarrierzBOBBIN LIFTERzBOBBIN CARRIERzBOBIN LIFTERzBobin Lifteru	   권선기zWinding MachineWINDING MACHINEu	   탈피기zDecoating MachinezDECOATING MACHINEu   리턴 컨베이어z\d+\..*RETURN CONVEYORzDECOATING CONVEYORu	   대차류)z\d+\..*ROLLER CONVEYORz\d+\..*SCARAz\d+\..*SKID CONVEYORzPalletizer(?!.*PANEL)u   보빈 정렬zBobbin alignmentzBobbin Alignmentu   서포트링 열간압입)Hot PressingzHot pressingzSupporting.*HotSupporting \(Pu   보빈 에어블로우)zAir BlowAirblowzAir blowu   보빈 단차 측정zTerminal measurementu   단차u   팔레트 에어블로우z
Pallet AirzPallet.*blowu   권선라인 이재로더zProcess connection reloadereloaderu   레이져마킹)zMarking machinezLaser MarkingMarkingu   바니시 예열zPreheating the varnish
Preheatingu   바니쉬 예열u   바니시 함침zVarnish applicationu   바니쉬 도포u   1차 고주파 경화zVarnish curingzHigh frequencyu   겐트리로더)KentryGantry
Autoloaderu   바니쉬 경화 & 냉각)zVarnish drying ovenzVarnish cooling furnacezVarnish.*coolingzVarnish.*dryingzVarnish.*tank coverzVarnish.*ductzChiller.*Varnishu	   포밍기zWire Forming(?!.*Vision)zWire Forming #u   포밍 비젼검사)zWireforming VisionzForming VisionzWire.*Visionu   포밍 에어블로우)zForming.*AirzAir.*blow.*formz	Wire.*Airu   터미널 조립기zTerminal Assemblyu   코킹 & 컷팅zCaulking.*CuttingzCaulking(?!.*Vision)u   코킹 & 컷팅 비젼검사)zCaulking.*Cutting.*VisionzCaulking.*VisionzCutting.*VisionzCaulking.*Inspectionu   퓨징 & 검사zFusing(?!.*Air)u   퓨징 에어블로우zFusing.*AirzFusing.*blowu   트래버스Traverseu   온도센서 조립zTemperature sensor(?!.*vision)zTemperature sensor assemblyu    온도센서 조립 비젼검사zTemperature sensor visionzTemperature.*visionu   에폭시 몰딩기)zEpoxy Molding(?!.*Vision)zEpoxy Molding #z
Epoxy Tanku   에폭시 몰딩 비젼검사zEpoxy.*Visionu   에폭시 경화 & 냉각)zEpoxy drying furnacezEpoxy cooling furnacezEpoxy.*coolingzEpoxy.*dryingu   지그 탈거 장치zJig removalz
Jig.*robot)zElectrical.*testzElectric.*testzElect.*Inspec)zCompletion inspectionzFinished.*inspectionzFinal inspection)zmulti-joint robotzcompleted.*elevatorzRobot controller)zNG Conveyorz
Master CarzNG CartzNG replacement)zControl Panel(?!.*stand)	RTB PanelzElectric ControlzElectrical supplieszELECTRIC CONTROL UNITzCONTROL PANELPANELzPC RACKResolverz
Leak.*testzLeak TesterzPerformance.*test)u   전기 특성 검사u   완성검사u   완성이재u   NG대차u	   제어반u   레졸버 체결u   리크테스트u   성능 특성 검사)
zConveyor(?!.*Finished)zconveyor(?!.*finished)zProfile FencezFence(?!.*Autoloader)StairzLift.*tableStopperzInput NGzAir conditioner.*hosezProcess.*Palletr   r   )ConveyorconveyorFenceProfilezFinished PalletzControl panel standz	Vision PCzAir conditionerzdust collectorr   zAutoloader FenceChillerzBobbin.*[Pp]alletzMain.*[Pp]alletzMain.*palettezBobbin.*palletz	Air.*blowzVision PC Spare)u   공정연결장치u   컨베어 外 (열간압입u   컨베어 外 (메인)c                 V   g }t               }t        | dd      5 }|j                         }ddd       d}t        d      D ]  \  }}|dk(  r|j	                  d      }|j                         s/d|v rd	}|j                  d
      rG|j                  d      }	|	r|	d   j                         nd}
|rIt        |	      dk\  r:d|
v r6t        |	      dkD  r|	d   j                         nd}|r|j                  |       |
dvrt        |	      dk  rt        |	      dkD  r|	d   j                         nd}|dk7  r|	d   j                         }	 t        |	d   j                               }t        |	      dkD  r|	d   j                         nd}d|v sd|v rd}n
|dk\  rd}nd}t        |	      dkD  r|	d   j                         nd}|j                  ||t        |	      dkD  r|	d   j                         nd|||g ddd	        ||fS # 1 sw Y   xY w# t        t        f$ r d}Y w xY w)z&Extract INCLUDED Motor items from TSV.rutf-8encodingNF   
EXCLUDEDTz---	r          )Motor   INCLUDED           z06-15z6/15jun15;   may20   )	linenosectionitem_no_rawkorean_nameweight_tarrivalmatched_pkgsflagnotes)setopen	readlines	enumeraterstripstrip
startswithsplitlenaddfloat
ValueError
IndexErrorappend)pathitemsexcluded_namesflinesin_excludedr0   rawlinecolsareanamestatusweightarrival_rawr5   r1   s                    N/home/borbolla/clawd/projects/HTS/TMED-II-Phase-III/project/cross_reference.pyparse_master_schedulerV   q   s3   EUN	dC'	* a K * 8Q;zz$zz|Ku%zz$"&tAw}}B4yA~*"4*-d)a-tAw}}R"&&t,z!t9q=$'IMarZAw}}	47==?+F
 *-TQd1gmmoBk!V{%:Gr\GG%(Y]$q'--/.1$i!m47==?

 
	]8t .  } H J' 	F	s   HHHH('H(c                    ddddddddddd
}| D ]Q  }t        |      D ]?  \  }}|j                  rAt        |j                        j                  dd      j	                         j                         nd}|sY|dk(  rd|v sd|v r||d<   |d	k  r	d
|v r||d
<   d|v rd|v s|j                  d      r||d<   d|v rd|v s|j                  d      r||d<   d|v r||d<   |dk(  r
|d   ||d<   |dk(  r"|d   ||j                  d      xs dkD  r||d<   |dk(  r"|d   ||j                  d      xs dkD  r||d<   d|v r	d|v r||d<   d|v s.d|v s4|dkD  s;||d<   B T |S )zIAuto-detect column positions by scanning header rows for keywords (F-01).N)
	containerfacilitynet_wtgross_wtlengthwidthheightcontainer_specscontainer_iddescription_enr!    r$   r   rX   zc/tr*   rY   netrS   wrZ   grossr[   zdescription in englishra   lr\   r]   hr^   specr_   no   r`   )r<   valuestrreplacer>   lowerendswithget)header_rowsrO   rowcol_idxcellvals         rU   detect_columnsrv      s    tDD  /&s^ 	/MGTHL

#djj/))$4::<BBDXZC!|!3u|$+[!!|
c 1#*Z  |SCLL4E!(X#~8s?cll36G#*Z '3.)0%&czd8n4!(Xczd7m3488HCUCZYZ8[ 'Wczd8n4DHHWDUDZYZ9[!(Xc!fm*1&'c!ts{"'.^$=	//B K    c                 J    | y	 t        |       S # t        t        f$ r Y yw xY w)Nr+   )rC   rD   	TypeError)ru   s    rU   
safe_floatrz      s0    
{Sz	" s   
 ""c                    | |   }t        |j                  d            }t        |      dk  rg S t        |dd       }|d   d|d<   |d   d|d<   |d   [d	D ]L  }|t        |d
         k  st	        |d
   |   j
                  xs d      j                         }d|v sG||d<    n |d   d|d<   |d   |d   d
z   |d<   g }d}	d}
t        |      D ]  \  }}|dk  r|D cg c]  }|j
                   }}t        |      }|d   r0t	        |d         j                         j                         dk(  r |S |d   }||k  r!||   rt	        ||         j                         nd}|r|dk(  r|d   }||k  r||   nd}|jt	        |      j                         rQt	        |      j                         dk7  r5	 t	        t        t        t	        |      j                                           }	|d   r|d   |k  rz||d      }|rpt	        |      j                         rWt	        |      j                         dk7  r;t	        |      j                         j                  dd      j                         }|r|}
|d   }|d   }||k  rt        ||         nd}||k  rt        ||         nd}|dk(  r|dk(  r|j!                  d      }|j!                  d      }|j!                  d      }|r||k  rt        ||         nd}|r||k  rt        ||         nd}|r||k  rt        ||         nd}|j!                  d      } d}!| r&| |k  r!||    rt	        ||          j                         }!|	r| d|	 n| d}"|j#                  ||"|	|
xs d||!|||||fdd
        |S c c}w # t        t        f$ r t	        |      j                         }	Y w xY w)z>Parse a PACKING DETAIL sheet, auto-detecting column positions.Fvalues_onlyr&   NrX   r   rY   rZ   )         r    r$   rc   r   r[   ENDNoner_   r!   rb   r+   r\   r]   r^   ra   -z-?)
supplierrX   container_rawr_   facility_namera   	net_wt_kggross_wt_kgdims_mm
matched_to)list	iter_rowsrA   rv   rl   rk   rn   r<   r>   upperintrC   rD   ry   rm   rz   rp   rF   )#wb
sheet_namesupplier_prefixwsall_rowscol_maptry_colhdrrH   current_containercurrent_container_specsrow_idxrr   ccellsmax_colfac_colrY   ct_colct_val	specs_val	raw_specsnw_colgw_colrZ   r[   l_colw_colh_colr\   r]   r^   desc_en_coldesc_enprefixed_cts#                                      rU   parse_packing_detailr      s`   	JBBLLUL34H
8}q	Xbq\*G {# z"
x # 	GXa[))(1+g.44:;AACC<(/GH%	 8$ "GHz"%h/!3
E"!(+ EQ;"%&Q&&e*8E!H++-335>~ L{ *%29G2Cg3uW~&,,.\^8v- %"(7"2v#f+"3"3"5#f+:K:K:MQW:W8$'E#f+2C2C2E,F(G$H!
 $%'2C*Dw*Ng&789IS^113I8L8L8NRX8X	N002::4EKKM	.7+ "$.4w.>E&M*C060@:eFm,cQ;8q= H%G$H%-2uwE%L)C,1ego
5<(3-2uwE%L)C kk"23;0U;5G%,-335G CT)+<*=>\k[llnYo'$.6<"%%#v.
 	uEN LG '" 	* 8$'K$5$5$7!8s   %N84N!!(OOc           	         g }ddddddd}|j                         D ]  \  }}| |z  }|j                         st        d| d       +t        j                  t        |      dd      }d}|j                  D ]  }|d	k(  s	|} n |rGt        |||      }	|	D ]  }
||
d
<   	 |j                  |	       t        d| dt        |	       d|        |j                           |S )zParse all 6 xlsx files.DKHWIA)zDKTIND-2604-01.xlsxzDKTIND-2604-02.xlsxHWIA-EM260408-01.xlsxHWIA-EM260408-02.xlsxHWIA-EM260413-03.xlsxHWIA-EM260413-04.xlsxz	WARNING: z
 not foundT	read_only	data_onlyNzPACKING DETAILsource_filez  z: z items from )rH   existsprintopenpyxlload_workbookrl   
sheetnamesr   extendrA   close)pkg_dir	all_items
files_infofnameprefixfpathr   detail_sheetsnrH   items              rU   parse_all_packagesr   X  s   I##!'!'!'!'J $))+ v%||~IeWJ/0##CJ$$O-- 	B%%!	
 (\6BE ,&+]#,U#BugRE
|<~FG

+. rw   c                 2   i }g d}|D ]
  }| |z  }|j                         st        j                  t        |      dd      }d|j                  vr|j                          Z|d   }|j                  d      D ]  }|D ]  }|t        |      j                         }	t        j                  d|	      }
|
s8|
j                  d      j                         }|
j                  d      j                         }|sy|s||||<     |j                           |S )	z8Extract English(Korean) pairs from Machine PHOTO sheets.)r   r   r   r   Tr   zMachine PHOTOr|   u&   ^(.+?)\s*[\(（]([가-힣\s&]+)[\)）]r    r/   )r   r   r   rl   r   r   r   r>   rematchgroup)r   pairs
hwia_filesr   r   r   r   rr   rt   ru   menkrs                rU   scrape_bilingual_captionsr     s   EJ
  %||~##CJ$$O"--/HHJ <<D<1 
	'C 	'<$ioo'HHFL))+B))+Bb$&b		'
	' 	
), Lrw   c                 L    t        j                  dd|       j                         S )u=   Strip trailing number suffix: '권선기 #4' → '권선기'.z\s*#\d+$r$   )r   subr>   )r3   s    rU   get_base_namer     s    66+r;/5577rw   c                 \   g }|D ]W  }|r|d   |d    d|d    }| D ];  }	 t        j                  ||t         j                        r|j                  |        V= Y |S # t         j                  $ r7 |j                         |j                         v r|j                  |       Y  Y w xY w)z6Find all unclaimed package items matching any pattern.r   r   rb   ra   )r   search
IGNORECASErF   errorrn   )patterns	pkg_itemsexclude_claimedmatchespkgsearch_textpats          rU   find_matching_packagesr     s    G s<0<_-.a4D0E/FG 	C99S+r}}=NN3' >		 N	 88 99;+"3"3"55NN3' 6s   6A!!AB+*B+c                 ^   t        |       }g }g }|D ]  }|| v s||v s|j                  |        g }|D ]*  t        fd|D              }|r|j                         , |D ]  }|j                  ||           g }	|j	                         D ]=  \  }
| v s| v r|	j                  |
f       "|v s|v s+|	j                  |
f       ? |	D cg c]  }|d   	 }}|	D ]@  \  }
t        fd|D              }|r|j                  t        j                  |
             B |S c c}w )u   Get all English search patterns for a Korean equipment name.

    Uses longest-match-wins: if 'A' and 'A B' both match, only 'A B' patterns are used.
    This prevents '코킹 & 컷팅 비젼검사' from inheriting '코킹 & 컷팅' patterns.
    c              3   4   K   | ]  }|k7  xr |v   y wN ).0otherks     rU   	<genexpr>z#get_patterns_for.<locals>.<genexpr>  s)      %
 J%1:%%
   r   c              3   4   K   | ]  }|k7  xr |v   y wr   r   )r   r   
kr_captions     rU   r   z#get_patterns_for.<locals>.<genexpr>  s#     [UZ5(@Z5-@@[r   )r   rF   anyr   rH   r   escape)r3   	kr_en_mapauto_captionsbaser   matching_keyskr_keyfiltered_keysis_substring_of_longermatching_captions
en_captionr   caption_keysis_subr   r   s                 @@rU   get_patterns_forr     ss    %DH M )[ FdN  ()
 M $!$ %
&%
 "
 &  #$   +	&)*+ "/"5"5"7 ?
J$z(A$$j*%=>44:#5$$j*%=>	? #44QAaD4L4"3 3
J[l[[OOBIIj123
 O 5s   D*c                 
  ( g }t        t        j                               ((fd}| D cg c]  } ||d         r| }}| D cg c]  } ||d         s| }}t        t              }|D ]7  }|d   dk(  rd|d<   d|d<   t        |d         }	||	   j                  |       9 t        |j                         d	 
      }
|
D ]  }||   }t        |t        |      }|D ]3  }t        |d   t        |      }|D ]  }||vs|j                  |        5 |s3|D ]-  }d|d<   d|d<   |j                  d|d   d|d    dddd       / t        ||      }|s:|D ]4  }d|d<   d|dd  d|d<   |j                  d|d   d|d    dddd       6 t        |      }t        |      }|dk(  r|D ]  }|d   d   |d<    ||d   d<   nt        |d d       }t        |      D cg c]  }g  }}d!g|z  }|D ]@  }|j                  t        |            }||   j                  |       ||xx   |d"   z  cc<   B t        |      D ]  \  }}||   D ]
  }|d   |d<    ||   |d<   ! |D ]k  }|d   }|sd|d<   d#|d<   t!        d$ |D              d%z  }|d   }|dkD  rt#        ||z
        |z  d&z  }nd}|d'k  rd(|d<   Vd)|d<   d*|d+d,| d-|d.d/|d<   m  |D ]!  }|d   dk(  rd|d<   d|d<   |d   }g }t        j%                         D ]  \  } }!| |v s|j'                  |!        t        j%                         D ]  \  }"}#|"|v s|j'                  |#        |sd|d<   t        ||      }$|$D ]
  }|d   |d<    |$|d<   |$sd|d<   d0|d<   t!        d1 |$D              d%z  }|d   }|dkD  rt#        ||z
        |z  d&z  }nd}|d'k  rd(|d<   d)|d<   d2|d+d,| d-|d.d3|d<   |d4k\  s|dxx   d5z  cc<   $ |D ]4  }|d   	|j                  d6|d7   d8|d9    d:|d"    d;|d<    d=d>d       6 |D ]  }|j)                  d?d@      }%dA|%j+                         v s(t-        j.                  dB|%      }|sAt1        |j3                  d            }&h dC}'|&|'v sd|j                  dDdE|& dF|d<    dG|d9    dHdId        | D ](  }|d   d)k(  s|j                  d)|d   |d   dJdKd       * |S c c}w c c}w c c}w )LzCTwo-pass matching with group-aware distribution for numbered items.c                 .     t         fdD              S )Nc              3   &   K   | ]  }|v  
 y wr   r   )r   ckrQ   s     rU   r   z4run_matching.<locals>.is_catchall.<locals>.<genexpr>  s     9"2:9s   )r   )rQ   catchall_kr_keyss   `rU   is_catchallz!run_matching.<locals>.is_catchall  s    9(8999rw   r3   r5   r,   NOT_IN_PACKAGES_EXPECTEDr7   z"Jun 15 arrival (separate shipment)r8   c                     t        |        S r   )rA   )r   s    rU   <lambda>zrun_matching.<locals>.<lambda>  s    SVG rw   )key	NOT_FOUNDz%No mapping found for this Korean namezWeight r4   zT, no English pattern mappedz"Cannot verify against package listu%   Add Korean→English mapping manually)typer   detailimpactactionz	Patterns Nr&   z found no matcheszT, patterns tried but no matchz-May be packed under different name or missingzVerify with Daniel Leer    r   r   r6   c                     | d   S )Nr   r   )ps    rU   r  zrun_matching.<locals>.<lambda>7  s
    Q{^ rw   T)r  reverser+   r   z3Group had matches but none distributed to this itemc              3   &   K   | ]	  }|d      ywr   Nr   r   r	  s     rU   r   zrun_matching.<locals>.<genexpr>N  s     9qAkN9        @@d   
   MATCHWEIGHT_DIFFzDelta .0fz% (plan z	T vs pkg .2fzT net)z,Catch-all found no remaining unmatched itemsc              3   &   K   | ]	  }|d      ywr  r   r  s     rU   r   zrun_matching.<locals>.<genexpr>}  s     81+8r  zCatch-all delta zT)   u.    — expected large delta for catch-all bucketEXTRA_IN_PACKAGESr   z
Container rX   z, Net zkg, Source: r   z/Item in packages but not in our master schedulez2Determine if scope addition or ancillary equipmentra   r$   r   z(\d+)\.\s*WINDING>
   r%      r(      	      r   r~         EXCLUDED_IN_PACKAGESzWinding Machine #z	Found in z, container u3   EXCLUDED item (5만 미포함) appears in packages!u0   Verify scope — may be shipped for future phaseu.   Weight discrepancy — may affect rigging planz)Verify weight with supplier documentation)r9   CATCHALL_ITEMSkeysr   r   r   rF   sortedr   	KR_EN_MAPr   rA   rangeindexminr<   sumabsrH   r   rp   r   r   r   r   r   ))master_itemsr   r   flagsr   r   specific_itemscatchall_itemsgroupsr   sorted_group_keys	base_namer   r   extrar	  r6   	n_mastersn_pkgsr   sorted_pkgs_bucketsbucket_weightsmin_idxipkgs	pkg_net_t	planned_t	delta_pctmasterkr_namecatchall_krcatchall_patsr   en_patsmatcheddescpkg_numexcluded_wm_numsr   s)                                           @rU   run_matchingrF    s   E >..01: ".SA[=AQ5RaSNS!-OAQ}=M1NaONO F Y<7"2AfI=AgJQ}-.tA v{{}2CD& Tg	y!#Iy-H 	'A$Q}%5y-PE 'H$OOA&'	'  	'&	D'
'm, '*6RSBE 	  .h	B 	'&	("16GH'
'm, '*6TUM6 	  J	\"># <$)!H]$;L!<'3E!H^$ !3KUYZK#(#34ar4G4 "UY.N" <(..s>/BC '',w'3{+;;'<
 "%( /1"1: 9C()-(8C%9$+AJ.!/  	gA^$D'&	R'
9D99FBI*I1}	I 56BSH		B#&	)&	%i_HYKyQZ[^P__ef'
%	gETgn ! .T)'7F6NBF7O' +9*>*>*@ 	/&Kg%.	/
  )0 	)OFG (	) (F6N(9= 	6C &} 5C	6!(~(F6NLF7O8886A	:&	q=I	12Y>DII?$F6N*F6N 03x	{R[\efi[jjlmF7OBw#SS].Tb  |$LL+O,&s;'7&8s;?O>PP\]`an]o\pqKN   ww',

,		.5Aaggaj/#F ..LL 6"3G9 =$-c-.@-AcR]N^M_"`"W"T" "  V9%LL%-(G*JE  LA TOH 5s   S9S9S>S>&	Tc                    t        d       }| D ]  }|d   }||   }|d   |d<   |d   j                  |       |dxx   |d   z  cc<   |dxx   |d   z  cc<   |j                  d	d
      }|r
|d   s||d<   |d   |d   kD  ss|d   |d<   |d   |d<    t        |j	                               }g }d}d}	|D ]	  }
||
   }|d   j                         }|d   dz  }d|v sd|v rd}n"|dk  rd}n|dk  rd}n|dk  rd}n
|dk  rd}nd}|	dz  }	|	dkD  r|dz  }d}	dj                  d |d   d d D              }t        |d         dkD  r|d!t        |d         dz
   d"z  }|j                  |
|d   d#k(  rd$nd%|d   xs d&t        |d         t        |d         t        |d         t        |d         |d   |||d'        |S )(zAGroup items by container, compute forklift class and unload days.c                      ddg dddddS )Nr$   r+   )r   container_typerH   rZ   r[   heaviest_kgheaviest_namer   r   rw   rU   r  z)build_container_summary.<locals>.<lambda>  s    "r3R& rw   rX   r   rH   rZ   r   r[   r   r_   r$   rI  rJ  r   rK  r    r   r  FRFLATCraner&   z3.5Tr%   5Tr(   z7.5Tr   17Tr  ; c              3   ,   K   | ]  }|d    dd   yw)r   Nr  r   r  s     rU   r   z*build_container_summary.<locals>.<genexpr>  s     O1q1#26Os   N (+z more)r   DKTECzHyundai WIA40HQ)rX   r   rI  	num_itemsr   r   rJ  rK  forklift_class
unload_day
items_list)	r   rF   rp   r"  r!  r   joinrA   round)r   
containersr   ctr   specssorted_containerssummarydaycount_todayct_numct_type
heaviest_tforkliftrY  s                  rU   build_container_summaryrg    se     J  6rNJ*	'
#	(s;''	*]++)2.+,"'A}- 00"=1Am!$_!5Ao6  z01G
CK# (v$%++-}%.
 7?f/H1_H1_H1_H2HHq1HCKYYO'
2AOO
qz?QCAgJ 12&99J#$Z=D#8m 01;VQwZq{+ :/ =!12/&$
 	9(T Nrw   c                    g d}|g}t        | d      D ]  \  }}|j                  dg       }t        t        d |D                    }|rdj	                  |dd       nd}t        |      dkD  r|d	t        |      dz
   d
z  }t        t        d |D                    }|rdj	                  t        |            nd}	t        d |D              dz  }
t        d |D              dz  }|d   dkD  r|r|
|d   z
  |d   z  dz  }|dd}nd}t        d |D        d      dz  }d}|rm|D cg c]  }t        d |d   D              s|d    }}|rCt        d |D              }t        d |D              }t        d |D              }|dd|dd|d}|j                  t        |      |d   ||d   d |d!   |d"   xs d|	|r|
d nd|r|d nd||dkD  r|d nd||d"   xs d|d#   g        |S c c}w )$z$Build Sheet 1: Cross-Reference data.)zItem NozKorean NamezEnglish NamezOur Weight NET (T)ArrivalzFound?zContainer #szPackage Net (T)zPackage Gross (T)zDelta %zMax Piece (T)zMax Dims LxWxH (mm)FlagNotesr    r6   c              3   &   K   | ]	  }|d      yw)r   Nr   r  s     rU   r   z'build_crossref_sheet.<locals>.<genexpr>  s     =1Ao.=r  rQ  Nr&   z(not matched)rS  )c              3   &   K   | ]	  }|d      yw)rX   Nr   r  s     rU   r   z'build_crossref_sheet.<locals>.<genexpr>  s     8a1[>8r  z, r$   c              3   &   K   | ]	  }|d      ywr  r   r  s     rU   r   z'build_crossref_sheet.<locals>.<genexpr>  s     3an3r  r  c              3   &   K   | ]	  }|d      ywr   Nr   r  s     rU   r   z'build_crossref_sheet.<locals>.<genexpr>  s     7Q-(7r  r4   r   r  z+.0f%c              3   &   K   | ]	  }|d      ywrq  r   r  s     rU   r   z'build_crossref_sheet.<locals>.<genexpr>"  s     8a=)8r  defaultc              3   &   K   | ]	  }|d kD    ywr   Nr   r   ds     rU   r   z'build_crossref_sheet.<locals>.<genexpr>&  s     :WQ1q5:Wr  r   c              3   &   K   | ]	  }|d      ywrw  r   rx  s     rU   r   z'build_crossref_sheet.<locals>.<genexpr>(       4QAaD4r  c              3   &   K   | ]	  }|d      yw)r    Nr   rx  s     rU   r   z'build_crossref_sheet.<locals>.<genexpr>)  r{  r  c              3   &   K   | ]	  }|d      yw)r/   Nr   rx  s     rU   r   z'build_crossref_sheet.<locals>.<genexpr>*  r{  r  r  xr3   r  r5   r7   r8   )r<   rp   r   r9   rZ  rA   r"  r'  maxr   rF   rl   )r)  headersrowsr8  r   r9  en_namesen_namect_numsct_strpkg_net	pkg_grossdelta	delta_str	max_piecemax_dimsr	  	dims_listmax_lmax_wmax_hs                        rU   build_crossref_sheetr    sB   G 9D,* (1uu^R(===>-5$))HRaL)?x=1S]1_-Q//Gs84889/66'?+B3d33f<7$77&@	Z=1q},*=CE ,a(II848!DvM	/3X!s:W!I,:W7W9XIX4)444)444)44#C[%AeC[AFAm$g}S!AiLfIOV $wsm""&yoB"+a-yoRaio2qz	
 		?(T K% Ys   )G0G0c                     g d}|g}| D ]l  }|j                  |d   |d   |d   t        |d         t        |d         t        |d         t        |d         |d	   |d
   t        |d         |d   g       n |S )N)SupplierzContainer #zContainer TypeItemszNet Wt (kg)zGross Wt (kg)zHeaviest Item (kg)zHeaviest NamezForklift Classz
Unload Dayz
Items Listr   rX   rI  rV  r   r   rJ  rK  rW  rX  rY  )rF   rl   )r`  r  r  r   s       rU   build_container_sheetr  ;  s    G
 9D jM1[>1-=+>+Q{^!4c!M:J6K- !1_#5Q|_!5q	
 	 Krw   c           	      l    g d}|g}| D ]'  }|j                  |d   |d   |d   |d   |d   g       ) |S )N)z	Flag TypeItemDetailImpactActionr  r   r  r  r  )rF   )r*  r  r  rJ   s       rU   build_flags_sheetr  L  sO    AG9D SQvY&	1X;(Qx[QRSKrw   c                  	   t        d       t        d       t        d       t        d       t        t              \  } }| D cg c]  }|d   dk(  s| }}| D cg c]  }|d   dk(  s| }}t        d | D              }t        dt	        |        d	|d
d       t        dt	        |       d	t        d |D              d
d       t        dt	        |       d	t        d |D              d
d       t        dt	        |              t        d       t        t              }t        d |D              dz  }t        d |D              dz  }t        dt	        |              t        d|d
d       t        d|d
d       t        d       t        t              }	t        dt	        |	       d       t        d       t        | ||	      }
t        t              }| D ]  }||d   xs dxx   dz  cc<    t        d t        |              |D cg c]
  }|d!   	| }}t        d"t	        |              |rT|d d# D ]#  }t        d$|d%   d d&  d'|d(    d)|d*    d+       % t	        |      d#kD  rt        d,t	        |      d#z
   d-       t        d.       t        |      }t	        |      }t        d/ |D        d01      }t        d2 |D              }t        d3|        t        d4|        t        d5| d6       t        d7       t        |       }t        |      }t!        |
      }t        d8t	        |      dz
   d9       t        d:t	        |      dz
   d9       t        d;t	        |      dz
   d9       |||t	        |       t	        |      t#        |d<      t#        |d<      t#        |d<      |||t	        |
      t	        |      d=
d>}t$        d?z  }t'        |d@dAB      5 }t)        j*                  ||dCd<D       d d d        t        dE|        t        dF       t        dG       t        d       t        dH|dIdJ       t        dKt        dL |D              d
dM|dIdN       t        dO|j-                  dPd0       dQ       t        dRt	        |       dS       t        dT| dU| dV       |S c c}w c c}w c c}w # 1 sw Y   xY w)WNzF======================================================================uE   TMED-II Phase III — Package List vs Master Schedule Cross-Referencez$
[1a] Parsing master_schedule.tsv...r5   r.   r,   c              3   &   K   | ]	  }|d      ywr4   Nr   r   r   s     rU   r   zmain.<locals>.<genexpr>`  s     <!*<r  z  Motor INCLUDED: z items, r  zT totalz  May 20 arrival: c              3   &   K   | ]	  }|d      ywr  r   r  s     rU   r   zmain.<locals>.<genexpr>b       6Tq}6Tr  Tz  Jun 15 arrival: c              3   &   K   | ]	  }|d      ywr  r   r  s     rU   r   zmain.<locals>.<genexpr>c  r  r  z  Excluded names tracked: z(
[1b] Parsing package list xlsx files...c              3   &   K   | ]	  }|d      ywr  r   r  s     rU   r   zmain.<locals>.<genexpr>i  s     6qAkN6r  r  c              3   &   K   | ]	  }|d      ywrq  r   r  s     rU   r   zmain.<locals>.<genexpr>j  s     :1a&:r  z  Total package items: z  Total net weight: z  Total gross weight: z>
[1c] Scraping bilingual captions from Machine PHOTO sheets...z  Found u    Korean→English pairsz!
[2] Running two-pass matching...r7   NONEr    z  Results: r   z  Unmatched package items: r  z    - r   2   z (r   zkg) [r   ]z    ... and z morez"
[3] Building container summary...c              3   &   K   | ]	  }|d      yw)rX  Nr   r   r   s     rU   r   zmain.<locals>.<genexpr>  s     B1qBr  r   rt  c              3   2   K   | ]  }|d    dk(  sd  yw)rW  rN  r    Nr   r  s     rU   r   zmain.<locals>.<genexpr>  s     VQq9I7Jg7UqVs   z  Containers: z  Unload days (10/day): z  Crane required: z containersz
[4] Building sheet data...z  Cross-Reference: z rowsz  Container Summary: z	  Flags: r/   )
r)  r   total_planned_ttotal_pkg_net_ttotal_pkg_gross_tnum_containersunload_dayscrane_containersflags_countunmatched_pkg_items)crossrefr\  r*  statsz#project/cross_reference_output.jsonrd   r   r   F)ensure_asciiindentz
  Output saved to: zG
======================================================================VERIFICATIONz!  1. Total package gross weight: z.1fzT (expected ~324T)z  2. Non-assembly planned: c              3   &   K   | ]	  }|d      ywr  r   r  s     rU   r   zmain.<locals>.<genexpr>  s     +IaAjM+Ir  zT vs packages zT grossz,  3. Jun 15 items NOT_IN_PACKAGES_EXPECTED: r   z (expected 7)z  4. Unmatched package items: z (target: 0)z  5. Containers: z / 10/day = z working days)r   rV   TSV_PATHr'  rA   r   PKG_DIRr   rF  r   r   dictrg  r  r  r  r  r[  BASEr:   jsondumprp   )r)  rI   r   r.   r,   total_plannedr   	total_nettotal_grossr   r*  by_flagr	  unmatched_pkgscontainer_summaryr  r  crane_neededcrossref_rowscontainer_rows
flags_rowsoutput	json_pathrJ   s                           rU   mainr  V  s)   	(O	
QR	(O 

12#8#B L.$@1)(?Q@E@$@1)(?Q@E@<|<<M	s<01-9LG
TU	s5zl(36Te6T3TUX2YYZ
[\	s5zl(36Te6T3TUX2YYZ
[\	&s>':&;
<= 

56"7+I6I66?I:	::VCK	#C	N#3
45	 3q
12	";s"31
56 

KL-g6M	HS'((?
@A 

./y-@E#G *&	#V$)$*	KW
'(!*FAao.EaFNF	'N(;'<
=>$ 	`AF1_-cr232an5EU1]K[J\\]^_	`~#L^!4R!7 8>? 

/0/	:*+NB0ABANKV"3VVL	N>*
+,	$[M
23	|nK
89 

()(6M*+<=N"5)J	M 21 45U
;<	!#n"5a"7!8
>?	Ic*oa'(
./ "$-Y$]A6$Y2!&{A!6,& ,u:#&~#6
	F$ <<I	iw	/ ;1		&!%:;	!)
-. 
/	.	(O	-k#->>P
QR	'+I5+I(I#'Nn]hil\mmt
uv	8E_ab9c8ddq
rs	*3~+>*?|
LM	n-\+m
TUM{ A@< G`; ;s0   R>R>S)S
S!S.SS__main__)T) __doc__osr   mathr  collectionsr   pathlibr   r   r  r  r  OUTPUT_SHEET_IDr#  r   rV   rv   rz   r   r   r   r   r   r   rF  rg  r  r  r  r  __name__r   rw   rU   <module>r     sR   
 	   #   ABDD
(
(@; 2; #%67	;
 %':;; 68LM;  &; (*<=;   "+; A; 3X>;  ,!?;   ">
!K!;" F#;$ 1<@%;& 1<@';( ./);* ./+;, .0@A-;. 9/;0   ".1;8 ,.>?9;: S;;< N=;> /0?;@ +-CDA;B # %GC;F )*G;H }n=I;J ZLK;L <>[\M;N ')DF[(\O;P  "Q;T $o%6U;V   "=W;Z ]L9[;\ T##J2 $$m401u;	~ 	>$*B!N+\fR#PF8
&+\J^GX4n"eP zF rw   