Search in sources :

Example 21 with ETriState

use of com.helger.commons.state.ETriState in project en16931-cii2ubl by phax.

the class CIIToUBL23Converter method convertToCreditNote.

@Nullable
public CreditNoteType convertToCreditNote(@Nonnull final CrossIndustryInvoiceType aCIICreditNote, @Nonnull final ErrorList aErrorList) {
    ValueEnforcer.notNull(aCIICreditNote, "CIICreditNote");
    ValueEnforcer.notNull(aErrorList, "ErrorList");
    final ExchangedDocumentType aED = aCIICreditNote.getExchangedDocument();
    final SupplyChainTradeTransactionType aSCTT = aCIICreditNote.getSupplyChainTradeTransaction();
    if (aSCTT == null) {
        // Mandatory element
        return null;
    }
    final HeaderTradeAgreementType aHeaderAgreement = aSCTT.getApplicableHeaderTradeAgreement();
    final HeaderTradeDeliveryType aHeaderDelivery = aSCTT.getApplicableHeaderTradeDelivery();
    final HeaderTradeSettlementType aHeaderSettlement = aSCTT.getApplicableHeaderTradeSettlement();
    if (aHeaderAgreement == null || aHeaderDelivery == null || aHeaderSettlement == null) {
        // All mandatory elements
        return null;
    }
    final CreditNoteType aUBLCreditNote = new CreditNoteType();
    if (false)
        aUBLCreditNote.setUBLVersionID(UBL_VERSION);
    if (StringHelper.hasText(getCustomizationID()))
        aUBLCreditNote.setCustomizationID(getCustomizationID());
    if (StringHelper.hasText(getProfileID()))
        aUBLCreditNote.setProfileID(getProfileID());
    if (aED != null)
        aUBLCreditNote.setID(aED.getIDValue());
    // Mandatory supplier
    final SupplierPartyType aUBLSupplier = new SupplierPartyType();
    aUBLCreditNote.setAccountingSupplierParty(aUBLSupplier);
    // Mandatory customer
    final CustomerPartyType aUBLCustomer = new CustomerPartyType();
    aUBLCreditNote.setAccountingCustomerParty(aUBLCustomer);
    // IssueDate
    {
        LocalDate aIssueDate = null;
        if (aED != null && aED.getIssueDateTime() != null)
            aIssueDate = _parseDate(aED.getIssueDateTime().getDateTimeString(), aErrorList);
        if (aIssueDate != null)
            aUBLCreditNote.setIssueDate(aIssueDate);
    }
    // DueDate
    {
        LocalDate aDueDate = null;
        for (final TradePaymentTermsType aPaymentTerms : aHeaderSettlement.getSpecifiedTradePaymentTerms()) if (aPaymentTerms.getDueDateDateTime() != null) {
            aDueDate = _parseDate(aPaymentTerms.getDueDateDateTime().getDateTimeString(), aErrorList);
            if (aDueDate != null)
                break;
        }
        if (aDueDate != null)
            aUBLCreditNote.setDueDate(aDueDate);
    }
    // CreditNoteTypeCode
    if (aED != null)
        aUBLCreditNote.setCreditNoteTypeCode(aED.getTypeCodeValue());
    // Note
    if (aED != null)
        for (final un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._100.NoteType aEDNote : aED.getIncludedNote()) ifNotNull(aUBLCreditNote::addNote, _copyNote(aEDNote));
    // TaxPointDate
    for (final TradeTaxType aTradeTax : aHeaderSettlement.getApplicableTradeTax()) {
        if (aTradeTax.getTaxPointDate() != null) {
            final LocalDate aTaxPointDate = _parseDate(aTradeTax.getTaxPointDate().getDateString(), aErrorList);
            if (aTaxPointDate != null) {
                // Use the first tax point date only
                aUBLCreditNote.setTaxPointDate(aTaxPointDate);
                break;
            }
        }
    }
    // DocumentCurrencyCode
    final String sDefaultCurrencyCode = aHeaderSettlement.getInvoiceCurrencyCodeValue();
    aUBLCreditNote.setDocumentCurrencyCode(sDefaultCurrencyCode);
    // TaxCurrencyCode
    if (aHeaderSettlement.getTaxCurrencyCodeValue() != null) {
        aUBLCreditNote.setTaxCurrencyCode(aHeaderSettlement.getTaxCurrencyCodeValue());
    }
    // AccountingCost
    for (final TradeAccountingAccountType aAccount : aHeaderSettlement.getReceivableSpecifiedTradeAccountingAccount()) {
        final String sID = aAccount.getIDValue();
        if (StringHelper.hasText(sID)) {
            // Use the first ID
            aUBLCreditNote.setAccountingCost(sID);
            break;
        }
    }
    // BuyerReferences
    if (aHeaderAgreement.getBuyerReferenceValue() != null) {
        aUBLCreditNote.setBuyerReference(aHeaderAgreement.getBuyerReferenceValue());
    }
    // CreditNotePeriod
    {
        final SpecifiedPeriodType aSPT = aHeaderSettlement.getBillingSpecifiedPeriod();
        if (aSPT != null) {
            final DateTimeType aStartDT = aSPT.getStartDateTime();
            final DateTimeType aEndDT = aSPT.getEndDateTime();
            if (aStartDT != null && aEndDT != null) {
                final PeriodType aUBLPeriod = new PeriodType();
                aUBLPeriod.setStartDate(_parseDate(aStartDT.getDateTimeString(), aErrorList));
                aUBLPeriod.setEndDate(_parseDate(aEndDT.getDateTimeString(), aErrorList));
                aUBLCreditNote.addInvoicePeriod(aUBLPeriod);
            }
        }
    }
    // OrderReference
    {
        final OrderReferenceType aUBLOrderRef = _createUBLOrderRef(aHeaderAgreement.getBuyerOrderReferencedDocument(), aHeaderAgreement.getSellerOrderReferencedDocument());
        aUBLCreditNote.setOrderReference(aUBLOrderRef);
    }
    // BillingReference
    {
        final DocumentReferenceType aUBLDocRef = _convertDocumentReference(aHeaderSettlement.getInvoiceReferencedDocument(), aErrorList);
        if (aUBLDocRef != null) {
            final BillingReferenceType aUBLBillingRef = new BillingReferenceType();
            aUBLBillingRef.setCreditNoteDocumentReference(aUBLDocRef);
            aUBLCreditNote.addBillingReference(aUBLBillingRef);
        }
    }
    // DespatchDocumentReference
    {
        final DocumentReferenceType aUBLDocRef = _convertDocumentReference(aHeaderDelivery.getDespatchAdviceReferencedDocument(), aErrorList);
        if (aUBLDocRef != null)
            aUBLCreditNote.addDespatchDocumentReference(aUBLDocRef);
    }
    // ReceiptDocumentReference
    {
        final DocumentReferenceType aUBLDocRef = _convertDocumentReference(aHeaderDelivery.getReceivingAdviceReferencedDocument(), aErrorList);
        if (aUBLDocRef != null)
            aUBLCreditNote.addReceiptDocumentReference(aUBLDocRef);
    }
    // OriginatorDocumentReference
    {
        for (final ReferencedDocumentType aRD : aHeaderAgreement.getAdditionalReferencedDocument()) {
            // Use for "Tender or lot reference" with TypeCode "50"
            if (isOriginatorDocumentReferenceTypeCode(aRD.getTypeCodeValue())) {
                final DocumentReferenceType aUBLDocRef = _convertDocumentReference(aRD, aErrorList);
                if (aUBLDocRef != null)
                    aUBLCreditNote.addOriginatorDocumentReference(aUBLDocRef);
            }
        }
    }
    // ContractDocumentReference
    {
        final DocumentReferenceType aUBLDocRef = _convertDocumentReference(aHeaderAgreement.getContractReferencedDocument(), aErrorList);
        if (aUBLDocRef != null)
            aUBLCreditNote.addContractDocumentReference(aUBLDocRef);
    }
    // AdditionalDocumentReference
    {
        for (final ReferencedDocumentType aRD : aHeaderAgreement.getAdditionalReferencedDocument()) {
            // Except OriginatorDocumentReference
            if (!isOriginatorDocumentReferenceTypeCode(aRD.getTypeCodeValue())) {
                final DocumentReferenceType aUBLDocRef = _convertDocumentReference(aRD, aErrorList);
                if (aUBLDocRef != null)
                    aUBLCreditNote.addAdditionalDocumentReference(aUBLDocRef);
            }
        }
    }
    // ProjectReference
    {
        final ProcuringProjectType aSpecifiedProcuring = aHeaderAgreement.getSpecifiedProcuringProject();
        if (aSpecifiedProcuring != null) {
            final String sID = aSpecifiedProcuring.getIDValue();
            if (StringHelper.hasText(sID)) {
                final ProjectReferenceType aUBLProjectRef = new ProjectReferenceType();
                aUBLProjectRef.setID(sID);
                aUBLCreditNote.addProjectReference(aUBLProjectRef);
            }
        }
    }
    // Supplier Party
    {
        final TradePartyType aSellerParty = aHeaderAgreement.getSellerTradeParty();
        if (aSellerParty != null) {
            final PartyType aUBLParty = _convertParty(aSellerParty, true);
            for (final TaxRegistrationType aTaxRegistration : aSellerParty.getSpecifiedTaxRegistration()) {
                final PartyTaxSchemeType aUBLPartyTaxScheme = _convertPartyTaxScheme(aTaxRegistration);
                if (aUBLPartyTaxScheme != null)
                    aUBLParty.addPartyTaxScheme(aUBLPartyTaxScheme);
            }
            final PartyLegalEntityType aUBLPartyLegalEntity = _convertPartyLegalEntity(aSellerParty);
            if (aUBLPartyLegalEntity != null)
                aUBLParty.addPartyLegalEntity(aUBLPartyLegalEntity);
            final ContactType aUBLContact = _convertContact(aSellerParty);
            if (aUBLContact != null)
                aUBLParty.setContact(aUBLContact);
            aUBLSupplier.setParty(aUBLParty);
        }
    }
    // Customer Party
    {
        final TradePartyType aBuyerParty = aHeaderAgreement.getBuyerTradeParty();
        if (aBuyerParty != null) {
            final PartyType aUBLParty = _convertParty(aBuyerParty, false);
            for (final TaxRegistrationType aTaxRegistration : aBuyerParty.getSpecifiedTaxRegistration()) {
                final PartyTaxSchemeType aUBLPartyTaxScheme = _convertPartyTaxScheme(aTaxRegistration);
                if (aUBLPartyTaxScheme != null)
                    aUBLParty.addPartyTaxScheme(aUBLPartyTaxScheme);
            }
            final PartyLegalEntityType aUBLPartyLegalEntity = _convertPartyLegalEntity(aBuyerParty);
            if (aUBLPartyLegalEntity != null)
                aUBLParty.addPartyLegalEntity(aUBLPartyLegalEntity);
            final ContactType aUBLContact = _convertContact(aBuyerParty);
            if (aUBLContact != null)
                aUBLParty.setContact(aUBLContact);
            aUBLCustomer.setParty(aUBLParty);
        }
    }
    // Payee Party
    {
        final TradePartyType aPayeeParty = aHeaderSettlement.getPayeeTradeParty();
        if (aPayeeParty != null) {
            final PartyType aUBLParty = _convertParty(aPayeeParty, false);
            for (final TaxRegistrationType aTaxRegistration : aPayeeParty.getSpecifiedTaxRegistration()) {
                final PartyTaxSchemeType aUBLPartyTaxScheme = _convertPartyTaxScheme(aTaxRegistration);
                if (aUBLPartyTaxScheme != null)
                    aUBLParty.addPartyTaxScheme(aUBLPartyTaxScheme);
            }
            // validation rules warning
            if (false) {
                final PartyLegalEntityType aUBLPartyLegalEntity = _convertPartyLegalEntity(aPayeeParty);
                if (aUBLPartyLegalEntity != null)
                    aUBLParty.addPartyLegalEntity(aUBLPartyLegalEntity);
            }
            final ContactType aUBLContact = _convertContact(aPayeeParty);
            if (aUBLContact != null)
                aUBLParty.setContact(aUBLContact);
            aUBLCreditNote.setPayeeParty(aUBLParty);
        }
    }
    // Tax Representative Party
    {
        final TradePartyType aTaxRepresentativeParty = aHeaderAgreement.getSellerTaxRepresentativeTradeParty();
        if (aTaxRepresentativeParty != null) {
            final PartyType aUBLParty = _convertParty(aTaxRepresentativeParty, false);
            for (final TaxRegistrationType aTaxRegistration : aTaxRepresentativeParty.getSpecifiedTaxRegistration()) {
                final PartyTaxSchemeType aUBLPartyTaxScheme = _convertPartyTaxScheme(aTaxRegistration);
                if (aUBLPartyTaxScheme != null)
                    aUBLParty.addPartyTaxScheme(aUBLPartyTaxScheme);
            }
            // validation rules warning
            if (false) {
                final PartyLegalEntityType aUBLPartyLegalEntity = _convertPartyLegalEntity(aTaxRepresentativeParty);
                if (aUBLPartyLegalEntity != null)
                    aUBLParty.addPartyLegalEntity(aUBLPartyLegalEntity);
            }
            final ContactType aUBLContact = _convertContact(aTaxRepresentativeParty);
            if (aUBLContact != null)
                aUBLParty.setContact(aUBLContact);
            aUBLCreditNote.setTaxRepresentativeParty(aUBLParty);
        }
    }
    // Delivery
    {
        final TradePartyType aShipToParty = aHeaderDelivery.getShipToTradeParty();
        if (aShipToParty != null) {
            final DeliveryType aUBLDelivery = new DeliveryType();
            final SupplyChainEventType aSCE = aHeaderDelivery.getActualDeliverySupplyChainEvent();
            if (aSCE != null) {
                final DateTimeType aODT = aSCE.getOccurrenceDateTime();
                if (aODT != null)
                    aUBLDelivery.setActualDeliveryDate(_parseDate(aODT.getDateTimeString(), aErrorList));
            }
            final oasis.names.specification.ubl.schema.xsd.commonaggregatecomponents_23.LocationType aUBLDeliveryLocation = new oasis.names.specification.ubl.schema.xsd.commonaggregatecomponents_23.LocationType();
            boolean bUseLocation = false;
            final oasis.names.specification.ubl.schema.xsd.commonbasiccomponents_23.IDType aUBLID = _extractFirstPartyID(aShipToParty);
            if (aUBLID != null) {
                aUBLDeliveryLocation.setID(aUBLID);
                bUseLocation = true;
            }
            final TradeAddressType aPostalAddress = aShipToParty.getPostalTradeAddress();
            if (aPostalAddress != null) {
                aUBLDeliveryLocation.setAddress(_convertPostalAddress(aPostalAddress));
                bUseLocation = true;
            }
            if (bUseLocation)
                aUBLDelivery.setDeliveryLocation(aUBLDeliveryLocation);
            final TextType aName = aShipToParty.getName();
            if (aName != null) {
                final PartyType aUBLDeliveryParty = new PartyType();
                final PartyNameType aUBLPartyName = new PartyNameType();
                aUBLPartyName.setName(_copyName(aName, new NameType()));
                aUBLDeliveryParty.addPartyName(aUBLPartyName);
                aUBLDelivery.setDeliveryParty(aUBLDeliveryParty);
            }
            aUBLCreditNote.addDelivery(aUBLDelivery);
        }
    }
    // Payment means
    {
        for (final TradeSettlementPaymentMeansType aPaymentMeans : aHeaderSettlement.getSpecifiedTradeSettlementPaymentMeans()) {
            _convertPaymentMeans(aHeaderSettlement, aPaymentMeans, x -> _addPartyID(x, aUBLCreditNote.getAccountingSupplierParty().getParty()), aUBLCreditNote::addPaymentMeans, aErrorList);
            // Allowed again in 1.2.1: exactly 2
            if (false)
                // Since v1.2.0 only one is allowed
                if (true)
                    break;
        }
    }
    // Payment Terms
    {
        for (final TradePaymentTermsType aPaymentTerms : aHeaderSettlement.getSpecifiedTradePaymentTerms()) {
            final PaymentTermsType aUBLPaymenTerms = new PaymentTermsType();
            for (final TextType aDesc : aPaymentTerms.getDescription()) ifNotNull(aUBLPaymenTerms::addNote, _copyNote(aDesc));
            if (aUBLPaymenTerms.hasNoteEntries())
                aUBLCreditNote.addPaymentTerms(aUBLPaymenTerms);
        }
    }
    // Allowance Charge
    {
        for (final TradeAllowanceChargeType aAllowanceCharge : aHeaderSettlement.getSpecifiedTradeAllowanceCharge()) {
            ETriState eIsCharge = ETriState.UNDEFINED;
            if (aAllowanceCharge.getChargeIndicator() != null)
                eIsCharge = _parseIndicator(aAllowanceCharge.getChargeIndicator(), aErrorList);
            else
                aErrorList.add(_buildError(new String[] { "CrossIndustryCreditNote", "SupplyChainTradeTransaction", "ApplicableHeaderTradeSettlement", "SpecifiedTradeAllowanceCharge" }, "Failed to determine if SpecifiedTradeAllowanceCharge is an Allowance or a Charge"));
            if (eIsCharge.isDefined()) {
                final AllowanceChargeType aUBLAllowanceCharge = new AllowanceChargeType();
                aUBLAllowanceCharge.setChargeIndicator(eIsCharge.getAsBooleanValue());
                _copyAllowanceCharge(aAllowanceCharge, aUBLAllowanceCharge, sDefaultCurrencyCode);
                aUBLCreditNote.addAllowanceCharge(aUBLAllowanceCharge);
            }
        }
    }
    final TradeSettlementHeaderMonetarySummationType aSTSHMS = aHeaderSettlement.getSpecifiedTradeSettlementHeaderMonetarySummation();
    // TaxTotal
    {
        TaxTotalType aUBLTaxTotal = null;
        if (aSTSHMS != null && aSTSHMS.hasTaxTotalAmountEntries()) {
            // For all currencies
            for (final AmountType aTaxTotalAmount : aSTSHMS.getTaxTotalAmount()) {
                final TaxTotalType aUBLCurTaxTotal = new TaxTotalType();
                aUBLCurTaxTotal.setTaxAmount(_copyAmount(aTaxTotalAmount, new TaxAmountType(), sDefaultCurrencyCode));
                aUBLCreditNote.addTaxTotal(aUBLCurTaxTotal);
                if (aUBLTaxTotal == null) {
                    // Use the first one
                    aUBLTaxTotal = aUBLCurTaxTotal;
                }
            }
        } else {
            // Mandatory in UBL
            final TaxAmountType aUBLTaxAmount = new TaxAmountType();
            aUBLTaxAmount.setValue(BigDecimal.ZERO);
            aUBLTaxAmount.setCurrencyID(sDefaultCurrencyCode);
            aUBLTaxTotal = new TaxTotalType();
            aUBLTaxTotal.setTaxAmount(aUBLTaxAmount);
            aUBLCreditNote.addTaxTotal(aUBLTaxTotal);
        }
        for (final TradeTaxType aTradeTax : aHeaderSettlement.getApplicableTradeTax()) {
            final TaxSubtotalType aUBLTaxSubtotal = new TaxSubtotalType();
            if (aTradeTax.hasBasisAmountEntries()) {
                aUBLTaxSubtotal.setTaxableAmount(_copyAmount(aTradeTax.getBasisAmountAtIndex(0), new TaxableAmountType(), sDefaultCurrencyCode));
            }
            if (aTradeTax.hasCalculatedAmountEntries()) {
                aUBLTaxSubtotal.setTaxAmount(_copyAmount(aTradeTax.getCalculatedAmountAtIndex(0), new TaxAmountType(), sDefaultCurrencyCode));
            }
            final TaxCategoryType aUBLTaxCategory = new TaxCategoryType();
            aUBLTaxCategory.setID(aTradeTax.getCategoryCodeValue());
            if (aTradeTax.getRateApplicablePercentValue() != null)
                aUBLTaxCategory.setPercent(MathHelper.getWithoutTrailingZeroes(aTradeTax.getRateApplicablePercentValue()));
            if (StringHelper.hasText(aTradeTax.getExemptionReasonCodeValue()))
                aUBLTaxCategory.setTaxExemptionReasonCode(aTradeTax.getExemptionReasonCodeValue());
            if (aTradeTax.getExemptionReason() != null) {
                final TaxExemptionReasonType aUBLTaxExemptionReason = new TaxExemptionReasonType();
                aUBLTaxExemptionReason.setValue(aTradeTax.getExemptionReason().getValue());
                aUBLTaxExemptionReason.setLanguageID(aTradeTax.getExemptionReason().getLanguageID());
                aUBLTaxExemptionReason.setLanguageLocaleID(aTradeTax.getExemptionReason().getLanguageLocaleID());
                aUBLTaxCategory.addTaxExemptionReason(aUBLTaxExemptionReason);
            }
            final TaxSchemeType aUBLTaxScheme = new TaxSchemeType();
            aUBLTaxScheme.setID(getVATScheme());
            aUBLTaxCategory.setTaxScheme(aUBLTaxScheme);
            aUBLTaxSubtotal.setTaxCategory(aUBLTaxCategory);
            aUBLTaxTotal.addTaxSubtotal(aUBLTaxSubtotal);
        }
    }
    // LegalMonetaryTotal
    {
        final MonetaryTotalType aUBLMonetaryTotal = new MonetaryTotalType();
        if (aSTSHMS != null) {
            if (aSTSHMS.hasLineTotalAmountEntries())
                aUBLMonetaryTotal.setLineExtensionAmount(_copyAmount(aSTSHMS.getLineTotalAmountAtIndex(0), new LineExtensionAmountType(), sDefaultCurrencyCode));
            if (aSTSHMS.hasTaxBasisTotalAmountEntries())
                aUBLMonetaryTotal.setTaxExclusiveAmount(_copyAmount(aSTSHMS.getTaxBasisTotalAmountAtIndex(0), new TaxExclusiveAmountType(), sDefaultCurrencyCode));
            if (aSTSHMS.hasGrandTotalAmountEntries())
                aUBLMonetaryTotal.setTaxInclusiveAmount(_copyAmount(aSTSHMS.getGrandTotalAmountAtIndex(0), new TaxInclusiveAmountType(), sDefaultCurrencyCode));
            if (aSTSHMS.hasAllowanceTotalAmountEntries())
                aUBLMonetaryTotal.setAllowanceTotalAmount(_copyAmount(aSTSHMS.getAllowanceTotalAmountAtIndex(0), new AllowanceTotalAmountType(), sDefaultCurrencyCode));
            if (aSTSHMS.hasChargeTotalAmountEntries())
                aUBLMonetaryTotal.setChargeTotalAmount(_copyAmount(aSTSHMS.getChargeTotalAmountAtIndex(0), new ChargeTotalAmountType(), sDefaultCurrencyCode));
            if (aSTSHMS.hasTotalPrepaidAmountEntries())
                aUBLMonetaryTotal.setPrepaidAmount(_copyAmount(aSTSHMS.getTotalPrepaidAmountAtIndex(0), new PrepaidAmountType(), sDefaultCurrencyCode));
            if (aSTSHMS.hasRoundingAmountEntries()) {
                // compatibility
                if (MathHelper.isNE0(aSTSHMS.getRoundingAmountAtIndex(0).getValue()))
                    aUBLMonetaryTotal.setPayableRoundingAmount(_copyAmount(aSTSHMS.getRoundingAmountAtIndex(0), new PayableRoundingAmountType(), sDefaultCurrencyCode));
            }
            if (aSTSHMS.hasDuePayableAmountEntries())
                aUBLMonetaryTotal.setPayableAmount(_copyAmount(aSTSHMS.getDuePayableAmountAtIndex(0), new PayableAmountType(), sDefaultCurrencyCode));
        }
        aUBLCreditNote.setLegalMonetaryTotal(aUBLMonetaryTotal);
    }
    // All invoice lines
    for (final SupplyChainTradeLineItemType aLineItem : aSCTT.getIncludedSupplyChainTradeLineItem()) {
        final CreditNoteLineType aUBLCreditNoteLine = new CreditNoteLineType();
        final DocumentLineDocumentType aDLD = aLineItem.getAssociatedDocumentLineDocument();
        aUBLCreditNoteLine.setID(_copyID(aDLD.getLineID()));
        // Note
        for (final un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._100.NoteType aLineNote : aDLD.getIncludedNote()) ifNotNull(aUBLCreditNoteLine::addNote, _copyNote(aLineNote));
        // Line extension amount
        boolean bLineExtensionAmountIsNegative = false;
        final LineTradeSettlementType aLineSettlement = aLineItem.getSpecifiedLineTradeSettlement();
        final TradeSettlementLineMonetarySummationType aSTSLMS = aLineSettlement.getSpecifiedTradeSettlementLineMonetarySummation();
        if (aSTSLMS != null) {
            if (aSTSLMS.hasLineTotalAmountEntries()) {
                aUBLCreditNoteLine.setLineExtensionAmount(_copyAmount(aSTSLMS.getLineTotalAmountAtIndex(0), new LineExtensionAmountType(), sDefaultCurrencyCode));
                if (isLT0Strict(aUBLCreditNoteLine.getLineExtensionAmountValue()))
                    bLineExtensionAmountIsNegative = true;
            }
        }
        // CreditNoted quantity
        final LineTradeDeliveryType aLineDelivery = aLineItem.getSpecifiedLineTradeDelivery();
        if (aLineDelivery != null) {
            final QuantityType aBilledQuantity = aLineDelivery.getBilledQuantity();
            if (aBilledQuantity != null) {
                aUBLCreditNoteLine.setCreditedQuantity(_copyQuantity(aBilledQuantity, new CreditedQuantityType()));
            }
        }
        // Accounting cost
        if (aLineSettlement.hasReceivableSpecifiedTradeAccountingAccountEntries()) {
            final TradeAccountingAccountType aLineAA = aLineSettlement.getReceivableSpecifiedTradeAccountingAccountAtIndex(0);
            aUBLCreditNoteLine.setAccountingCost(aLineAA.getIDValue());
        }
        // CreditNote period
        final SpecifiedPeriodType aLineBillingPeriod = aLineSettlement.getBillingSpecifiedPeriod();
        if (aLineBillingPeriod != null) {
            final PeriodType aUBLLinePeriod = new PeriodType();
            if (aLineBillingPeriod.getStartDateTime() != null)
                aUBLLinePeriod.setStartDate(_parseDate(aLineBillingPeriod.getStartDateTime().getDateTimeString(), aErrorList));
            if (aLineBillingPeriod.getEndDateTime() != null)
                aUBLLinePeriod.setEndDate(_parseDate(aLineBillingPeriod.getEndDateTime().getDateTimeString(), aErrorList));
            aUBLCreditNoteLine.addInvoicePeriod(aUBLLinePeriod);
        }
        // Order line reference
        final LineTradeAgreementType aLineAgreement = aLineItem.getSpecifiedLineTradeAgreement();
        if (aLineAgreement != null) {
            final ReferencedDocumentType aBuyerOrderReference = aLineAgreement.getBuyerOrderReferencedDocument();
            if (aBuyerOrderReference != null && StringHelper.hasText(aBuyerOrderReference.getLineIDValue())) {
                final OrderLineReferenceType aUBLOrderLineReference = new OrderLineReferenceType();
                aUBLOrderLineReference.setLineID(_copyID(aBuyerOrderReference.getLineID(), new LineIDType()));
                aUBLCreditNoteLine.addOrderLineReference(aUBLOrderLineReference);
            }
        }
        // Document reference
        for (final ReferencedDocumentType aLineReferencedDocument : aLineSettlement.getAdditionalReferencedDocument()) {
            final DocumentReferenceType aUBLDocRef = _convertDocumentReference(aLineReferencedDocument, aErrorList);
            if (aUBLDocRef != null)
                aUBLCreditNoteLine.addDocumentReference(aUBLDocRef);
        }
        // Allowance charge
        for (final TradeAllowanceChargeType aLineAllowanceCharge : aLineSettlement.getSpecifiedTradeAllowanceCharge()) {
            ETriState eIsCharge = ETriState.UNDEFINED;
            if (aLineAllowanceCharge.getChargeIndicator() != null)
                eIsCharge = _parseIndicator(aLineAllowanceCharge.getChargeIndicator(), aErrorList);
            else
                aErrorList.add(_buildError(new String[] { "CrossIndustryCreditNote", "SupplyChainTradeTransaction", "IncludedSupplyChainTradeLineItem", "SpecifiedLineTradeSettlement", "SpecifiedTradeAllowanceCharge" }, "Failed to determine if SpecifiedTradeAllowanceCharge is an Allowance or a Charge"));
            if (eIsCharge.isDefined()) {
                final AllowanceChargeType aUBLLineAllowanceCharge = new AllowanceChargeType();
                aUBLLineAllowanceCharge.setChargeIndicator(eIsCharge.getAsBooleanValue());
                _copyAllowanceCharge(aLineAllowanceCharge, aUBLLineAllowanceCharge, sDefaultCurrencyCode);
                aUBLCreditNoteLine.addAllowanceCharge(aUBLLineAllowanceCharge);
            }
        }
        // Item
        final ItemType aUBLItem = new ItemType();
        final TradeProductType aLineProduct = aLineItem.getSpecifiedTradeProduct();
        if (aLineProduct != null) {
            final TextType aDescription = aLineProduct.getDescription();
            if (aDescription != null)
                ifNotNull(aUBLItem::addDescription, _copyName(aDescription, new DescriptionType()));
            if (aLineProduct.hasNameEntries())
                aUBLItem.setName(_copyName(aLineProduct.getNameAtIndex(0), new NameType()));
            final IDType aBuyerAssignedID = aLineProduct.getBuyerAssignedID();
            if (aBuyerAssignedID != null) {
                final ItemIdentificationType aUBLID = new ItemIdentificationType();
                aUBLID.setID(_copyID(aBuyerAssignedID));
                if (StringHelper.hasText(aUBLID.getIDValue()))
                    aUBLItem.setBuyersItemIdentification(aUBLID);
            }
            final IDType aSellerAssignedID = aLineProduct.getSellerAssignedID();
            if (aSellerAssignedID != null) {
                final ItemIdentificationType aUBLID = new ItemIdentificationType();
                aUBLID.setID(_copyID(aSellerAssignedID));
                if (StringHelper.hasText(aUBLID.getIDValue()))
                    aUBLItem.setSellersItemIdentification(aUBLID);
            }
            final IDType aGlobalID = aLineProduct.getGlobalID();
            if (aGlobalID != null) {
                final ItemIdentificationType aUBLID = new ItemIdentificationType();
                aUBLID.setID(_copyID(aGlobalID));
                if (StringHelper.hasText(aUBLID.getIDValue()))
                    aUBLItem.setStandardItemIdentification(aUBLID);
            }
            final TradeCountryType aOriginCountry = aLineProduct.getOriginTradeCountry();
            if (aOriginCountry != null) {
                final CountryType aUBLCountry = new CountryType();
                aUBLCountry.setIdentificationCode(aOriginCountry.getIDValue());
                if (aOriginCountry.hasNameEntries())
                    aUBLCountry.setName(_copyName(aOriginCountry.getNameAtIndex(0), new NameType()));
                aUBLItem.setOriginCountry(aUBLCountry);
            }
            // Commodity Classification
            for (final ProductClassificationType aLineProductClassification : aLineProduct.getDesignatedProductClassification()) {
                final CodeType aClassCode = aLineProductClassification.getClassCode();
                if (aClassCode != null) {
                    final CommodityClassificationType aUBLCommodityClassification = new CommodityClassificationType();
                    aUBLCommodityClassification.setItemClassificationCode(_copyCode(aClassCode, new ItemClassificationCodeType()));
                    if (aUBLCommodityClassification.getItemClassificationCode() != null)
                        aUBLItem.addCommodityClassification(aUBLCommodityClassification);
                }
            }
        }
        for (final TradeTaxType aTradeTax : aLineSettlement.getApplicableTradeTax()) {
            final TaxCategoryType aUBLTaxCategory = new TaxCategoryType();
            aUBLTaxCategory.setID(aTradeTax.getCategoryCodeValue());
            if (aTradeTax.getRateApplicablePercentValue() != null)
                aUBLTaxCategory.setPercent(MathHelper.getWithoutTrailingZeroes(aTradeTax.getRateApplicablePercentValue()));
            final TaxSchemeType aUBLTaxScheme = new TaxSchemeType();
            aUBLTaxScheme.setID(getVATScheme());
            aUBLTaxCategory.setTaxScheme(aUBLTaxScheme);
            aUBLItem.addClassifiedTaxCategory(aUBLTaxCategory);
        }
        if (aLineProduct != null) {
            for (final ProductCharacteristicType aAPC : aLineProduct.getApplicableProductCharacteristic()) if (aAPC.hasDescriptionEntries()) {
                final ItemPropertyType aUBLAdditionalItem = new ItemPropertyType();
                aUBLAdditionalItem.setName(_copyName(aAPC.getDescriptionAtIndex(0), new NameType()));
                if (aAPC.hasValueEntries())
                    aUBLAdditionalItem.setValue(aAPC.getValueAtIndex(0).getValue());
                if (aUBLAdditionalItem.getName() != null)
                    aUBLItem.addAdditionalItemProperty(aUBLAdditionalItem);
            }
        }
        final PriceType aUBLPrice = new PriceType();
        boolean bUsePrice = false;
        if (aLineAgreement != null) {
            final TradePriceType aNPPTP = aLineAgreement.getNetPriceProductTradePrice();
            if (aNPPTP != null) {
                if (aNPPTP.hasChargeAmountEntries()) {
                    aUBLPrice.setPriceAmount(_copyAmount(aNPPTP.getChargeAmountAtIndex(0), new PriceAmountType(), sDefaultCurrencyCode));
                    bUsePrice = true;
                }
                if (aNPPTP.getBasisQuantity() != null) {
                    aUBLPrice.setBaseQuantity(_copyQuantity(aNPPTP.getBasisQuantity(), new BaseQuantityType()));
                    bUsePrice = true;
                }
            }
        }
        swapQuantityAndPriceIfNeeded(bLineExtensionAmountIsNegative, aUBLCreditNoteLine.getCreditedQuantityValue(), aUBLCreditNoteLine::setCreditedQuantity, bUsePrice ? aUBLPrice.getPriceAmountValue() : null, bUsePrice ? aUBLPrice::setPriceAmount : null);
        // Allowance charge
        final TradePriceType aTradePrice = aLineAgreement.getNetPriceProductTradePrice();
        if (aTradePrice != null)
            for (final TradeAllowanceChargeType aPriceAllowanceCharge : aTradePrice.getAppliedTradeAllowanceCharge()) {
                ETriState eIsCharge = ETriState.UNDEFINED;
                if (aPriceAllowanceCharge.getChargeIndicator() != null)
                    eIsCharge = _parseIndicator(aPriceAllowanceCharge.getChargeIndicator(), aErrorList);
                else
                    aErrorList.add(_buildError(new String[] { "CrossIndustryCreditNote", "SupplyChainTradeTransaction", "IncludedSupplyChainTradeLineItem", "SpecifiedLineTradeAgreement", "NetPriceProductTradePrice", "AppliedTradeAllowanceCharge" }, "Failed to determine if AppliedTradeAllowanceCharge is an Allowance or a Charge"));
                if (eIsCharge.isDefined()) {
                    final AllowanceChargeType aUBLLineAllowanceCharge = new AllowanceChargeType();
                    aUBLLineAllowanceCharge.setChargeIndicator(eIsCharge.getAsBooleanValue());
                    _copyAllowanceCharge(aPriceAllowanceCharge, aUBLLineAllowanceCharge, sDefaultCurrencyCode);
                    aUBLPrice.addAllowanceCharge(aUBLLineAllowanceCharge);
                }
            }
        if (bUsePrice)
            aUBLCreditNoteLine.setPrice(aUBLPrice);
        aUBLCreditNoteLine.setItem(aUBLItem);
        aUBLCreditNote.addCreditNoteLine(aUBLCreditNoteLine);
    }
    return aUBLCreditNote;
}
Also used : DateTimeType(un.unece.uncefact.data.standard.unqualifieddatatype._100.DateTimeType) un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._100(un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._100) FormattedDateTimeType(un.unece.uncefact.data.standard.qualifieddatatype._100.FormattedDateTimeType) CodeType(un.unece.uncefact.data.standard.unqualifieddatatype._100.CodeType) ErrorList(com.helger.commons.error.list.ErrorList) ETriState(com.helger.commons.state.ETriState) CollectionHelper(com.helger.commons.collection.CollectionHelper) CreditNoteType(oasis.names.specification.ubl.schema.xsd.creditnote_23.CreditNoteType) BigDecimal(java.math.BigDecimal) TextType(un.unece.uncefact.data.standard.unqualifieddatatype._100.TextType) CrossIndustryInvoiceType(un.unece.uncefact.data.standard.crossindustryinvoice._100.CrossIndustryInvoiceType) Nonnull(javax.annotation.Nonnull) Nullable(javax.annotation.Nullable) BinaryObjectType(un.unece.uncefact.data.standard.unqualifieddatatype._100.BinaryObjectType) MathHelper(com.helger.commons.math.MathHelper) CGlobal(com.helger.commons.CGlobal) oasis.names.specification.ubl.schema.xsd.commonbasiccomponents_23(oasis.names.specification.ubl.schema.xsd.commonbasiccomponents_23) StringHelper(com.helger.commons.string.StringHelper) AmountType(un.unece.uncefact.data.standard.unqualifieddatatype._100.AmountType) oasis.names.specification.ubl.schema.xsd.commonaggregatecomponents_23(oasis.names.specification.ubl.schema.xsd.commonaggregatecomponents_23) InvoiceType(oasis.names.specification.ubl.schema.xsd.invoice_23.InvoiceType) EqualsHelper(com.helger.commons.equals.EqualsHelper) Serializable(java.io.Serializable) ValueEnforcer(com.helger.commons.ValueEnforcer) QuantityType(un.unece.uncefact.data.standard.unqualifieddatatype._100.QuantityType) Consumer(java.util.function.Consumer) LocalDate(java.time.LocalDate) IErrorList(com.helger.commons.error.list.IErrorList) IDType(un.unece.uncefact.data.standard.unqualifieddatatype._100.IDType) LocalDate(java.time.LocalDate) un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._100(un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._100) TextType(un.unece.uncefact.data.standard.unqualifieddatatype._100.TextType) AmountType(un.unece.uncefact.data.standard.unqualifieddatatype._100.AmountType) CreditNoteType(oasis.names.specification.ubl.schema.xsd.creditnote_23.CreditNoteType) oasis.names.specification.ubl.schema.xsd.commonaggregatecomponents_23(oasis.names.specification.ubl.schema.xsd.commonaggregatecomponents_23) IDType(un.unece.uncefact.data.standard.unqualifieddatatype._100.IDType) CreditNoteType(oasis.names.specification.ubl.schema.xsd.creditnote_23.CreditNoteType) DateTimeType(un.unece.uncefact.data.standard.unqualifieddatatype._100.DateTimeType) FormattedDateTimeType(un.unece.uncefact.data.standard.qualifieddatatype._100.FormattedDateTimeType) QuantityType(un.unece.uncefact.data.standard.unqualifieddatatype._100.QuantityType) ETriState(com.helger.commons.state.ETriState) CodeType(un.unece.uncefact.data.standard.unqualifieddatatype._100.CodeType) Nullable(javax.annotation.Nullable)

