/**
  * Add separate flow for annotated data objects.
  *
  * @param \Magento\Framework\Webapi\ServiceOutputProcessor $subject
  * @param \Closure $proceed
  * @param $data
  * @param $type
  * @return mixed
  */
 public function aroundConvertValue(\Magento\Framework\Webapi\ServiceOutputProcessor $subject, \Closure $proceed, $data, $type)
 {
     if ($data instanceof \Flancer32\Lib\DataObject) {
         $result = [];
         $typeData = $this->_typePropertiesRegistry->register($type);
         /**
          * @var string $propertyName
          * @var \Praxigento\Core\Reflection\Data\Property $propertyData
          */
         foreach ($typeData as $propertyName => $propertyData) {
             $attrName = $this->_toolConvert->camelCaseToSnakeCase($propertyName);
             $getter = 'get' . ucfirst($propertyName);
             $value = call_user_func([$data, $getter]);
             $isRequired = $propertyData->getIsRequired();
             $propertyType = $propertyData->getType();
             if ($isRequired || $value) {
                 if ($this->_toolType->isSimple($propertyType)) {
                     $result[$attrName] = $value;
                 } else {
                     // the last 2 chars will be removed for arrays
                     // in \Magento\Framework\Webapi\ServiceOutputProcessor::convertValue
                     if (is_array($value)) {
                         $propertyType = $this->_toolType->getTypeAsArrayOfTypes($propertyType);
                     }
                     $result[$attrName] = $proceed($value, $propertyType);
                 }
             }
         }
     } else {
         $result = $proceed($data, $type);
     }
     return $result;
 }
 public function getPeriodPrev($periodValue, $periodType = self::TYPE_DAY)
 {
     $result = null;
     switch ($periodType) {
         case self::TYPE_DAY:
             $dt = date_create_from_format('Ymd', $periodValue);
             $ts = strtotime('previous day', $dt->getTimestamp());
             $dt = $this->toolConvert->toDateTime($ts);
             $result = date_format($dt, 'Ymd');
             break;
         case self::TYPE_WEEK:
             /* week period ends on ...  */
             $end = $this->getWeekLastDay();
             $dt = date_create_from_format('Ymd', $periodValue);
             $ts = strtotime("previous {$end}", $dt->getTimestamp());
             $dt = $this->toolConvert->toDateTime($ts);
             $result = date_format($dt, 'Ymd');
             break;
         case self::TYPE_MONTH:
             $dt = date_create_from_format('Ym', $periodValue);
             $ts = strtotime('previous month', $dt->getTimestamp());
             $dt = $this->toolConvert->toDateTime($ts);
             $result = date_format($dt, 'Ym');
             break;
         case self::TYPE_YEAR:
             $dt = date_create_from_format('Y', $periodValue);
             $ts = strtotime('previous year', $dt->getTimestamp());
             $dt = $this->toolConvert->toDateTime($ts);
             $result = date_format($dt, 'Y');
             break;
     }
     return $result;
 }