§
    `^¶jÿ(  ã                  óx  — d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZmZ ddlmZmZ ddlmZ  eddg¬	¦  «        Z e¦   «         Z G d
„ de¦  «        Ze                     deeef         ¬¦  «         e
dd¬¦  «         e
dd¬¦  «         e
dd¬¦  «        fdDd„¦   «         Ze                     deeef         ¬¦  «        dEd„¦   «         Ze                     deeef         ¬¦  «         e
dd ¬¦  «         e
dd!¬¦  «         e
dd"¬¦  «         e
dd#¬¦  «         e
d$d$d%¬&¦  «         e
d'd$d(d)¬*¦  «        fdFd/„¦   «         Ze                     d0¦  «         e
dd ¬¦  «         e
dd!¬¦  «        fdGd1„¦   «         Ze                     d2eeef         ¬¦  «        dHd4„¦   «         Ze                     d5¦  «         ed6¦  «         ed¬7¦  «         ed¬7¦  «         ed¬7¦  «        fdId;„¦   «         Ze                     d<¦  «        dEd=„¦   «         Ze                     d>¦  «         e
d?d$d@dA¬*¦  «        fdJdC„¦   «         Z dS )KzMREST API router for State Published Prices & Bidding Market Price Comparison.é    )Úannotations)ÚAny)Ú	APIRouterÚFileÚFormÚHTTPExceptionÚQueryÚ
UploadFileÚstatus)Ú	BaseModelÚField)ÚStatePriceSyncServicez/v1/material-pricesz,Material Price Benchmarks & State Comparison)ÚprefixÚtagsc                  ó®  — e Zd ZU  edddi¬¦  «        Zded<    edddi¬¦  «        Zded<    eddd	i¬¦  «        Zded
<    edddi¬¦  «        Zded<    edddi¬¦  «        Z	ded<    edddi¬¦  «        Z
ded<    edddi¬¦  «        Zded<    edddi¬¦  «        Zded<    edddi¬¦  «        Zded<    edddi¬¦  «        Zded<   dZded<   dS )ÚCustomStatePriceRequest.Úexampleú2026-08)Újson_schema_extraÚstrÚpublish_periodÚHAI_PHONG_KHU_VUC_2Úregion_codeÚ	AGGREGATEÚmaterial_groupzTBG-CAT-VANG-BTÚmaterial_codeu&   CÃ¡t vÃ ng háº¡t lá»›n Ä‘á»• bÃª tÃ´ngÚmaterial_nameNz	Mk >= 2.0ú
str | NoneÚspecificationsÚm3Úunitg    àª%AÚfloatÚstate_unit_price_vnduP   ThÃ´ng bÃ¡o sá»‘ 558/TB-SXD ngÃ y 07/08/2026 cá»§a Sá»Ÿ XÃ¢y dá»±ng Háº£i PhÃ²ngÚdocument_referencez
2026-08-01Úeffective_dateÚnotes)Ú__name__Ú
__module__Ú__qualname__r   r   Ú__annotations__r   r   r   r   r   r!   r#   r$   r%   r&   © ó    úXC:\Projects\DSCons\app\modules\inventory\presentation\material_price_benchmark_routes.pyr   r      sÀ  € € € € € € Ø˜% ¸	À9Ð7MÐNÑNÔN€NÐNÐNÐNÑNØ�u˜S°YÐ@UÐ4VÐWÑWÔW€KÐWÐWÐWÑWØ˜% ¸	À;Ð7OÐPÑPÔP€NÐPÐPÐPÑPØ˜˜s°yÐBSÐ6TÐUÑUÔU€MÐUÐUÐUÑUØ˜Ø 	Ð+SÐTðñ ô €Mð ð ð ñ ð "'  tÀ	È;Ð?WÐ!XÑ!XÔ!X€NÐXÐXÐXÑXØ��c¨i¸Ð->Ð?Ñ?Ô?€DÐ?Ð?Ð?Ñ?Ø"' %¨À	È8Ð?TÐ"UÑ"UÔ"UÐÐUÐUÐUÑUØ#˜eØàÐið
ðñ ô Ðð ð ð ñ ð  ˜% ¸	À<Ð7PÐQÑQÔQ€NÐQÐQÐQÑQØ€EÐÐÐÑÐÐr,   r   z/comparison)Úresponse_modelr   u.   Ká»³ thÃ´ng bÃ¡o giÃ¡ (YYYY-MM hoáº·c YYYY-QX))ÚdefaultÚdescriptionr   u;   MÃ£ phÃ¢n vÃ¹ng (HAI_PHONG_KHU_VUC_2 / HAI_PHONG_KHU_VUC_1)Nu]   Lá»�c theo nhÃ³m váº­t tÆ° (AGGREGATE, STEEL, CEMENT, CONCRETE, FUEL_OIL, EQUIPMENT_SHIFT...)Úperiodr   Úregionr   r   Úreturnúdict[str, Any]c              ƒ  ó®   K  — 	 t                                | ||¬¦  «        }d|dœS # t          $ r$}t          t          j        d|›�¬¦  «        |‚d}~ww xY w)u”   Láº¥y báº£ng Ä‘á»‘i soÃ¡t chi tiáº¿t song song giá»¯a Ä�Æ¡n giÃ¡ NhÃ  nÆ°á»›c (Sá»Ÿ XÃ¢y Dá»±ng Háº£i PhÃ²ng) vÃ  Ä�Æ¡n giÃ¡ Thá»‹ trÆ°á»�ng DSCons.)r   r   r   Úsuccess©r   Údatau.   Lá»—i truy xuáº¥t báº£ng so sÃ¡nh Ä‘Æ¡n giÃ¡: ©Ústatus_codeÚdetailN)ÚserviceÚget_price_comparisonÚ	Exceptionr   r   ÚHTTP_500_INTERNAL_SERVER_ERROR)r1   r2   r   r8   Úexcs        r-   r=   r=   )   sˆ   è è € ð	Ý×+Ò+Ø!¨vÀnð ,ñ 
ô 
ˆð $¨TÐ2Ð2Ð2øÝð ð ð ÝÝÔ=ØKÀCÐKÐKð
ñ 
ô 
ð ð	øøøøðøøøs   „!& ¦
A°AÁAz/periodsc               ƒ  ó¦   K  — 	 t                                ¦   «         } d| dœS # t          $ r$}t          t          j        d|›�¬¦  «        |‚d}~ww xY w)uZ   Láº¥y danh sÃ¡ch cÃ¡c ká»³ ThÃ´ng bÃ¡o giÃ¡ Sá»Ÿ XÃ¢y dá»±ng cÃ³ sáºµn trong há»‡ thá»‘ng.r6   r7   u4   Lá»—i truy xuáº¥t danh má»¥c ká»³ thÃ´ng bÃ¡o giÃ¡: r9   N)r<   Úget_available_periodsr>   r   r   r?   )Úperiodsr@   s     r-   Úget_published_periodsrD   D   sv   è è € ðÝ×/Ò/Ñ1Ô1ˆØ#¨WÐ5Ð5Ð5øÝð ð ð ÝÝÔ=ØQÈ#ÐQÐQð
ñ 
ô 
ð ð	øøøøðøøøs   „" ¢
A¬AÁAz/full-catalogu   Ká»³ thÃ´ng bÃ¡o giÃ¡ (YYYY-MM)u7   PhÃ¢n vÃ¹ng (HAI_PHONG_KHU_VUC_2 / HAI_PHONG_KHU_VUC_1)uZ   Lá»�c theo nhÃ³m váº­t tÆ° (AGGREGATE, STEEL, CEMENT, CONCRETE, EQUIPMENT_SHIFT, LABOR...)uD   TÃ¬m kiáº¿m theo tá»« khÃ³a tÃªn váº­t liá»‡u, quy cÃ¡ch, mÃ£ hiá»‡ué   u
   Sá»‘ trang)r/   Úger0   éÈ   iè  u   Sá»‘ báº£n ghi trÃªn 1 trang)r/   rF   Úler0   ÚsearchÚpageÚintÚlimitc              ƒ  ó´   K  — 	 t                                | |||||¬¦  «        }d|dœS # t          $ r$}t          t          j        d|›�¬¦  «        |‚d}~ww xY w)u—   Láº¥y Báº¢NG GIÃ� CÃ”NG Bá»� Sá»ž XÃ‚Y Dá»°NG Ä�áº¦Y Ä�á»¦ (ToÃ n bá»™ 100+ danh má»¥c cÃ´ng bá»‘ chÃ­nh thá»©c tá»« Sá»Ÿ XÃ¢y dá»±ng TP Háº£i PhÃ²ng).)r   r   r   Úsearch_queryrJ   rL   r6   r7   uH   Lá»—i truy xuáº¥t báº£ng giÃ¡ cÃ´ng bá»‘ Sá»Ÿ XÃ¢y Dá»±ng Ä‘áº§y Ä‘á»§: r9   N)r<   Úget_full_state_price_catalogr>   r   r   r?   )r1   r2   r   rI   rJ   rL   Úcatalogr@   s           r-   rO   rO   Q   s”   è è € ð*Ý×6Ò6Ø!ØØ)ØØØð 7ñ 
ô 
ˆð $¨WÐ5Ð5Ð5øÝð ð ð ÝÝÔ=ØeÐ^aÐeÐeð
ñ 
ô 
ð ð	øøøøðøøøó   „$) ©
A³AÁAz/export-full-excelc              ƒ  óè   K  — ddl m} 	 t                               | |¬¦  «        }d| › d|› d�} ||ddd	|› d
�i¬¦  «        S # t          $ r$}t          t          j        d|›�¬¦  «        |‚d}~ww xY w)u‚   Xuáº¥t toÃ n bá»™ Báº£ng giÃ¡ cÃ´ng bá»‘ chÃ­nh thá»©c Sá»Ÿ XÃ¢y dá»±ng Háº£i PhÃ²ng ra file Excel (.xlsx) chuáº©n doanh nghiá»‡p.r   )ÚResponse)r   r   ÚBang_Gia_SXD_Hai_Phong_Ú_z.xlsxzAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetzContent-Dispositionzattachment; filename="ú")ÚcontentÚ
media_typeÚheadersuA   Lá»—i xuáº¥t file Excel báº£ng giÃ¡ cÃ´ng bá»‘ Sá»Ÿ XÃ¢y Dá»±ng: r9   N)ÚfastapirS   r<   Ú!export_full_state_prices_to_excelr>   r   r   r?   )r1   r2   rS   Úexcel_bytesÚfilenamer@   s         r-   Úexport_full_state_prices_excelr^   w   sÞ   è è € ð !Ð Ð Ð Ð Ð ðÝ×?Ò?Ø!¨vð @ñ 
ô 
ˆð D¨VÐCÐC°fÐCÐCÐCˆØˆxØØZà%Ð'KÀÐ'KÐ'KÐ'Kðð
ñ 
ô 
ð 	
øõ ð ð ð ÝÝÔ=Ø^ÐWZÐ^Ð^ð
ñ 
ô 
ð ð	øøøøðøøøs   Š8A Á
A1ÁA,Á,A1z/custom-itemÚreqc              ƒ  ó–  K  — 	 ddl m } ddlm} |                     | j        d¦  «                             ¦   «         }t                               | j        | j	        | j
        | j        | j        | j        | j        | j        | j        || j        ¬¦  «        }dd|dœS # t$          $ r$}t'          t(          j        d	|›�¬
¦  «        |‚d}~ww xY w)u^   ThÃªm má»›i hoáº·c cáº­p nháº­t má»™t má»¥c Ä‘Æ¡n giÃ¡ cÃ´ng bá»‘ Sá»Ÿ XÃ¢y Dá»±ng cÃ´ng bá»‘.r   )Údatetime)ÚDecimalz%Y-%m-%d)r   r   r   r   r   r   r!   r#   r$   r%   r&   r6   u9   Ä�Ã£ lÆ°u báº£n ghi Ä‘Æ¡n giÃ¡ NhÃ  nÆ°á»›c thÃ nh cÃ´ng!)r   Úmessager8   u$   Lá»—i lÆ°u Ä‘Æ¡n giÃ¡ NhÃ  nÆ°á»›c: r9   N)ra   Údecimalrb   Ústrptimer%   Údater<   Úadd_or_update_custom_itemr   r   r   r   r   r   r!   r#   r$   r&   r>   r   r   r?   )r_   ra   rb   Úeff_dateÚsavedr@   s         r-   Ú add_or_update_custom_state_pricerj   •   s  è è € ð
Ø%Ð%Ð%Ð%Ð%Ð%Ø#Ð#Ð#Ð#Ð#Ð#à×$Ò$ SÔ%7¸ÑDÔD×IÒIÑKÔKˆÝ×1Ò1ØÔ-ØœØÔ-ØÔ+ØÔ+ØÔ-Ø”Ø!$Ô!9Ø"Ô5Ø#Ø”)ð 2ñ 
ô 
ˆð  ØRØð
ð 
ð 	
øõ
 ð ð ð ÝÝÔ=ØA¸#ÐAÐAð
ñ 
ô 
ð ð	øøøøðøøøs   „BB Â
CÂ$CÃCz/import-appendix-file.)r/   Úfiler
   r$   c              ƒ  óî   K  — 	 |                       ¦   «         ƒ d{V —†}t                               || j        pd|||¬¦  «        }|S # t          $ r$}t          t          j        d|›�¬¦  «        |‚d}~ww xY w)um   Upload vÃ  import trá»±c tiáº¿p file Phá»¥ lá»¥c cÃ´ng bá»‘ giÃ¡ Sá»Ÿ XÃ¢y dá»±ng Háº£i PhÃ²ng (.xlsx, .csv).Nzappendix.xlsx)Ú
file_bytesr]   r   r   r$   u2   Lá»—i xá»­ lÃ½ file Phá»¥ lá»¥c Sá»Ÿ XÃ¢y dá»±ng: r9   )Úreadr<   Ú!import_appendix_from_excel_or_csvr]   r>   r   r   r?   )rk   r1   r2   r$   rW   Úresr@   s          r-   Úimport_official_appendix_filerq   ¹   s­   è è € ðØŸ	š	™œÐ#Ð#Ð#Ð#Ð#Ð#ˆÝ×7Ò7ØØ”]Ð5 oØ!ØØ1ð 8ñ 
ô 
ˆð ˆ
øÝð ð ð ÝÝÔ=ØOÈÐOÐOð
ñ 
ô 
ð ð	øøøøðøøøs   „AA Á
A4ÁA/Á/A4z/sync-from-price-refc               ƒ  ó´   K  — 	 ddl m}  |                      ¦   «         }dd|d›d�|dœS # t          $ r$}t	          t
          j        d|›�¬	¦  «        |‚d
}~ww xY w)u�   QuÃ©t vÃ  Ä‘á»“ng bá»™ toÃ n bá»™ cÃ¡c tá»‡p Phá»¥ lá»¥c thÃ´ng bÃ¡o giÃ¡ chÃ­nh thá»©c trong thÆ° má»¥c Price_Ref vÃ o cÆ¡ sá»Ÿ dá»¯ liá»‡u.r   )Úofficial_sxd_ingestion_enginer6   u"   Ä�Ã£ quÃ©t vÃ  náº¡p thÃ nh cÃ´ng ú,uW    danh má»¥c váº­t tÆ°, ca mÃ¡y vÃ  nhÃ¢n cÃ´ng trá»±c tiáº¿p tá»« thÆ° má»¥c Price_Ref!)r   rc   Útotal_itemsu/   Lá»—i Ä‘á»“ng bá»™ dá»¯ liá»‡u tá»« Price_Ref: r9   N)Ú?app.modules.inventory.application.official_sxd_ingestion_enginers   Úingest_to_postgresr>   r   r   r?   )rs   Úupserted_countr@   s      r-   Ú sync_state_prices_from_price_refry   Ò   s¿   è è € ðð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 7×IÒIÑKÔKˆàð f¸Nð  fð  fð  fð  fØ)ð
ð 
ð 	
øõ
 ð ð ð ÝÝÔ=ØLÀSÐLÐLð
ñ 
ô 
ð ð	øøøøðøøørQ   z/crawl-and-syncé   é
   u4   Sá»‘ lÆ°á»£ng thÃ´ng bÃ¡o giÃ¡ tá»‘i Ä‘a cáº§n crawlÚmax_announcementsc              ƒ  óÆ   K  — 	 ddl m}  |¦   «         }|                     | ¬¦  «        ƒ d{V —†}|S # t          $ r$}t	          t
          j        d|›�¬¦  «        |‚d}~ww xY w)uy   KÃ­ch hoáº¡t crawler AIHawk Stealth thu tháº­p tá»± Ä‘á»™ng thÃ´ng bÃ¡o giÃ¡ Sá»Ÿ XÃ¢y dá»±ng vÃ  Ä‘á»“ng bá»™ vÃ o CSDL.r   )ÚCrawlAndSyncSxdPricesUseCase)r|   Nu(   Lá»—i thu tháº­p giÃ¡ Sá»Ÿ XÃ¢y dá»±ng: r9   )ÚDapp.modules.inventory.application.crawl_and_sync_sxd_prices_use_caser~   Úexecuter>   r   r   r?   )r|   r~   Úuse_caseÚresultr@   s        r-   Ú"crawl_and_sync_sxd_material_pricesrƒ   ç   s³   è è € ðð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 0Ð/Ñ1Ô1ˆØ×'Ò'Ð:KÐ'ÑLÔLÐLÐLÐLÐLÐLÐLˆØˆøÝð ð ð ÝÝÔ=ØE¸cÐEÐEð
ñ 
ô 
ð ð	øøøøðøøøs   „-2 ²
A ¼AÁA )r1   r   r2   r   r   r   r3   r4   )r3   r4   )r1   r   r2   r   r   r   rI   r   rJ   rK   rL   rK   r3   r4   )r1   r   r2   r   )r_   r   r3   r4   )
rk   r
   r1   r   r2   r   r$   r   r3   r4   )r|   rK   r3   r4   )!Ú__doc__Ú
__future__r   Útypingr   rZ   r   r   r   r   r	   r
   r   Úpydanticr   r   Ú:app.modules.inventory.application.state_price_sync_servicer   Úrouterr<   r   ÚgetÚdictr   r=   rD   rO   r^   Úpostrj   rq   ry   rƒ   r+   r,   r-   ú<module>r�      s  ðØ SÐ Sà "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð à SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SØ %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à \Ð \Ð \Ð \Ð \Ð \à	ˆØ Ø
8Ð	9ð
ñ 
ô 
€ð
  Ð
Ñ
!Ô
!€ðð ð ð ð ˜iñ ô ð ð* ‡‚ˆM¨$¨s°C¨x¬.€Ñ9Ô9à�%ØÐ'Wðñ ô ð �%Ø%ØQðñ ô ð "' ØØsð"ñ "ô "ðð ð ð ñ :Ô9ðð4 ‡‚ˆJ t¨C°¨H¤~€Ñ6Ô6ð	ð 	ð 	ñ 7Ô6ð	ð ‡‚ˆO¨D°°c°¬N€Ñ;Ô;à�% 	Ð7XÐYÑYÔYØ�%Ø%ØMðñ ô ð "' ØØpð"ñ "ô "ð ˜ØØZðñ ô ð �˜a A°<Ð@Ñ@Ô@Ø�Ø˜˜dÐ0Nðñ ô ð"ð "ð "ð "ñ <Ô;ð"ðJ ‡‚Ð Ñ!Ô!à�% 	Ð7XÐYÑYÔYØ�%Ø%ØMðñ ô ðð ð ð ñ "Ô!ðð: ‡‚ˆ^¨D°°c°¬N€Ñ;Ô;ð ð  ð  ñ <Ô;ð ðF ‡‚Ð$Ñ%Ô%à�t˜C‘y”yØ�$˜yÐ)Ñ)Ô)Ø�$Ð4Ð5Ñ5Ô5Ø%) T°$Ð%7Ñ%7Ô%7ð	ð ð ð ñ &Ô%ðð0 ‡‚Ð#Ñ$Ô$ðð ð ñ %Ô$ðð( ‡‚ÐÑÔà"˜UØ�a˜BÐ,bðñ ô ðð ð ð ñ  Ôðð ð r,   