Skip to content

Commit caf08a2

Browse files
authored
Merge pull request #3644 from bakaphp/development
Version 1.35.4
2 parents 531b348 + 566bb91 commit caf08a2

File tree

4 files changed

+182
-38
lines changed

4 files changed

+182
-38
lines changed

app/Console/Commands/Connectors/ESim/ImporOrderFromCsvCommand.php

+34-32
Original file line numberDiff line numberDiff line change
@@ -5,51 +5,50 @@
55
namespace App\Console\Commands\Connectors\ESim;
66

77
use Baka\Traits\KanvasJobsTrait;
8+
use Exception;
89
use Illuminate\Console\Command;
9-
use Kanvas\Apps\Models\Apps;
10-
use Kanvas\Regions\Models\Regions;
11-
use Kanvas\Companies\Models\Companies;
12-
use Kanvas\Connectors\ESim\Actions\ImportOrderFromCsvAction;
13-
use Kanvas\Users\Repositories\UsersRepository;
14-
use Kanvas\Guild\Customers\Actions\CreatePeopleAction;
15-
use Kanvas\Souk\Orders\Enums\OrderStatusEnum;
16-
use League\Csv\Reader;
1710
use Illuminate\Support\Facades\Http;
1811
use Illuminate\Support\Facades\Storage;
1912
use Illuminate\Support\Str;
20-
use Kanvas\Souk\Orders\DataTransferObject\Order as OrderDTO;
21-
use Kanvas\Guild\Customers\Repositories\PeoplesRepository;
13+
use Kanvas\Apps\Models\Apps;
14+
use Kanvas\Companies\Models\Companies;
15+
use Kanvas\Connectors\ESim\Enums\CustomFieldEnum;
16+
use Kanvas\Currencies\Models\Currencies;
17+
use Kanvas\Guild\Customers\Actions\CreatePeopleAction;
18+
use Kanvas\Guild\Customers\DataTransferObject\Address;
19+
use Kanvas\Guild\Customers\DataTransferObject\Contact;
2220
use Kanvas\Guild\Customers\DataTransferObject\People as PeopleDTO;
2321
use Kanvas\Guild\Customers\Enums\ContactTypeEnum;
24-
use Kanvas\Guild\Customers\DataTransferObject\Contact;
25-
use Kanvas\Guild\Customers\DataTransferObject\Address;
26-
use Spatie\LaravelData\DataCollection;
27-
use Kanvas\Users\Models\Users;
28-
use Kanvas\Currencies\Models\Currencies;
29-
use Kanvas\Souk\Orders\DataTransferObject\OrderItem;
22+
use Kanvas\Guild\Customers\Repositories\PeoplesRepository;
3023
use Kanvas\Inventory\Variants\Models\Variants;
31-
use Kanvas\Souk\Orders\Models\Order;
24+
use Kanvas\Regions\Models\Regions;
3225
use Kanvas\Souk\Orders\Actions\CreateOrderAction;
33-
use Exception;
26+
use Kanvas\Souk\Orders\DataTransferObject\Order as OrderDTO;
27+
use Kanvas\Souk\Orders\DataTransferObject\OrderItem;
28+
use Kanvas\Souk\Orders\Enums\OrderStatusEnum;
29+
use Kanvas\Souk\Orders\Models\Order;
30+
use Kanvas\Users\Models\Users;
31+
use Kanvas\Users\Repositories\UsersRepository;
32+
use League\Csv\Reader;
33+
use Spatie\LaravelData\DataCollection;
3434

