All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.dreceiptx.receipt.serialization.json.LineItemDeserializer Maven / Gradle / Ivy

There is a newer version: 1.16.4
Show newest version
/*
 * Copyright 2016 Digital Receipt Exchange Limited
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package net.dreceiptx.receipt.serialization.json;


import com.google.gson.*;
import net.dreceiptx.receipt.allowanceCharge.ReceiptAllowanceCharge;
import net.dreceiptx.receipt.common.DespatchInformation;
import net.dreceiptx.receipt.common.LocationInformation;
import net.dreceiptx.receipt.common.Measurement.TradeItemMeasurements;
import net.dreceiptx.receipt.ecom.AVP;
import net.dreceiptx.receipt.lineitem.TradeItemDescriptionInformation;
import net.dreceiptx.receipt.lineitem.TransactionalTradeItemType;
import net.dreceiptx.receipt.lineitem.*;
import net.dreceiptx.receipt.tax.Tax;
import net.dreceiptx.receipt.validation.ReceiptDeserializationException;

import java.lang.reflect.Type;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

public class LineItemDeserializer implements JsonDeserializer
{
    private transient TransactionalTradeItemType _transactionalTradeItemType = null;
    private TradeItemDescriptionInformation _tradeItemDescriptionInformation = null;
    private transient String _transactionalTradeItemCode = null;
    private TradeItemIdentification _tradeItemIdentification = new TradeItemIdentification();
    private LineItemFactory _lineItemFactory = new LineItemFactory();
    
    @Override
    public LineItem deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext ctx) throws JsonParseException
    {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
        
        JsonObject lineItemObject = (JsonObject) json;
        
        LineItem lineItem = null;
        
        try{
            //Extract the main components for the standard to create the LineItem
            //TODO: Change this. Can get as BigDecimal rather than Double
            Double quantity = lineItemObject.get("invoicedQuantity").getAsDouble();
            Double price = lineItemObject.get("itemPriceExclusiveAllowancesCharges").getAsDouble();
            //Get the TradeItem detail
            JsonObject transactionalTradeItemObject =lineItemObject.get("transactionalTradeItem").getAsJsonObject();
            //Firstly, get the TradeItemIdentification data from the data to help create the lineitem
            if(transactionalTradeItemObject.has("additionalTradeItemIdentification")){
                JsonArray additionalTradeItemIdentifications = transactionalTradeItemObject.get("additionalTradeItemIdentification").getAsJsonArray();
                for(int i = 0; i < additionalTradeItemIdentifications.size(); i++)
                {
                    JsonObject additionalTradeItemIdentificationObject = additionalTradeItemIdentifications.get(i).getAsJsonObject();
                    _tradeItemIdentification.add(additionalTradeItemIdentificationObject.get("additionalTradeItemIdentificationType").getAsString(), 
                            additionalTradeItemIdentificationObject.get("additionalTradeItemIdentificationValue").getAsString());
                } 
            }
            
            String DRX_LINEITEM_TYPE = _tradeItemIdentification.get(LineItem.LineItemTypeIdentifier, StandardLineItem.LineItemTypeValue);

            if(transactionalTradeItemObject.has("tradeItemDescriptionInformation")){
                TradeItemDescriptionInformation tradeItemDescriptionInformation = 
                        new Gson().fromJson(transactionalTradeItemObject.get("tradeItemDescriptionInformation").getAsJsonObject(), TradeItemDescriptionInformation.class);
                lineItem = _lineItemFactory.createLineItem(DRX_LINEITEM_TYPE, tradeItemDescriptionInformation, quantity, price);
            }else{
                throw new ReceiptDeserializationException("TradeItemDescriptionInformation is required, unsupported Digital Receipt format");
            }

            if(transactionalTradeItemObject.has("gtin")){
                String gtin = transactionalTradeItemObject.get("gtin").getAsString();
                lineItem.setTransactionalTradeItemType(TransactionalTradeItemType.GTIN, gtin);

            }

            //Add the TradeItemIdentification details to the receipt
            lineItem.setTradeItemIdentification(_tradeItemIdentification);
            lineItem.setLineItemId(lineItemObject.get("lineItemNumber").getAsInt());

            if(transactionalTradeItemObject.has("tradeItemMeasurements")){
                lineItem.setTradeItemMeasurements((TradeItemMeasurements) ctx.deserialize(transactionalTradeItemObject.get("tradeItemMeasurements"), TradeItemMeasurements.class));
            }
            
            if(lineItemObject.get("creditLineIndicator").getAsBoolean()){
                lineItem.setReturnOrExchange();
            }
            
            if(transactionalTradeItemObject.has("transactionalItemData")){
                JsonObject transactionalItemData = transactionalTradeItemObject.get("transactionalItemData").getAsJsonObject();
                if(transactionalItemData.has("batchNumber")){
                    lineItem.setBatchNumber(transactionalItemData.get("batchNumber").getAsString());  
                }
                if(transactionalItemData.has("serialNumber")){
                    lineItem.setSerialNumber(transactionalItemData.get("serialNumber").getAsString());  
                }
            }
            
            if(lineItemObject.has("invoiceLineTaxInformation")){
                JsonArray invoiceLineTaxInformation = lineItemObject.getAsJsonArray("invoiceLineTaxInformation");
                for(int i = 0; i < invoiceLineTaxInformation.size(); i++)
                {
                    lineItem.addTax((Tax) ctx.deserialize(invoiceLineTaxInformation.get(i), Tax.class));
                }
            }

            if(lineItemObject.has("invoiceAllowanceCharge")){
                JsonArray invoiceAllowanceCharges = lineItemObject.getAsJsonArray("invoiceAllowanceCharge");
                for(int i = 0; i < invoiceAllowanceCharges.size(); i++)
                {
                    lineItem.addAllowanceOrCharge((ReceiptAllowanceCharge) ctx.deserialize(invoiceAllowanceCharges.get(i), ReceiptAllowanceCharge.class));
                }
            }

            if(lineItemObject.has("note")){
                lineItem.setNote(lineItemObject.get("note").getAsString());
            }
            
            if(lineItemObject.has("billingCostCentre")){
                JsonObject billingCostCentre = lineItemObject.get("billingCostCentre").getAsJsonObject();
                lineItem.setBillingCostCentre(billingCostCentre.get("entityIdentification").getAsString());  
            }

            if(lineItemObject.has("shipFrom")){
                lineItem.setOriginInformation((LocationInformation) ctx.deserialize(lineItemObject.get("shipFrom"), LocationInformation.class));
            }
            if(lineItemObject.has("shipTo")){
                lineItem.setDestinationInformation((LocationInformation) ctx.deserialize(lineItemObject.get("shipTo"), LocationInformation.class));
            }

            if(lineItemObject.has("despatchInformation")){
                lineItem.setDespatchInformation((DespatchInformation) ctx.deserialize(lineItemObject.get("despatchInformation"), DespatchInformation.class));
            }

            //Get any custom data sent
            if(lineItemObject.has("avpList")){
                JsonArray avpList = lineItemObject.get("avpList").getAsJsonArray();
                for(int i = 0; i < avpList.size(); i++)
                {
                    lineItem.addEcomAVP((AVP) ctx.deserialize(avpList.get(i).getAsJsonObject(), AVP.class));
                }
            }
            
        }catch(Exception e){
            //TODO: Add error handling
            String error = e.toString();
            String otherError = e.getMessage();
        }
        
        return lineItem;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy