# Diagrama de Flujo - Sistema Delivery List

## Diagrama General del Sistema

```mermaid
flowchart TD
    Start([Inicio]) --> CrearLista[Crear Delivery List]
    CrearLista --> ValidarPlan{Plan tiene<br/>hasdelivery?}
    ValidarPlan -->|No| Error1[Error: Plan no disponible]
    ValidarPlan -->|Sí| ValidarMain{Maincompany tiene<br/>hasdelivery?}
    ValidarMain -->|No| Error2[Error: Debe activar entregas]
    ValidarMain -->|Sí| CrearEntidad[Crear nueva entidad Deliverylist]
    CrearEntidad --> AsignarAgencia[Asignar Agencia del usuario]
    AsignarAgencia --> GenerarNumero[Generar número único]
    GenerarNumero --> EstadoInicial["Estado: CREADA<br/>isopen: true<br/>delivered: false"]
    EstadoInicial --> GuardarLog[Registrar acción CREATE en logs]
    GuardarLog --> Persistir[Persistir en BD]
    Persistir --> ListaCreada[Lista Creada]

    ListaCreada --> MenuPrincipal{¿Qué acción?}

    MenuPrincipal -->|Agregar| AgregarElementos
    MenuPrincipal -->|Quitar| QuitarElementos
    MenuPrincipal -->|Entregar| EntregarLista
    MenuPrincipal -->|Cerrar| CerrarLista

    AgregarElementos --> TipoElemento{Tipo de<br/>Elemento?}
    TipoElemento -->|Receipt| AgregarReceipt
    TipoElemento -->|Guide| AgregarGuide
    TipoElemento -->|WHrec| AgregarWHrec

    QuitarElementos --> TipoQuitar{Tipo de<br/>Elemento?}
    TipoQuitar -->|Receipt| QuitarReceipt
    TipoQuitar -->|Guide| QuitarGuide
    TipoQuitar -->|WHrec| QuitarWHrec

    EntregarLista --> ValidarEntrega{Lista<br/>abierta?}
    ValidarEntrega -->|No| Error3[Error: Lista cerrada]
    ValidarEntrega -->|Sí| GuardarFirma[Guardar firma y comentario]
    GuardarFirma --> MarcarEntregada[Marcar delivered = true]
    MarcarEntregada --> PropagarEntrega[Propagar a elementos hijos]
    PropagarEntrega --> FinEntrega[Entrega completada]

    CerrarLista --> ValidarCerrar{Tiene<br/>elementos?}
    ValidarCerrar -->|No| Error4[Error: No se puede cerrar]
    ValidarCerrar -->|Sí| ValidarAbierta{Está<br/>abierta?}
    ValidarAbierta -->|No| Error5[Error: Ya está cerrada]
    ValidarAbierta -->|Sí| Cerrar[isopen = false]
    Cerrar --> LogCerrar[Registrar acción CLOSE]
    LogCerrar --> FinCerrar[Lista Cerrada]

    FinEntrega --> MenuPrincipal
    FinCerrar --> MenuPrincipal

    style CrearLista fill:#e1f5ff,color:#004085
    style ListaCreada fill:#d4edda,color:#155724
    style FinEntrega fill:#d4edda,color:#155724
    style FinCerrar fill:#d4edda,color:#155724
    style Error1 fill:#f8d7da,color:#721c24
    style Error2 fill:#f8d7da,color:#721c24
    style Error3 fill:#f8d7da,color:#721c24
    style Error4 fill:#f8d7da,color:#721c24
    style Error5 fill:#f8d7da,color:#721c24
```

## Flujo Detallado: Agregar Elementos

