PageRenderTime 45ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/modules/Report/Http/Resources/GeneralItemCollection.php

https://gitlab.com/laher01/factu40
PHP | 201 lines | 154 code | 21 blank | 26 comment | 22 complexity | 5d78b853b1097dbbd4f487216b7ab28d MD5 | raw file
  1. <?php
  2. namespace Modules\Report\Http\Resources;
  3. use App\Models\Tenant\Purchase;
  4. use App\Models\Tenant\PurchaseItem;
  5. use Illuminate\Http\Resources\Json\ResourceCollection;
  6. class GeneralItemCollection extends ResourceCollection
  7. {
  8. public function toArray($request)
  9. {
  10. return $this->collection->transform(function ($row, $key) {
  11. /** @var \App\Models\Tenant\DocumentItem|\App\Models\Tenant\PurchaseItem|mixed|\App\Models\Tenant\SaleNoteItem|mixed $row */
  12. $resource = self::getDocument($row);
  13. $purchase_item = null;
  14. $total_item_purchase = self::getPurchaseUnitPrice($row,$resource,$purchase_item);
  15. if ($row->item->presentation) {
  16. $total_item_purchase = $total_item_purchase * $row->item->presentation->quantity_unit;
  17. }
  18. $utility_item = $row->total - $total_item_purchase;
  19. $item = $row->getModelItem();
  20. $model = $item->model;
  21. $platform = $item->getWebPlatformModel();
  22. if($platform !== null){
  23. $platform = $platform->name;
  24. }
  25. return [
  26. 'id' => $row->id,
  27. 'unit_type_id' => $row->item->unit_type_id,
  28. 'internal_id' => $row->relation_item->internal_id,
  29. 'description' => $row->item->description,
  30. 'currency_type_id' => $resource['currency_type_id'],
  31. 'lot_has_sale' => self::getLotsHasSale($row),
  32. 'date_of_issue' => $resource['date_of_issue'],
  33. 'customer_name' => $resource['customer_name'],
  34. 'purchase_order' => $resource['purchase_order'],
  35. 'customer_number' => $resource['customer_number'],
  36. 'brand' => $row->relation_item->brand->name,
  37. 'series' => $resource['series'],
  38. 'alone_number' => $resource['alone_number'],
  39. 'quantity' => number_format($row->quantity, 2),
  40. 'unit_value' => number_format($row->unit_value, 2),
  41. 'total' => number_format($row->total, 2),
  42. 'total_number' => $row->total,
  43. 'total_item_purchase' => number_format($total_item_purchase, 2),
  44. 'is_set' => (bool) $row->relation_item->is_set,
  45. 'utility_item' => number_format($utility_item, 2),
  46. 'factor' => $row->item->presentation ? number_format($row->item->presentation->quantity_unit, 2) : 0,
  47. 'document_type_description' => $resource['document_type_description'],
  48. 'document_type_id' => $resource['document_type_id'],
  49. 'web_platform_name' => optional($row->relation_item->web_platform)->name,
  50. 'model' => $model,
  51. 'platform' => $platform,
  52. // 'resource'=>$resource,
  53. 'purchase_item'=>$purchase_item,
  54. ];
  55. });
  56. }
  57. public static function getPurchaseUnitPrice($record, $resource = null,&$purchase_item = null)
  58. {
  59. if($resource === null){
  60. $resource = self::getDocument($record);
  61. }
  62. $purchase_unit_price = self::getIndividualPurchaseUnitPrice($record,$resource,$purchase_item) * $record->quantity;
  63. if ($record->relation_item->is_set) {
  64. $purchase_unit_price = 0;
  65. foreach ($record->relation_item->sets as $item_set) {
  66. $purchase_unit_price += (self::getIndividualPurchaseUnitPrice($item_set,$resource,$purchase_item) * $item_set->quantity) * $record->quantity;
  67. }
  68. } /*elseif() {
  69. }*/
  70. return $purchase_unit_price;
  71. }
  72. public static function getIndividualPurchaseUnitPrice($record, $resource, &$purchase_item = null)
  73. {
  74. $purchase_unit_price = 0;
  75. $currency_type_id = $resource['currency_type_id'];
  76. // Se busca la compra del producto en el dia o antes de su venta,
  77. // para sacar la ganancia correctamente
  78. // La tabla purchase items parece eliminar due of date
  79. $purchase_item = PurchaseItem::where('item_id', $record->item_id)
  80. ->latest('id')->get()->pluck('purchase_id');
  81. // para ello se busca las compras
  82. $purchase = Purchase::wherein('id',$purchase_item)
  83. ->where('date_of_issue', '<=', $resource['date_of_issue'])
  84. ->latest('id')->first();
  85. if ($purchase) {
  86. $purchase_item = PurchaseItem::where([
  87. 'purchase_id'=> $purchase->id,
  88. 'item_id'=> $record->item_id
  89. ])
  90. ->latest('id')
  91. ->first();
  92. $purchase_unit_price = $purchase_item->unit_price;
  93. $purchase = Purchase::find($purchase_item->purchase_id);
  94. $exchange_rate_sale = $purchase->exchange_rate_sale * 1;
  95. // Si la venta es en soles, y la compra del producto es en dolares, se hace la transformcaion
  96. if ($currency_type_id === 'PEN') {
  97. if ($purchase->currency_type_id !== $currency_type_id) {
  98. $purchase_unit_price = $purchase_unit_price * $exchange_rate_sale;
  99. }
  100. } else {
  101. // Si la venta es en dolares, y la compra del producto es en soles, se hace la transformcaion
  102. if ($purchase->currency_type_id !== $currency_type_id && $exchange_rate_sale !== 0) {
  103. $purchase_unit_price = $purchase_unit_price / $exchange_rate_sale;
  104. }
  105. }
  106. }
  107. // TODO: revisar esta linea: Eliminando esta linea porque el precio de compra no puede ser igual al precio de venta,
  108. // en conculusión esta condición nunca será 0, para los productos que no tienen una compra luego de registrarse
  109. // $purchase_unit_price = ($purchase_item) ? $purchase_item->unit_price : $record->unit_price;
  110. if ($purchase_unit_price == 0 && $record->relation_item->purchase_unit_price > 0) {
  111. $purchase_unit_price = $record->relation_item->purchase_unit_price;
  112. }
  113. // if ($record->relation_item->purchase_unit_price > 0) {
  114. // $purchase_unit_price = $record->relation_item->purchase_unit_price;
  115. // } else {
  116. // $purchase_item = PurchaseItem::select('unit_price')->where('item_id', $record->item_id)->latest('id')->first();
  117. // $purchase_unit_price = ($purchase_item) ? $purchase_item->unit_price : $record->unit_price;
  118. // }
  119. return $purchase_unit_price;
  120. }
  121. public static function getLotsHasSale($row)
  122. {
  123. if (isset($row->item->lots)) {
  124. $class = get_class($row);
  125. if($class == 'App\Models\Tenant\PurchaseItem'){
  126. // para compras
  127. return collect($row->item->lots);
  128. }
  129. return collect($row->item->lots)->where('has_sale', 1);
  130. } else {
  131. return [];
  132. }
  133. }
  134. public static function getDocument($row)
  135. {
  136. $data = [];
  137. /*$data['quantity'] = number_format($row->quantity,2);
  138. $data['total'] = number_format($row->total,2);
  139. $data['unit_type_id'] = $row->item->unit_type_id;
  140. $data['description'] = $row->item->description;*/
  141. $data['purchase_order'] = null;
  142. if ($row->document) {
  143. /** @var \App\Models\Tenant\Document $document */
  144. $document = $row->document;
  145. $data['date_of_issue'] = $document->date_of_issue->format('Y-m-d');
  146. $data['customer_name'] = $document->customer->name;
  147. $data['customer_number'] = $document->customer->number;
  148. $data['series'] = $document->series;
  149. $data['alone_number'] = $document->number;
  150. $data['document_type_description'] = $document->document_type->description;
  151. $data['document_type_id'] = $document->document_type->id;
  152. $data['currency_type_id'] = $document->currency_type_id;
  153. $data['purchase_order'] = $document->purchase_order;
  154. } else if ($row->purchase) {
  155. /** @var \App\Models\Tenant\Purchase $document */
  156. $document = $row->purchase;
  157. $data['date_of_issue'] = $document->date_of_issue->format('Y-m-d');
  158. $data['customer_name'] = $document->supplier->name;
  159. $data['customer_number'] = $document->supplier->number;
  160. $data['series'] = $document->series;
  161. $data['alone_number'] = $document->number;
  162. $data['document_type_description'] = $document->document_type->description;
  163. $data['document_type_id'] = $document->document_type->id;
  164. $data['currency_type_id'] = $document->currency_type_id;
  165. } else if ($row->sale_note) {
  166. /** @var \App\Models\Tenant\SaleNote $document */
  167. $document = $row->sale_note;
  168. $data['date_of_issue'] = $document->date_of_issue->format('Y-m-d');
  169. $data['customer_name'] = $document->customer->name;
  170. $data['customer_number'] = $document->customer->number;
  171. $data['series'] = $document->series;
  172. $data['alone_number'] = $document->number;
  173. $data['document_type_description'] = 'NOTA DE VENTA';
  174. $data['document_type_id'] = 80;
  175. $data['currency_type_id'] = $document->currency_type_id;
  176. $data['purchase_order'] = $document->purchase_order;
  177. }
  178. return $data;
  179. }
  180. }