o
    tBh~                      @   s   d 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Z
d	Zd
Zdd ZG dd deZG dd deZG dd deZG dd deZG dd deZeZdS )zBModule: barcode.codex

:Provided barcodes: Code 39, Code 128, PZN
    )Barcode)code128)code39)BarcodeError)IllegalCharacterError)NumberOfDigitsErrorzrestructuredtext eng?gRQ@c                 C   s@   g }| D ]}||vr| | q|rtdj|d|dd S )Nz:The following characters are not valid for {name}: {wrong}z, )namewrong)appendr   formatjoin)coder   allowedr	   char r   d/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/barcode/codex.py
check_code   s   

r   c                   @   sL   e Zd ZdZdZdddZdd ZeZd	d
 Zdd Z	dd Z
dddZdS )Code39a  Initializes a new Code39 instance.

    :parameters:
        code : String
            Code 39 string without \* and checksum (added automatically if
            `add_checksum` is True).
        writer : barcode.writer Instance
            The writer to render the barcode (default: SVGWriter).
        add_checksum : Boolean
            Add the checksum to code or not (default: True).
    zCode 39NTc                 C   sD   |  | _|r|  j|  7  _|pt | _t| j| jtj	 d S N)
upperr   calculate_checksumr   default_writerwriterr   r   r   REF)selfr   r   add_checksumr   r   r   __init__/   s
   
zCode39.__init__c                 C      | j S r   r   r   r   r   r   __unicode__6      zCode39.__unicode__c                 C   r   r   r   r   r   r   r   get_fullcode;   r!   zCode39.get_fullcodec                 C   sD   t dd | jD d }tj D ]\}}||d kr|  S qd S )Nc                 s   s    | ]
}t j| d  V  qdS )r   N)r   MAP).0xr   r   r   	<genexpr>?   s    z,Code39.calculate_checksum.<locals>.<genexpr>+   r   )sumr   r   r#   items)r   checkkvr   r   r   r   >   s   zCode39.calculate_checksumc                 C   sB   t jg}| jD ]}|t j| d  q|t j t j|gS N   )r   EDGEr   r
   r#   MIDDLEr   )r   charsr   r   r   r   buildD   s
   
zCode39.buildc                 C   &   t td}||p
i  t| ||S N)module_width
quiet_zoneMIN_SIZEMIN_QUIET_ZONEupdater   renderr   writer_optionstextoptionsr   r   r   r;   K      
zCode39.render)NTNN)__name__
__module____qualname____doc__r   r   r    __str__r"   r   r2   r;   r   r   r   r   r       s    
r   c                   @   s2   e Zd ZdZdZdZdddZdd Zd	d
 ZdS )PZN7zInitializes new German number for pharmaceutical products.

    :parameters:
        pzn : String
            Code to render.
        writer : barcode.writer Instance
            The writer to render the barcode (default: SVGWriter).
    Pharmazentralnummer   Nc                 C   sx   |d | j  }| stdt|| j kr!td| j t||| _d||  | _tj	| d| j|dd d S )NzPZN can only contain numbers.z PZN must have {} digits, not {}.z{}{}PZN-{}F)r   )
digitsisdigitr   lenr   r   pznr   r   r   )r   rN   r   r   r   r   r   _   s   zPZN7.__init__c                 C   s   d | jS )NrJ   )r   rN   r   r   r   r   r"   k   s   zPZN7.get_fullcodec                 C   s8   t dd t| jddD }|d }|dkrtd|S )Nc                 s   s$    | ]\}}t |t | V  qd S r   )int)r$   r%   yr   r   r   r&   o   s   " z*PZN7.calculate_checksum.<locals>.<genexpr>   start   
   zChecksum can not be 10 for PZN.)r(   	enumeraterN   r   )r   sum_checksumr   r   r   r   n   s
   zPZN7.calculate_checksumr   )	rB   rC   rD   rE   r   rK   r   r"   r   r   r   r   r   rG   Q   s    	
rG   c                   @   s   e Zd ZdZdZdS )PZN8zWill be fully added in v0.9.   N)rB   rC   rD   rE   rK   r   r   r   r   rY   w   s    rY   c                   @   s   e Zd ZdZdZdddZdd ZeZedd	 Z	d
d Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdddZdS )Code128a@  Initializes a new Code128 instance. The checksum is added automatically
    when building the bars.

    :parameters:
        code : String
            Code 128 string without checksum (added automatically).
        writer : barcode.writer Instance
            The writer to render the barcode (default: SVGWriter).
    zCode 128Nc                 C   s6   || _ |pt | _d| _d| _t| j | jtj	 d S )NB )
