okfn-brasil/serenata-de-amor

View on GitHub
jarbas/layers/elm/Reimbursement/Decoder.elm

Summary

Maintainability
Test Coverage
module Reimbursement.Decoder exposing (..)

import Array exposing (Array, fromList)
import Dict
import Internationalization.Types exposing (Language)
import Json.Decode exposing (Decoder, array, bool, float, int, keyValuePairs, list, nullable, string)
import Json.Decode.Extra exposing (date)
import Json.Decode.Pipeline exposing (decode, hardcoded, required)
import Reimbursement.Company.Model as CompanyModel
import Reimbursement.Model exposing (Model, Reimbursement, Results, results)
import Reimbursement.Receipt.Decoder as ReceiptDecoder
import Reimbursement.Receipt.Model as ReceiptModel
import Reimbursement.RelatedTable.Model as RelatedTable
import String


{-| From a query list of key/values get the page number:

    getPage [ ( "page", "42" ), ( "year", "2016" ) ]
    --> Just 42

    getPage [ ( "page", "foo bar" ) ]
    --> Nothing

    getPage [ ( "format", "json" ) ]
    --> Nothing

-}
getPage : List ( String, String ) -> Maybe Int
getPage query =
    query
        |> Dict.fromList
        |> Dict.get "page"
        |> Maybe.andThen (String.toInt >> Result.toMaybe)


decoder : Language -> Maybe String -> List ( String, String ) -> Decoder Results
decoder lang apiKey query =
    let
        currentPage : Int
        currentPage =
            query
                |> getPage
                |> Maybe.withDefault 1
    in
        decode Results
            |> required "results" (array <| singleDecoder lang apiKey)
            |> required "count" (nullable int)
            |> required "previous" (nullable string)
            |> required "next" (nullable string)
            |> hardcoded Nothing
            |> hardcoded currentPage
            |> hardcoded (Just currentPage)


singleDecoder : Language -> Maybe String -> Decoder Reimbursement
singleDecoder lang apiKey =
    let
        supplier : CompanyModel.Model
        supplier =
            CompanyModel.model
    in
        decode Reimbursement
            |> required "year" int
            |> required "document_id" int
            |> required "applicant_id" int
            |> required "total_value" (nullable float)
            |> required "total_net_value" float
            |> required "all_numbers" (list int)
            |> required "congressperson_id" (nullable int)
            |> required "congressperson_name" (nullable string)
            |> required "congressperson_document" (nullable int)
            |> required "state" (nullable string)
            |> required "party" (nullable string)
            |> required "term_id" (nullable int)
            |> required "term" (nullable int)
            |> required "subquota_number" int
            |> required "subquota_description" string
            |> required "subquota_group_id" (nullable int)
            |> required "subquota_group_description" (nullable string)
            |> required "supplier" string
            |> required "cnpj_cpf" (nullable string)
            |> required "document_type" int
            |> required "document_number" (nullable string)
            |> required "document_value" float
            |> required "issue_date" date
            |> required "month" int
            |> required "remark_value" (nullable float)
            |> required "installment" (nullable int)
            |> required "batch_number" (nullable int)
            |> required "passenger" (nullable string)
            |> required "leg_of_the_trip" (nullable string)
            |> required "probability" (nullable float)
            |> required "suspicions" (nullable <| keyValuePairs bool)
            |> required "rosies_tweet" (nullable string)
            |> required "receipt" (ReceiptDecoder.decoder lang)
            |> hardcoded { supplier | googleStreetViewApiKey = apiKey }
            |> hardcoded RelatedTable.model
            |> hardcoded RelatedTable.model


updateReimbursementLanguage : Language -> Reimbursement -> Reimbursement
updateReimbursementLanguage lang reimbursement =
    let
        receipt : ReceiptModel.Model
        receipt =
            reimbursement.receipt

        newReceipt : ReceiptModel.Model
        newReceipt =
            { receipt | lang = lang }

        supplier : CompanyModel.Model
        supplier =
            reimbursement.supplierInfo

        newCompany : CompanyModel.Model
        newCompany =
            { supplier | lang = lang }
    in
        { reimbursement | receipt = newReceipt, supplierInfo = newCompany }


updateLanguage : Language -> Model -> Model
updateLanguage lang model =
    let
        results : Results
        results =
            model.results

        newReimbursements : Array Reimbursement
        newReimbursements =
            Array.map (updateReimbursementLanguage lang) model.results.reimbursements

        newResults : Results
        newResults =
            { results | reimbursements = newReimbursements }
    in
        { model | lang = lang, results = newResults }


updateGoogleStreetViewApiKey : Maybe String -> Model -> Model
updateGoogleStreetViewApiKey key model =
    { model | googleStreetViewApiKey = key }