HEX
Server: Microsoft-IIS/10.0
System: Windows NT ITPWINWEBSVR22 10.0 build 20348 (Windows Server 2022) AMD64
User: www.conferencesearch.co.uk (0)
PHP: 8.3.30
Disabled: NONE
Upload Files
File: D:/web/hyperflight/apps/inxpress/app/__pycache__/app.cpython-311.pyc
�

�jb����ddlmZmZddlmZmZmZmZmZm	Z	m
Z
mZddlm
Z
mZddlmZddlmZddlmZddlmZmZdd	lmZdd
lZdd
lZddlmZee��Zhd�Zed
���e_dZ d�Z!	ddl"m#Z$n
#e%$re!Z$YnwxYwe re$ne!Z#e�&d��d���Z'e rej(d���Z)ej*dd��e_+ej,�-ddd���ej*dd��Z.ej*dd��Z/dGd�Z0d �Z#e�&d!d"d#g�$��d%���Z1e�&d&��d'���Z2ej*d(d)��d*kr'de_3dej,d+<ej4ej5�,��ed-��Z6e�&d.��d/���Z7ee��e�&d��d0���Z8e�&d1��d2���Z9e�&d3��d4���Z:dd5lm
Z
mZddlmZd6�Z;e�&d7��d8���Z<e�&d9��d:���Z=e�&d;��d<���Z>e�?d=��d>���Z@e�?d?d@�A��dB���ZAedCkre�BdDdEd�F��d
Sd
S)H�)�urlparse�urljoin)�Flask�session�redirect�url_for�request�abort�render_template�send_from_directory)�Decimal�InvalidOperation�)�get_db)�register_filters��country_name)�datetime�	timedelta��wrapsN)�Path>�/login�/health�/logout�)�hoursFc��|S)N�)�fs �+D:\web\hyperflight\apps\inxpress\app\app.py�_noopr"s��Q�h�)�login_required�/c�:�ttd����S)N�shipments_parsed)rrrr#r!�rootr(%s���G�.�/�/�0�0�0r#c���tj}|�d��rdS|tvrdSt	jd��rdStjtd<ttd����S)Nz/static/�user�next�login)	r	�path�
startswith�PUBLIC_PATHSr�get�	full_pathrr)�ps r!�require_login_everywherer3*sm��
�,�a�	
���j�	!�	!��
�&�	
�l�	��
�&�	��V�	�	��
�&��)�g�f�o�
�g�g�&�&�
'�
'�'r#�FLASK_SECRETz
replace-meT�Lax)�SESSION_COOKIE_SECURE�SESSION_COOKIE_HTTPONLY�SESSION_COOKIE_SAMESITE�APP_USER�admin�APP_PASS�	hyperbankr'c�>�tj�d��ptjdd��}|st|��St
ttj|����}|j	r6|j	t
tj��j	krt|��Stj
pd�d��}|j�
|dz��s|j|krt|��S|jr|���n|S)Nr+z/apps/inxpressr%)r	�argsr0r�poprrr�host_url�netloc�script_root�rstripr-r.�scheme�geturl)�
default_ep�nxt�test�prefixs    r!�
_safe_nextrJEs���
�,�
�
�6�
"�
"�
?�g�k�&�$�&?�&?�C��#��z�"�"�"��G�G�,�c�2�2�3�3�D��{�#�t�{�h�w�/?�&@�&@�&G�G�#��z�"�"�"��!�5�%5�
=�
=�c�
B�
B�F��9������-�-�#�$�)�v�2E�#��z�"�"�"� �K�0�4�;�;�=�=�=�S�0r#c�<��t����fd���}|S)Nc���tjd��tkr�|i|��Stjtd<tt
d����S)Nr*r+r,)rr0�USERr	r1rr)r>�kwargs�fns  �r!�wrapzlogin_required.<locals>.wrapYsQ����;�v���$�&�	'��2�t�&�v�&�&�&�!�+�������(�(�)�)�)r#r)rOrPs` r!r$r$Xs3���
�2�Y�Y�*�*�*�*��Y�*��Kr#r�GET�POST)�methodsc���tjdkr�tj�d��tkr^tj�d��t
kr6ttd<dt_tt����Stdd���Stj�d	��}|r
|td	<td��S)
NrR�ur2r*Tz
login.htmlzInvalid credentials)�errorr+)r	�method�formr0rM�PASSr�	permanentrrJrr>)rGs r!r,r,bs����~���J��<���C� � �$�&�	*�7�<�+;�+;�C�+@�+@�$�+F�	*�"�G�F�O� $�G���J�L�L�)�)�)��|�3H�I�I�I�I�
�,�
�
�6�
"�
"�C�
�������<�(�(�(r#rc�`�tj��ttd����S)Nr,)r�clearrrrr#r!�logoutr]qs#���M�O�O�O��G�G�$�$�%�%�%r#�	APP_DEBUG�0�1�PROPAGATE_EXCEPTIONS)�levelzD:\data\inxpress_pdfsz/pdf/<path:fname>c�$�t|��j}|����d��st	d��t
|z}|���st	d��tt
|dd|d���S)zs
    Stream a PDF from D:\data\inxpress_pdfs by file name.
    Prevent directory traversal and 404 if missing.
    z.pdf�zapplication/pdfFr)�mimetype�
as_attachment�
download_name�max_age)r�name�lower�endswithr
�PDF_ROOT�existsr)�fname�	name_only�fpaths   r!�pdf_downloadrq�s����U��� �I��?�?���%�%�f�-�-��
�c�
�
�
��y� �E��<�<�>�>��
�c�
�
�
���)�"�������r#c��dS)Nzinxpress app aliverrr#r!�homers�s���r#rc�
�ddiS)N�status�okrrr#r!�healthrw�s
���d��r#z	/inxpressc�t�tj�d��}tj�d��}d}t�����5}|�|||||f��|���}ddd��n#1swxYwYtd|||���S)z�
    Mirrors your ASP page but rendered via Jinja.
    - Numeric rules: blank if zero, 2dp for totals
    - Styling: use your existing CSS (copy into app/static/css/site.css)
    �from�toae
        SELECT  InvoiceNo,
                Base, Fuel, Other, Net, VAT, Total,
                Charged, Cost, Calculated,
                InvoiceDate
        FROM    inxpress_invoices
        WHERE   (%s IS NULL OR InvoiceDate >= %s)
        AND     (%s IS NULL OR InvoiceDate <  %s)
        ORDER BY InvoiceDate DESC, InvoiceNo DESC
        LIMIT 500
    Nz
inxpress.html)�rows�	date_from�date_to)r	r>r0r�cursor�execute�fetchallr)r|r}�sql�curr{s     r!�inxpressr��s����� � ��(�(�I��� � ��&�&�G�
�C�
�����	�	��c����C�)�Y���A�B�B�B��|�|�~�~���������������������?���T[�\�\�\�\s�!/B�B �#B )rr	c���|���5}|�d|f��d�|���D��cddd��S#1swxYwYdS)z-Return list of column names in display order.z�
          SELECT COLUMN_NAME
          FROM information_schema.COLUMNS
          WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = %s
          ORDER BY ORDINAL_POSITION
        c��g|]
}|d��S)�COLUMN_NAMEr��.0�rs  r!�
<listcomp>z&_get_table_columns.<locals>.<listcomp>�s��9�9�9�Q��-� �9�9�9r#N)r~rr�)�conn�tabler�s   r!�_get_table_columnsr��s���	
�����:�#�����
�X�	�	�	�:�9�#�,�,�.�.�9�9�9�:�:�:�:�:�:�:�:�:�:�:�:����:�:�:�:�:�:s�5A�A�Az
/shipmentsc	��d}t��}tj�d��pd���}tj�d��pd���}tj�d��pd���}tj�d��pd������}tj�d��pd���}tj�d��pd���}tj�d	��d
k}tj�dd��}	|	d
k}
dtdzd
tdzfd�}||��}||��}
tj�d��pd���}tj�d��pd���}tj�d��}|r|dkrd}d}n3	tdt|����}n#t$rd}d}YnwxYwtdttj�dd
������}|�dn|dz
|z}tj�d��d
k}gg}}d}i}|���5}|�|��|�
��D] }t|d��||d<�!	ddd��n#1swxYwYt|�����}|r$d|�d�}|�d��||gd zz
}|r*|�d!��|�|��|r*|�d"��|�|��|r|�d#��|||gz
}|r*|�d$��|�|��|
rtt#j|
d%�����t)d�&��z���}|�d'��|�|��|ru|s|�d(��n]d)�d*gt/|��z��}|�d+|�d,|�d-|�d.���|�|d/z��|r|�d0��d1}|rd2d3�|��znd} d4|�d5| ��}!d6|�d7| �d8|�d5|����d9�	}"|�|"}#|}$n|"d:z}#|||gz}$|���5}|�d;��g}%|�
��D]w}&|&d<}'|&�d=��}(|(r<t3|(d>��r|(�d?��nt
|(��})|)�d@|'��}*n|'}*|%�|'|*dA����x|�dB|�dC���dD�|�
��D��}+|�dE|�dF���dG�|�
��D��},|�|!|��|���dH}-|�|#|$��|�
��}.ddd��n#1swxYwYt9dI�|,D��dJ��K��}/dL�}0dM�dND��}1t;dO��|1dP<dQ�}2dRD](}3|1�|3t;dS����|1|3<�)|.D�]1}&|0|&�dT����|0|&�dU����z|0|&�dV����z|0|&�dW����z|0|&�dX����z|0|&�dY����z}4|4|&dP<|1dZxx|0|&�dZ����z
cc<|1d[xx|0|&�d[����z
cc<|1d\xx|0|&�d\����z
cc<|1d]xx|0|&�d]����z
cc<|1d^xx|0|&�d^����z
cc<|1dPxx|4z
cc<|1d_xx|2|&�d_����z
cc<|1d`xx|2|&�d`����z
cc<|1daxx|2|&�da����z
cc<��3|1d\|1d`z
|1db<|1d\|1daz
|1dc<|1d`rdd|1d\|1d`z
z|1d`znd|1de<|1dardd|1d\|1daz
z|1daznd|1df<|�dnt|-|zdz
|zd��}5|�|-n|}6tj�d��d
k}t=	duidh|.�di|�d|�d	|�d|�d|�dj|%�d|�dk|+�d|�dl|/�dm|�dn|
�d|�d|6�do|-�dp|5�dq|1�d|�dr|�ds|�dt|
��S)vN�inxpress_shipments_parsed�q��invoice�carrier�countryryrz�noorderr`�details�s�returnc��|sdSdD]M}	tj||��������cS#t$rY�JwxYwdS)z?Return YYYY-MM-DD from UK (DD/MM/YYYY) or ISO input; else None.N��%Y-%m-%d�%d/%m/%Yz%d-%m-%Yz%d.%m.%Y�r�strptime�date�	isoformat�
ValueError�r��fmts  r!�to_iso_datez%shipments_parsed.<locals>.to_iso_date�sy���	��4�C�	�	�C�
��(��C�0�0�5�5�7�7�A�A�C�C�C�C�C���
�
�
���
�����ts�8A�
A�A�sort�shipment_id�dir�desc�pagesize�allr���200�pager�duponlya(
      SELECT ref, COUNT(*) AS cnt FROM (
          SELECT TRIM(LOWER(Reference))  AS ref FROM inxpress_shipments_parsed
           WHERE Reference  IS NOT NULL AND Reference  <> ''
        UNION ALL
          SELECT TRIM(LOWER(Reference2)) AS ref FROM inxpress_shipments_parsed
           WHERE Reference2 IS NOT NULL AND Reference2 <> ''
        UNION ALL
          SELECT TRIM(LOWER(Reference3)) AS ref FROM inxpress_shipments_parsed
           WHERE Reference3 IS NOT NULL AND Reference3 <> ''
      ) t
      GROUP BY ref
      HAVING cnt > 1
    �cnt�ref�%z�(invoice_number LIKE %s OR AirbillNumber LIKE %s OR Reference LIKE %s OR Reference2 LIKE %s OR Reference3 LIKE %s OR ReceiverName LIKE %s)�zinvoice_number = %szCarrier = %sz((DestCountry = %s OR OriginCountry = %s)zShipDate >= %sr���daysz
ShipDate < %sz1=0z, z%sz0(
                  TRIM(LOWER(Reference))  IN (z0)
               OR TRIM(LOWER(Reference2)) IN (z0)
               OR TRIM(LOWER(Reference3)) IN (z)
            )�zo.OrderNo IS NULLz^
    FROM inxpress_shipments_parsed sp
    LEFT JOIN orders o ON o.OrderNo = sp.Reference
    �WHERE � AND zSELECT COUNT(*) AS n � aL
        SELECT
          sp.shipment_id, sp.invoice_number, sp.Carrier, sp.AirbillNumber, sp.ShipDate,
          sp.OriginCountry, sp.DestCountry, sp.Reference, sp.Reference2, sp.Reference3,
          sp.ReceiverName, sp.Pieces, sp.WeightKg, sp.Length, sp.Width, sp.Height, sp.Zone,
          sp.ServiceType, sp.BaseCharge, sp.FuelSurcharge, sp.Handling, sp.Insurance,
          sp.AreaSurcharge, sp.ProcessingFee, sp.ResidentialFee, sp.OtherCharges,
          sp.NetAmount, sp.VATAmount, sp.TotalParsed, sp.Total,
          ROUND(
            o.Delivery /
            (
                1 + ROUND(
                        (o.VATIncluded + o.VATDeducted)
                        / NULLIF(o.GrandTotal - o.VATIncluded, 0),
                        2
                    )
            ),
            2
          ) AS Charge,
          
          o.DeliveryAgentCost      AS Cost,
          o.DeliveryCalculatedCost AS Calculated,

          -- Value deltas vs NetAmount
          CASE
            WHEN o.DeliveryAgentCost IS NULL OR sp.NetAmount IS NULL THEN NULL
            ELSE sp.NetAmount - o.DeliveryAgentCost
          END AS DiffCost,

          CASE
            WHEN o.DeliveryCalculatedCost IS NULL OR sp.NetAmount IS NULL THEN NULL
            ELSE sp.NetAmount - o.DeliveryCalculatedCost
          END AS DiffCalc,

          -- Percent deltas vs NetAmount
          CASE
            WHEN o.DeliveryAgentCost IS NULL OR sp.NetAmount IS NULL OR o.DeliveryAgentCost = 0 THEN NULL
            ELSE 100.0 * (sp.NetAmount - o.DeliveryAgentCost) / o.DeliveryAgentCost
          END AS DiffCostPct,

          CASE
            WHEN o.DeliveryCalculatedCost IS NULL OR sp.NetAmount IS NULL OR o.DeliveryCalculatedCost = 0 THEN NULL
            ELSE 100.0 * (sp.NetAmount - o.DeliveryCalculatedCost) / o.DeliveryCalculatedCost
          END AS DiffCalcPct


          z
          z
          ORDER BY z, sp.shipment_id ASC

    � LIMIT %s OFFSET %sa�
            SELECT
                sp.invoice_number,
                MAX(i.invoice_date) AS invoice_date
            FROM inxpress_shipments_parsed sp
            LEFT JOIN inxpress_invoices i
                   ON i.invoice_number = sp.invoice_number
            WHERE sp.invoice_number <> ''
            GROUP BY sp.invoice_number
            ORDER BY MAX(i.invoice_date) DESC, sp.invoice_number DESC
        �invoice_number�invoice_date�strftimer�u · )�number�labelzSELECT DISTINCT Carrier FROM z# WHERE Carrier<>'' ORDER BY Carrierc��g|]
}|d��S)�Carrierrr�s  r!r�z$shipments_parsed.<locals>.<listcomp>�s��9�9�9�Q�A�i�L�9�9�9r#z\
          SELECT DISTINCT UPPER(COALESCE(DestCountry, OriginCountry)) AS cc
          FROM zD
          WHERE COALESCE(DestCountry, OriginCountry) <> ''
        c��g|]
}|d��S)�ccrr�s  r!r�z$shipments_parsed.<locals>.<listcomp>�s��2�2�2�a�!�D�'�2�2�2r#�nc�6�g|]}|t|��p|d���S))r�rir)r��cs  r!r�z$shipments_parsed.<locals>.<listcomp>�s+��A�A�A�Q��<��?�?�/�a�	0�	0�A�A�Ar#c��|dS)Nrir��xs r!�<lambda>z"shipments_parsed.<locals>.<lambda>�s
��a��i�r#)�keyc�\�|�tt|����ntd��S�N�0.00�r
�strr�s r!�dzshipments_parsed.<locals>.d��"���J�W�S��V�V�_�_�_�7�6�?�?�Jr#c�.�i|]}|td����S�r��r
�r��ks  r!�
<dictcomp>z$shipments_parsed.<locals>.<dictcomp>�s ��g�g�g�1�A�w�v���g�g�gr#)�
BaseCharge�
FuelSurcharge�	NetAmount�	VATAmount�Totalr��Otherc�`�|dvrtt|����ntd��S)N)Nr�r_r�r�s r!r�z"shipments_parsed.<locals>.<lambda>�s&��Q�j�%8�J�'�#�a�&�&�/�/�/�g�c�l�l�r#)�Charge�Cost�
Calculatedr�r_�Handling�	Insurance�
AreaSurcharge�
ProcessingFee�ResidentialFee�OtherChargesr�r�r�r�r�r�r�r��
DiffCostTotal�
DiffCalcTotal�d�DiffCostPct�DiffCalcPct�shipments_parsed.htmlr{�
duplicates�invoices�carriers�	countries�
date_from_iso�date_to_iso�total�	last_page�sums�	direction�pagesize_raw�show_details)r�)rr	r>r0�strip�upperr�rj�max�intr�r~rr��list�keys�appendrr�r�rr��join�len�extend�hasattrr��fetchone�sortedr
r)7r�r�r�r�r�r��
date_from_raw�date_to_rawr��details_rawr�r�r�r�r�r�r�r�r��offsetr��where�params�dup_sql�dup_mapr��row�dup_keys�like�next_day�ph�
from_parts�	where_sql�	count_sql�base_sql�data_sql�data_paramsr�r��inv_no�inv_date�date_txtr�r��ccodes�
total_rowsr{r�r�r��Dr��otherr��pagesize_effectives7                                                       r!r'r'�s}
��'�E��8�8�D���!�!�#�&�&�,�"�3�3�5�5�A���!�!�)�,�,�2��9�9�;�;�G���!�!�)�,�,�2��9�9�;�;�G���!�!�)�,�,�2��9�9�;�;�A�A�C�C�G��\�%�%�f�-�-�3��:�:�<�<�M��\�%�%�d�+�+�3��:�:�<�<�K��|���	�*�*�c�1�G��L�$�$�Y��3�3�K� �C�'�L�	�s�T�z�	�c�D�j�	�	�	�	� �K�
�.�.�M��K��,�,�K���!�!�&�)�)�:�]�A�A�C�C�D���!�!�%�(�(�3�V�:�:�<�<�I��<�#�#�J�/�/�L��!�<�5�0�!������	!��1�c�,�/�/�0�0�H�H���	!�	!�	!��H� �L�L�L�	!�����q�#�g�l�&�&�v�s�3�3�4�4�5�5�D��
=�Q�Q����X�(=�F�
�|���	�*�*�c�1�G���6�E�
�G��G�	
�����2�#����G�����<�<�>�>�	2�	2�C�"%�c�%�j�/�/�G�C��J���	2�2�2�2�2�2�2�2�2�2�2�2����2�2�2�2��G�L�L�N�N�#�#�H�	���1�x�x�x��
���$�	
�	
�	
��d�V�A�X��6��D�
���*�+�+�+�V�]�]�7�-C�-C�-C��=�
���^�$�$�$�f�m�m�G�&<�&<�&<��_�
���?�@�@�@�&�W�V]�L^�B^�&��E�
���%�&�&�&��
�
�m�(D�(D�(D��?��%�k�:�>�>�C�C�E�E�	�WX�HY�HY�HY�Y�d�d�f�f��
���_�%�%�%�v�}�}�X�'>�'>�'>��
(��		(��L�L���������D�6�C��M�M�1�2�2�B��L�L��/1���/1���02����
�
�
�

�M�M�(�Q�,�'�'�'��(��l�l�&�'�'�'��J�
5:�A��G�L�L��/�/�/�/�r�I�@�
�@�@�Y�@�@�I�2�\�]2�2�^�_2�2�`�a2�2�`%�?�?�,�,�a2�2�2�H�j�2��h��k�k��3�3����&�1�1��
�����-�#����
�
	
�
	
�
	
��������	�	�A��'�(�F��u�u�^�,�,�H��
�<C�H�j�<Y�<Y�l�8�,�,�Z�8�8�8�_b�ck�_l�_l��#�1�1��1�1������O�O� ����
�
�
�
�
	���^�E�^�^�^�_�_�_�9�9�#�,�,�.�.�9�9�9����������	
�	
�	
�
3�2�3�<�<�>�>�2�2�2�����I�v�&�&�&��\�\�^�^�C�(�
����H�k�*�*�*��|�|�~�~��[-�-�-�-�-�-�-�-�-�-�-����-�-�-�-�^�A�A�&�A�A�A������I�K�J�J�g�g�(f�g�g�g�D��F�O�O�D��M�J�J�A�
:�,�,���(�(�1�g�c�l�l�+�+��Q���
�
5�
5����!�%�%�
�#�#�$�$�q�q����{�);�);�'<�'<�<�q�q�����AW�AW�?X�?X�X���!�%�%��(�(�)�)�*�,-�A�a�e�e�4D�.E�.E�,F�,F�G�IJ��1�5�5�Q_�K`�K`�Ia�Ia�b����'�
��\����a�a����l� 3� 3�4�4�4�����_������1�5�5��#9�#9�!:�!:�:�����[����Q�Q�q�u�u�[�1�1�2�2�2�����[����a�a����k� 2� 2�3�3�3�����W�
�
�
�a�a����g���/�/�/�
�
�
��W�
�
�
�e�#�
�
�
��X����a�a����h���0�0�0�����V����a�a����f�
�
�.�.�.�����\����a�a����l� 3� 3�4�4�4�����!��-��V��<�D��� ��-��\�0B�B�D���X\�\b�Wc�m�3�$�{�"3�d�6�l�"B�C�d�6�l�R�R�im�D���cg�ht�cu��3�$�{�"3�d�<�6H�"H�I�D�Q]�L^�^�^�{�D����Z���3�
�X�0E��0I�h�/V�XY�+Z�+Z�I�'/�E���X���|���	�*�*�c�1�G������
�T���7����	�
����!�
��W�
��������������)��$�m�� �K���T��$�#�� �j�!�"�)�#�$�T�%�&�T�'�(�)�)�*"�\�+�,"�\�-�s8�I=�=J�
J�AM/�/M3�6M3�E,]
�
]�]z/shipment/<int:shipment_id>c��t��}|���5}|�d|f��|���}ddd��n#1swxYwY|st	d��td|���S)NaF
            SELECT  s.*,
                    sp.Reference,
                    sp.Reference2,
                    sp.Reference3
            FROM inxpress_shipments AS s
            LEFT JOIN inxpress_shipments_parsed AS sp
                   ON sp.shipment_id = s.shipment_id
            WHERE s.shipment_id = %s
            rdzpartials/shipment_detail.html)r�)rr~rrr
r)r�r�r�rs    r!�shipment_detailr#s����8�8�D�	
������#����	
��N�	
�	
�	
��l�l�n�n�������������������� ��
�c�
�
�
��:�c�B�B�B�B��,A�A�"Az	/invoicesc�>
�d}tj�d��pd���}tj�d��pd���}tj�d��pd���}d�}||��}||��}tj�d��pd���}tj�d	��pd
���}hd�}	||	vrd}|dvrd
}tj�d
��pd������}
|
dvrdn*tt
t|
��d��d��}|�dn<tttj�dd��pd��d��}|�dn|dz
|z}
gg}}|r.|�d��|�d|�d���|r*|�d��|�|��|rttj
|d�����td���z�
��}|�d��|�|��|rdd�|��znd}d|�d|��}d|�d |�d!|�d"|����d#�	|�dnd$z}t!��}|���5}|�||��|���d%}|�|�||��n|�||||
gz��|���}ddd��n#1swxYwYd&�}d'�d(D��}|D�]}|d)xx||�d)����z
cc<|d*xx||�d*����z
cc<|d+xx||�d+����z
cc<|d,xx||�d,����z
cc<|d-xx||�d-����z
cc<|d.xx||�d.����z
cc<��
|�dnt||zdz
|zd��}|�|n|}t+d/|||||||||||
|�0�
�
S)1N�inxpress_invoicesr�r�ryrzc��|sdSdD]L}tj||��������cS#t$rY�IwxYwdS)Nr�r�r�s  r!�to_isozinvoices.<locals>.to_iso>sh������C�	$�	$�C� �)�!�S�1�1�6�6�8�8�B�B�D�D�D�D�D���#�#�#�t�t�#�����ts�8A�
A�Ar�r�r�r�>�
amount_due�
invoice_idr��airbills_countr��customer_number�vat_shipments_vat�vat_shipments_total�vat_shipments_amount�non_vat_shipments_total�non_vat_shipments_amount>�ascr�r�r�>�-1r_r�i@B�
rr�rzinvoice_number LIKE %sr�zinvoice_date >= %sr�r�zinvoice_date < %sr�r�zSELECT COUNT(*) AS n FROM r�a*
        SELECT invoice_id, invoice_number, invoice_date, customer_number,
               airbills_count, amount_due,
               vat_shipments_amount, vat_shipments_vat, vat_shipments_total,
               non_vat_shipments_amount, non_vat_shipments_total,
               pdf_file
        FROM z	
        z
        ORDER BY `z` z, invoice_id DESC
    r�r�c�\�|�tt|����ntd��Sr�r�r�s r!r�zinvoices.<locals>.d|r�r#c�.�i|]}|td����Sr�r�r�s  r!r�zinvoices.<locals>.<dictcomp>}s,�����1�A�w�v�����r#)r)r/r-r.r1r0r)r/r-r.r1r0z
invoices.html)r{r�r�r�r�r�r�r�r�r�r�r�)r	r>r0r�rjr��minr�rrr�r�rr�rr�rr~rrr�r)r�r�rrr(r�r�r�r��
allowed_sortsr�r�r�r
rr�ndrrrr�r�rr{r�r�r�r�r!s                             r!r�r�1s���E�
��	�	�#�	�	�	$�"�+�+�-�-�A��\�%�%�f�-�-�3��:�:�<�<�M��\�%�%�d�+�+�3��:�:�<�<�K�����F�=�)�)�M��F�;�'�'�K���!�!�&�)�)�;�^�B�B�D�D�D���!�!�%�(�(�2�F�9�9�;�;�I����M��=� �7��$���&�:�F�	��L�$�$�Z�0�0�9�E�@�@�B�B�H�H�J�J�L�#�'7�7�g�t�t�S��S��EV�EV�Xa�Ab�Ab�df�=g�=g�H��S�1�1�c�#�g�l�.>�.>�v�q�.I�.I�.N�Q�*O�*O�QR�&S�&S�D��
=�Q�Q����X�(=�F���6�E�� �
���-�.�.�.��
�
�h�!�h�h�h�����I�
���)�*�*�*�F�M�M�-�,H�,H�,H��=����Z�8�8�=�=�?�?�)�QR�BS�BS�BS�S�
^�
^�
`�
`��
���(�)�)�)�6�=�=��+<�+<�+<�49�A��G�L�L��/�/�/�/�r�I�@�U�@�@�Y�@�@�I�	��
	�	�
�	�	��	�	�%�?�?�,�,�	�	�	��<�2�2�'<�	>�H��8�8�D�	
������#����I�v�&�&�&�S�\�\�^�^�C�5H�
��	?��K�K��&�)�)�)�)��K�K��&�H�f�+=�"=�>�>�>��|�|�~�~��
������������������K�J�J���)����D��O�O���\����1�1�Q�U�U�<�-@�-@�+A�+A�A�����
#�$�$�$�1�1�Q�U�U�3I�-J�-J�+K�+K�K�$�$�$��
 �!�!�!�1�1�Q�U�U�3F�-G�-G�+H�+H�H�!�!�!��
"�#�#�#�1�1�Q�U�U�3H�-I�-I�+J�+J�J�#�#�#��
'�(�(�(�1�1�Q�U�U�3M�-N�-N�+O�+O�O�(�(�(��
&�'�'�'�1�1�Q�U�U�3L�-M�-M�+N�+N�N�'�'�'�'��Z���3�
�X�0E��0I�h�/V�XY�+Z�+Z�I�'/�E���X����
�Q�#��
�.�j�I�
�Y�\�����s�2A9N7�7N;�>N;z/order/by-ref/<ref>c���t��}|���5}|�d|g��|���}ddd��n#1swxYwYt	d||���S)Na7
            SELECT
              o.OrderNo,
              o.SessionID,
              o.IPAddress,
              CONCAT_WS(' ', o.FirstName, o.Surname) AS Name,
              o.CompanyName,
              o.AddressLine1, o.AddressLine2, o.Town, o.County, o.Postcode, o.Country,
              o.EmailAddress,
              o.Message, o.Notes,
              o.DateTimeOrdered, o.DateTimePaid, o.DateTimeCompleted,
              o.TotalWeight, o.Subtotal, o.Discount, o.Delivery, o.VATIncluded, o.VATDeducted, o.GrandTotal,
              o.DeliveryWillCollect, o.DeliveryAddressSameAsInvoice,
              o.DeliveryName, o.DeliveryCompanyName, o.DeliveryAddressLine1, o.DeliveryAddressLine2,
              o.DeliveryTown, o.DeliveryCounty, o.DeliveryPostcode, o.DeliveryCountry, o.DeliveryInfo,
              o.DeliveryOption, o.DeliveryService, o.DeliveryCalculatedCost,
              o.EstimatedGrossWeight, o.EstimatedVolumetricWeight,
              o.PackageSize, o.PackageName, o.PaymentMethod, o.PaymentReference,
              o.Status, o.Courier, o.TrackingNo, o.MessageToCustomer,
              o.DeliveryAgentName, o.DeliveryAgentDate, o.DeliveryAgentCost,
              o.PackedBy, o.GrossWeight, o.CN22TariffCode, o.CommercialInvoiceInfo
            FROM orders o
            WHERE o.OrderNo = %s
            LIMIT 1
        zpartials/order_detail.html)�or�)rr~rrr)r�r�r�rs    r!�order_by_refr<�s����8�8�D�	