3535
class ImporOrderFromCsvCommand extends Command
3636
{
37+
use KanvasJobsTrait;
3738
public Apps $app;
3839
public Companies $company;
3940
public Regions $region;
4041
public Users $user;
4142
public string $url;
42-
use KanvasJobsTrait;
43-
protected $signature = "kanvas:import-order-from-csv {app_id} {company_id} {region_id} {user_id} {url}";
44-
43+
protected $signature = 'kanvas:import-order-from-csv {app_id} {company_id} {region_id} {user_id} {url}';
4544

4645
public function handle(): void
4746
{
48-
$this->app = Apps::getById($this->argument("app_id"));
49-
$this->company = Companies::getById($this->argument("company_id"));
50-
$this->region = Regions::getById($this->argument("region_id"));
51-
$this->user = UsersRepository::getUserOfAppById((int)$this->argument("user_id"), $this->app);
52-
$this->url = $this->argument("url");
47+
$this->app = Apps::getById($this->argument('app_id'));
48+
$this->company = Companies::getById($this->argument('company_id'));
49+
$this->region = Regions::getById($this->argument('region_id'));
50+
$this->user = UsersRepository::getUserOfAppById((int)$this->argument('user_id'), $this->app);
51+
$this->url = $this->argument('url');
5352
$this->process();
5453
}
5554

@@ -63,7 +62,7 @@ public function process(): void
6362
Storage::put("downloads/{$fileName}", $response->body());
6463
$path = Storage::path("downloads/{$fileName}");
6564
} else {
66-
$this->error("Error al descargar el archivo.");
65+
$this->error('Failed to download the file.');
6766
}
6867
$reader = Reader::createFromPath($path, 'r');
6968
$reader->setHeaderOffset(0);
@@ -74,9 +73,10 @@ public function process(): void
7473
$app = $this->app;
7574
$company = $this->company;
7675
foreach ($collection as $order) {
77-
$kanvasOrder = Order::getByCustomField('order_reference', $order['order_reference'], $company);
76+
$kanvasOrder = Order::getByCustomField(CustomFieldEnum::WOOCOMMERCE_ORDER_ID->value, $order['order_reference'], $company);
7877
if ($kanvasOrder) {
7978
$this->info('Order already exists: ' . $kanvasOrder->order_number);
79+
8080
continue;
8181
}
8282
$items = $collection->where('order_reference', $order['order_reference']);
@@ -102,6 +102,7 @@ public function process(): void
102102
currency: Currencies::getByCode('USD'),
103103
quantityShipped: 0
104104
);
105+
105106
return $orderItem;
106107
}
107108
}
@@ -112,8 +113,8 @@ public function process(): void
112113
[
113114
'value' => $order['email'],
114115
'contacts_types_id' => ContactTypeEnum::EMAIL->value,
115-
'weight' => 0
116-
]
116+
'weight' => 0,
117+
],
117118
];
118119
$name = explode(' ', $order['name']);
119120
$peopleDto = new PeopleDTO(
@@ -131,6 +132,7 @@ public function process(): void
131132
}
132133
$total = $items->sum('price');
133134
$items = OrderItem::collect($items, DataCollection::class);
135+
134136
try {
135137
$user = UsersRepository::getByEmail($order['email']);
136138
} catch (Exception $e) {
@@ -151,12 +153,12 @@ public function process(): void
151153
'status' => OrderStatusEnum::COMPLETED->value,
152154
'checkoutToken' => '',
153155
'currency' => Currencies::getByCode('USD'),
154-
'items' => $items
156+
'items' => $items,
155157
]);
156158
$action = new CreateOrderAction($dto);
157159
$action->disableWorkflow();
158160
$kanvasOrder = $action->execute();
159-
$kanvasOrder->set('order_reference', $order['order_reference']);
161+
$kanvasOrder->set(CustomFieldEnum::WOOCOMMERCE_ORDER_ID->value, $order['order_reference']);
160162
$this->info("Order created: {$kanvasOrder->order_number}\n");
161163
}
162164
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class () extends Migration {
8+
/**
9+
* Run the migrations.
10+
*/
11+
public function up(): void
12+
{
13+
Schema::create('discount_types', function (Blueprint $table) {
14+
$table->id();
15+
$table->bigInteger('apps_id');
16+
$table->string('name');
17+
$table->text('description')->nullable();
18+
$table->timestamps();
19+
$table->boolean('is_deleted')->default(false);
20+
21+
$table->index('apps_id');
22+
$table->index('name');
23+
$table->index('is_deleted');
24+
});
25+
26+
Schema::create('discounts', function (Blueprint $table) {
27+
$table->id();
28+
$table->bigInteger('apps_id');
29+
$table->bigInteger('companies_id');
30+
$table->uuid('uuid');
31+
$table->string('name');
32+
$table->text('description')->nullable();
33+
$table->foreignId('discount_type_id')->constrained();
34+
$table->decimal('value', 10, 2);
35+
$table->boolean('is_percentage')->default(false);
36+
$table->decimal('min_order_value', 10, 2)->nullable();
37+
$table->decimal('max_discount_amount', 10, 2)->nullable();
38+
$table->string('code')->nullable()->unique();
39+
$table->timestamp('start_date')->nullable();
40+
$table->timestamp('end_date')->nullable();
41+
$table->boolean('is_active')->default(true);
42+
$table->integer('usage_limit')->nullable();
43+
$table->integer('usage_count')->default(0);
44+
$table->boolean('is_one_per_customer')->default(false);
45+
$table->timestamps();
46+
$table->boolean('is_deleted')->default(false);
47+
48+
$table->unique(['apps_id', 'uuid']);
49+
$table->index('apps_id');
50+
$table->index('companies_id');
51+
$table->index('uuid');
52+
$table->index('name');
53+
$table->index('discount_type_id');
54+
$table->index('start_date');
55+
$table->index('end_date');
56+
$table->index('is_active');
57+
$table->index('is_deleted');
58+
});
59+
60+
Schema::create('discount_conditions', function (Blueprint $table) {
61+
$table->id();
62+
$table->bigInteger('apps_id');
63+
$table->foreignId('discount_id')->constrained()->onDelete('cascade');
64+
$table->enum('type', ['product', 'category', 'variant', 'customer', 'customer_group']);
65+
$table->enum('operator', ['in', 'not_in'])->default('in');
66+
$table->timestamps();
67+
$table->boolean('is_deleted')->default(false);
68+
69+
$table->index('apps_id');
70+
$table->index('discount_id');
71+
$table->index('type');
72+
$table->index('operator');
73+
$table->index('is_deleted');
74+
});
75+
76+
Schema::create('discount_condition_values', function (Blueprint $table) {
77+
$table->id();
78+
$table->bigInteger('apps_id');
79+
$table->foreignId('condition_id')->constrained('discount_conditions')->onDelete('cascade');
80+
$table->string('value');
81+
$table->timestamps();
82+
$table->boolean('is_deleted')->default(false);
83+
84+
$table->index('apps_id');
85+
$table->index('condition_id');
86+
$table->index('value');
87+
$table->index('is_deleted');
88+
});
89+
90+
Schema::create('order_discounts', function (Blueprint $table) {
91+
$table->id();
92+
$table->bigInteger('apps_id');
93+
$table->foreignId('order_id')->constrained()->onDelete('cascade');
94+
$table->foreignId('discount_id')->constrained();
95+
$table->decimal('amount', 10, 2);
96+
$table->timestamps();
97+
$table->boolean('is_deleted')->default(false);
98+
99+
$table->index('apps_id');
100+
$table->index('order_id');
101+
$table->index('discount_id');
102+
$table->index('is_deleted');
103+
});
104+
105+
Schema::create('order_item_discounts', function (Blueprint $table) {
106+
$table->id();
107+
$table->bigInteger('apps_id');
108+
$table->foreignId('order_item_id')->constrained()->onDelete('cascade');
109+
$table->foreignId('discount_id')->constrained();
110+
$table->decimal('amount', 10, 2);
111+
$table->timestamps();
112+
$table->boolean('is_deleted')->default(false);
113+
114+
$table->index('apps_id');
115+
$table->index('order_item_id');
116+
$table->index('discount_id');
117+
$table->index('is_deleted');
118+
});
119+
}
120+
121+
/**
122+
* Reverse the migrations.
123+
*/
124+
public function down(): void
125+
{
126+
Schema::dropIfExists('discount_types');
127+
Schema::dropIfExists('discounts');
128+
Schema::dropIfExists('discount_conditions');
129+
Schema::dropIfExists('discount_condition_values');
130+
Schema::dropIfExists('order_discounts');
131+
Schema::dropIfExists('order_item_discounts');
132+
}
133+
};

