<?php
/**
* Boxmaker extension for Contao Open Source CMS
*
* Copyright (C) 2013-2014 bekanntmacher
*
* @author Yanick Witschi <yanick.witschi@terminal42.ch>
* @license commercial
*/
namespace Bekanntmacher\BoxmakerBundle\Module;
use Bekanntmacher\BoxmakerBundle\Model\TypeModel;
use Bekanntmacher\BoxmakerBundle\Model\FarbeModel;
use Bekanntmacher\BoxmakerBundle\Model\WelleModel;
use Bekanntmacher\BoxmakerBundle\Model\TypeOptionModel;
use Bekanntmacher\BoxmakerBundle\Calculation\PriceCalculator;
use Bekanntmacher\BoxmakerBundle\Calculation\OptionCalculator;
use Bekanntmacher\BoxmakerBundle\Calculation\Margin;
use Haste\Util\Url;
abstract class TypeUtil extends \Module
{
// ok Dem Modell Preise adden
public function addTypePrices()
{
// Marge
$objMargin = new Margin($this->objType, $this->objUserInput);
$grundmarge_pro_stk = $objMargin->getBaseMarginStk();
// Preise berechnen
$arrPricesTotal = array();
$objCalc = new PriceCalculator($this->objType, $this->objConfig, $this->objUserInput);
$arrPrices = $objCalc->getAll();
$arrMaterial = $arrPrices['material'];
// tiefster einkaufspreis material + stanzen + kleben berechen
foreach ($arrPrices['material']['p'] as $idWelle => $arrFarbe)
{
foreach ($arrFarbe as $idFarbe => $priceMaterial) {
$lowestEp = null;
foreach ($GLOBALS['BOXMAKER']['productionMethods'] as $method)
{
$material = $arrPrices['material'][$method][$idWelle][$idFarbe];
$stanzen = $arrPrices['stanzen'][$method]['stanzen_per_stk'];
$kleben = $arrPrices['kleben'][$method]['kleben_per_stk'];
$ep = $material + $stanzen + $kleben;
$arrPrices['ep'][$method][$idWelle][$idFarbe] = $ep;
if ($lowestEp === null || $ep < $lowestEp)
{
$lowestEp = $ep;
$arrPrices['lowestEp'][$idWelle][$idFarbe] = $ep;
$arrPrices['lowestMethod'][$idWelle][$idFarbe] = $method;
}
}
}
}
// array mit den kleinsten ep generieren
foreach($arrPrices['lowestEp'] as $welle => $arrFarben)
{
foreach ($arrFarben as $farbe_id => $ep)
{
$f_id = str_replace('farbe_','', $farbe_id);
foreach ($GLOBALS['BOXMAKER']['printingMethods'] as $method)
{
// aufpreis schnellere Lieferung
$lowestMethode = $arrPrices['lowestMethod'][$welle][$farbe_id];
$diff = $arrPrices['ep']['p'][$welle][$farbe_id] - $ep;
$arrDeliverySurcharge[$welle][$f_id][$method]['p'] = $this->getAmount($objMargin->getDynamicMarginStk($diff) + $diff);
if($lowestMethode == 'ht' || $lowestMethode == 'ap')
{
$diff = $arrPrices['ep']['ht'][$welle][$farbe_id] - $ep;
$arrDeliverySurcharge[$welle][$f_id][$method]['ht'] = $this->getAmount($objMargin->getDynamicMarginStk($diff) + $diff);
}
if($lowestMethode == 'ap')
{
$diff = $arrPrices['ep']['ap'][$welle][$farbe_id] - $ep;
$arrDeliverySurcharge[$welle][$f_id][$method]['ap'] = $this->getAmount($objMargin->getDynamicMarginStk($diff) + $diff);
}
// preis einseitig
$arrPricesTotal[$welle][$f_id][$method]['1s'] = $this->getAmount
(
$ep
+ $objCalc->getDruckPrice('1f', $method)
+ $grundmarge_pro_stk
+ $objMargin->getDynamicMarginStk($ep + $objCalc->getDruckPrice('1f', $method))
);
// preis zweiseitig
$intDruckpreis = ($objCalc->getDruckPrice('1f', $method) > 0) ? $objCalc->getDruckPrice('1f', $method) : $objCalc->getDruckPrice('4f', $method);
$arrPricesTotal[$welle][$f_id][$method]['2s'] = $this->getAmount
(
$ep
+ (2 * $intDruckpreis)
+ $grundmarge_pro_stk
+ $objMargin->getDynamicMarginStk($ep + (2 * $objCalc->getDruckPrice('1f', $method)))
);
}
}
}
// digitaldruckeco 2s überschreiben
foreach ($arrPricesTotal as $key => $array)
{
foreach ($array as $k => $arr)
{
$lowest = 0;
foreach ($arr as $method => $set)
{
if(strpos($method,'_4f') !== false) {
if($method != 'digitaldruckeco_4f' && ($lowest == 0 || $set['2s'] < $lowest)) {
$lowest = $set['2s'];
}
}
}
$arrPricesTotal[$key][$k]['digitaldruckeco_4f']['2s'] = $lowest;
}
}
// return results
return array
(
'arrPriceTotal' => $arrPricesTotal,
'arrDeliverySurcharge' => $arrDeliverySurcharge,
'arrAll' => $objCalc->getAll(),
'cheapestProductionMethod' => $objCalc->getCheapestProductionMethod(),
'cheapestPrintingMethod' => $objCalc->getCheapestPrintingMethod()
);
}
// ok Bilder und PDF compilieren und als array zurückgeben
protected function compileTypeData(TypeModel $typeModel)
{
$arrReturn = $typeModel->row();
// Image
$image_b = \FilesModel::findByUuid($typeModel->image_b);
$image_w = \FilesModel::findByUuid($typeModel->image_w);
$image_s = \FilesModel::findByUuid($typeModel->image_s);
$image_f = \FilesModel::findByUuid($typeModel->image_f);
// PDF
$pdf = \FilesModel::findByUuid($typeModel->pdf3d);
if ($pdf !== null)
{
if (\Input::get('pdf') && \Input::get('pdf') === $pdf->path)
{
$file = new \File($pdf->path);
$file->sendToBrowser();
}
$pdf = Url::addQueryString('pdf=' . urlencode($pdf->path));
}
$arrReturn = array_merge
(
$arrReturn,
array
(
'title' => specialchars($typeModel->title),
'norm' => $typeModel->norm,
'image' => array
(
'braun' => ($image_b === null) ?: $image_b->path,
'weiss' => ($image_w === null) ?: $image_w->path,
'schwarz' => ($image_s === null) ?: $image_s->path,
'wunschfarbe' => ($image_f === null) ?: $image_f->path
),
'pdf3d' => ($pdf === null) ?: $pdf,
'href' => ($this->jumpTo == 0) ?: Url::addQueryString('type=' . $typeModel->id, $this->jumpTo),
'type_options' => \StringUtil::deserialize($typeModel->type_options,true),
'ht_delivery_time' => $typeModel->ht_delivery_time,
'ap_delivery_time' => $typeModel->ap_delivery_time,
)
);
return $arrReturn;
}
// ok Währung und Welleninfo
protected function addGeneralTemplateData()
{
// Währungskürzel
$this->Template->boxmaker_currency = $this->objConfig->boxmaker_currency;
}
protected function getDruckLabel()
{
$druckverfahren = str_replace($this->objUserInput->druckfarben,'',$this->objUserInput->druckverfahren);
$strDruck = ($druckverfahren == '') ? 'unbedruckt' : $GLOBALS['BOXMAKER']['printingMethodsLabels_short'][$druckverfahren];
$strDruck .= ($druckverfahren != '') ? ', ' . str_replace(array('_1f','_4f'),array('einfarbig','mehrfarbig'), $this->objUserInput->druckfarben) : '';
$strDruck .= ($druckverfahren != '') ? ', ' . str_replace(array('1s','2s'),array('einseitig','beidseitig'), $this->objUserInput->seite) : '';
return $strDruck;
}
public function getDeliveryDate($productionMethod)
{
$var = $productionMethod .'_delivery_time';
return $this->objType->$var;
}
// ok Preis runden und formatieren
public function getAmount($price, $convert_currency=true, $number_format=true, $thousands_sep=true)
{
if($convert_currency === true)
{
$price = $price * $this->objConfig->boxmaker_priceCalculateFactor;
}
$price = round($price,2);
if($number_format === true)
{
if($thousands_sep === true)
{
$price = number_format($price,2,'.','`');
} else {
$price = number_format($price,2,'.','');
}
}
return $price;
}
}