r   r   r   r   _charset_bufferr   r   r   ALLr   r   r   r   r   r   r      s
   zCode128.__init__c                 C   r   r   r   r   r   r   r   r       r!   zCode128.__unicode__c                 C   s   |   S r   )_buildr   r   r   r   encoded   s   zCode128.encodedc                 C   r   r   r   r   r   r   r   r"      r!   zCode128.get_fullcodec                 C   sF   |dkr
|  d}n|dkr|  d}n	|dkr|  d}|| _|gS )NATO_Ar\   TO_BCTO_C)_convertr^   )r   whichr   r   r   r   _new_charset   s   
zCode128._new_charsetc                    s  | j | }| j ||d    fdd}g }| jdkrK| sK|tjv r*| d}n
|tjv r4| d}t| jdkrI|	| 
| jd  d	| _|S | jdkrk| rZ| d}|S |tjvri|tjv ri| d}|S | jdkr| rz| d}|S |tjvr|tjv r| d}|S )
NrU   c                     s4   d}  D ]}|  r| d7 } q | dko| d dkS )Nr   r.      rQ   )rL   )rK   cnext_r   r   	look_next   s   
z0Code128._maybe_switch_charset.<locals>.look_nextrg   r\   rd   r.   r   r]   )r   r^   rL   r   r\   rk   rd   rM   r_   r
   ri   )r   posr   rp   codesr   rn   r   _maybe_switch_charset   s:   
	













zCode128._maybe_switch_charsetc                 C   s   | j dkr
tj| S | j dkrtj| S | j dkr?|tjv r#tj| S | rA|  j|7  _t| jdkrCt| j}d| _|S d S d S d S )Nrd   r\   rg   rQ   r]   )	r^   r   rd   r\   rg   rL   r_   rM   rO   )r   r   valuer   r   r   ri      s    







zCode128._convertc                 C   s*   |d t jv rt j|d  g|d d< |S )Nr.   rQ   )r   TO)r   rc   r   r   r   _try_to_optimize   s   zCode128._try_to_optimizec                 C   sB   |d g}t |dd  ddD ]\}}|||  qt|d S )Nr   r.   rR   g   )rV   r
   r(   )r   rc   csicode_numr   r   r   _calculate_checksum   s   
zCode128._calculate_checksumc                 C   s   t j| j g}t| jD ]\}}|| | | |}|d ur&|| qt	| j
dkrD|| d || | j
d  d| _
| |}|S )Nr.   r\   r   r]   )r   START_CODESr^   rV   r   extendrs   ri   r
   rM   r_   rk   rv   )r   rc   ry   r   rz   r   r   r   rb      s   


zCode128._buildc                 C   sL   |   }|| | d}|D ]	}|tj| 7 }q|tj7 }|d7 }|gS )Nr]   11)rb   r
   r{   r   CODESSTOP)r   rc   r   rz   r   r   r   r2      s   
zCode128.buildc                 C   r3   r4   r7   r<   r   r   r   r;      r@   zCode128.renderr   rA   )rB   rC   rD   rE   r   r   r    rF   propertyrc   r"   rk   rs   ri   rv   r{   rb   r2   r;   r   r   r   r   r[   }   s"    



$
r[   c                       s6   e Zd ZdZdZdZd	 fdd	Z fddZ  ZS )
Gs1_128z
    following the norm, a gs1-128 barcode is a subset of code 128 barcode,
    it can be generated by prepending the code with the FNC1 character
    https://en.wikipedia.org/wiki/GS1-128
    https://www.gs1-128.info/
    zGS1-128   ñNc                    s   | j | }t || d S r   )	FNC1_CHARsuperr   ra   	__class__r   r   r     s   
zGs1_128.__init__c                    s   t   dd  S r-   )r   r"   r   r   r   r   r"     s   zGs1_128.get_fullcoder   )	rB   rC   rD   rE   r   r   r   r"   __classcell__r   r   r   r   r     s    r   N)rE   barcode.baser   barcode.charsetsr   r   barcode.errorsr   r   r   __docformat__r8   r9   r   r   rG   rY   r[   r   PZNr   r   r   r   <module>   s$    1& 