Abhängig vom Flag (CustomsRequired bzw. UXDimensionRequired) in der DA zugrundeliegenden Nachricht (PO oder VMI) müssen bestimmte Felder beim Import / Upload geprüft werden. Wenn das Flag auf true steht, müssen die Felder gefüllt sein.
Bei UX Dimensions müssen nicht immer alle Felder Pflichtfelder sein, sondern man muss schauen wie das Feld konfiguriert ist. Der Code kann sich wahrscheinlich an den von der UI anlehnen.
Zusätzlich muss geprüft werden:
Außerdem müssen die eingehenden(?) CSVs und XMLs bei PO und VMI Demand das Feld “CustomsRequired” enthalten.
CSV Upload Spec ist in dem Task AIRS-1474 enthalten:
https://tasks.supplyon.de/secure/attachment/26880/SD_AirSupply_Interfaces_DA_V_9.3.xlsx
Hints:
Attention: mandatory fields for UX dimensions (fields above marked in blue) may vary depending on the customer configuration in the TAIRFIELDCONFIG. This has to be considered for the validation
Folgende Tests wurden von meinen Änderungen betroffen und müssen nun repariert werden:
Nachdem die ASN importiert und validiert wurde, sollte man die richtige (interne!) UoMs setzen. Davor muss aber geprüft werden, ob vom alten Code wirklich interne UoMs verwendet werden.
Hilfreich:
ASNXMLExportHandler BigDecimal uxWeightInXML = XMLToolbox.getSubTagValueAsBigDecimal(uxElement, ASNXMLConstants.TAG_UX_GROSSWEIGHT, null); WeightUtil.UOM_CONVERTER_UNITS_WEIGHT targetWeightUoM = WeightUtil.UOM_CONVERTER_UNITS_WEIGHT.getUOMConverterUnit(uxModel.getUXWeightUOM()); uxModel.setGrossWeight(DimensionsUtil.convertFromUIToModel(targetWeightUoM.name(), uxWeightInXML));
Im ASNXMLImportHandler:
// TODO: check if it works for "non UX Dimensions" situations! // uxModel.setUXWeightUOM(WeightUtil.INTERNAL_GLOBAL_WEIGHT_UOM); // uxModel.setDimensionsUom(DimensionsUtil.INTERNAL_GLOBAL_DEFAULT_LENGTH_UOM);
…
Wichtige Klassen:
ASNCSVUploadModels ohne Bezug auf andere Datenstrukturen, d.h. die Validierungen, die von irgendwelchen Flags in der zugrundeliegenden Nachricht abhängig sind, laufen in der Web/ManagerEJB-Klasse ab (→ check it)-- Flags abfragen SELECT t.CCUSTOMSDECLARATIONREQUIRED, t.CPACKDETAILSREQUIRED, t.* FROM TAIRDEMANDS t WHERE CHEADERID=18168; -- Flags bei der Demand, die ich verwende, setzen UPDATE TAIRDEMANDS SET CCUSTOMSDECLARATIONREQUIRED=1, CPACKDETAILSREQUIRED=1 WHERE CHEADERID=18168; -- Flag CENABLEUXDIMENSIONS bei dem Profile 1 setzen UPDATE TCPPROFILES_SCD SET CENABLEUXDIMENSIONS=0 WHERE cProfileId=1; -- Misc SELECT t.CPROFILEID, t.* FROM TCONTROLPOINT_SCD t WHERE cCPId=101883; SELECT t.CPROFILEID, t.* FROM TCPPROFILES_SCD t;
Die Felder, die für die Validierung von UXs notwendig sind werden in ASNValidations.getUxMandatoryFields() hinzugefügt.
Die Felder, die für die Validierung von UEs notwendig sind werden in ASNValidations.getUEMandatoryFields() hinzugefügt.
Die Gewichte der UXs werden momentan “nicht konsequent” berechnet. Um dies zu korrigieren am besten die Verwendungen von UXModel.setUXWeightUOM() und UXModel.setGrossWeightUom() anschauen (z.B. auch die Verwendung von ASNWeightModel.setWeightUoM()).
default_xx.properties
# Für AIRS-1472: airsupply.asn.csv.error.uxlengthuom=$$P$$Empty or invalid UoM for UX length in line %s1, position %s2. airsupply.asn.csv.error.uxheightuom=$$P$$Empty or invalid UoM for UX height in line %s1, position %s2. airsupply.asn.csv.error.uxwidthuom=$$P$$Empty or invalid UoM for UX width in line %s1, position %s2. airsupply.asn.csv.error.uxgrossweightuom=$$P$$Empty or invalid UoM for UX gross weight in line %s1, position %s2. airsupply.asn.csv.error.uenetweightuom=$$P$$Empty or invalid UoM for UE net weight in line %s1, position %s2. airsupply.asn.validation.business.c450.9=$$P$$C450.9 - CUST.MATNR\: %s7 /PO/VMI REF, ITEM, PO SL\: %s4 , %s5 , %s6 /UE\: %s3 /UX\: %s2 /DA ID\: %s1 - Net weight UoM is missing. As the flag for 'Customs Declaration Required' is set to TRUE in the Customer PO this value has to be declared in the associated UE. # Für AIRS- airsupply.asn.ue.column.netweight.withoutuom=$$P$$Net weight airsupply.asn.ue.column.netweightuom=$$P$$Net weight UoM airsupply.asn.uxdimensions.column.weightuom=$$P$$Weight UoM # Für AIRS-1532 Enhance DA full download uoms.in=$$P$$in uoms.ft=$$P$$ft uoms.mm=$$P$$mm uoms.cm=$$P$$cm uoms.m=$$P$$m uoms.kg=$$P$$kg uoms.lb=$$P$$lb
SQL (es hat sich herausgestellt, dass dieses Skript nicht notwendig ist, da GrossWeightUoM ein “virtuelles” Feld ist, das nur für Import und CSV Upload notwendig ist):
INSERT INTO TAIRFIELDCONFIG ( CCUSTOMERCPID, CCUSTOMERCPPROFILEID, CPROCESS, CFIELDNAME, CMANDATORY, CDISPLAYABLE, CDEFAULTDISPLAY, CSORTING, CPROCESSTRANSFER, CFORMATPATTERN, CEDITABLE ) SELECT '-1000','-1','DA-UXDimensions','GrossWeightUom','1','1','1','11','0',NULL,'1' FROM DUAL WHERE NOT EXISTS ( SELECT * FROM TAIRFIELDCONFIG WHERE CCUSTOMERCPID=-1000 AND CCUSTOMERCPPROFILEID=-1 AND cProcess='DA-UXDimensions' AND cFieldName = 'GrossWeightUom');
Die UoMs berücksichtigen:
Der folgende Code wurde von mir geschrieben, wird aber nicht mehr verwendet, da jetzt immer Zentimeter und Kilogramm bei den Brexit Feldern als UoMs verwendet werden.
// the same utility method is used on the UI too String grossWeightUom = ASNWebUtil.getWeightUoM(sasUserContext, asnModel); WeightConverter converter = new WeightConverter.Builder() .setSourceUom(WeightUtil.INTERNAL_GLOBAL_WEIGHT_UOM) .setTargetUom(WeightUtil.getUnitOfMeasure(grossWeightUom)).build(); BigDecimal converted = converter.convertAndRound(uxModel.getGrossWeight()); csvModel.setGrossWeight(converted); String translatedDimensionsUom = DimensionsUtil.getTranslatedUserDimensionUom(asnModel.getCustomerCPId(), sasUserContext); csvModel.setLength(DimensionsUtil.convertFromModelToUi(sasUserContext, asnModel.getCustomerCPId(), uxModel.getLength())); csvModel.setLengthUom(translatedDimensionsUom); csvModel.setWidth(DimensionsUtil.convertFromModelToUi(sasUserContext, asnModel.getCustomerCPId(), uxModel.getWidth())); csvModel.setWidthUom(translatedDimensionsUom); csvModel.setHeight(DimensionsUtil.convertFromModelToUi(sasUserContext, asnModel.getCustomerCPId(), uxModel.getHeight())); csvModel.setHeightUom(translatedDimensionsUom);