Skip to content
Code-Schnipsel Gruppen Projekte
Commit 4dfdd231 erstellt von Patrick Müller's avatar Patrick Müller
Dateien durchsuchen

temp commit

Übergeordneter 4504be9c
No related branches found
No related tags found
Keine zugehörigen Merge Requests gefunden
......@@ -344,7 +344,7 @@ define('package/quiqqer/coupons/bin/backend/controls/Manager', [
Popup.Loader.show();
if (CouponData) {
CouponCodes.edit(CouponData.id, QUIFormUtils.getFormData(Form)).then(function (couponCodeId) {
CouponCodes.edit(CouponData.id, QUIFormUtils.getFormData(Form)).then((couponCodeId) => {
if (!couponCodeId) {
Popup.Loader.hide();
return;
......
......@@ -2,10 +2,6 @@
<database>
<global>
<table name="products">
<field type="BIGINT(20) NULL DEFAULT NULL">couponDiscountId</field>
</table>
<table name="quiqqer_coupons">
<field type="BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY">id</field>
<field type="MEDIUMTEXT NULL">discountIds</field>
......
......@@ -24,6 +24,10 @@
fire="\QUI\ERP\Coupons\Events::onQuiqqerOrderSuccessful"
/>
<event on="onQuiqqerOrderCreated"
fire="\QUI\ERP\Coupons\Events::onQuiqqerOrderCreated"
/>
<event on="onOrderProcess"
fire="\QUI\ERP\Coupons\Events::onOrderProcess"
/>
......
......@@ -89,6 +89,64 @@
</groups>
<groups name="quiqqer/coupons" datatype="php">
<locale name="Coupon.mail.subject">
<de><![CDATA[Ihr persönlicher Gutschein-Code]]></de>
<en><![CDATA[Your personal coupon code]]></en>
</locale>
<locale name="Coupon.mail.body">
<de><![CDATA[
<p>Hallo [customerName],</p>
<p>vielen Dank für Ihren Gutschein-Einkauf. Hiermit erhalten Sie Ihren exklusiven Gutschein-Code für "[couponDescription]".</p>
<p>
<b>Gutschein-Code:</b> [couponCode]<br/>
<b>Wert:</b> [discountAmountFormatted]<br/>
<b>Ausgestellt am:</b> [createDateFormatted]<br/>
<b>Einlösbar bis:</b> [validUntilDateFormatted]<br/>
</p>
<p>[transferableInfo]</p>
<p>
Beste Grüße<br/>
[company]
</p>
]]></de>
<en><![CDATA[
]]></en>
</locale>
<locale name="Coupon.mail.transferable_info.is_transferable">
<de><![CDATA[Sie dürfen diesen Gutschein verschenken! Der Gutschein-Code ist nicht personalisiert und kann von jedem in unserem Shop eingelöst werden. Bewahren Sie ihn daher gut auf!]]></de>
<en><![CDATA[You may give this coupn as a gift! The coupon code is not personalized and can be redeemed by anyone in our store. Therefore, keep it safe!]]></en>
</locale>
<locale name="Coupon.mail.transferable_info.is_not_transferable">
<de><![CDATA[Bitte bachten Sie: Dieser Gutschein kann nur von Ihnen persönlich eingesetzt werden, wenn Sie in unserem Shop eingeloggt sind. Dritte können den Gutschein-Code nicht einlösen.]]></de>
<en><![CDATA[Please note: This voucher can only be used by you personally when you are logged in to our store. Third parties can not redeem the voucher code.]]></en>
</locale>
<locale name="DownloadProduct.pdf.filename">
<de><![CDATA[Gutschein_[productTitle]__[date]]]></de>
<en><![CDATA[Coupon_[productTitle]__[date]]]></en>
</locale>
<locale name="CouponCode.tpl.header">
<de><![CDATA[G U T S C H E I N]]></de>
<en><![CDATA[C O U P O N]]></en>
</locale>
<locale name="CouponCode.tpl.labelAmount">
<de><![CDATA[über]]></de>
<en><![CDATA[for]]></en>
</locale>
<locale name="CouponCode.tpl.labelCreateDate">
<de><![CDATA[ausgestellt am]]></de>
<en><![CDATA[issued at]]></en>
</locale>
<locale name="CouponCode.tpl.labelValidUntilDate">
<de><![CDATA[einlösbar bis]]></de>
<en><![CDATA[redeemable until]]></en>
</locale>
<locale name="CouponCode.tpl.labelUser">
<de><![CDATA[für]]></de>
<en><![CDATA[for]]></en>
</locale>
<locale name="Discount.default_title">
<de><![CDATA[Coupon-Code [couponCode]]]></de>
......
......@@ -10,6 +10,8 @@
<field>670</field>
<field>671</field>
<field>672</field>
<field>673</field>
<field>674</field>
</fields>
</fieldCategory>
</fieldCategories>
......
......@@ -240,6 +240,22 @@ public function getDiscounts(): array
return $discounts;
}
/**
* @return int[]
*/
public function getUserIds(): array
{
return $this->userIds;
}
/**
* @return int[]
*/
public function getGroupIds(): array
{
return $this->groupIds;
}
/**
* Redeems this CouponCode
*
......
......@@ -421,7 +421,7 @@ protected static function addCouponToOrder($Order, $coupon)
protected static function createProductFields()
{
$fields = [
CouponProductType::PRODUCT_FIELD_ID_TRANSFERABLE => [
CouponProductType::PRODUCT_FIELD_ID_TRANSFERABLE => [
'title' => [
'de' => 'Gutschein-Code ist übertragbar',
'en' => 'Coupon code is transferable'
......@@ -430,23 +430,41 @@ protected static function createProductFields()
'public' => false,
'standard' => false
],
CouponProductType::PRODUCT_FIELD_ID_GENERATE_PDF => [
CouponProductType::PRODUCT_FIELD_ID_GENERATE_PDF => [
'title' => [
'de' => 'Gutschein-Code als PDF bereitstellen',
'en' => 'Provice coupon code as PDF'
'en' => 'Provide coupon code as PDF'
],
'type' => Fields::TYPE_BOOL,
'public' => false,
'standard' => false
],
CouponProductType::PRODUCT_FIELD_ID_COUPON_AMOUNT => [
CouponProductType::PRODUCT_FIELD_ID_COUPON_AMOUNT => [
'title' => [
'de' => 'Gutschein-Code Wert',
'en' => 'Coupon code amount'
'de' => 'Gutschein Wert',
'en' => 'Coupon amount'
],
'type' => Fields::TYPE_FLOAT,
'public' => false,
'standard' => false
],
CouponProductType::PRODUCT_FIELD_ID_DAYS_VALID => [
'title' => [
'de' => 'Gutschein-Code Gültigkeit (Tage)',
'en' => 'Coupon code validity (days)'
],
'type' => Fields::TYPE_INT,
'public' => false,
'standard' => false
],
CouponProductType::PRODUCT_FIELD_ID_COUPON_DESCRIPTION => [
'title' => [
'de' => 'Gutschein-Beschreibung',
'en' => 'Coupon description'
],
'type' => Fields::TYPE_INPUT_MULTI_LANG,
'public' => false,
'standard' => false
]
];
......@@ -497,9 +515,11 @@ public static function onQuiqqerProductsProductCreate(ProductInterface $Product)
}
$fields = [
CouponProductType::PRODUCT_FIELD_ID_TRANSFERABLE => true,
CouponProductType::PRODUCT_FIELD_ID_GENERATE_PDF => true,
CouponProductType::PRODUCT_FIELD_ID_COUPON_AMOUNT => null
CouponProductType::PRODUCT_FIELD_ID_TRANSFERABLE => true,
CouponProductType::PRODUCT_FIELD_ID_GENERATE_PDF => true,
CouponProductType::PRODUCT_FIELD_ID_COUPON_AMOUNT => null,
CouponProductType::PRODUCT_FIELD_ID_DAYS_VALID => 1095, // 3 years
CouponProductType::PRODUCT_FIELD_ID_COUPON_DESCRIPTION => null
];
foreach ($fields as $fieldId => $value) {
......@@ -520,24 +540,6 @@ public static function onQuiqqerProductsProductCreate(ProductInterface $Product)
}
}
/**
* quiqqer/products: onQuiqqerProductsProductSave
*
* Create or update a discount that is associated with a product
*
* @param QUI\ERP\Products\Product\Product $Product
*/
public static function onQuiqqerProductsProductSave(QUI\ERP\Products\Product\Product $Product)
{
if ($Product instanceof CouponProductType) {
try {
CouponProductsHandler::updateProductDiscount($Product);
} catch (\Exception $Exception) {
QUI\System\Log::writeException($Exception);
}
}
}
/**
* quiqqer/order: onQuiqqerOrderCreated
*
......@@ -548,29 +550,6 @@ public static function onQuiqqerProductsProductSave(QUI\ERP\Products\Product\Pro
*/
public static function onQuiqqerOrderCreated(AbstractOrder $Order)
{
/** @var QUI\ERP\Accounting\Article $Article */
foreach ($Order->getArticles() as $Article) {
try {
// Do not parse coupon codes / discounts
if (empty($Article->getId()) || !\is_numeric($Article->getId())) {
continue;
}
$Product = Products::getProduct($Article->getId());
// Only parse download products
if (!($Product->getType() instanceof CouponProductType)) {
continue;
}
CouponProductsHandler::createCouponCodeFromProduct($Product);
} catch (\Exception $Exception) {
if ($Exception->getCode() === 404) {
QUI\System\Log::writeDebugException($Exception);
} else {
QUI\System\Log::writeException($Exception);
}
}
}
QUI\ERP\Coupons\Products\Handler::createCouponCodesFromOrder($Order);
}
}
......@@ -15,9 +15,11 @@ class CouponProductType extends DigitalProduct
/**
* Special fields for coupon products
*/
const PRODUCT_FIELD_ID_TRANSFERABLE = 670;
const PRODUCT_FIELD_ID_GENERATE_PDF = 671;
const PRODUCT_FIELD_ID_COUPON_AMOUNT = 672;
const PRODUCT_FIELD_ID_TRANSFERABLE = 670;
const PRODUCT_FIELD_ID_GENERATE_PDF = 671;
const PRODUCT_FIELD_ID_COUPON_AMOUNT = 672;
const PRODUCT_FIELD_ID_DAYS_VALID = 673;
const PRODUCT_FIELD_ID_COUPON_DESCRIPTION = 674;
/**
* @param QUI\Locale $Locale
......
......@@ -3,10 +3,14 @@
namespace QUI\ERP\Coupons\Products;
use QUI;
use QUI\ERP\Order\AbstractOrder;
use QUI\ERP\Products\Product\Product;
use QUI\ERP\Discount\Discount;
use QUI\ERP\Discount\Handler as DiscountHandler;
use QUI\ERP\Coupons\Handler as CouponsHandler;
use QUI\ERP\Coupons\CouponCode;
use QUI\ERP\Products\Handler\Products as ProductsHandler;
use QUI\HtmlToPdf\Document;
use QUI\ERP\Customer\CustomerFiles;
/**
* Class Handler
......@@ -16,42 +20,97 @@
class Handler
{
/**
* Create coupon codes from an order
* Create coupons from all coupon products of an order.
*
* @param Product $Product
* Each coupon created is sent via e-mail (either as PDF or text).
*
* @param QUI\ERP\Order\AbstractOrder $Order
* @return void
*/
public static function createCouponCodeFromProduct(Product $Product)
public static function createCouponCodesFromOrder(QUI\ERP\Order\AbstractOrder $Order): void
{
$Customer = $Order->getCustomer();
/** @var QUI\ERP\Accounting\Article $Article */
foreach ($Order->getArticles() as $Article) {
try {
// Do not parse coupon codes / discounts
if (empty($Article->getId()) || !\is_numeric($Article->getId())) {
continue;
}
$Product = ProductsHandler::getProduct($Article->getId());
// Only parse coupon products
if (!($Product instanceof CouponProductType)) {
continue;
}
$CouponCode = self::createCouponCodeFromProduct($Product, $Customer);
$couponPdfFile = null;
// Generate coupon PDF
if ($Product->getFieldValue(CouponProductType::PRODUCT_FIELD_ID_GENERATE_PDF)) {
$couponPdfFile = self::createCouponCodePdf($CouponCode, $Product);
// Add PDF file to customer files
CustomerFiles::addFileToCustomer($Customer->getId(), $couponPdfFile);
\unlink($couponPdfFile);
$customerDir = CustomerFiles::getFolderPath($Customer);
$pdfFileCustomer = $customerDir.DIRECTORY_SEPARATOR.\basename($couponPdfFile, '.pdf');
CustomerFiles::addFileToDownloadEntry($Customer->getId(), $pdfFileCustomer);
}
// Send coupon via email
self::sendCouponMail($CouponCode, $Product, $Customer, $couponPdfFile);
} catch (\Exception $Exception) {
if ($Exception->getCode() === 404) {
QUI\System\Log::writeDebugException($Exception);
} else {
QUI\System\Log::writeException($Exception);
}
}
}
}
/**
* Create and/or updates the discount that is associated with a coupon code product.
* Create coupon codes from an order
*
* @param Product $Product
* @return void
* @param QUI\Interfaces\Users\User $User - The user that bought the product
* @return CouponCode
*
* @throws QUI\Exception
* @throws \Exception
*/
public static function updateProductDiscount(Product $Product): void
protected static function createCouponCodeFromProduct(Product $Product, QUI\Interfaces\Users\User $User): CouponCode
{
$Discount = self::getProductDiscount($Product);
$Discount = self::createDiscountFromProduct($Product);
$couponAttributes = [
'maxUsages' => CouponsHandler::MAX_USAGE_ONCE
];
// Valid until
$daysValid = $Product->getFieldValue(CouponProductType::PRODUCT_FIELD_ID_DAYS_VALID);
if (!$Discount) {
$Discount = self::createProductDiscount($Product);
if (empty($daysValid)) {
$daysValid = 1095; // 3 years;
}
$discountAmount = $Product->getFieldValue(CouponProductType::PRODUCT_FIELD_ID_COUPON_AMOUNT);
$ValidUntil = \date_create('+ '.$daysValid.' days');
$couponAttributes['validUntilDate'] = $ValidUntil->format('Y-m-d');
if (empty($discountAmount)) {
$discountAmount = $Product->getPrice()->getValue();
}
// Transferable (=usable by other users or guests)
$isTransferable = $Product->getFieldValue(CouponProductType::PRODUCT_FIELD_ID_TRANSFERABLE);
$Discount->setAttributes([
'discount' => $discountAmount
]);
if (empty($isTransferable)) {
$couponAttributes['userIds'] = [$User->getId()];
}
$Discount->update();
return CouponsHandler::createCouponCode([$Discount->getId()], $couponAttributes);
}
/**
......@@ -62,7 +121,7 @@ public static function updateProductDiscount(Product $Product): void
*
* @throws QUI\Exception
*/
protected static function createProductDiscount(Product $Product): Discount
protected static function createDiscountFromProduct(Product $Product): Discount
{
$Handler = DiscountHandler::getInstance();
......@@ -76,7 +135,8 @@ protected static function createProductDiscount(Product $Product): Discount
$NewDiscount = $Handler->createChild([
'active' => 1,
'discount' => $discountAmount,
'discount_type' => DiscountHandler::DISCOUNT_TYPE_CURRENCY
'discount_type' => DiscountHandler::DISCOUNT_TYPE_CURRENCY,
'hidden' => 1
]);
$L = new QUI\Locale();
......@@ -100,44 +160,180 @@ protected static function createProductDiscount(Product $Product): Discount
\QUI\Translator::publish('quiqqer/discount');
QUI::getDataBase()->update(
QUI\ERP\Products\Utils\Tables::getProductTableName(),
[
'couponDiscountId' => $NewDiscount->getId()
],
return $NewDiscount;
}
/**
* @param CouponCode $CouponCode - The coupon code
* @param Product $Product - The product the coupon code was created from
* @return string - PDF file path
*/
public static function createCouponCodePdf(CouponCode $CouponCode, Product $Product): string
{
$fileName = QUI::getLocale()->get(
'quiqqer/coupons',
'DownloadProduct.pdf.filename',
[
'id' => $Product->getId()
'productTitle' => \str_replace(' ', '_', $Product->getTitle()),
'date' => \date('Y_m_d')
]
);
return $NewDiscount;
$Document = new Document([
'filename' => $fileName.'.pdf',
]);
// $Document->setAttribute('foldingMarks', true);
$Document->setAttribute('disableSmartShrinking', true);
$Document->setAttribute('headerSpacing', 0);
$Document->setAttribute('marginTop', 85);
$Document->setAttribute('marginBottom', 40);
$Document->setAttribute('marginLeft', 0);
$Document->setAttribute('marginRight', 0);
$Engine = QUI::getTemplateManager()->getEngine();
$Engine->assign(\array_merge(
[
'CouponCode' => $CouponCode,
'Product' => $Product->getViewFrontend(),
],
self::getCouponViewData($CouponCode, $Product)
));
$tplDir = QUI::getPackage('quiqqer/coupons')->getDir().'templates/';
try {
$Document->setHeaderHTML($Engine->fetch($tplDir.'CouponCode.header.html'));
$Document->setContentHTML($Engine->fetch($tplDir.'CouponCode.body.html'));
$Document->setFooterHTML($Engine->fetch($tplDir.'CouponCode.footer.html'));
} catch (\Exception $Exception) {
QUI\System\Log::writeException($Exception);
}
return $Document->createPDF();
}
/**
* Send coupon code via e-mail to a customer.
*
* @param CouponCode $CouponCode - The coupon code
* @param Product $Product - The product the coupon code was created from
* @param QUI\Interfaces\Users\User $Customer
* @param string|null $couponPdfFile (optional) - Coupon PDF that is attached to the email
*
* @throws \Exception
*/
public static function sendCouponMail(
CouponCode $CouponCode,
Product $Product,
QUI\Interfaces\Users\User $Customer,
?string $couponPdfFile
) {
$recipient = QUI\ERP\Customer\Utils::getInstance()->getEmailByCustomer($Customer);
if (empty($recipient)) {
QUI\System\Log::addWarning(
'Cannot send coupon code e-mail to customer #'.$Customer->getUniqueId().' because user has no'
.' email address!'
);
return;
}
$Mailer = QUI::getMailManager()->getMailer();
$Mailer->addRecipient($recipient);
$Mailer->setSubject(QUI::getLocale()->get('quiqqer/coupons', 'Coupon.mail.subject'));
$couponViewData = self::getCouponViewData($CouponCode, $Product);
if ($couponViewData['isTransferable']) {
$transferableInfo = QUI::getLocale()->get(
'quiqqer/coupons',
'Coupon.mail.transferable_info.is_transferable'
);
} else {
$transferableInfo = QUI::getLocale()->get(
'quiqqer/coupons',
'Coupon.mail.transferable_info.is_not_transferable'
);
}
$Mailer->setBody(
QUI::getLocale()->get(
'quiqqer/coupons',
'Coupon.mail.body',
\array_merge(
$couponViewData,
[
'customerName' => $Customer->getName(),
'company' => QUI\ERP\Defaults::conf('company', 'name'),
'transferableInfo' => $transferableInfo
]
)
)
);
if ($couponPdfFile) {
$Mailer->addAttachment($couponPdfFile);
}
$Mailer->send();
}
/**
* Get the discount that is associated with a coupon code product.
* Get view data of a coupon.
*
* @param CouponCode $CouponCode
* @param Product $Product
* @return Discount|false - Discount or false if no discount created yet
* @return array
*
* @throws QUI\Exception
* @throws QUI\ERP\Products\Product\Exception
* @throws QUI\Users\Exception
*/
public static function getProductDiscount(Product $Product)
protected static function getCouponViewData(CouponCode $CouponCode, Product $Product): array
{
$result = QUI::getDataBase()->fetch([
'select' => ['couponDiscountId'],
'from' => QUI\ERP\Products\Utils\Tables::getProductTableName(),
'where' => [
'id' => $Product->getId()
]
]);
$discounts = $CouponCode->getDiscounts();
$Discount = $discounts[0];
$Currency = QUI\ERP\Defaults::getCurrency();
$DiscountAmount = new QUI\ERP\Money\Price($Discount->getAttribute('discount'), $Currency);
if (empty($result)) {
return false;
$Locale = QUI::getLocale();
// Check if coupon is restricted to specific user
$User = false;
$restrictedToUserIds = $CouponCode->getUserIds();
if (!empty($restrictedToUserIds)) {
$User = QUI::getUsers()->get($restrictedToUserIds[0]);
}
/** @var Discount $Discount */
$Discount = DiscountHandler::getInstance()->getChild($result[0]['couponDiscountId']);
// Parse valid until date
$dateFormat = QUI\ERP\Defaults::getDateFormat();
$ValidUntilDate = $CouponCode->getValidUntilDate();
$validUntilDateFormatted = '-';
if ($ValidUntilDate) {
$validUntilDateFormatted = $Locale->formatDate(
$ValidUntilDate->getTimestamp(),
$dateFormat
);
}
return $Discount;
return [
'isTransferable' => empty($User),
'couponCode' => $CouponCode->getCode(),
'userName' => $User ? $User->getName() : false,
'couponDescription' => $Product->getFieldValueByLocale(
CouponProductType::PRODUCT_FIELD_ID_COUPON_DESCRIPTION
),
'discountAmountFormatted' => $DiscountAmount->getDisplayPrice(),
'createDateFormatted' => $Locale->formatDate(
$CouponCode->getCreateDate()->getTimestamp(),
$dateFormat
),
'validUntilDateFormatted' => $validUntilDateFormatted,
];
}
}
<style>
*, *:before, *:after {
box-sizing: border-box;
}
.couponcode-body {
padding: 5mm 15mm 0 20mm;
text-align: center;
width: 210mm;
}
.couponcode-body-extra p {
line-height: 20px;
margin: 0;
padding: 0;
}
.couponcode-body-code {
background-color: #dedede;
border-radius: 5px;
font-family: monospace;
font-size: 2em;
margin: 20px auto;
padding: 20px;
width: 225px;
}
.couponcode-body-data {
margin-top: 80px;
}
.couponcode-body-data table {
margin: auto;
text-align: left;
width: 50%;
}
.couponcode-body-data-label {
font-size: 12px;
}
.couponcode-body-data-value {
background-color: #f5f5f5;
display: block;
padding: 10px;
}
</style>
<div class="couponcode-body">
<h1>
{locale group="quiqqer/coupons" var="CouponCode.tpl.header"}
</h1>
{if !empty($couponDescription)}
<div class="couponcode-body-description">
{$couponDescription}
</div>
{/if}
<div class="couponcode-body-code">
{$CouponCode->getCode()}
</div>
<div class="couponcode-body-data">
<table>
<tbody>
<tr>
<td colspan="2">
<span class="couponcode-body-data-label">
{locale group="quiqqer/coupons" var="CouponCode.tpl.labelAmount"}
</span>
<span class="couponcode-body-data-value">
{$discountAmountFormatted}
</span>
</td>
</tr>
{if $userName}
<tr>
<td colspan="2">
<span class="couponcode-body-data-label">
{locale group="quiqqer/coupons" var="CouponCode.tpl.labelUser"}
</span>
<span class="couponcode-body-data-value">
{$userName}
</span>
</td>
</tr>
{/if}
<tr>
<td>
<span class="couponcode-body-data-label">
{locale group="quiqqer/coupons" var="CouponCode.tpl.labelCreateDate"}
</span>
<span class="couponcode-body-data-value">
{$createDateFormatted}
</span>
</td>
<td>
<span class="couponcode-body-data-label">
{locale group="quiqqer/coupons" var="CouponCode.tpl.labelValidUntilDate"}
</span>
<span class="couponcode-body-data-value">
{$validUntilDateFormatted}
</span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<style>
*, *:before, *:after {
box-sizing: border-box;
}
.couponcode-footer {
height: 40mm;
clear: both;
display: inline-block;
margin-top: 20px;
margin-left: 0;
padding: 0 15mm 0 20mm;
position: relative;
top: 0;
width: 210mm;
}
#pages {
font-size: 0.75rem;
position: absolute;
right: 13mm;
top: 30mm;
white-space: nowrap;
}
.couponcode-footer-text {
font-size: 0.7em;
position: relative;
text-align: center;
top: 15mm;
width: 100%;
}
</style>
<footer class="couponcode-footer">
<div class="couponcode-footer-text">
{locale group="quiqqer/erp-accounting-templates" var="header"
shopownerAdressShort=QUI\ERP\Defaults::getShortAddress()}
</div>
</footer>
\ No newline at end of file
<style>
*, *:before, *:after {
box-sizing: border-box;
}
.couponcode-header {
display: inline-block;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
height: 85mm;
margin-left: 0;
padding: 5mm 15mm 5mm 20mm;
position: relative;
text-align: center;
width: 210mm;
}
.couponcode-header-image {
height: 40mm;
margin-top: 5mm;
margin-bottom: 0;
position: relative;
}
.couponcode-header-image img {
height: auto;
margin: 5mm 0 0 0;
max-height: 20mm;
max-width: 350px;
}
.couponcode-body-header-text {
border-bottom: 1px solid #999;
clear: both;
display: inline-block;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 10px;
line-height: 2rem;
margin-bottom: 1rem;
width: 100%;
}
.couponcode-body-header-text p {
margin: 0;
}
.couponcode-customer,
.couponcode-customer address {
display: block;
float: left;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
width: 55%;
font-style: normal !important;
font-size: 14px !important;
}
.couponcode-data {
float: right;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
width: 45%;
}
.value-id,
.value-date,
.value-customer {
font-weight: bold;
}
.couponcode-data-highlight {
background: #e5e5e5;
border-radius: 3px;
margin-left: auto;
padding: 10px;
width: 100%;
}
.delivery-address {
font-size: 12px;
margin-top: 0;
margin-left: auto;
padding: 10px;
width: 100%;
}
.delivery-address-label {
font-weight: bold;
}
.couponcode-data table {
border-spacing: 0;
border-collapse: collapse;
}
.couponcode-data table td + td {
line-height: 20px;
padding: 0 0 0 10px;
}
.couponcode-data-highlight h2 {
font-size: 1.2rem;
margin: 0 0 10px 0;
padding: 0;
text-align: left;
text-transform: uppercase;
}
.couponcode-data-highlight table {
border-collapse: separate;
width: 100%;
}
.couponcode-data-highlight td {
font-size: 14px;
}
.couponcode-data-highlight td:first-child {
width: 35%;
}
.couponcode-data-highlight td span {
background: #fff;
border-radius: 3px;
display: inline-block;
margin: 0 0 2px;
padding: 0 10px;
width: 160px;
}
.couponcode-customer h3 {
margin: 0 0 10px 0;
}
</style>
<!-- Workaround to achieve full a4 format as PDF file -->
<div style="position: absolute; left: 0; top: 0; width: 210mm; background: #fff; height: 5mm; z-index: -1;"></div>
<div style="position: absolute; left: 0; top: 0; width: 5mm; background: #fff; height: 297mm; z-index: -1;"></div>
<div class="couponcode-header couponcode-header-top">
<div class="couponcode-header-image">
{assign var=Logo value=\QUI\ERP\Defaults::getLogo()}
{image image=$Logo height="120" svgtopng=1 host=1}
</div>
<div class="couponcode-header-line"></div>
</div>
0% oder .
You are about to add 0 people to the discussion. Proceed with caution.
Bearbeitung dieser Nachricht zuerst beenden!
Bitte registrieren oder zum Kommentieren