diff --git a/migrations/changes-1741852019.sql b/migrations/changes-1741852019.sql new file mode 100644 index 00000000..c2691e8d --- /dev/null +++ b/migrations/changes-1741852019.sql @@ -0,0 +1,13 @@ +-- +migrate Up +ALTER TABLE passports +DROP CONSTRAINT passports_passport_number_key; + +ALTER TABLE passports +ADD CONSTRAINT passports_passport_number_series_key UNIQUE (passport_number, series); + +-- +migrate Down +ALTER TABLE passports +DROP CONSTRAINT passports_passport_number_series_key; + +ALTER TABLE passports +ADD CONSTRAINT passports_passport_number_key UNIQUE (passport_number); diff --git a/modules/core/infrastructure/persistence/schema/core-schema.sql b/modules/core/infrastructure/persistence/schema/core-schema.sql index 65c92909..b664f1d5 100644 --- a/modules/core/infrastructure/persistence/schema/core-schema.sql +++ b/modules/core/infrastructure/persistence/schema/core-schema.sql @@ -20,7 +20,7 @@ CREATE TABLE passports ( birth_place varchar(255), nationality varchar(100), passport_type varchar(20), -- Type of passport (e.g., personal, diplomatic). - passport_number varchar(20) UNIQUE, + passport_number varchar(20), series varchar(20), -- Some countries use a prefix before the passport number. issuing_country varchar(100), issued_at date, @@ -31,7 +31,8 @@ CREATE TABLE passports ( signature_image bytea, -- Digital signature of the passport holder. remarks text, -- Additional notes (e.g., travel restrictions, visa endorsements). created_at timestamp with time zone DEFAULT now(), - updated_at timestamp with time zone DEFAULT now() + updated_at timestamp with time zone DEFAULT now(), + UNIQUE (passport_number, series) ); CREATE TABLE companies ( diff --git a/modules/crm/domain/aggregates/client/client_dto.go b/modules/crm/domain/aggregates/client/client_dto.go index de840926..a99b3e81 100644 --- a/modules/crm/domain/aggregates/client/client_dto.go +++ b/modules/crm/domain/aggregates/client/client_dto.go @@ -3,17 +3,19 @@ package client import ( "context" "fmt" + "github.com/iota-uz/iota-sdk/modules/core/domain/entities/passport" "github.com/iota-uz/iota-sdk/modules/core/domain/value_objects/country" "github.com/iota-uz/iota-sdk/modules/core/domain/value_objects/internet" "github.com/iota-uz/iota-sdk/modules/core/domain/value_objects/phone" "github.com/iota-uz/iota-sdk/modules/core/domain/value_objects/tax" - "github.com/go-playground/validator/v10" - "github.com/nicksnyder/go-i18n/v2/i18n" - "github.com/iota-uz/iota-sdk/pkg/composables" "github.com/iota-uz/iota-sdk/pkg/constants" + + "github.com/go-playground/validator/v10" + "github.com/google/uuid" + "github.com/nicksnyder/go-i18n/v2/i18n" ) type CreateDTO struct { @@ -168,8 +170,17 @@ func (d *UpdateDTO) Apply(entity Client) (Client, error) { // Update passport if both series and number provided if d.PassportSeries != "" && d.PassportNumber != "" { - passport := passport.New(d.PassportSeries, d.PassportNumber) - updated = updated.SetPassport(passport) + if entity.Passport() != nil && entity.Passport().ID() != uuid.Nil { + passport := passport.New( + d.PassportSeries, + d.PassportNumber, + passport.WithID(entity.Passport().ID()), + ) + updated = updated.SetPassport(passport) + } else { + passport := passport.New(d.PassportSeries, d.PassportNumber) + updated = updated.SetPassport(passport) + } } // Update PIN if provided with country code