<#--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you 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.
-->

<#-- NOTE: this template is used for the orderstatus screen in ecommerce AND for order notification emails through the OrderNoticeEmail.ftl file -->
<#-- the "urlPrefix" value will be prepended to URLs by the ofbizUrl transform if/when there is no "request" object in the context -->
<#if baseEcommerceSecureUrl??><#assign urlPrefix = baseEcommerceSecureUrl/></#if>
<#if (orderHeader.externalId)?? && (orderHeader.externalId)?has_content >
  <#assign externalOrder = "(" + orderHeader.externalId + ")"/>
</#if>

<div id="orderHeader">
<#-- left side -->
<div class="columnLeft">
<div class="screenlet">
  <h3>
    <#if maySelectItems?default("N") == "Y" && returnLink?default("N") == "Y" && (orderHeader.statusId)! == "ORDER_COMPLETED" && roleTypeId! == "PLACING_CUSTOMER">
      <a href="<@ofbizUrl fullPath="true">makeReturn?orderId=${orderHeader.orderId}</@ofbizUrl>" class="submenutextright">${uiLabelMap.OrderRequestReturn}</a>
    </#if>
    ${uiLabelMap.OrderOrder}
    <#if orderHeader?has_content>
      ${uiLabelMap.CommonNbr}<a href="<@ofbizUrl fullPath="true">orderstatus?orderId=${orderHeader.orderId}</@ofbizUrl>" class="lightbuttontext">${orderHeader.orderId}</a>
    </#if>
    ${uiLabelMap.CommonInformation}
    <#if (orderHeader.orderId)??>
      ${externalOrder!} [ <a href="<@ofbizUrl fullPath="true">order.pdf?orderId=${(orderHeader.orderId)!}</@ofbizUrl>" target="_BLANK" class="lightbuttontext">PDF</a> ]
    </#if>
  </h3>
  <#-- placing customer information -->
  <ul>
    <#if localOrderReadHelper?? && orderHeader?has_content>
      <#assign displayParty = localOrderReadHelper.getPlacingParty()!/>
      <#if displayParty?has_content>
        <#assign displayPartyNameResult = dispatcher.runSync("getPartyNameForDate", Static["org.ofbiz.base.util.UtilMisc"].toMap("partyId", displayParty.partyId, "compareDate", orderHeader.orderDate, "userLogin", userLogin))/>
      </#if>
      <li>
        ${uiLabelMap.PartyName}
        ${(displayPartyNameResult.fullName)?default("[Name Not Found]")}
      </li>
    </#if>
    <#-- order status information -->
    <li>
      ${uiLabelMap.CommonStatus}
      <#if orderHeader?has_content>
        ${localOrderReadHelper.getStatusString(locale)}
      <#else>
        ${uiLabelMap.OrderNotYetOrdered}
      </#if>
    </li>
    <#-- ordered date -->
    <#if orderHeader?has_content>
      <li>
        ${uiLabelMap.CommonDate}
        ${orderHeader.orderDate.toString()}
      </li>
    </#if>
    <#if distributorId??>
      <li>
        ${uiLabelMap.OrderDistributor}
        ${distributorId}
      </li>
    </#if>
  </ul>
</div>

<div class="screenlet">
  <#if paymentMethods?has_content || paymentMethodType?has_content || billingAccount?has_content>
    <#-- order payment info -->
    <h3>${uiLabelMap.AccountingPaymentInformation}</h3>
    <#-- offline payment address infomation :: change this to use Company's address -->
    <ul>
      <#if !paymentMethod?has_content && paymentMethodType?has_content>
        <li>
          <#if paymentMethodType.paymentMethodTypeId == "EXT_OFFLINE">
            ${uiLabelMap.AccountingOfflinePayment}
            <#if orderHeader?has_content && paymentAddress?has_content>
              ${uiLabelMap.OrderSendPaymentTo}:
              <#if paymentAddress.toName?has_content>${paymentAddress.toName}</#if>
              <#if paymentAddress.attnName?has_content>${uiLabelMap.PartyAddrAttnName}: ${paymentAddress.attnName}</#if>
              ${paymentAddress.address1}
              <#if paymentAddress.address2?has_content>${paymentAddress.address2}</#if>
              <#assign paymentStateGeo = (delegator.findOne("Geo", {"geoId", paymentAddress.stateProvinceGeoId!}, false))! />
              ${paymentAddress.city}<#if paymentStateGeo?has_content>, ${paymentStateGeo.geoName!}</#if> ${paymentAddress.postalCode!}
              <#assign paymentCountryGeo = (delegator.findOne("Geo", {"geoId", paymentAddress.countryGeoId!}, false))! />
              <#if paymentCountryGeo?has_content>${paymentCountryGeo.geoName!}</#if>
              ${uiLabelMap.EcommerceBeSureToIncludeYourOrderNb}
            </#if>
          <#else>
            <#assign outputted = true>
            ${uiLabelMap.AccountingPaymentVia} ${paymentMethodType.get("description",locale)}
          </#if>
        </li>
      </#if>
      <#if paymentMethods?has_content>
        <#list paymentMethods as paymentMethod>
          <#if "CREDIT_CARD" == paymentMethod.paymentMethodTypeId>
            <#assign creditCard = paymentMethod.getRelatedOne("CreditCard", false)>
            <#assign formattedCardNumber = Static["org.ofbiz.party.contact.ContactHelper"].formatCreditCard(creditCard)>
          <#elseif "GIFT_CARD" == paymentMethod.paymentMethodTypeId>
            <#assign giftCard = paymentMethod.getRelatedOne("GiftCard", false)>
          <#elseif "EFT_ACCOUNT" == paymentMethod.paymentMethodTypeId>
            <#assign eftAccount = paymentMethod.getRelatedOne("EftAccount", false)>
          </#if>
          <#-- credit card info -->
          <#if "CREDIT_CARD" == paymentMethod.paymentMethodTypeId && creditCard?has_content>
            <#if outputted?default(false)>
            </#if>
            <#assign pmBillingAddress = creditCard.getRelatedOne("PostalAddress", false)!>
            <li>
              <ul>
                <li> ${uiLabelMap.AccountingCreditCard}
                  <#if creditCard.companyNameOnCard?has_content>${creditCard.companyNameOnCard}</#if>
                  <#if creditCard.titleOnCard?has_content>${creditCard.titleOnCard}</#if>
                  ${creditCard.firstNameOnCard}
                  <#if creditCard.middleNameOnCard?has_content>${creditCard.middleNameOnCard}</#if>
                  ${creditCard.lastNameOnCard}
                  <#if creditCard.suffixOnCard?has_content>${creditCard.suffixOnCard}</#if>
                </li>
                <li>${formattedCardNumber}</li>
              </ul>
            </li>
            <#-- Gift Card info -->
          <#elseif "GIFT_CARD" == paymentMethod.paymentMethodTypeId && giftCard?has_content>
            <#if outputted?default(false)>
            </#if>
            <#if giftCard?has_content && giftCard.cardNumber?has_content>
              <#assign pmBillingAddress = giftCard.getRelatedOne("PostalAddress", false)!>
              <#assign giftCardNumber = "">
              <#assign pcardNumber = giftCard.cardNumber>
              <#if pcardNumber?has_content>
                <#assign psize = pcardNumber?length - 4>
                <#if 0 < psize>
                  <#list 0 .. psize-1 as foo>
                    <#assign giftCardNumber = giftCardNumber + "*">
                  </#list>
                  <#assign giftCardNumber = giftCardNumber + pcardNumber[psize .. psize + 3]>
                <#else>
                  <#assign giftCardNumber = pcardNumber>
                </#if>
              </#if>
            </#if>
            <li>
              ${uiLabelMap.AccountingGiftCard}
              ${giftCardNumber}
            </li>
            <#-- EFT account info -->
          <#elseif "EFT_ACCOUNT" == paymentMethod.paymentMethodTypeId && eftAccount?has_content>
            <#if outputted?default(false)>
            </#if>
            <#assign pmBillingAddress = eftAccount.getRelatedOne("PostalAddress", false)!>
            <li>
              <ul>
                <li>
                  ${uiLabelMap.AccountingEFTAccount}
                  ${eftAccount.nameOnAccount!}
                </li>
                <li>
                  <#if eftAccount.companyNameOnAccount?has_content>${eftAccount.companyNameOnAccount}</#if>
                </li>
                <li>
                  ${uiLabelMap.AccountingBank}: ${eftAccount.bankName}, ${eftAccount.routingNumber}
                </li>
                <li>
                  ${uiLabelMap.AccountingAccount} #: ${eftAccount.accountNumber}
                </li>
              </ul>
            </li>
          </#if>
          <#if pmBillingAddress?has_content>
            <li>
              <ul>
                <li>
                  <#if pmBillingAddress.toName?has_content>${uiLabelMap.CommonTo}: ${pmBillingAddress.toName}</#if>
                </li>
                <li>
                  <#if pmBillingAddress.attnName?has_content>${uiLabelMap.CommonAttn}: ${pmBillingAddress.attnName}</#if>
                </li>
                <li>
                  ${pmBillingAddress.address1}
                </li>
                <li>
                  <#if pmBillingAddress.address2?has_content>${pmBillingAddress.address2}</#if>
                </li>
                <li>
                <#assign pmBillingStateGeo = (delegator.findOne("Geo", {"geoId", pmBillingAddress.stateProvinceGeoId!}, false))! />
                ${pmBillingAddress.city}<#if pmBillingStateGeo?has_content>, ${ pmBillingStateGeo.geoName!}</#if> ${pmBillingAddress.postalCode!}
                <#assign pmBillingCountryGeo = (delegator.findOne("Geo", {"geoId", pmBillingAddress.countryGeoId!}, false))! />
                <#if pmBillingCountryGeo?has_content>${pmBillingCountryGeo.geoName!}</#if>
                </li>
              </ul>
            </li>
          </#if>
          <#assign outputted = true>
        </#list>
      </#if>
      <#-- billing account info -->
      <#if billingAccount?has_content>
        <#if outputted?default(false)>
        </#if>
        <#assign outputted = true>
        <li>
          ${uiLabelMap.AccountingBillingAccount}
          #${billingAccount.billingAccountId!} - ${billingAccount.description!}
        </li>
      </#if>
      <#if (customerPoNumberSet?has_content)>
        <li>
          ${uiLabelMap.OrderPurchaseOrderNumber}
          <#list customerPoNumberSet as customerPoNumber>
            ${customerPoNumber!}
          </#list>
        </li>
      </#if>
    </ul>
  </#if>
</div>
</div>
<#-- right side -->
<div class="screenlet columnRight">
  <#if orderItemShipGroups?has_content>
    <h3>${uiLabelMap.OrderShippingInformation}</h3>
    <#-- shipping address -->
    <#assign groupIdx = 0>
    <#list orderItemShipGroups as shipGroup>
      <#if orderHeader?has_content>
        <#assign shippingAddress = shipGroup.getRelatedOne("PostalAddress", false)!>
        <#assign groupNumber = shipGroup.shipGroupSeqId!>
      <#else>
        <#assign shippingAddress = cart.getShippingAddress(groupIdx)!>
        <#assign groupNumber = groupIdx + 1>
      </#if>
      <ul>
        <#if shippingAddress?has_content>
          <li>
            <ul>
              <li>
                ${uiLabelMap.OrderDestination} [${groupNumber}]
                <#if shippingAddress.toName?has_content>${uiLabelMap.CommonTo}: ${shippingAddress.toName}</#if>
              </li>
              <li>
                <#if shippingAddress.attnName?has_content>${uiLabelMap.PartyAddrAttnName}: ${shippingAddress.attnName}</#if>
              </li>
              <li>
                ${shippingAddress.address1}
              </li>
              <li>
                <#if shippingAddress.address2?has_content>${shippingAddress.address2}</#if>
              </li>
              <li>
                <#assign shippingStateGeo = (delegator.findOne("Geo", {"geoId", shippingAddress.stateProvinceGeoId!}, false))! />
                ${shippingAddress.city}<#if shippingStateGeo?has_content>, ${shippingStateGeo.geoName!}</#if> ${shippingAddress.postalCode!}
              </li>
              <li>
                <#assign shippingCountryGeo = (delegator.findOne("Geo", {"geoId", shippingAddress.countryGeoId!}, false))! />
                <#if shippingCountryGeo?has_content>${shippingCountryGeo.geoName!}</#if>
              </li>
            </ul>
          </li>
        </#if>
        <li>
          <ul>
            <li>
              ${uiLabelMap.OrderMethod}:
              <#if orderHeader?has_content>
                <#assign shipmentMethodType = shipGroup.getRelatedOne("ShipmentMethodType", false)!>
                <#assign carrierPartyId = shipGroup.carrierPartyId!>
              <#else>
                <#assign shipmentMethodType = cart.getShipmentMethodType(groupIdx)!>
                <#assign carrierPartyId = cart.getCarrierPartyId(groupIdx)!>
              </#if>
              <#if carrierPartyId?? && carrierPartyId != "_NA_">${carrierPartyId!}</#if>
              ${(shipmentMethodType.description)?default("N/A")}
            </li>
            <li>
              <#if shippingAccount??>${uiLabelMap.AccountingUseAccount}: ${shippingAccount}</#if>
            </li>
          </ul>
        </li>
        <#-- tracking number -->
        <#if trackingNumber?has_content || orderShipmentInfoSummaryList?has_content>
          <li>
            ${uiLabelMap.OrderTrackingNumber}
            <#-- TODO: add links to UPS/FEDEX/etc based on carrier partyId  -->
            <#if shipGroup.trackingNumber?has_content>
              ${shipGroup.trackingNumber}
            </#if>
            <#if orderShipmentInfoSummaryList?has_content>
              <#list orderShipmentInfoSummaryList as orderShipmentInfoSummary>
                <#if (orderShipmentInfoSummaryList?size > 1)>${orderShipmentInfoSummary.shipmentPackageSeqId}: </#if>
                Code: ${orderShipmentInfoSummary.trackingCode?default("[Not Yet Known]")}
                <#if orderShipmentInfoSummary.boxNumber?has_content>${uiLabelMap.OrderBoxNumber}${orderShipmentInfoSummary.boxNumber}</#if>
                <#if orderShipmentInfoSummary.carrierPartyId?has_content>(${uiLabelMap.ProductCarrier}: ${orderShipmentInfoSummary.carrierPartyId})</#if>
              </#list>
            </#if>
          </li>
          </#if>
          <#-- splitting preference -->
          <#if orderHeader?has_content>
            <#assign maySplit = shipGroup.maySplit?default("N")>
          <#else>
            <#assign maySplit = cart.getMaySplit(groupIdx)?default("N")>
          </#if>
          <li>
            ${uiLabelMap.OrderSplittingPreference}:
            <#if maySplit?default("N") == "N">${uiLabelMap.OrderPleaseWaitUntilBeforeShipping}.</#if>
            <#if maySplit?default("N") == "Y">${uiLabelMap.OrderPleaseShipItemsBecomeAvailable}.</#if>
          </li>
          <#-- shipping instructions -->
          <#if orderHeader?has_content>
            <#assign shippingInstructions = shipGroup.shippingInstructions!>
          <#else>
            <#assign shippingInstructions =  cart.getShippingInstructions(groupIdx)!>
          </#if>
          <#if shippingInstructions?has_content>
            <li>
              ${uiLabelMap.OrderInstructions}
              ${shippingInstructions}
            </li>
          </#if>
          <#-- gift settings -->
          <#if orderHeader?has_content>
            <#assign isGift = shipGroup.isGift?default("N")>
            <#assign giftMessage = shipGroup.giftMessage!>
          <#else>
            <#assign isGift = cart.getIsGift(groupIdx)?default("N")>
            <#assign giftMessage = cart.getGiftMessage(groupIdx)!>
          </#if>
          <#if productStore.showCheckoutGiftOptions! != "N">
          <li>
            ${uiLabelMap.OrderGift}?
            <#if isGift?default("N") == "N">${uiLabelMap.OrderThisIsNotGift}.</#if>
            <#if isGift?default("N") == "Y">${uiLabelMap.OrderThisIsGift}.</#if>
          </li>
          <#if giftMessage?has_content>
            <li>
              ${uiLabelMap.OrderGiftMessage}
              ${giftMessage}
            </li>
          </#if>
        </#if>
        <#if shipGroup_has_next>
        </#if>
      </ul>
      <#assign groupIdx = groupIdx + 1>
    </#list><#-- end list of orderItemShipGroups -->
  </#if>
</div>

<div class="clearBoth"></div>
</div>