Example 22 with ETriState

use of com.helger.commons.state.ETriState in project en16931-cii2ubl by phax.

the class CIIToUBL23Converter method convertCIItoUBL.

@Override
@Nullable
public Serializable convertCIItoUBL(@Nonnull final CrossIndustryInvoiceType aCIIInvoice, @Nonnull final ErrorList aErrorList) {
    ValueEnforcer.notNull(aCIIInvoice, "CIIInvoice");
    ValueEnforcer.notNull(aErrorList, "ErrorList");
    switch(getUBLCreationMode()) {
        case AUTOMATIC:
            final ETriState eIsInvoice = isInvoiceType(aCIIInvoice);
            // Default to invoice
            return eIsInvoice.getAsBooleanValue(true) ? convertToInvoice(aCIIInvoice, aErrorList) : convertToCreditNote(aCIIInvoice, aErrorList);
        case INVOICE:
            return convertToInvoice(aCIIInvoice, aErrorList);
        case CREDIT_NOTE:
            return convertToCreditNote(aCIIInvoice, aErrorList);
    }
    throw new IllegalStateException("Unsupported creation mode");
}
Also used : ETriState(com.helger.commons.state.ETriState) Nullable(javax.annotation.Nullable)

Example 23 with ETriState

use of com.helger.commons.state.ETriState in project as2-lib by phax.