```mermaid
flowchart TD
    Start([Agregar Elementos]) --> ValidarPermisos{Usuario tiene<br/>permisos?}
    ValidarPermisos -->|No| Error1[Error: Sin permisos]
    ValidarPermisos -->|Sí| ValidarEstado{Lista está<br/>abierta?}
    ValidarEstado -->|No| Error2[Error: Lista cerrada]
    ValidarEstado -->|Sí| ValidarStatus{Status diferente EJECUTADA?}
    ValidarStatus -->|No| Error3[Error: No se pueden agregar]
    ValidarStatus -->|Sí| TipoElemento{Tipo de<br/>Elemento?}

    TipoElemento -->|Receipt| BuscarReceipts["Buscar Receipts disponibles:<br/>deliverylist IS NULL<br/>delivered false<br/>Status válido"]
    TipoElemento -->|Guide| BuscarGuides["Buscar Guides disponibles:<br/>deliverylist IS NULL<br/>delivered false<br/>Status PROCESADA"]
    TipoElemento -->|WHrec| BuscarWHrecs["Buscar WHrecs disponibles:<br/>deliverylist IS NULL<br/>delivered false<br/>Status válido"]

    BuscarReceipts --> ValidarAgencia1{allagency false?}
    BuscarGuides --> ValidarAgencia2{allagency false?}
    BuscarWHrecs --> ValidarAgencia3{allagency false?}

    ValidarAgencia1 -->|Sí| FiltrarAgencia1[Filtrar por agencia asignada]
    ValidarAgencia1 -->|No| ValidarDestino1{alldestination false?}
    ValidarAgencia2 -->|Sí| FiltrarAgencia2[Filtrar por agencia asignada]
    ValidarAgencia2 -->|No| ValidarDestino2{alldestination false?}
    ValidarAgencia3 -->|Sí| FiltrarAgencia3[Filtrar por agencia asignada]
    ValidarAgencia3 -->|No| ValidarDestino3{alldestination false?}

    FiltrarAgencia1 --> ValidarDestino1
    FiltrarAgencia2 --> ValidarDestino2
    FiltrarAgencia3 --> ValidarDestino3

    ValidarDestino1 -->|Sí| FiltrarDestino1[Filtrar por país destino]
    ValidarDestino1 -->|No| AsignarReceipt[Asignar deliverylist a Receipt]
    ValidarDestino2 -->|Sí| FiltrarDestino2[Filtrar por país destino]
    ValidarDestino2 -->|No| AsignarGuide[Asignar deliverylist a Guide]
    ValidarDestino3 -->|Sí| FiltrarDestino3[Filtrar por país destino]
    ValidarDestino3 -->|No| AsignarWHrec[Asignar deliverylist a WHrec]

    FiltrarDestino1 --> AsignarReceipt[Asignar deliverylist a Receipt]
    FiltrarDestino2 --> AsignarGuide[Asignar deliverylist a Guide]
    FiltrarDestino3 --> AsignarWHrec[Asignar deliverylist a WHrec]

    AsignarReceipt --> CrearLineReceipt["Crear DeliveryLine<br/>type receipt<br/>orden siguiente"]
    AsignarGuide --> CrearLineGuide["Crear DeliveryLine<br/>type guide<br/>orden siguiente"]
    AsignarWHrec --> CrearLineWHrec["Crear DeliveryLine<br/>type whrec<br/>orden siguiente"]

    CrearLineReceipt --> LogAddReceipt["Registrar en addlogs<br/>action ADD<br/>elements receipts"]
    CrearLineGuide --> LogAddGuide["Registrar en addlogs<br/>action ADD<br/>elements guides"]
    CrearLineWHrec --> LogAddWHrec["Registrar en addlogs<br/>action ADD<br/>elements whrecs"]

    LogAddReceipt --> GuardarBD[Persistir cambios]
    LogAddGuide --> GuardarBD
    LogAddWHrec --> GuardarBD

    GuardarBD --> Fin([Elementos Agregados])

    style Start fill:#e1f5ff,color:#004085
    style Fin fill:#d4edda,color:#155724
    style Error1 fill:#f8d7da,color:#721c24
    style Error2 fill:#f8d7da,color:#721c24
    style Error3 fill:#f8d7da,color:#721c24
```

## Flujo Detallado: Quitar Elementos

