120 lines
5.5 KiB
PHP
120 lines
5.5 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit\EcommerceFinance;
|
|
|
|
use Illuminate\Database\Schema\Blueprint;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Schema;
|
|
use Modules\EcommerceFinance\Repositories\GenericBusinessMirrorRepository;
|
|
use Modules\EcommerceFinance\Repositories\InstallationFeeSummaryRepository;
|
|
use Modules\EcommerceFinance\Services\BusinessMirrorDatasetRegistry;
|
|
use Tests\TestCase;
|
|
|
|
class InstallationFeeSummaryRepositoryTest extends TestCase
|
|
{
|
|
private InstallationFeeSummaryRepository $repository;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
|
|
config([
|
|
'database.connections.business_mirror' => [
|
|
'driver' => 'sqlite',
|
|
'database' => ':memory:',
|
|
'prefix' => '',
|
|
],
|
|
'upstream_mirrors.connection' => 'business_mirror',
|
|
'cache.default' => 'array',
|
|
'upstream_mirrors.datasets' => [
|
|
InstallationFeeSummaryRepository::MAIN_DATASET => [
|
|
'source_key' => 'jiansun',
|
|
'schema' => 'dbo',
|
|
'object' => 'install_view',
|
|
'target' => 'fixture_install_view',
|
|
'keys' => ['Id'],
|
|
],
|
|
InstallationFeeSummaryRepository::ITEM_DATASET => [
|
|
'source_key' => 'jiansun',
|
|
'schema' => 'dbo',
|
|
'object' => 'install_item',
|
|
'target' => 'fixture_install_item',
|
|
'keys' => ['Id'],
|
|
],
|
|
],
|
|
]);
|
|
DB::purge('business_mirror');
|
|
Cache::flush();
|
|
|
|
$schema = Schema::connection('business_mirror');
|
|
$schema->create('business_mirror_table_states', function (Blueprint $table): void {
|
|
$table->string('dataset_key')->primary();
|
|
$table->dateTime('initial_completed_at')->nullable();
|
|
});
|
|
$schema->create('fixture_install_view', function (Blueprint $table): void {
|
|
$table->integer('Id');
|
|
$table->string('SourceGuid');
|
|
$table->dateTime('ShipTIme')->nullable();
|
|
$table->string('shop_name')->nullable();
|
|
$table->string('installCompanyName')->nullable();
|
|
$table->string('costWay')->nullable();
|
|
});
|
|
$schema->create('fixture_install_item', function (Blueprint $table): void {
|
|
$table->integer('Id');
|
|
$table->string('guid');
|
|
$table->decimal('settleItemAmount', 18, 4)->nullable();
|
|
});
|
|
foreach ([InstallationFeeSummaryRepository::MAIN_DATASET, InstallationFeeSummaryRepository::ITEM_DATASET] as $dataset) {
|
|
DB::connection('business_mirror')->table('business_mirror_table_states')->insert([
|
|
'dataset_key' => $dataset,
|
|
'initial_completed_at' => '2026-09-01 00:00:00',
|
|
]);
|
|
}
|
|
|
|
$mirror = DB::connection('business_mirror');
|
|
$mirror->table('fixture_install_view')->insert([
|
|
['Id' => 1, 'SourceGuid' => 'A', 'ShipTIme' => '2026-09-01 10:00:00', 'shop_name' => '店铺A', 'installCompanyName' => '万师傅', 'costWay' => null],
|
|
['Id' => 2, 'SourceGuid' => 'A', 'ShipTIme' => '2026-09-02 10:00:00', 'shop_name' => '店铺A', 'installCompanyName' => '万师傅', 'costWay' => null],
|
|
['Id' => 3, 'SourceGuid' => 'B', 'ShipTIme' => '2026-09-03 10:00:00', 'shop_name' => '店铺A', 'installCompanyName' => '万师傅', 'costWay' => '银行转账'],
|
|
['Id' => 4, 'SourceGuid' => 'C', 'ShipTIme' => '2026-08-31 23:59:59', 'shop_name' => '店铺C', 'installCompanyName' => '鲁班到家', 'costWay' => null],
|
|
['Id' => 5, 'SourceGuid' => 'D', 'ShipTIme' => '2026-09-04 10:00:00', 'shop_name' => null, 'installCompanyName' => ' ', 'costWay' => ' '],
|
|
]);
|
|
$mirror->table('fixture_install_item')->insert([
|
|
['Id' => 10, 'guid' => 'A', 'settleItemAmount' => 100],
|
|
['Id' => 11, 'guid' => 'A', 'settleItemAmount' => 25],
|
|
['Id' => 12, 'guid' => 'B', 'settleItemAmount' => 50],
|
|
['Id' => 13, 'guid' => 'C', 'settleItemAmount' => 999],
|
|
['Id' => 14, 'guid' => 'D', 'settleItemAmount' => 10],
|
|
]);
|
|
|
|
$this->repository = new InstallationFeeSummaryRepository(
|
|
new GenericBusinessMirrorRepository(app('db')),
|
|
new BusinessMirrorDatasetRegistry(),
|
|
);
|
|
}
|
|
|
|
public function test_summary_and_details_use_shipment_month_and_settlement_detail_amount(): void
|
|
{
|
|
$summary = $this->repository->summary('2026-09');
|
|
$this->assertTrue($summary['ready']);
|
|
$this->assertSame(185.0, $summary['total']);
|
|
$this->assertSame(4, $summary['row_count']);
|
|
|
|
$details = $this->repository->details('2026-09');
|
|
$this->assertTrue($details['ready']);
|
|
$this->assertSame(185.0, $details['total']);
|
|
$this->assertSame([
|
|
['store_name' => '店铺A', 'installation_company' => '万师傅', 'payment_channel' => '包安装', 'amount' => 125.0],
|
|
['store_name' => '店铺A', 'installation_company' => '万师傅', 'payment_channel' => '不包安装', 'amount' => 50.0],
|
|
['store_name' => '未填写店铺', 'installation_company' => '未填写安装公司', 'payment_channel' => '包安装', 'amount' => 10.0],
|
|
], $details['rows']);
|
|
}
|
|
|
|
public function test_invalid_month_is_rejected(): void
|
|
{
|
|
$this->expectException(\InvalidArgumentException::class);
|
|
$this->repository->summary('2026-13');
|
|
}
|
|
}
|