the class AS2ReceiverHandler method verify.

protected void verify(@Nonnull final IMessage aMsg, @Nonnull final AS2ResourceHelper aResHelper) throws AS2Exception {
    final ICertificateFactory aCertFactory = m_aReceiverModule.getSession().getCertificateFactory();
    final ICryptoHelper aCryptoHelper = AS2Helper.getCryptoHelper();
    try {
        final boolean bDisableVerify = aMsg.partnership().isDisableVerify();
        final boolean bMsgIsSigned = aCryptoHelper.isSigned(aMsg.getData());
        final boolean bForceVerify = aMsg.partnership().isForceVerify();
        if (bMsgIsSigned && bDisableVerify) {
            if (LOGGER.isInfoEnabled())
                LOGGER.info("Message claims to be signed but signature validation is disabled" + aMsg.getLoggingText());
        } else if (bMsgIsSigned || bForceVerify) {
            if (bForceVerify && !bMsgIsSigned) {
                if (LOGGER.isInfoEnabled())
                    LOGGER.info("Forced verify signature" + aMsg.getLoggingText());
            } else if (LOGGER.isDebugEnabled())
                LOGGER.debug("Verifying signature" + aMsg.getLoggingText());
            final X509Certificate aSenderCert = aCertFactory.getCertificateOrNull(aMsg, ECertificatePartnershipType.SENDER);
            boolean bUseCertificateInBodyPart;
            final ETriState eUseCertificateInBodyPart = aMsg.partnership().getVerifyUseCertificateInBodyPart();
            if (eUseCertificateInBodyPart.isDefined()) {
                // Use per partnership
                bUseCertificateInBodyPart = eUseCertificateInBodyPart.getAsBooleanValue();
            } else {
                // Use global value
                bUseCertificateInBodyPart = m_aReceiverModule.getSession().isCryptoVerifyUseCertificateInBodyPart();
            }
            final Wrapper<X509Certificate> aCertHolder = new Wrapper<>();
            final MimeBodyPart aVerifiedData = aCryptoHelper.verify(aMsg.getData(), aSenderCert, bUseCertificateInBodyPart, bForceVerify, aCertHolder::set, aResHelper);
            final Consumer<X509Certificate> aExternalConsumer = getVerificationCertificateConsumer();
            if (aExternalConsumer != null)
                aExternalConsumer.accept(aCertHolder.get());
            aMsg.setData(aVerifiedData);
            // Remember that message was signed and verified
            aMsg.attrs().putIn(AS2Message.ATTRIBUTE_RECEIVED_SIGNED, true);
            // Remember the PEM encoded version of the X509 certificate that was
            // used for verification
            aMsg.attrs().putIn(AS2Message.ATTRIBUTE_RECEIVED_SIGNATURE_CERTIFICATE, CertificateHelper.getPEMEncodedCertificate(aCertHolder.get()));
            if (LOGGER.isInfoEnabled())
                LOGGER.info("Successfully verified signature of incoming AS2 message" + aMsg.getLoggingText());
        }
    } catch (final Exception ex) {
        if (LOGGER.isErrorEnabled())
            LOGGER.error("Error verifying signature " + aMsg.getLoggingText() + ": " + ex.getMessage());
        throw AS2DispositionException.wrap(ex, () -> DispositionType.createError("integrity-check-failed"), () -> AbstractActiveNetModule.DISP_VERIFY_SIGNATURE_FAILED);
    }
}
Also used : Wrapper(com.helger.commons.wrapper.Wrapper) ETriState(com.helger.commons.state.ETriState) Consumer(java.util.function.Consumer) ICertificateFactory(com.helger.as2lib.cert.ICertificateFactory) ICryptoHelper(com.helger.as2lib.crypto.ICryptoHelper) MimeBodyPart(javax.mail.internet.MimeBodyPart) X509Certificate(java.security.cert.X509Certificate) MessagingException(javax.mail.MessagingException) AS2NoModuleException(com.helger.as2lib.processor.AS2NoModuleException) AS2DispositionException(com.helger.as2lib.disposition.AS2DispositionException) AS2ProcessorException(com.helger.as2lib.processor.AS2ProcessorException) CMSException(org.bouncycastle.cms.CMSException) AS2Exception(com.helger.as2lib.exception.AS2Exception) WrappedAS2Exception(com.helger.as2lib.exception.WrappedAS2Exception) IOException(java.io.IOException) SMIMEException(org.bouncycastle.mail.smime.SMIMEException) AS2ComponentNotFoundException(com.helger.as2lib.session.AS2ComponentNotFoundException)

Example 24 with ETriState

use of com.helger.commons.state.ETriState in project as2-lib by phax.

the class AS2SenderModule method receiveSyncMDN.

/**
 * @param aMsg
 *        AS2Message
 * @param aHttpClient
 *        URLConnection
 * @param aOriginalMIC
 *        mic value from original msg
 * @param aIncomingDumper
 *        Incoming dumper. May be <code>null</code>.
 * @param aResHelper
 *        Resource helper
 * @throws AS2Exception
 *         in case of an error
 * @throws IOException
 *         in case of an IO error
 */
protected void receiveSyncMDN(@Nonnull final AS2Message aMsg, @Nonnull final AS2HttpClient aHttpClient, @Nonnull final MIC aOriginalMIC, @Nullable final IHTTPIncomingDumper aIncomingDumper, @Nonnull final AS2ResourceHelper aResHelper) throws AS2Exception, IOException {
    if (LOGGER.isDebugEnabled())
        LOGGER.debug("Receiving synchronous MDN for message" + aMsg.getLoggingText());
    try {
        // Create a MessageMDN and copy HTTP headers
        final IMessageMDN aMDN = new AS2MessageMDN(aMsg);
        // Bug in ph-commons 9.1.3 in addAllHeaders!
        aMDN.headers().addAllHeaders(aHttpClient.getResponseHeaderFields());
        // Receive the MDN data
        final InputStream aConnIS = aHttpClient.getInputStream();
        final NonBlockingByteArrayOutputStream aMDNStream = new NonBlockingByteArrayOutputStream();
        // Retrieve the whole MDN content
        StreamHelper.copyByteStream().from(aConnIS).closeFrom(true).to(aMDNStream).closeTo(true).limit(StringParser.parseLong(aMDN.getHeader(CHttpHeader.CONTENT_LENGTH), -1)).build();
        // Dump collected message
        if (aIncomingDumper != null)
            aIncomingDumper.dumpIncomingRequest(aMDN.headers().getAllHeaderLines(true), aMDNStream.getBufferOrCopy(), aMDN);
        if (LOGGER.isTraceEnabled()) {
            // Debug print the whole MDN stream
            LOGGER.trace("Retrieved MDN stream data:\n" + aMDNStream.getAsString(StandardCharsets.ISO_8859_1));
        }
        final MimeBodyPart aPart = new MimeBodyPart(AS2HttpHelper.getAsInternetHeaders(aMDN.headers()), aMDNStream.getBufferOrCopy());
        aMDN.setData(aPart);
        // get the MDN partnership info
        aMDN.partnership().setSenderAS2ID(aMDN.getHeader(CHttpHeader.AS2_FROM));
        aMDN.partnership().setReceiverAS2ID(aMDN.getHeader(CHttpHeader.AS2_TO));
        // Set the appropriate key store aliases
        aMDN.partnership().setSenderX509Alias(aMsg.partnership().getReceiverX509Alias());
        aMDN.partnership().setReceiverX509Alias(aMsg.partnership().getSenderX509Alias());
        // Update the partnership
        getSession().getPartnershipFactory().updatePartnership(aMDN, false);
        final ICertificateFactory aCertFactory = getSession().getCertificateFactory();
        final X509Certificate aSenderCert = aCertFactory.getCertificate(aMDN, ECertificatePartnershipType.SENDER);
        boolean bUseCertificateInBodyPart;
        final ETriState eUseCertificateInBodyPart = aMsg.partnership().getVerifyUseCertificateInBodyPart();
        if (eUseCertificateInBodyPart.isDefined()) {
            // Use per partnership
            bUseCertificateInBodyPart = eUseCertificateInBodyPart.getAsBooleanValue();
        } else {
            // Use global value
            bUseCertificateInBodyPart = getSession().isCryptoVerifyUseCertificateInBodyPart();
        }
        AS2Helper.parseMDN(aMsg, aSenderCert, bUseCertificateInBodyPart, m_aVerificationCertificateConsumer, aResHelper);
        try {
            getSession().getMessageProcessor().handle(IProcessorStorageModule.DO_STOREMDN, aMsg, null);
        } catch (final AS2ComponentNotFoundException | AS2NoModuleException ex) {
        // No message processor found
        // Or no module found in message processor
        }
        final String sDisposition = aMDN.attrs().getAsString(AS2MessageMDN.MDNA_DISPOSITION);
        if (LOGGER.isInfoEnabled())
            LOGGER.info("Received synchronous AS2 MDN [" + sDisposition + "]" + aMsg.getLoggingText());
        // Asynch MDN 2007-03-12
        // Verify if the original mic is equal to the mic in returned MDN
        final String sReturnMIC = aMDN.attrs().getAsString(AS2MessageMDN.MDNA_MIC);
        final MIC aReturnMIC = MIC.parse(sReturnMIC);
        // Catch ReturnMIC == null in case the attribute is simply missing
        final boolean bMICMatch = aOriginalMIC != null && aReturnMIC != null && aReturnMIC.equals(aOriginalMIC);
        if (bMICMatch) {
            // MIC was matched - all good
            m_aMICMatchingHandler.onMICMatch(aMsg, sReturnMIC);
        } else {
            // file was sent completely but the returned mic was not matched,
            m_aMICMatchingHandler.onMICMismatch(aMsg, aOriginalMIC == null ? null : aOriginalMIC.getAsAS2String(), sReturnMIC);
        }
        if (m_aIncomingMDNCallback != null)
            m_aIncomingMDNCallback.onIncomingMDN(true, aMDN, aMDN.getHeader(CHttpHeader.AS2_FROM), aMDN.getHeader(CHttpHeader.AS2_TO), sDisposition, aMDN.attrs().getAsString(AS2MessageMDN.MDNA_MIC), aMDN.attrs().getAsString(AS2MessageMDN.MDNA_ORIG_MESSAGEID), aMDN.attrs().getAsBoolean(AS2Message.ATTRIBUTE_RECEIVED_SIGNED, false), bMICMatch);
        DispositionType.createFromString(sDisposition).validate(aMsg, aMDN.getText());
    } catch (final IOException ex) {
        throw ex;
    } catch (final Exception ex) {
        throw WrappedAS2Exception.wrap(ex).setSourceMsg(aMsg);
    }
}
Also used : AS2MessageMDN(com.helger.as2lib.message.AS2MessageMDN) ETriState(com.helger.commons.state.ETriState) InputStream(java.io.InputStream) MIC(com.helger.as2lib.crypto.MIC) NonBlockingByteArrayOutputStream(com.helger.commons.io.stream.NonBlockingByteArrayOutputStream) ICertificateFactory(com.helger.as2lib.cert.ICertificateFactory) IOException(java.io.IOException) X509Certificate(java.security.cert.X509Certificate) MessagingException(javax.mail.MessagingException) AS2NoModuleException(com.helger.as2lib.processor.AS2NoModuleException) AS2DispositionException(com.helger.as2lib.disposition.AS2DispositionException) AS2Exception(com.helger.as2lib.exception.AS2Exception) WrappedAS2Exception(com.helger.as2lib.exception.WrappedAS2Exception) IOException(java.io.IOException) AS2InvalidParameterException(com.helger.as2lib.params.AS2InvalidParameterException) SMIMEException(org.bouncycastle.mail.smime.SMIMEException) AS2ComponentNotFoundException(com.helger.as2lib.session.AS2ComponentNotFoundException) AS2NoModuleException(com.helger.as2lib.processor.AS2NoModuleException) AS2ComponentNotFoundException(com.helger.as2lib.session.AS2ComponentNotFoundException) IMessageMDN(com.helger.as2lib.message.IMessageMDN) MimeBodyPart(javax.mail.internet.MimeBodyPart)

Example 25 with ETriState

use of com.helger.commons.state.ETriState in project phase4 by phax.

the class PModeLegSecurityJsonConverter method convertToNative.

/**
 * Convert the provided JSON to a {@link PModeLegSecurity} object.
 *
 * @param aElement
 *        The JSON object to be converted. May not be <code>null</code>.
 * @return A non-<code>null</code> {@link PModeLegSecurity}
 * @throws IllegalStateException
 *         In case of an unsupported value
 */
@Nonnull
public static PModeLegSecurity convertToNative(@Nonnull final IJsonObject aElement) {
    final String sWSSVersion = aElement.getAsString(ATTR_WSS_VERSION);
    final EWSSVersion eWSSVersion = EWSSVersion.getFromVersionOrNull(sWSSVersion);
    if (eWSSVersion == null && sWSSVersion != null)
        throw new IllegalStateException("Invalid WSS version '" + sWSSVersion + "'");
    final ICommonsList<String> aX509SignElements = new CommonsArrayList<>();
    final IJsonArray aSignElement = aElement.getAsArray(ELEMENT_X509_SIGN_ELEMENT);
    if (aSignElement != null)
        for (final IJsonValue aItem : aSignElement.iteratorValues()) aX509SignElements.add(aItem.getAsString());
    final ICommonsList<String> aX509SignAttachments = new CommonsArrayList<>();
    final IJsonArray aSignAttachment = aElement.getAsArray(ELEMENT_X509_SIGN_ATTACHMENT);
    if (aSignAttachment != null)
        for (final IJsonValue aItem : aSignAttachment.iteratorValues()) aX509SignAttachments.add(aItem.getAsString());
    final String sX509SignatureCertificate = aElement.getAsString(ELEMENT_X509_SIGNATURE_CERTIFICATE);
    final String sX509SignatureHashFunction = aElement.getAsString(ATTR_X509_SIGNATURE_HASH_FUNCTION);
    final ECryptoAlgorithmSignDigest eX509SignatureHashFunction = ECryptoAlgorithmSignDigest.getFromIDOrNull(sX509SignatureHashFunction);
    if (eX509SignatureHashFunction == null && sX509SignatureHashFunction != null)
        throw new IllegalStateException("Invalid signature hash function '" + sX509SignatureHashFunction + "'");
    final String sX509SignatureAlgorithm = aElement.getAsString(ATTR_X509_SIGNATURE_ALGORITHM);
    final ECryptoAlgorithmSign eX509SignatureAlgorithm = ECryptoAlgorithmSign.getFromIDOrNull(sX509SignatureAlgorithm);
    if (eX509SignatureAlgorithm == null && sX509SignatureAlgorithm != null)
        throw new IllegalStateException("Invalid signature algorithm '" + sX509SignatureAlgorithm + "'");
    final ICommonsList<String> aX509EncryptionElements = new CommonsArrayList<>();
    final IJsonArray aEncryptElement = aElement.getAsArray(ELEMENT_X509_ENCRYPTION_ENCRYPT_ELEMENT);
    if (aEncryptElement != null)
        for (final IJsonValue aItem : aEncryptElement.iteratorValues()) aX509EncryptionElements.add(aItem.getAsString());
    final ICommonsList<String> aX509EncryptionAttachments = new CommonsArrayList<>();
    final IJsonArray aEncryptAttachment = aElement.getAsArray(ELEMENT_X509_ENCRYPTION_ENCRYPT_ATTACHMENT);
    if (aEncryptAttachment != null)
        for (final IJsonValue aItem : aEncryptAttachment.iteratorValues()) aX509EncryptionAttachments.add(aItem.getAsString());
    final String sX509EncryptionCertificate = aElement.getAsString(ELEMENT_X509_ENCRYPTION_CERTIFICATE);
    final String sX509EncryptionAlgorithm = aElement.getAsString(ATTR_X509_ENCRYPTION_ALGORITHM);
    final ECryptoAlgorithmCrypt eX509EncryptionAlgorithm = ECryptoAlgorithmCrypt.getFromIDOrNull(sX509EncryptionAlgorithm);
    if (eX509EncryptionAlgorithm == null && sX509EncryptionAlgorithm != null)
        throw new IllegalStateException("Invalid encrypt algorithm '" + sX509EncryptionAlgorithm + "'");
    final Integer aX509EncryptionMinimumStrength = aElement.getAsIntObj(ATTR_X509_ENCRYPTION_MINIMUM_STRENGTH);
    final String sUsernameTokenUsername = aElement.getAsString(ATTR_USERNAME_TOKEN_USERNAME);
    final String sUsernameTokenPassword = aElement.getAsString(ATTR_USERNAME_TOKEN_PASSWORD);
    final ETriState eUsernameTokenDigest = AbstractPModeMicroTypeConverter.getTriState(aElement.getAsString(ATTR_USERNAME_TOKEN_DIGEST), PModeLegSecurity.DEFAULT_USERNAME_TOKEN_DIGEST);
    final ETriState eUsernameTokenNonce = AbstractPModeMicroTypeConverter.getTriState(aElement.getAsString(ATTR_USERNAME_TOKEN_NONCE), PModeLegSecurity.DEFAULT_USERNAME_TOKEN_NONCE);
    final ETriState eUsernameTokenCreated = AbstractPModeMicroTypeConverter.getTriState(aElement.getAsString(ATTR_USERNAME_TOKEN_CREATED), PModeLegSecurity.DEFAULT_USERNAME_TOKEN_CREATED);
    final ETriState ePModeAuthorize = AbstractPModeMicroTypeConverter.getTriState(aElement.getAsString(ATTR_PMODE_AUTHORIZE), PModeLegSecurity.DEFAULT_PMODE_AUTHORIZE);
    final ETriState eSendReceipt = AbstractPModeMicroTypeConverter.getTriState(aElement.getAsString(ATTR_SEND_RECEIPT), PModeLegSecurity.DEFAULT_SEND_RECEIPT);
    final String sSendReceiptReplyPattern = aElement.getAsString(ATTR_SEND_RECEIPT_REPLY_PATTERN);
    final EPModeSendReceiptReplyPattern eSendReceiptReplyPattern = EPModeSendReceiptReplyPattern.getFromIDOrNull(sSendReceiptReplyPattern);
    if (eSendReceiptReplyPattern == null && sSendReceiptReplyPattern != null)
        throw new IllegalStateException("Invalid SendReceipt ReplyPattern version '" + sSendReceiptReplyPattern + "'");
    final ETriState eSendReceiptNonRepudiation = AbstractPModeMicroTypeConverter.getTriState(aElement.getAsString(ATTR_SEND_RECEIPT_NON_REPUDIATION), PModeLegSecurity.DEFAULT_SEND_RECEIPT_NON_REPUDIATION);
    return new PModeLegSecurity(eWSSVersion, aX509SignElements, aX509SignAttachments, sX509SignatureCertificate, eX509SignatureHashFunction, eX509SignatureAlgorithm, aX509EncryptionElements, aX509EncryptionAttachments, sX509EncryptionCertificate, eX509EncryptionAlgorithm, aX509EncryptionMinimumStrength, sUsernameTokenUsername, sUsernameTokenPassword, eUsernameTokenDigest, eUsernameTokenNonce, eUsernameTokenCreated, ePModeAuthorize, eSendReceipt, eSendReceiptReplyPattern, eSendReceiptNonRepudiation);
}
Also used : ETriState(com.helger.commons.state.ETriState) ECryptoAlgorithmCrypt(com.helger.phase4.crypto.ECryptoAlgorithmCrypt) IJsonValue(com.helger.json.IJsonValue) ECryptoAlgorithmSignDigest(com.helger.phase4.crypto.ECryptoAlgorithmSignDigest) IJsonArray(com.helger.json.IJsonArray) EWSSVersion(com.helger.phase4.wss.EWSSVersion) CommonsArrayList(com.helger.commons.collection.impl.CommonsArrayList) ECryptoAlgorithmSign(com.helger.phase4.crypto.ECryptoAlgorithmSign) Nonnull(javax.annotation.Nonnull)

Aggregations

ETriState (com.helger.commons.state.ETriState)32 Nonnull (javax.annotation.Nonnull)24 Nullable (javax.annotation.Nullable)10 ValueEnforcer (com.helger.commons.ValueEnforcer)7 ErrorList (com.helger.commons.error.list.ErrorList)7 Consumer (java.util.function.Consumer)7 AmountType (un.unece.uncefact.data.standard.unqualifieddatatype._100.AmountType)7 CGlobal (com.helger.commons.CGlobal)6 CollectionHelper (com.helger.commons.collection.CollectionHelper)6 EqualsHelper (com.helger.commons.equals.EqualsHelper)6 IErrorList (com.helger.commons.error.list.IErrorList)6 MathHelper (com.helger.commons.math.MathHelper)6 StringHelper (com.helger.commons.string.StringHelper)6 Serializable (java.io.Serializable)6 BigDecimal (java.math.BigDecimal)6 LocalDate (java.time.LocalDate)6 CrossIndustryInvoiceType (un.unece.uncefact.data.standard.crossindustryinvoice._100.CrossIndustryInvoiceType)6 FormattedDateTimeType (un.unece.uncefact.data.standard.qualifieddatatype._100.FormattedDateTimeType)6 un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._100 (un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._100)6 BinaryObjectType (un.unece.uncefact.data.standard.unqualifieddatatype._100.BinaryObjectType)6