Files
cloud-services/pkg/common/order_updated.go

232 lines
10 KiB
Go

package common
import (
"encoding/json"
"encoding/xml"
"time"
"github.com/fiskerinc/cloud-services/pkg/grpc/kafka_grpc"
)
type OrderUpdated struct {
XMLName xml.Name `xml:"VehicleOrderReplicate"`
Header HeaderArea `xml:"HeaderArea" validate:"required"`
VehicleOrder VehicleOrder `xml:"DataArea>VehicleOrder" validate:"required"`
}
type HeaderArea struct {
CreationDateTime CreationDateTime `xml:"CreationDateTime" json:"creation_date_time"`
MessageIdentifier string `xml:"MessageIdentifier" json:"message_identifier"`
InterfaceID int `xml:"InterfaceId" json:"interface_id"`
SourceSystem string `xml:"Sender>SourceSystem" json:"source_system"`
TargetSystem string `xml:"Sender>TargetSystem" json:"target_system"`
}
type VehicleOrder struct {
SpecID int `xml:"SpecId" json:"spec_id"`
OrderNumber int `xml:"VehicleOrderNumber" json:"order_number"`
MessageIdentifier string `xml:"-" json:"message_identifier"`
VehicleSpecification VehicleSpecification `xml:"VehicleSpecification" json:"vehicle_specification"`
}
type VehicleSpecification struct {
OrderIndicator string `xml:"OrderIndicator" json:"order_indicator"`
FleetOrderIndicator string `xml:"FleetOrderIndicator" json:"fleet_order_indicator"`
ProductionPhaseIndicator string `xml:"ProductionPhaseIndicator" json:"production_phase_indicator"`
VehicleIndicator string `xml:"VehicleIndicator" json:"vehicle_indicator"`
ManufacturingPlant string `xml:"ManufacturingPlant" json:"manufacturing_plant"`
ExpectedReferenceDate ExpectedReferenceDate `xml:"ExpectedReferenceDate" json:"expected_reference_date"`
ModelType string `xml:"ModelType" json:"model_type"`
ModelYearIndicator int `xml:"ModelYearIndicator" json:"model_year_indicator"`
ModelYear int `xml:"ModelYear" json:"model_year"`
SequenceNumber string `xml:"SequenceNumber" json:"sequence_number"`
VersionDuringModelYear int `xml:"VersionDuringModelYear" json:"version_during_model_year"`
VehicleModel string `xml:"VehicleModel" json:"vehicle_model"`
VinPrefix string `xml:"VinPrefix" json:"vin_prefix"`
VehicleFeatures []FeatureCodes `xml:"VehicleFeatures>FeatureCodes" json:"vehicle_features"`
DestinationCountry string `xml:"DestinationCountry" json:"destination_country"`
}
type FeatureCodes struct {
FamilyCode string `xml:"FamilyCode" json:"family_code"`
FeatureCode string `xml:"FeatureCode" json:"feature_code"`
}
type ExpectedReferenceDate struct {
time.Time
}
func (t *ExpectedReferenceDate) UnmarshalText(data []byte) error {
// Fractional seconds are handled implicitly by Parse.
var err error
t.Time, err = time.Parse("2006-01-02", string(data))
return err
}
func (t ExpectedReferenceDate) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
s := t.Format("2006-01-02")
return e.EncodeElement(s, start)
}
type CreationDateTime struct {
time.Time
}
func (t *CreationDateTime) UnmarshalText(data []byte) error {
// Fractional seconds are handled implicitly by Parse.
var err error
t.Time, err = time.Parse("2006-01-02T15:04", string(data))
return err
}
func (t CreationDateTime) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
s := t.Format("2006-01-02T15:04")
return e.EncodeElement(s, start)
}
// OrderUpdatedSwag is used ONLY to represent OrderUpdated in swagger.
type OrderUpdatedSwag struct {
Header struct {
CreationDateTime CreationDateTime `json:"CreationDateTime" swaggertype:"string"`
MessageIdentifier string `json:"MessageIdentifier"`
InterfaceID int `json:"InterfaceId"`
Sender struct {
SourceSystem string `json:"SourceSystem"`
TargetSystem string `json:"TargetSystem"`
} `json:"Sender"`
} `json:"HeaderArea" validate:"required"`
DataArea struct {
VehicleOrder struct {
SpecID int `json:"SpecId"`
OrderNumber int `json:"VehicleOrderNumber"`
VehicleSpecification struct {
OrderIndicator string `json:"OrderIndicator"`
FleetOrderIndicator string `json:"FleetOrderIndicator"`
ProductionPhaseIndicator string `json:"ProductionPhaseIndicator"`
VehicleIndicator string `json:"VehicleIndicator"`
ManufacturingPlant string `json:"ManufacturingPlant"`
ExpectedReferenceDate ExpectedReferenceDate `json:"ExpectedReferenceDate" swaggertype:"string"`
ModelType string `json:"ModelType"`
ModelYearIndicator int `json:"ModelYearIndicator"`
SequenceNumber string `json:"SequenceNumber"`
VehicleModel string `json:"VehicleModel"`
VinPrefix string `json:"VinPrefix"`
VehicleFeatures []struct {
FeatureCodes struct {
FamilyCode string `json:"FamilyCode" `
FeatureCode string `json:"FeatureCode"`
} `json:"FeatureCodes"`
} `json:"VehicleFeatures"`
DestinationCountry string `json:"DestinationCountry"`
} `json:"VehicleSpecification"`
} `json:"VehicleOrder" validate:"required"`
} `json:"DataArea"`
} // @name VehicleOrderReplicate
func OrderToGRPC(input MessageRawJSON) *kafka_grpc.GRPC_AttendantPayload {
grpcPayload := &kafka_grpc.GRPC_AttendantPayload{
Handler: input.Handler,
}
var order VehicleOrder
err := json.Unmarshal(input.Data, &order)
if err != nil {
return grpcPayload
}
orderObj := &kafka_grpc.Order{
VehicleSpecification: &kafka_grpc.VehicleSpecification{},
}
orderObj.VehicleSpecification.Date = order.VehicleSpecification.ExpectedReferenceDate.UnixMilli()
orderObj.MsgIdentifier = order.MessageIdentifier
orderObj.SpecId = int64(order.SpecID)
orderObj.VehicleSpecification.OrderId = order.VehicleSpecification.OrderIndicator
orderObj.VehicleSpecification.FOrderId = order.VehicleSpecification.FleetOrderIndicator
orderObj.VehicleSpecification.MfPlant = order.VehicleSpecification.ManufacturingPlant
orderObj.VehicleSpecification.DestCon = order.VehicleSpecification.DestinationCountry
orderObj.VehicleSpecification.ModelType = order.VehicleSpecification.ModelType
orderObj.VehicleSpecification.ProductId = order.VehicleSpecification.ProductionPhaseIndicator
orderObj.VehicleSpecification.Sn = order.VehicleSpecification.SequenceNumber
orderObj.VehicleSpecification.VehicleId = order.VehicleSpecification.VehicleIndicator
orderObj.VehicleSpecification.Model = order.VehicleSpecification.VehicleModel
orderObj.VehicleSpecification.VinPre = order.VehicleSpecification.VinPrefix
orderObj.VehicleSpecification.ModelYear = int64(order.VehicleSpecification.ModelYear)
orderObj.VehicleSpecification.ModelId = int64(order.VehicleSpecification.ModelYearIndicator)
orderObj.VehicleSpecification.Version = int64(order.VehicleSpecification.VersionDuringModelYear)
if len(order.VehicleSpecification.VehicleFeatures) > 0 {
var features []*kafka_grpc.FeatureCodes
for _, feature := range order.VehicleSpecification.VehicleFeatures {
features = append(features, &kafka_grpc.FeatureCodes{
FamilyCode: feature.FamilyCode,
FeatureCode: feature.FeatureCode,
})
}
orderObj.VehicleSpecification.Feature = features
}
payload := &kafka_grpc.GRPC_AttendantPayload_Order{
Order: orderObj,
}
grpcPayload.Data = payload
return grpcPayload
}
func GRPCToOrder(payload *kafka_grpc.GRPC_AttendantPayload) *VehicleOrder {
if payload.Data == nil {
return nil
}
data := payload.Data.(*kafka_grpc.GRPC_AttendantPayload_Order)
order := &VehicleOrder{}
order.OrderNumber = int(data.Order.OrderNo)
order.MessageIdentifier = data.Order.MsgIdentifier
order.SpecID = int(data.Order.SpecId)
order.VehicleSpecification = VehicleSpecification{}
if data.Order.VehicleSpecification != nil {
order.VehicleSpecification.DestinationCountry = data.Order.VehicleSpecification.DestCon
order.VehicleSpecification.FleetOrderIndicator = data.Order.VehicleSpecification.FOrderId
order.VehicleSpecification.FleetOrderIndicator = data.Order.VehicleSpecification.FOrderId
order.VehicleSpecification.ManufacturingPlant = data.Order.VehicleSpecification.MfPlant
order.VehicleSpecification.ModelType = data.Order.VehicleSpecification.ModelType
order.VehicleSpecification.ModelYear = int(data.Order.VehicleSpecification.ModelYear)
order.VehicleSpecification.ModelYearIndicator = int(data.Order.VehicleSpecification.ModelId)
order.VehicleSpecification.OrderIndicator = data.Order.VehicleSpecification.OrderId
order.VehicleSpecification.ProductionPhaseIndicator = data.Order.VehicleSpecification.ProductId
order.VehicleSpecification.FleetOrderIndicator = data.Order.VehicleSpecification.FOrderId
order.VehicleSpecification.SequenceNumber = data.Order.VehicleSpecification.Sn
order.VehicleSpecification.VehicleIndicator = data.Order.VehicleSpecification.VehicleId
order.VehicleSpecification.VehicleModel = data.Order.VehicleSpecification.Model
order.VehicleSpecification.VinPrefix = data.Order.VehicleSpecification.VinPre
order.VehicleSpecification.VersionDuringModelYear = int(data.Order.VehicleSpecification.Version)
seconds := data.Order.VehicleSpecification.Date / 1000
nanoseconds := (data.Order.VehicleSpecification.Date % 1000) * int64(time.Millisecond)
order.VehicleSpecification.ExpectedReferenceDate = ExpectedReferenceDate{time.Unix(seconds, nanoseconds)}
if data.Order.VehicleSpecification.Feature != nil && len(data.Order.VehicleSpecification.Feature) > 0 {
var features []FeatureCodes
for _, feature := range data.Order.VehicleSpecification.Feature {
features = append(features, FeatureCodes{
FamilyCode: feature.FamilyCode,
FeatureCode: feature.FeatureCode,
})
}
order.VehicleSpecification.VehicleFeatures = features
}
}
return order
}