```mermaid
flowchart TD
    Start([Quitar Elementos]) --> ValidarPermisos{Usuario tiene<br/>permisos?}
    ValidarPermisos -->|No| Error1[Error: Sin permisos]
    ValidarPermisos -->|Sí| ValidarEstado{Lista está<br/>abierta?}
    ValidarEstado -->|No| Error2[Error: Lista cerrada]
    ValidarEstado -->|Sí| TipoElemento{Tipo de<br/>Elemento?}

    TipoElemento -->|Receipt| ValidarReceipt{Receipt existe y está en lista?}
    TipoElemento -->|Guide| ValidarGuide{Guide existe y está en lista?}
    TipoElemento -->|WHrec| ValidarWHrec{WHrec existe y está en lista?}

    ValidarReceipt -->|No| Error3[Error: Receipt no encontrado]
    ValidarReceipt -->|Sí| RemoverReceipt["deliverylist.removeReceipt<br/>receipt.setDeliverylist null"]
    ValidarGuide -->|No| Error4[Error: Guide no encontrado]
    ValidarGuide -->|Sí| RemoverGuide["deliverylist.removeGuide<br/>guide.setDeliverylist null"]
    ValidarWHrec -->|No| Error5[Error: WHrec no encontrado]
    ValidarWHrec -->|Sí| RemoverWHrec["deliverylist.removeWhrec<br/>whrec.setDeliverylist null"]

    RemoverReceipt --> BuscarLineReceipt["Buscar DeliveryLine<br/>itemid receipt.id<br/>type receipt"]
    RemoverGuide --> BuscarLineGuide["Buscar DeliveryLine<br/>itemid guide.id<br/>type guide"]
    RemoverWHrec --> BuscarLineWHrec["Buscar DeliveryLine<br/>itemid whrec.id<br/>type whrec"]

    BuscarLineReceipt --> EliminarLineReceipt[Eliminar DeliveryLine]
    BuscarLineGuide --> EliminarLineGuide[Eliminar DeliveryLine]
    BuscarLineWHrec --> EliminarLineWHrec[Eliminar DeliveryLine]

    EliminarLineReceipt --> ValidarOldGuide{Receipt tiene oldGuide?}
    EliminarLineGuide --> LogRemoveGuide[Registrar en addlogs action REMOVEGUIDES]
    EliminarLineWHrec --> ValidarOldWHrec{Receipt tiene oldWHrec?}

    ValidarOldGuide -->|Sí| VerificarOtrosReceipts{¿Otros receipts con misma guide?}
    ValidarOldGuide -->|No| LogRemoveReceipt[Registrar en addlogs action REMOVEPIECES]
    ValidarOldWHrec -->|Sí| VerificarOtrosReceipts2{¿Otros receipts con mismo whrec?}
    ValidarOldWHrec -->|No| LogRemoveReceipt

    VerificarOtrosReceipts -->|No| EliminarLineGuide2[Eliminar DeliveryLine de la guide]
    VerificarOtrosReceipts -->|Sí| LogRemoveReceipt
    VerificarOtrosReceipts2 -->|No| EliminarLineWHrec2[Eliminar DeliveryLine del whrec]
    VerificarOtrosReceipts2 -->|Sí| LogRemoveReceipt

    EliminarLineGuide2 --> LogRemoveReceipt
    EliminarLineWHrec2 --> LogRemoveReceipt

    LogRemoveReceipt --> GuardarBD[Persistir cambios]
    LogRemoveGuide --> GuardarBD

    GuardarBD --> Fin([Elementos Quitados])

    style Start fill:#e1f5ff,color:#004085
    style Fin fill:#d4edda,color:#155724
    style Error1 fill:#f8d7da,color:#721c24
    style Error2 fill:#f8d7da,color:#721c24
    style Error3 fill:#f8d7da,color:#721c24
    style Error4 fill:#f8d7da,color:#721c24
    style Error5 fill:#f8d7da,color:#721c24
```

## Flujo Detallado: Entregar Lista

```mermaid
flowchart TD
    Start([Entregar Lista]) --> ValidarPermisos{Usuario tiene<br/>permisos?}
    ValidarPermisos -->|No| Error1[Error: Sin permisos]
    ValidarPermisos -->|Sí| ValidarExiste{Lista existe?}
    ValidarExiste -->|No| Error2[Error: Lista no encontrada]
    ValidarExiste -->|Sí| EstadoActual{Estado actual?}

    EstadoActual -->|delivered true| RevertirEntrega[Reversar entrega]
    EstadoActual -->|delivered false| ProcesarEntrega[Procesar entrega]

    RevertirEntrega --> LimpiarDatos1[Limpiar delicomment null delidate null delivered false]
    LimpiarDatos1 --> GuardarBD1[Persistir cambios]
    GuardarBD1 --> Fin1([Entrega Revertida])

    ProcesarEntrega --> RecibirFirma{¿Hay firma digital?}
    RecibirFirma -->|Sí| GuardarFirma[Guardar deliveredsigData Type Size image]
    RecibirFirma -->|No| RecibirImagen{¿Hay imagen final?}

    GuardarFirma --> RecibirImagen{¿Hay imagen final?}
    RecibirImagen -->|Sí| GuardarImagen[Guardar endimage]
    RecibirImagen -->|No| RecibirComentario{¿Hay comentario?}

    GuardarImagen --> RecibirComentario{¿Hay comentario?}
    RecibirComentario -->|Sí| GuardarComentario[Guardar delicomment]
    RecibirComentario -->|No| EstablecerFecha

    GuardarComentario --> EstablecerFecha[Establecer delidate now]
    EstablecerFecha --> MarcarEntregada[delivered true]

    MarcarEntregada --> ProcesarReceipts[Procesar Receipts]
    ProcesarReceipts --> ValidarFirmaReceipt{Receipt tiene firma propia?}
    ValidarFirmaReceipt -->|No| MarcarReceipt["receipt.delivered true<br/>receipt.delicomment comment<br/>receipt.delidate delidate"]
    ValidarFirmaReceipt -->|Sí| ProcesarWHrecs

    MarcarReceipt --> ValidarLocation{Processlocation emptydelivered?}
    ValidarLocation -->|Sí| LimpiarLocation[receipt.location null]
    ValidarLocation -->|No| ProcesarWHrecs

    LimpiarLocation --> ProcesarWHrecs[Procesar WHrecs]
    ProcesarWHrecs --> ValidarFirmaWHrec{WHrec tiene firma propia?}
    ValidarFirmaWHrec -->|No| MarcarWHrec["whrec.delivered true<br/>whrec.delicomment comment<br/>whrec.delidate delidate"]
    ValidarFirmaWHrec -->|Sí| ProcesarGuides

    MarcarWHrec --> MarcarReceiptsWHrec[Propagar a receipts del whrec]
    MarcarReceiptsWHrec --> ValidarLocationWHrec{Processlocation emptydelivered?}
    ValidarLocationWHrec -->|Sí| LimpiarLocationWHrec[whrec.location null]
    ValidarLocationWHrec -->|No| ProcesarGuides

    LimpiarLocationWHrec --> ProcesarGuides[Procesar Guides]
    ProcesarGuides --> ValidarFirmaGuide{Guide tiene firma propia?}
    ValidarFirmaGuide -->|No| MarcarGuide["guide.delivered true<br/>guide.delicomment comment<br/>guide.delidate delidate"]
    ValidarFirmaGuide -->|Sí| GuardarBD2

    MarcarGuide --> MarcarReceiptsGuide[Propagar a receipts de la guide]
    MarcarReceiptsGuide --> ValidarLocationGuide{Processlocation emptydelivered?}
    ValidarLocationGuide -->|Sí| LimpiarLocationGuide[guide.location null]
    ValidarLocationGuide -->|No| GuardarBD2

    LimpiarLocationGuide --> GuardarBD2[Persistir todos los cambios]
    GuardarBD2 --> Fin2([Entrega Completada])

    style Start fill:#e1f5ff
    style Fin1 fill:#fff3cd,color:#856404
    style Fin2 fill:#d4edda
    style Error1 fill:#f8d7da,color:#721c24
    style Error2 fill:#f8d7da,color:#721c24
```

## Flujo Detallado: Cerrar Lista

```mermaid
flowchart TD
    Start([Cerrar Lista]) --> ValidarPlan{Plan tiene<br/>hasdelivery?}
    ValidarPlan -->|No| Error1[Error: Plan no disponible]
    ValidarPlan -->|Sí| ValidarMain{Maincompany tiene<br/>hasdelivery?}
    ValidarMain -->|No| Error2[Error: Debe activar entregas]
    ValidarMain -->|Sí| ValidarExiste{Lista existe?}
    ValidarExiste -->|No| Error3[Error: Lista no encontrada]
    ValidarExiste -->|Sí| ValidarPermisos{Usuario tiene permisos?}
    ValidarPermisos -->|No| Error4[Error: Sin permisos]
    ValidarPermisos -->|Sí| ValidarElementos{¿Tiene elementos? guides OR whrecs OR receipts}
    ValidarElementos -->|No| Error5[Error: No se puede cerrar sin elementos]
    ValidarElementos -->|Sí| ValidarAbierta{¿Está abierta? isopen true}
    ValidarAbierta -->|No| Error6[Error: Ya está cerrada]
    ValidarAbierta -->|Sí| CerrarLista[Ejecutar close isopen false]
    CerrarLista --> CrearLog[Crear log acción CLOSE user fecha hora]
    CrearLog --> AgregarLog[Agregar a actionlogs]
    AgregarLog --> GuardarBD[Persistir cambios]
    GuardarBD --> Fin([Lista Cerrada])

    style Start fill:#e1f5ff,color:#004085
    style Fin fill:#d4edda,color:#155724
    style Error1 fill:#f8d7da,color:#721c24
    style Error2 fill:#f8d7da,color:#721c24
    style Error3 fill:#f8d7da,color:#721c24
    style Error4 fill:#f8d7da,color:#721c24
    style Error5 fill:#f8d7da,color:#721c24
    style Error6 fill:#f8d7da,color:#721c24
```

## Diagrama de Estados

