
    `j                        d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	m
Z
mZmZmZ ddl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  ej>                  e       Z!ddZ" G d de      Z#y)u  Ross1000 export API view.

Endpoint: GET /api/istat/ross1000/export/

Query parameters:
    structure_id  (int, required)
    start_date    (YYYY-MM-DD, required)
    end_date      (YYYY-MM-DD, required)
    mode          ("xml" | "soap", optional, default "xml")

Response:
    application/xml  — plain Ross1000 XML
    text/xml         — SOAP envelope (mode=soap)

This view is completely isolated from:
- TXT export (/api/istat/export)
- C59 XML export (/api/istat/xml/c59-export/)
- Guest XML export (/api/istat/xml/guest-export/)
    )annotationsN)PermissionDenied)Http404HttpResponse)OpenApiExampleOpenApiParameterOpenApiResponseextend_schema)serializersstatus)IsAuthenticated)Response)APIView)Ross1000ExportRequestSerializer)Ross1000ValidationError)Ross1000ExportService)	Structurec                    t         j                  j                  |      j                         }|t	        d      |j
                  | j                  k(  xs* |j                  j                  |       j                         }|st        d      |S )N)idzStructure not found.)userz)You do not have access to this structure.)
r   objectsfilterfirstr   user_idr   structure_usersexistsr   )r   structure_id	structure
has_accesss       $/backend/istat/ross1000/api/views.py"_get_accessible_structure_or_raiser!   *   s    !!((L(9??AI,--TWW$ 	@$$+++6==?  JKK    c                  z   e Zd ZdZegZ edgdd edeej                  dd       ed	e
ej                  dd
       ede
ej                  dd       ede
ej                  dd      g edddddd       edddddd      g ed       ed       ed       ed       ed      d       d!        Zy")#Ross1000ExportAPIViewz>Download a Ross1000 XML/SOAP movement export for a date range.Ross1000z7Download Ross1000 movement XML export (Regione Liguria)a  Generates a Ross1000-compatible XML export for the given structure and date range. One <movimento> block is produced per calendar day, including empty days. Arrivals and departures are reported separately. Use mode=soap to wrap the payload in a SOAP 1.1 envelope.r   TzStructure ID to export.)nametypelocationrequireddescription
start_datez:First day of the reporting period (YYYY-MM-DD, inclusive).end_datez9Last day of the reporting period (YYYY-MM-DD, inclusive).modeFz0Export mode: 'xml' (default) or 'soap' envelope.u"   Ross1000 XML export — April 2026   z
2026-04-01z
2026-04-30xmlr   r+   r,   r-   )valuezRoss1000 SOAP exportsoapzGDownloadable Ross1000 XML (application/xml) or SOAP envelope (text/xml))r*   z!Validation or business-rule errorzPermission deniedzStructure not foundzUnexpected server error)   i  i  i  i  )tagssummaryr*   
parametersexamples	responsesc           	     l   t        |j                        }|j                         s%t        |j                  t
        j                        S |j                  }|d   }|d   }|d   }|j                  dd      }|j                  j                  ||j                         |j                         |dd	}	 t        |j                  |
       t               }	|	j                  ||||      }
t&        j;                  di ||
j<                  |
j>                  dd       tA        |
jB                  jE                  d      |
jF                        }d|
j<                   d|d<   |S # t        j                   $ r/}t        |j"                  t
        j                        cY d }~S d }~wt$        $ rW}t&        j)                  di |dt+        |      d       t        dt+        |      it
        j                        cY d }~S d }~wt,        $ r0}t        dt+        |      it
        j.                        cY d }~S d }~wt0        $ r0}t        dt+        |      it
        j2                        cY d }~S d }~wt4        $ r= t&        j7                  di |ddi       t        ddit
        j8                        cY S w xY w)N)data)r   r   r+   r,   r-   r/   ross1000)r   r   r+   r,   r-   export_type)r   r   r0   zRoss1000 export API failedfailure)r   error)extradetailz&Ross1000 export API unexpected failurer   zAn unexpected error occurred.zRoss1000 export API succeededsuccess)filename	day_countr   zutf-8)content_typezattachment; filename=""zContent-Disposition)$r   query_paramsis_validr   errorsr   HTTP_400_BAD_REQUESTvalidated_datagetr   r   	isoformatr!   r   exportr   ValidationErrorr@   r   loggerwarningstrr   HTTP_403_FORBIDDENr   HTTP_404_NOT_FOUND	Exception	exceptionHTTP_500_INTERNAL_SERVER_ERRORinforB   rC   r   contentencoderD   )selfrequestreq_serializerparamsr   r+   r,   r-   log_ctxserviceresultexcresponses                r    rK   zRoss1000ExportAPIView.get<   s   T 9g>R>RS&&(N11&:U:UVV..n-L)
*%zz&%( ||($..0 **,%
&	.\\)
 ,-G^^)%!	 $ FB 	+"OO#--#	 	 	
  NN!!'*,,
 -C6??BSST*U&'S ** 	LCJJv/J/JKK& 	VNN,IIICI   Xs3x09T9TUU 	TXs3x09R9RSS 	TXs3x09R9RSS 	866(I6   :;<< 	s\   36E! !J34$FJ3J3*AG<6J3<J3%H3-J33J3?%I*$J3*AJ32J3N)__name__
__module____qualname____doc__r   permission_classesr
   r   intQUERYrQ   r   r	   rK    r"   r    r$   r$   7   s7   H)*\IH #)//5 !)//X )//W )//N-
> 4$%". ,!	 &$%". ,"	
* !/ !-PQ -@A -BC -FG
wGPLQGPLr"   r$   )r   rh   returnr   )$rf   
__future__r   loggingdjango.core.exceptionsr   django.httpr   r   drf_spectacular.utilsr   r   r	   r
   rest_frameworkr   r   rest_framework.permissionsr   rest_framework.responser   rest_framework.viewsr   istat.ross1000.api.serializersr   istat.ross1000.exceptionsr   &istat.ross1000.services.export_servicer   structures.modelsr   	getLoggerrc   rO   r!   r$   rj   r"   r    <module>rz      s]   ( #  3 - b b . 6 , ( J = H ' 
		8	$
YG Yr"   