/*
 * 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.
 */

productPromoCodeId = request.getParameter("productPromoCodeId")
if (!productPromoCodeId) {
    productPromoCodeId = request.getAttribute("productPromoCodeId")
}
productPromoCode = from("ProductPromoCode").where("productPromoCodeId", productPromoCodeId).queryOne()

productPromoId = null
if (productPromoCode) {
    productPromoId = productPromoCode.productPromoId
} else {
    productPromoId = request.getParameter("productPromoId")
}

productPromo = null
if (productPromoId) {
    productPromo = from("ProductPromo").where("productPromoId", productPromoId).queryOne()
}

productPromoCodeEmails = null
productPromoCodeParties = null
if (productPromoCode) {
    productPromoCodeEmails = productPromoCode.getRelated("ProductPromoCodeEmail", null, null, false)
    productPromoCodeParties = productPromoCode.getRelated("ProductPromoCodeParty", null, null, false)
}

context.productPromoId = productPromoId
context.productPromo = productPromo
context.productPromoCodeId = productPromoCodeId
context.productPromoCode = productPromoCode
context.productPromoCodeEmails = productPromoCodeEmails
context.productPromoCodeParties = productPromoCodeParties
