diff --git a/app/Classes/General/Eloquent/Filters/DateEnd.php b/app/Classes/General/Eloquent/Filters/DateEnd.php new file mode 100644 index 00000000..3a5608f7 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/DateEnd.php @@ -0,0 +1,18 @@ +whereDate('created_at', '<=', $value); + } +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/DateStart.php b/app/Classes/General/Eloquent/Filters/DateStart.php new file mode 100644 index 00000000..21979a92 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/DateStart.php @@ -0,0 +1,18 @@ +whereDate('created_at', '>=', $value); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/ControllersLogic/AutoPurchaseOrderFillLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/AutoPurchaseOrderFillLogic.php index 5e65c6a4..7283548d 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/AutoPurchaseOrderFillLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/AutoPurchaseOrderFillLogic.php @@ -65,7 +65,7 @@ class AutoPurchaseOrderFillLogic extends AbstractControllerLogic public function logic(Request $request) : JsonResponse { $bookings = Booking::where(function($query){ - return $query->whereMonth('created_at', 01)->orWhereMonth('created_at', 02); + return $query->whereMonth('created_at', 03)->orWhereMonth('created_at', 04); })->whereDoesntHave('transactions', function($q){ $q->where('type', TransactionType::PURCHASE_ORDER); $q->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED]); diff --git a/app/Classes/Modules/Exports/Services/ExportsCustomers.php b/app/Classes/Modules/Exports/Services/ExportsCustomers.php index 1972935e..9f314030 100644 --- a/app/Classes/Modules/Exports/Services/ExportsCustomers.php +++ b/app/Classes/Modules/Exports/Services/ExportsCustomers.php @@ -7,21 +7,26 @@ use App\Classes\ValueObjects\Constants\CompanyType; use App\Models\Company; use Maatwebsite\Excel\Concerns\Exportable; use Maatwebsite\Excel\Concerns\FromQuery; +use Maatwebsite\Excel\Concerns\ShouldAutoSize; use Maatwebsite\Excel\Concerns\WithHeadingRow; +use Maatwebsite\Excel\Concerns\WithHeadings; use Maatwebsite\Excel\Concerns\WithMapping; -class ExportsCustomers implements FromQuery, WithHeadingRow, WithMapping +class ExportsCustomers implements FromQuery, WithHeadings, WithHeadingRow, WithMapping, ShouldAutoSize { - use Exportable; public function headings(): array { return [ 'Marking', - 'Name', + 'Company Name', + 'Email', + 'Account Name', + 'Phone Number', 'Business type', 'Number of bookings', + 'Last booking Date', 'Bookings total', 'Registration Date', 'System Registration' @@ -44,13 +49,18 @@ class ExportsCustomers implements FromQuery, WithHeadingRow, WithMapping public function map($company): array { + $employee = $company->employees()->first(); + $lastBooking = $company->bookings()->orderByDesc('id')->first(); + return [ $company->reference, $company->name, - $company->employees()->first() ? $company->employees()->first()->name : '', + $employee ? $employee->email : '', + $employee ? $employee->name : '', $company->contacts()->first() ? $company->contacts()->first()->phone : '', $company->type === CompanyType::COMPANY_BUSINESS ? 'Company' : 'individual', count($company->bookings), + $lastBooking ? $lastBooking->created_at : '', $company->bookings()->sum('fix_amount'), \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($company->created_at), count($company->segments()->where('segment_id', '=', 5)->get()) ? 'Exchange 1.0' : 'Exchange 2.0' diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateBulkPurchaseOrderDocumentLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateBulkPurchaseOrderDocumentLogic.php index b56e9bf7..9478e865 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateBulkPurchaseOrderDocumentLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateBulkPurchaseOrderDocumentLogic.php @@ -3,7 +3,6 @@ namespace App\Classes\Modules\Transactions\ControllersLogic; -use App\Models\Document; use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; use Meneses\LaravelMpdf\Facades\LaravelMpdf; diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateBulkPurchaseOrderTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateBulkPurchaseOrderTransactionLogic.php new file mode 100644 index 00000000..733f2288 --- /dev/null +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateBulkPurchaseOrderTransactionLogic.php @@ -0,0 +1,98 @@ + 'Generate Bulk Purchase Order', + 'message' => 'You have successfully generated bulk purchase order' + ]; + } + + /** @var ListsGroups */ + private $listsGroups; + + /** @var FetchesCompany */ + private $fetchesCompany; + + /** @var CreateInvoiceDocumentProcessor */ + private $invoiceDocumentProcessor; + + /** + * CreateBulkPurchaseOrderTransactionLogic constructor. + * @param ListsGroups $listsGroups + * @param FetchesCompany $fetchesCompany + * @param CreateInvoiceDocumentProcessor $invoiceDocumentProcessor + */ + public function __construct(ListsGroups $listsGroups, FetchesCompany $fetchesCompany, CreateInvoiceDocumentProcessor $invoiceDocumentProcessor) + { + $this->listsGroups = $listsGroups; + $this->fetchesCompany = $fetchesCompany; + $this->invoiceDocumentProcessor = $invoiceDocumentProcessor; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function logic(Request $request) : JsonResponse + { + $groups = $this->listsGroups->execute(['issuer_id' => [$request->issuer_id], 'date_start' => $request->start_date, 'date_end' => $request->end_date]); + + foreach($groups as $group){ + foreach($group->transactions as $transaction){ + if($transaction->owner()->owner()->transactions()->where('type', TransactionType::PURCHASE_ORDER)->where('status', '!=', ApprovalStatus::APPROVED)->exists()){ + throw new MalformedRequestException('You can\'t generate bulk purchased order if there in uncomplete transactions'); + } + } + } + + foreach($groups as $group){ + foreach($group->transactions as $transaction){ + $completed_transactions = $transaction->owner()->owner()->transactions()->where('type', TransactionType::PURCHASE_ORDER)->where('status', '=', ApprovalStatus::APPROVED)->get(); + + $purchaseOrder = $transaction->owner()->transactions() + ->where('type', TransactionType::PURCHASE_ORDER) + ->complete() + ->first(); + + foreach($completed_transactions as $transaction){ + $supplier = $this->fetchesCompany->execute(['id' => $transaction->receiver]); + + // purchase order + $this->invoiceDocumentProcessor->execute($transaction, $purchaseOrder, $supplier, DocumentType::PURCHASE_ORDER); + } + } + } + + return $this->response([]); + + } + + + +} diff --git a/app/Classes/Modules/Transactions/Processors/CreateSupplierTransactionProcessor.php b/app/Classes/Modules/Transactions/Processors/CreateSupplierTransactionProcessor.php index db443184..65a52d99 100644 --- a/app/Classes/Modules/Transactions/Processors/CreateSupplierTransactionProcessor.php +++ b/app/Classes/Modules/Transactions/Processors/CreateSupplierTransactionProcessor.php @@ -97,7 +97,7 @@ class CreateSupplierTransactionProcessor $this->pushBill($billTransaction); $transferFeeNumber = $this->generatesTransactionBillNumber->execute('TRFR-'); - $transferFee = $this->calculatesTransactionTransferFee->execute($billTransaction->amount, $constant); + $transferFee = $this->calculatesTransactionTransferFee->execute($billTransaction->original_amount, $constant); $object = new TransactionObject($transferFeeNumber, TransactionType::TRANSFER_FEE, 1, $supplier->id, $supplier->banks()->where('default', true)->first()->id, PaymentMethodType::CASH, $payment->original_amount, $payment->original_amount, $payment->original_currency_id, $payment->original_currency_id, diff --git a/app/Classes/ValueObjects/Constants/DocumentType.php b/app/Classes/ValueObjects/Constants/DocumentType.php index 04edf25c..fea344fa 100644 --- a/app/Classes/ValueObjects/Constants/DocumentType.php +++ b/app/Classes/ValueObjects/Constants/DocumentType.php @@ -22,4 +22,5 @@ final class DocumentType { public const DELIVER_ORDER = 'DELIVER_ORDER'; public const INVOICE = 'INVOICE'; public const SUPPLIER_DELIVER_ORDER = 'SUPPLIER_DELIVER_ORDER'; + public const BULK_PURCHASE_ORDER = 'BULK_PURCHASE_ORDER'; } diff --git a/app/Http/Controllers/Transactions/CreateBulkPurchaseOrderDocumentController.php b/app/Http/Controllers/Transactions/CreateBulkPurchaseOrderDocumentController.php new file mode 100644 index 00000000..eeeff585 --- /dev/null +++ b/app/Http/Controllers/Transactions/CreateBulkPurchaseOrderDocumentController.php @@ -0,0 +1,21 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Transactions/CreateBulkPurchaseOrderTransactionController.php b/app/Http/Controllers/Transactions/CreateBulkPurchaseOrderTransactionController.php new file mode 100644 index 00000000..695b8487 --- /dev/null +++ b/app/Http/Controllers/Transactions/CreateBulkPurchaseOrderTransactionController.php @@ -0,0 +1,21 @@ +execute($request); + } +} diff --git a/app/Http/Resources/GroupResource.php b/app/Http/Resources/GroupResource.php index 2d628d19..baed798f 100644 --- a/app/Http/Resources/GroupResource.php +++ b/app/Http/Resources/GroupResource.php @@ -2,7 +2,10 @@ namespace App\Http\Resources; +use App\Classes\ValueObjects\Constants\ApprovalStatus; +use App\Classes\ValueObjects\Constants\TransactionType; use Carbon\Carbon; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Http\Resources\Json\JsonResource; class GroupResource extends JsonResource @@ -15,15 +18,25 @@ class GroupResource extends JsonResource */ public function toArray($request) { + $transactions = $this->transactions()->get(); + $complete_transactions = new Collection([]); + foreach($transactions as $transaction){ + $booking = $transaction->owner()->first()->owner()->first(); + $purchaseOrders = $booking->transactions()->where('type', TransactionType::PURCHASE_ORDER)->where('status', '=', ApprovalStatus::APPROVED)->get(); + + $complete_transactions = $complete_transactions->merge($purchaseOrders); + } + return [ 'id' => $this->id, - 'original_amount' => (double) $this->original_amount, + 'original_amount' => (float) $this->original_amount, 'original_currency' => new CurrencyResource($this->original_currency), - 'amount' => (double) $this->amount, + 'amount' => (float) $this->amount, 'currency' => new CurrencyResource($this->currency), 'created_at' => Carbon::parse($this->created_at)->format('d-m-Y h:i:s A'), 'currency_rate' => (float) $this->currency_rate, - 'transactions' => TransactionResource::collection($this->transactions()->get()), + 'transactions' => TransactionResource::collection($transactions), + 'complete_transactions' => TransactionResource::collection($complete_transactions), ]; } } diff --git a/app/Models/Group.php b/app/Models/Group.php index 6e785faa..bd5d5a38 100644 --- a/app/Models/Group.php +++ b/app/Models/Group.php @@ -3,15 +3,28 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +use App\Classes\General\Interfaces\Documentable; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\MorphMany; +use Staudenmeir\EloquentHasManyDeep\HasRelationships; -class Group extends Model +class Group extends Model implements Documentable { + use HasRelationships; + public function transactions() { return $this->belongsToMany(Transaction::class, GroupTransaction::class); } + /** + * @return MorphMany + */ + public function documents(): morphMany + { + return $this->morphMany(Document::class, 'owner'); + } + /** * @return BelongsTo */ diff --git a/resources/assets/images/1688_approved.png b/resources/assets/images/1688_approved.png new file mode 100644 index 00000000..4275de56 Binary files /dev/null and b/resources/assets/images/1688_approved.png differ diff --git a/resources/assets/images/best-rate-300x127.png b/resources/assets/images/best-rate-300x127.png new file mode 100644 index 00000000..c5e9b1c8 Binary files /dev/null and b/resources/assets/images/best-rate-300x127.png differ diff --git a/resources/assets/vue/components/banks/forms/PhoneAccountFormComponent.vue b/resources/assets/vue/components/banks/forms/PhoneAccountFormComponent.vue index dfec0ddb..76401d2b 100644 --- a/resources/assets/vue/components/banks/forms/PhoneAccountFormComponent.vue +++ b/resources/assets/vue/components/banks/forms/PhoneAccountFormComponent.vue @@ -14,18 +14,10 @@ {{error}} -
Foreign name alipay may exceed Monthly / Yearly Limit , and may be unable to withdraw your funds out.
-