```mermaid
stateDiagram-v2
    [*] --> CREADA: newAction createAction

    CREADA --> CREADA: Agregar elementos Quitar elementos

    CREADA --> CERRADA: closeAction isopen false

    CERRADA --> CREADA: reopenAction isopen true

    CREADA --> EJECUTADA: Cambio status EJECUTADA

    CREADA --> ENTREGADA: deliveredAction delivered true

    CERRADA --> ENTREGADA: deliveredAction delivered true

    ENTREGADA --> CREADA: deliveredAction revertir

    ENTREGADA --> CERRADA: deliveredAction revertir

    note right of CREADA
        Estado inicial
        isopen true
        status CREADA
        Permite agregar quitar
    end note

    note right of CERRADA
        Lista cerrada
        isopen false
        No permite agregar quitar
    end note

    note right of EJECUTADA
        Lista ejecutada
        status EJECUTADA
        No permite agregar
    end note

    note right of ENTREGADA
        Lista entregada
        delivered true
        Tiene firma y comentario
    end note
```

## Diagrama de Relaciones de Base de Datos

```mermaid
erDiagram
    DELIVERYLIST ||--o{ DELIVERYLINE : "tiene"
    DELIVERYLIST ||--o{ DELIVERYDOCUMENT : "tiene"
    DELIVERYLIST ||--o{ STATUSDELIVERYLIST : "tiene"
    DELIVERYLIST }o--|| AGENCY : "pertenece"
    DELIVERYLIST }o--|| MAINCOMPANY : "pertenece"
    DELIVERYLIST }o--o| USER : "asignado"
    DELIVERYLIST }o--o| VEHICLE : "asignado"

    DELIVERYLINE }o--|| DELIVERYLIST : "pertenece"
    DELIVERYLINE }o--|| MAINCOMPANY : "pertenece"

    DELIVERYDOCUMENT }o--|| DELIVERYLIST : "pertenece"
    DELIVERYDOCUMENT }o--|| MAINCOMPANY : "pertenece"
    DELIVERYDOCUMENT ||--o{ DELIVERYITEM : "tiene"

    STATUSDELIVERYLIST }o--|| DELIVERYLIST : "pertenece"
    STATUSDELIVERYLIST }o--o| STEPSTATUS : "tiene"
    STATUSDELIVERYLIST }o--o| CITY : "lugar"
    STATUSDELIVERYLIST }o--o| USER : "usuario"

    RECEIPT }o--o| DELIVERYLIST : "puede estar en"
    GUIDE }o--o| DELIVERYLIST : "puede estar en"
    WHREC }o--o| DELIVERYLIST : "puede estar en"

    DELIVERYLIST {
        int id PK
        string name
        string number
        datetime creationdate
        datetime exedate
        enum status CREADA_EJECUTADA
        boolean isopen
        boolean delivered
        datetime delidate
        string delicomment
        string driver
        boolean allagency
        boolean alldestination
        text actionlogs
        text addlogs
        text delilogs
        blob deliveredsigData
        string deliveredsigType
        int deliveredsigSize
        string deliveredsigimage
        string endimage
    }

    DELIVERYLINE {
        int id PK
        int deliverylist_id FK
        int maincompany_id FK
        enum type receipt_guide_whrec
        int itemid
        int orden
        boolean visited
    }

    DELIVERYDOCUMENT {
        int id PK
        int deliverylist_id FK
        int maincompany_id FK
        enum type receipt_guide_whrec
        int itemid
        datetime creationdate
        enum status delivery_noDelivery
        string comments
        string reason
        blob deliveredsigData
        string deliveredsigType
        int deliveredsigSize
        string deliveredsigimage
    }

    STATUSDELIVERYLIST {
        int id PK
        int delivery_id FK
        int step_id FK
        int place_id FK
        int user_id FK
        datetime date
        string comment
        boolean external
    }
```

## Resumen de Validaciones por Operación

```mermaid
flowchart LR
    A[Operación] --> B{Validaciones Comunes}
    B --> C[Plan hasdelivery]
    B --> D[Maincompany hasdelivery]
    B --> E[Permisos usuario]
    B --> F[Lista existe]

    A --> G{Crear}
    G --> H[Agencia asignada]

    A --> I{Agregar/Quitar}
    I --> J[Lista abierta]
    I --> K[Status != EJECUTADA]
    I --> L[Permisos agencia]

    A --> M{Entregar}
    M --> N[Lista existe]

    A --> O{Cerrar}
    O --> P[Tiene elementos]
    O --> Q[Está abierta]

    style A fill:#e1f5ff,color:#004085
    style B fill:#fff3cd,color:#856404
    style G fill:#d4edda,color:#155724
    style I fill:#d4edda,color:#155724
    style M fill:#d4edda,color:#155724
    style O fill:#d4edda,color:#155724
```