������#�����0�U�1	�	�	�2�l�l�n�n��5������������������6�7�3�C�H�H�H�Hr$z/order/<int:order_no>/details�
order_details)�endpointc���t��}|���5}|�d|g��|���}ddd��n#1swxYwYt	d||���S)NaA
            SELECT
              OrderDetailID,
              ProductCode,
              ProductName,
              OptionsList,
              Qty,
              PriceEach,
              Qty * PriceEach AS LineTotal
            FROM orderdetails
            WHERE OrderNo = %s
            ORDER BY OrderDetailID
        zpartials/order_items.html)�items�order_no)rr~rr�r)rAr�r�r{s    r!r=r=�s����8�8�D�	
������#������Z�	�	�	��|�|�~�~���������������������6�d�X�V�V�V�Vr$�__main__z	127.0.0.1i�)�host�port�debug)r')C�urllib.parserr�flaskrrrrr	r
rr�decimalr
r�dbr�filtersrrrr�	functoolsr�os�logging�pathlibr�__name__�appr/�permanent_session_lifetime�
REQUIRE_LOGINr"�flask_loginr$�_fl_login_required�	Exception�router(�before_requestr3�getenv�
secret_key�config�updaterMrYrJr,r]rE�basicConfig�DEBUGrlrqrsrwr�r�r'r#r�r0r<r=�runrr#r!�<module>r_s��*�*�*�*�*�*�*�*�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�-�-�-�-�-�-�-�-�������%�%�%�%�%�%�!�!�!�!�!�!�(�(�(�(�(�(�(�(����������������������e�H�o�o��0�/�/��!*���!4�!4�!4���
�
�����@�@�@�@�@�@�@��������������(5�?�#�#�%��
���3���1�1���1��(���
(�
(���
(����>�<�8�8����
���� �!������r�y��W�%�%���r�y��[�)�)��1�1�1�1�&������8�e�F�^��,�,�)�)�-�,�)����9���&�&���&�

�2�9�[�#���#�%�-��C�I�)-�C�J�%�&��G��g�m�,�,�,�,�
�4�(�)�)���������� ���4���������3��� � ��� ����9�����������;���]�]���]�2+�*�*�*�*�*�*�*�������	:�	:�	:����<���@�@���@�L
���(�)�)�C�C�*�)�C�0���;���`�`���`�D���	���I�I� ��I�@���	(�?��C�C�W�W�D�C�W�*�z��5��G�G��4�t�G�4�4�4�4�4�5�5s�9B�B
�	B