src/Domains/Connectors/ESim/Actions/PushOrderToCommerceAction.php

+2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public function execute(string $provider): array
3131
$commerceProductId = $variant->product->getAttributeBySlug('commerce-product-id')?->value ?? '20';
3232
$variantDuration = $variant->getAttributeBySlug('variant-duration')?->value ?? null;
3333
$sku = $variant->getAttributeBySlug(CMLinkEnumsConfigurationEnum::PRODUCT_FATHER_SKU->value)?->value ?? $variant->sku;
34+
$isRefuelOrder = isset($this->order->metadata['parent_order_id']) && ! empty($this->order->metadata['parent_order_id']);
3435

3536
$response = Http::withHeaders([
3637
'X-API-Key' => $this->order->app->get(ConfigurationEnum::COMMERCE_API_KEY->value),
@@ -43,6 +44,7 @@ public function execute(string $provider): array
4344
'destination_code' => $destination,
4445
'sku' => $sku, //$commerceSku,
4546
'from_kanvas' => true,
47+
'is_recharge' => $isRefuelOrder,
4648
'iccid' => $this->esim->iccid,
4749
'apn' => null,
4850
'client_payment' => null,

src/Domains/Connectors/VinSolution/Actions/PushPeopleAction.php

+13-6
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,16 @@ protected function processDriversLicense(People $people): ?array
176176
if ($driversLicenseData) {
177177
try {
178178
$driversLicense = DriversLicense::fromArray($driversLicenseData);
179-
$birthDay = Carbon::createFromFormat(DateHelper::detectDateFormat($driversLicense->birthDate), $driversLicense->birthDate, 'UTC');
180-
$expirationData = Carbon::createFromFormat(DateHelper::detectDateFormat($driversLicense->expirationDate), $driversLicense->expirationDate, 'UTC');
181-
$issueDate = Carbon::createFromFormat(DateHelper::detectDateFormat($driversLicense->issueDate), $driversLicense->issueDate, 'UTC');
179+
180+
// Helper function to safely format date
181+
$formatDate = function ($dateString) {
182+
if (empty($dateString)) {
183+
return null;
184+
}
185+
$format = DateHelper::detectDateFormat($dateString);
186+
187+
return $format ? Carbon::createFromFormat($format, $dateString, 'UTC')->format('Y-m-d\TH:i:s.u\Z') : null;
188+
};
182189

183190
return [
184191
'State' => $driversLicense->state,
@@ -187,9 +194,9 @@ protected function processDriversLicense(People $people): ?array
187194
'PostalCode' => $driversLicense->zipCode,
188195
'Country' => 'USA',
189196
'LicenseID' => $driversLicense->documentNumber,
190-
'DateOfBirth' => $birthDay->format('Y-m-d\TH:i:s.u\Z'),
191-
'ExpirationDate' => $expirationData->format('Y-m-d\TH:i:s.u\Z'),
192-
'IssueDate' => $issueDate->format('Y-m-d\TH:i:s.u\Z'),
197+
'DateOfBirth' => $formatDate($driversLicense->birthDate),
198+
'ExpirationDate' => $formatDate($driversLicense->expirationDate),
199+
'IssueDate' => $formatDate($driversLicense->issueDate),
193200
'Sex' => $driversLicense->sex,
194201
];
195202
} catch (Throwable $e) {

0 commit comments

Comments
 (0)