diff --git a/delivery/http_server/admin/kind_box_req/deliver.go b/delivery/http_server/admin/kind_box_req/deliver.go new file mode 100644 index 0000000..05dc5b5 --- /dev/null +++ b/delivery/http_server/admin/kind_box_req/deliver.go @@ -0,0 +1,42 @@ +package adminkindboxreqhandler + +import ( + "net/http" + "strconv" + + param "git.gocasts.ir/ebhomengo/niki/param/admin/kind_box_req" + errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" + httpmsg "git.gocasts.ir/ebhomengo/niki/pkg/http_msg" + echo "github.com/labstack/echo/v4" +) + +func (h Handler) Deliver(c echo.Context) error { + var req param.DeliverKindBoxReqRequest + + id, cErr := strconv.ParseUint(c.Param("id"), 10, 64) + + if cErr != nil { + return c.JSON(http.StatusBadRequest, errmsg.ErrorMsgInvalidInput) + } + + req.KindBoxReqID = uint(id) + + if fieldErrors, err := h.adminKindBoxReqVld.ValidateDeliver(req); err != nil { + msg, code := httpmsg.Error(err) + + return c.JSON(code, echo.Map{ + "message": msg, + "errors": fieldErrors, + }) + } + + resp, sErr := h.adminKindBoxReqSvc.Deliver(c.Request().Context(), req) + + if sErr != nil { + msg, code := httpmsg.Error(sErr) + + return echo.NewHTTPError(code, msg) + } + + return c.JSON(http.StatusOK, resp) +} diff --git a/delivery/http_server/admin/kind_box_req/route.go b/delivery/http_server/admin/kind_box_req/route.go index c92ed27..98c12ca 100644 --- a/delivery/http_server/admin/kind_box_req/route.go +++ b/delivery/http_server/admin/kind_box_req/route.go @@ -11,5 +11,6 @@ func (h Handler) SetRoutes(e *echo.Echo) { // todo - add acl r.PATCH("/accept-kind-box-req/:id", h.Accept) r.PATCH("/reject-kind-box-req/:id", h.Reject) + r.PATCH("/deliver-kind-box-req/:id", h.Deliver) r.GET("/", h.GetAll, middleware.Auth(h.authSvc, h.authConfig)) } diff --git a/entity/address.go b/entity/address.go index ebfbb50..8a4ac1d 100644 --- a/entity/address.go +++ b/entity/address.go @@ -4,8 +4,9 @@ type Address struct { ID uint PostalCode string Address string - Lat float32 - Lon float32 + Lat float64 + Lon float64 + IsMain bool CityID uint ProvinceID uint BenefactorID uint diff --git a/entity/admin.go b/entity/admin.go index 97c0780..f677b0e 100644 --- a/entity/admin.go +++ b/entity/admin.go @@ -4,7 +4,7 @@ type Admin struct { ID uint FirstName string LastName string - password string + Password string PhoneNumber string Role AdminRole Description string @@ -12,11 +12,3 @@ type Admin struct { Gender Gender Status AdminStatus } - -func (a *Admin) GetPassword() string { - return a.password -} - -func (a *Admin) SetPassword(password string) { - a.password = password -} diff --git a/entity/admin_access_control.go b/entity/admin_access_control.go new file mode 100644 index 0000000..21906f7 --- /dev/null +++ b/entity/admin_access_control.go @@ -0,0 +1,15 @@ +package entity + +type AdminAccessControl struct { + ID uint + ActorID uint + ActorType AdminActorType + Permission AdminPermission +} + +type AdminActorType string + +const ( + AdminRoleActorType = AdminActorType("role") + AdminAdminActorType = AdminActorType("admin") +) diff --git a/entity/admin_permission.go b/entity/admin_permission.go new file mode 100644 index 0000000..2249102 --- /dev/null +++ b/entity/admin_permission.go @@ -0,0 +1,10 @@ +package entity + +type AdminPermission string + +const ( + AdminAdminRegisterPermission = AdminPermission("admin-register") + AdminKindBoxReqAcceptPermission = AdminPermission("kindboxreq-accept") + AdminKindBoxReqRejectPermission = AdminPermission("kindboxreq-reject") + AdminKindBoxReqGetAllPermission = AdminPermission("kindboxreq-getall") +) diff --git a/entity/admin_role.go b/entity/admin_role.go index dc06895..ab2d869 100644 --- a/entity/admin_role.go +++ b/entity/admin_role.go @@ -3,13 +3,15 @@ package entity type AdminRole uint const ( - AdminAdminRole AdminRole = iota + 1 - AdminSuperAdminRole + AdminSuperAdminRole AdminRole = iota + 1 + AdminAdminRole + AdminAgentRole ) var AdminRoleStrings = map[AdminRole]string{ - AdminAdminRole: "admin", AdminSuperAdminRole: "super-admin", + AdminAdminRole: "admin", + AdminAgentRole: "agent", } func (s AdminRole) String() string { diff --git a/entity/admin_status.go b/entity/admin_status.go index 9750c0d..644d103 100644 --- a/entity/admin_status.go +++ b/entity/admin_status.go @@ -4,12 +4,12 @@ type AdminStatus uint const ( AdminActiveStatus AdminStatus = iota + 1 - AdminDeactiveStatus + AdminInactiveStatus ) var AdminStatusStrings = map[AdminStatus]string{ AdminActiveStatus: "active", - AdminDeactiveStatus: "deactive", + AdminInactiveStatus: "inactive", } func (s AdminStatus) String() string { diff --git a/entity/benefactor.go b/entity/benefactor.go index 53fac3b..543d56f 100644 --- a/entity/benefactor.go +++ b/entity/benefactor.go @@ -7,12 +7,9 @@ type Benefactor struct { FirstName string LastName string PhoneNumber string - Address string Description string Email string - City string Gender Gender - Status BenefactorStatus - Birthdate time.Time + BirthDate time.Time Role UserRole } diff --git a/entity/benefactor_status.go b/entity/benefactor_status.go deleted file mode 100644 index 7ac454b..0000000 --- a/entity/benefactor_status.go +++ /dev/null @@ -1,38 +0,0 @@ -package entity - -type BenefactorStatus uint - -const ( - BenefactorActiveStatus BenefactorStatus = iota + 1 - BenefactorDeactiveStatus -) - -var BenefactorStatusStrings = map[BenefactorStatus]string{ - BenefactorActiveStatus: "active", - BenefactorDeactiveStatus: "deactive", -} - -func (s BenefactorStatus) String() string { - return BenefactorStatusStrings[s] -} - -// AllBenefactorStatus returns a slice containing all string values of BenefactorStatus. -func AllBenefactorStatus() []string { - statusStrings := make([]string, len(BenefactorStatusStrings)) - for status, str := range BenefactorStatusStrings { - statusStrings[int(status)-1] = str - } - - return statusStrings -} - -// MapToBenefactorStatus converts a string to the corresponding BenefactorStatus value. -func MapToBenefactorStatus(statusStr string) BenefactorStatus { - for status, str := range BenefactorStatusStrings { - if str == statusStr { - return status - } - } - - return BenefactorStatus(0) -} diff --git a/entity/kind_box.go b/entity/kind_box.go index 69d3bb8..cfb2957 100644 --- a/entity/kind_box.go +++ b/entity/kind_box.go @@ -3,14 +3,19 @@ package entity import "time" type KindBox struct { - ID uint - KindBoxReqID uint - BenefactorID uint - Type KindBoxType - TotalAmount uint - SerialNumber string - Status KindBoxStatus - SenderID uint - ReceiverID uint - StatusChangedAt time.Time + ID uint + KindBoxReqID uint + BenefactorID uint + Type KindBoxType + Amount uint + SerialNumber string + Status KindBoxStatus + DeliverReferDate time.Time + DeliverAddressID uint + SenderAgentID uint + DeliveredAt time.Time + ReturnReferDate time.Time + ReturnAddressID uint + ReceiverAgentID uint + ReturnedAt time.Time } diff --git a/entity/kind_box_req.go b/entity/kind_box_req.go index 59e4c64..0e233f8 100644 --- a/entity/kind_box_req.go +++ b/entity/kind_box_req.go @@ -3,14 +3,15 @@ package entity import "time" type KindBoxReq struct { - ID uint - KindBoxType KindBoxType - CountRequested uint - CountAccepted uint - BenefactorID uint - Status KindBoxReqStatus - Description string - ReferDate time.Time - AddressID uint - CreatedAt time.Time + ID uint + BenefactorID uint + KindBoxType KindBoxType + CountRequested uint + CountAccepted uint + Description string + Status KindBoxReqStatus + DeliverReferDate time.Time + DeliverAddressID uint + SenderAgentID uint + DeliveredAt time.Time } diff --git a/entity/kind_box_req_status.go b/entity/kind_box_req_status.go index a6795c6..a36d708 100644 --- a/entity/kind_box_req_status.go +++ b/entity/kind_box_req_status.go @@ -5,13 +5,17 @@ type KindBoxReqStatus uint const ( KindBoxReqPendingStatus KindBoxReqStatus = iota + 1 KindBoxReqAcceptedStatus + KindBoxReqAssignedSenderAgentStatus KindBoxReqRejectedStatus + KindBoxReqDeliveredStatus ) var kindBoxReqStatusStrings = map[KindBoxReqStatus]string{ - KindBoxReqPendingStatus: "pending", - KindBoxReqAcceptedStatus: "accepted", - KindBoxReqRejectedStatus: "rejected", + KindBoxReqPendingStatus: "pending", + KindBoxReqAcceptedStatus: "accepted", + KindBoxReqAssignedSenderAgentStatus: "assigned-sender-agent", + KindBoxReqRejectedStatus: "rejected", + KindBoxReqDeliveredStatus: "delivered", } func (s KindBoxReqStatus) String() string { diff --git a/entity/kind_box_status.go b/entity/kind_box_status.go index c3d76ec..48df6d7 100644 --- a/entity/kind_box_status.go +++ b/entity/kind_box_status.go @@ -3,19 +3,19 @@ package entity type KindBoxStatus uint const ( - KindBoxPendingSendStatus KindBoxStatus = iota + 1 - KindBoxSentStatus - KindBoxPendingReceivedStatus - KindBoxReceivedStatus + KindBoxDeliveredStatus KindBoxStatus = iota + 1 + KindBoxReadyToReturnStatus + KindBoxAssignedReceiverAgentStatus + KindBoxReturnedStatus KindBoxEnumeratedStatus ) var kindBoxStatusStrings = map[KindBoxStatus]string{ - KindBoxPendingSendStatus: "pending-send", - KindBoxSentStatus: "sent", - KindBoxPendingReceivedStatus: "pending-received", - KindBoxReceivedStatus: "received", - KindBoxEnumeratedStatus: "enumerated", + KindBoxDeliveredStatus: "delivered", + KindBoxReadyToReturnStatus: "ready-to-return", + KindBoxAssignedReceiverAgentStatus: "assigned-receiver-agent", + KindBoxReturnedStatus: "returned", + KindBoxEnumeratedStatus: "enumerated", } func (s KindBoxStatus) String() string { diff --git a/entity/kind_box_type.go b/entity/kind_box_type.go index 49d12f1..d6ebd04 100644 --- a/entity/kind_box_type.go +++ b/entity/kind_box_type.go @@ -1,6 +1,5 @@ package entity -// TODO - use config file instead of const. type KindBoxType uint const ( diff --git a/entity/Province.go b/entity/province.go similarity index 100% rename from entity/Province.go rename to entity/province.go diff --git a/entity/staff.go b/entity/staff.go deleted file mode 100644 index b5095c5..0000000 --- a/entity/staff.go +++ /dev/null @@ -1,18 +0,0 @@ -package entity - -import "time" - -type Staff struct { - ID uint - FirstName string - LastName string - PhoneNumber string - Address string - Description string - Email string - City string - Gender Gender - Status StaffStatus - Birthday time.Time - StatusChangedAt time.Time -} diff --git a/entity/staff_status.go b/entity/staff_status.go deleted file mode 100644 index 3a348a8..0000000 --- a/entity/staff_status.go +++ /dev/null @@ -1,38 +0,0 @@ -package entity - -type StaffStatus uint - -const ( - StaffActiveStatus StaffStatus = iota + 1 - StaffDeactiveStatus -) - -var StaffStatusStrings = map[StaffStatus]string{ - StaffActiveStatus: "active", - StaffDeactiveStatus: "deactive", -} - -func (s StaffStatus) String() string { - return StaffStatusStrings[s] -} - -// AllStaffStatus returns a slice containing all string values of StaffStatus. -func AllStaffStatus() []string { - statusStrings := make([]string, len(StaffStatusStrings)) - for status, str := range StaffStatusStrings { - statusStrings[int(status)-1] = str - } - - return statusStrings -} - -// MapToStaffStatus converts a string to the corresponding StaffStatus value. -func MapToStaffStatus(statusStr string) StaffStatus { - for status, str := range StaffStatusStrings { - if str == statusStr { - return status - } - } - - return StaffStatus(0) -} diff --git a/entity/benefactor_role.go b/entity/user_role.go similarity index 100% rename from entity/benefactor_role.go rename to entity/user_role.go diff --git a/go.mod b/go.mod index 0c66320..5dda685 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,6 @@ require ( github.com/knadh/koanf v1.5.0 github.com/labstack/echo-jwt/v4 v4.2.0 github.com/labstack/echo/v4 v4.11.4 - github.com/oklog/ulid/v2 v2.1.0 github.com/redis/go-redis/v9 v9.4.0 github.com/rubenv/sql-migrate v1.6.0 github.com/stretchr/testify v1.8.4 diff --git a/param/admin/kind_box/add.go b/param/admin/kind_box/add.go index 1a39b36..483dde2 100644 --- a/param/admin/kind_box/add.go +++ b/param/admin/kind_box/add.go @@ -1 +1,19 @@ package adminkindboxparam + +import ( + entity "git.gocasts.ir/ebhomengo/niki/entity" + "time" +) + +type AddKindBoxRequest struct { + KindBoxReqID uint + BenefactorID uint + Type entity.KindBoxType + DeliverReferDate time.Time + DeliverAddressID uint + SenderAgentID uint + DeliveredAt time.Time + CountAccepted uint +} + +type AddKindBoxResponse struct{} diff --git a/param/admin/kind_box/update.go b/param/admin/kind_box/update.go index f78fdf5..10e9792 100644 --- a/param/admin/kind_box/update.go +++ b/param/admin/kind_box/update.go @@ -3,13 +3,13 @@ package adminkindboxparam import entity "git.gocasts.ir/ebhomengo/niki/entity" type KindBoxUpdateRequest struct { - BenefactorID uint - KindBoxID uint - TotalAmount uint - ReceiverID uint - SenderID uint - SerialNumber string - Status entity.KindBoxStatus + BenefactorID uint + KindBoxID uint + Amount uint + ReceiverAgentID uint + SenderAgentID uint + SerialNumber string + Status entity.KindBoxStatus } type KindBoxUpdateResponse struct { diff --git a/param/admin/kind_box_req/accept.go b/param/admin/kind_box_req/accept.go index f3b8746..df243e0 100644 --- a/param/admin/kind_box_req/accept.go +++ b/param/admin/kind_box_req/accept.go @@ -16,6 +16,6 @@ type KindBoxReqAcceptResponse struct { KindBoxReqStatus entity.KindBoxReqStatus `json:"kind_box_req_status"` CountRequested uint `json:"count_requested"` CountAccepted uint `json:"count_accepted"` - ReferDate time.Time `json:"refer_date"` - AddressID uint `json:"address_id"` + DeliverReferDate time.Time `json:"deliver_refer_date"` + DeliverAddressID uint `json:"deliver_address_id"` } diff --git a/param/admin/kind_box_req/deliver.go b/param/admin/kind_box_req/deliver.go new file mode 100644 index 0000000..d1c1b91 --- /dev/null +++ b/param/admin/kind_box_req/deliver.go @@ -0,0 +1,7 @@ +package adminkindboxreqparam + +type DeliverKindBoxReqRequest struct { + KindBoxReqID uint `json:"kind_box_req_id"` +} + +type DeliverKindBoxReqResponse struct{} diff --git a/param/admin/kind_box_req/reject.go b/param/admin/kind_box_req/reject.go index a000e42..194b966 100644 --- a/param/admin/kind_box_req/reject.go +++ b/param/admin/kind_box_req/reject.go @@ -12,12 +12,12 @@ type KindBoxReqRejectRequest struct { } type KindBoxReqRejectResponse struct { - ID uint `json:"id"` - KindBoxType entity.KindBoxType `json:"kind_box_type"` - CountRequested uint `json:"count_requested"` - BenefactorID uint `json:"benefactor_id"` - Status entity.KindBoxReqStatus `json:"status"` - Description string `json:"description"` - ReferDate time.Time `json:"refer_date"` - AddressID uint `json:"address_id"` + ID uint `json:"id"` + KindBoxType entity.KindBoxType `json:"kind_box_type"` + CountRequested uint `json:"count_requested"` + BenefactorID uint `json:"benefactor_id"` + Status entity.KindBoxReqStatus `json:"status"` + Description string `json:"description"` + DeliverReferDate time.Time `json:"deliver_refer_date"` + DeliverAddressID uint `json:"deliver_address_id"` } diff --git a/param/benefactor/address/add.go b/param/benefactor/address/add.go index 2579e7c..74c1f8b 100644 --- a/param/benefactor/address/add.go +++ b/param/benefactor/address/add.go @@ -5,8 +5,8 @@ import "git.gocasts.ir/ebhomengo/niki/entity" type BenefactorAddAddressRequest struct { PostalCode string `json:"postal_code"` Address string `json:"address"` - Lat float32 `json:"lat"` - Lon float32 `json:"lon"` + Lat float64 `json:"lat"` + Lon float64 `json:"lon"` CityID uint `json:"city_id"` ProvinceID uint `json:"province_id"` BenefactorID uint `json:"benefactor_id"` diff --git a/param/benefactor/kind_box_req/add.go b/param/benefactor/kind_box_req/add.go index dcea5f1..b9ab864 100644 --- a/param/benefactor/kind_box_req/add.go +++ b/param/benefactor/kind_box_req/add.go @@ -1,17 +1,15 @@ package benefactorkindboxreqparam import ( - "time" - entity "git.gocasts.ir/ebhomengo/niki/entity" ) type KindBoxReqAddRequest struct { - BenefactorID uint `json:"benefactor_id"` - TypeID entity.KindBoxType `json:"type_id"` - AddressID uint `json:"address_id"` - ReferDate time.Time `json:"refer_date"` - CountRequested uint `json:"count_requested"` + BenefactorID uint `json:"benefactor_id"` + TypeID entity.KindBoxType `json:"type_id"` + DeliverAddressID uint `json:"deliver_address_id"` + DeliverReferDate string `json:"deliver_refer_date"` + CountRequested uint `json:"count_requested"` } type KindBoxReqAddResponse struct { diff --git a/pkg/err_msg/message.go b/pkg/err_msg/message.go index 348c97f..1e14da6 100644 --- a/pkg/err_msg/message.go +++ b/pkg/err_msg/message.go @@ -17,4 +17,5 @@ const ( ErrBadRequest = "Bad request" ErrorMsgAcceptKindBoxReqStatus = "only pending requests will have the ability to be confirmed" ErrorMsgRejectKindBoxReqStatus = "only pending requests will have the ability to be rejected" + ErrorMsgDeliverKindBoxReqStatus = "only assigned requests will have the ability to be delivered" ) diff --git a/repository/mysql/admin/create.go b/repository/mysql/admin/create.go index 9c4724a..96ed635 100644 --- a/repository/mysql/admin/create.go +++ b/repository/mysql/admin/create.go @@ -13,7 +13,7 @@ func (d DB) AddAdmin(ctx context.Context, admin entity.Admin) (entity.Admin, err res, err := d.conn.Conn().ExecContext(ctx, `insert into admins(first_name,last_name,password,phone_number, role,description,email,gender,status) values (?,?,?,?,?,?,?,?,?)`, - admin.FirstName, admin.LastName, admin.GetPassword(), admin.PhoneNumber, admin.Role.String(), admin.Description, admin.Email, + admin.FirstName, admin.LastName, admin.Password, admin.PhoneNumber, admin.Role.String(), admin.Description, admin.Email, admin.Gender.String(), admin.Status.String()) if err != nil { return entity.Admin{}, richerror.New(op).WithErr(err). diff --git a/repository/mysql/admin/get.go b/repository/mysql/admin/get.go index b8b0626..750bf7b 100644 --- a/repository/mysql/admin/get.go +++ b/repository/mysql/admin/get.go @@ -51,7 +51,7 @@ func scanAdmin(scanner mysql.Scanner) (entity.Admin, error) { admin.Role = entity.MapToAdminRole(roleStr) admin.Status = entity.MapToAdminStatus(statusStr) - admin.SetPassword(password) + admin.Password = password mapNotNullToAdmin(adminNullableFields, &admin) return admin, err diff --git a/repository/mysql/benefactor/create.go b/repository/mysql/benefactor/create.go index 4fad343..c749330 100644 --- a/repository/mysql/benefactor/create.go +++ b/repository/mysql/benefactor/create.go @@ -11,8 +11,8 @@ import ( func (d DB) CreateBenefactor(ctx context.Context, benefactor entity.Benefactor) (entity.Benefactor, error) { const op = "mysqlbenefactor.CreateBenefactor" - res, err := d.conn.Conn().ExecContext(ctx, `insert into benefactors(phone_number, status, role) values(?, ?, ?)`, - benefactor.PhoneNumber, benefactor.Status.String(), benefactor.Role.String()) + res, err := d.conn.Conn().ExecContext(ctx, `insert into benefactors(phone_number) values(?)`, + benefactor.PhoneNumber) if err != nil { return entity.Benefactor{}, richerror.New(op).WithErr(err). WithMessage(errmsg.ErrorMsgNotFound).WithKind(richerror.KindUnexpected) diff --git a/repository/mysql/benefactor/exist_benefactor.go b/repository/mysql/benefactor/exist_benefactor.go index 3b2e46c..cbbc49d 100644 --- a/repository/mysql/benefactor/exist_benefactor.go +++ b/repository/mysql/benefactor/exist_benefactor.go @@ -4,8 +4,6 @@ import ( "context" "database/sql" "errors" - "time" - "git.gocasts.ir/ebhomengo/niki/entity" errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" @@ -57,9 +55,8 @@ func (d *DB) IsExistBenefactorByID(ctx context.Context, id uint) (bool, error) { } func scanBenefactor(scanner mysql.Scanner) (entity.Benefactor, error) { - var createdAt time.Time + var benefactor entity.Benefactor - var roleStr, statusStr string // TODO - use db model and mapper between entity and db model OR use this approach var benefactorNullableFields nullableFields @@ -68,11 +65,8 @@ func scanBenefactor(scanner mysql.Scanner) (entity.Benefactor, error) { &benefactorNullableFields.lastName, &benefactor.PhoneNumber, &benefactorNullableFields.address, &benefactorNullableFields.description, &benefactorNullableFields.email, &benefactorNullableFields.city, &benefactorNullableFields.genderStr, - &statusStr, &benefactorNullableFields.birthdate, &roleStr, - &createdAt) + &benefactorNullableFields.birthdate) - benefactor.Role = entity.MapToUserRole(roleStr) - benefactor.Status = entity.MapToBenefactorStatus(statusStr) mapNotNullToBenefactor(benefactorNullableFields, &benefactor) return benefactor, err @@ -97,22 +91,22 @@ func mapNotNullToBenefactor(data nullableFields, benefactor *entity.Benefactor) if data.lastName.Valid { benefactor.LastName = data.lastName.String } - if data.address.Valid { - benefactor.Address = data.address.String - } + //if data.address.Valid { + // benefactor.Address = data.address.String + //} if data.description.Valid { benefactor.Description = data.description.String } if data.email.Valid { benefactor.Email = data.email.String } - if data.city.Valid { - benefactor.City = data.city.String - } + //if data.city.Valid { + // benefactor.City = data.city.String + //} if data.genderStr.Valid { benefactor.Gender = entity.MapToGender(data.genderStr.String) } if data.birthdate.Valid { - benefactor.Birthdate = data.birthdate.Time + benefactor.BirthDate = data.birthdate.Time } } diff --git a/repository/mysql/kind_box/kind_box.go b/repository/mysql/kind_box/add.go similarity index 51% rename from repository/mysql/kind_box/kind_box.go rename to repository/mysql/kind_box/add.go index ee077d3..062c5f3 100644 --- a/repository/mysql/kind_box/kind_box.go +++ b/repository/mysql/kind_box/add.go @@ -8,15 +8,28 @@ import ( richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" ) +func (d DB) AddKindBox(ctx context.Context, kindBox entity.KindBox) error { + const op = "mysqlkindbox.AddKindBox" + + _, err := d.conn.Conn().ExecContext(ctx, `insert into kind_boxes(kind_box_req_id,benefactor_id,type,status,sender_agent_id) values (?,?,?,?,?)`, + kindBox.KindBoxReqID, kindBox.BenefactorID, kindBox.Type, entity.KindBoxDeliveredStatus.String(), kindBox.SenderAgentID) + if err != nil { + return richerror.New(op).WithErr(err). + WithMessage(errmsg.ErrorMsgNotFound).WithKind(richerror.KindUnexpected) + } + + return nil +} + func (d DB) AddBatchKindBox(ctx context.Context, kindBoxes []entity.KindBox) error { const op = "mysqlkindbox.AddBatchKindBoxConcurrentlyRollback" - queryStr := "INSERT INTO kind_boxes (kind_box_req_id, benefactor_id, type, serial_number, status) VALUES " + queryStr := "INSERT INTO kind_boxes (kind_box_req_id, benefactor_id, type, status ,deliver_refer_date,deliver_address_id,sender_agent_id,delivered_at) VALUES " values := []any{} for _, kb := range kindBoxes { - queryStr += "(?, ?, ?, ?, ?)," - values = append(values, kb.KindBoxReqID, kb.BenefactorID, kb.Type, kb.SerialNumber, kb.Status.String()) + queryStr += "(?, ?, ?, ?, ?, ?, ?, ?)," + values = append(values, kb.KindBoxReqID, kb.BenefactorID, kb.Type, kb.Status.String(), kb.DeliverReferDate, kb.DeliverAddressID, kb.SenderAgentID, kb.DeliveredAt) } // trim the last , diff --git a/repository/mysql/kind_box_req/deliver.go b/repository/mysql/kind_box_req/deliver.go new file mode 100644 index 0000000..7ff8024 --- /dev/null +++ b/repository/mysql/kind_box_req/deliver.go @@ -0,0 +1,23 @@ +package mysqlkindboxreq + +import ( + "context" + "time" + + entity "git.gocasts.ir/ebhomengo/niki/entity" + errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" + richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" +) + +func (d DB) DeliverKindBoxReq(ctx context.Context, kindBoxReqID uint) error { + const op = "mysqlkindboxreq.DeliverKindBoxReq" + + _, err := d.conn.Conn().ExecContext(ctx, `update kind_box_reqs set status = ?, delivered_at = ?, updated_at = ?, where id = ?`, + entity.KindBoxReqDeliveredStatus.String(), time.Now(), time.Now(), kindBoxReqID) + if err != nil { + return richerror.New(op).WithErr(err). + WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected) + } + + return nil +} diff --git a/repository/mysql/kind_box_req/kind_box_req.go b/repository/mysql/kind_box_req/kind_box_req.go index 8c33403..8036060 100644 --- a/repository/mysql/kind_box_req/kind_box_req.go +++ b/repository/mysql/kind_box_req/kind_box_req.go @@ -14,7 +14,7 @@ func (d DB) AddKindBoxReq(ctx context.Context, kindBoxReq entity.KindBoxReq) (en const op = "mysqlkindboxreq.AddKindBoxReq" res, err := d.conn.Conn().ExecContext(ctx, `insert into kind_box_reqs(benefactor_id,kind_box_type,address_id,count_requested,refer_date,status) values (?,?,?,?,?,?)`, - kindBoxReq.BenefactorID, kindBoxReq.KindBoxType.String(), kindBoxReq.AddressID, kindBoxReq.CountRequested, kindBoxReq.ReferDate, kindBoxReq.Status.String()) + kindBoxReq.BenefactorID, kindBoxReq.KindBoxType.String(), kindBoxReq.DeliverAddressID, kindBoxReq.CountRequested, kindBoxReq.DeliverReferDate, kindBoxReq.Status.String()) if err != nil { return entity.KindBoxReq{}, richerror.New(op).WithErr(err). WithMessage(errmsg.ErrorMsgNotFound).WithKind(richerror.KindUnexpected) diff --git a/repository/mysql/kind_box_req/scan.go b/repository/mysql/kind_box_req/scan.go index 9dbd51e..b965601 100644 --- a/repository/mysql/kind_box_req/scan.go +++ b/repository/mysql/kind_box_req/scan.go @@ -13,9 +13,9 @@ func scanKindBoxReq(scanner mysql.Scanner) (entity.KindBoxReq, error) { var kindBoxType string var countAccept sql.NullInt64 var desc sql.NullString - err := scanner.Scan(&kindBoxReq.ID, &kindBoxReq.BenefactorID, &kindBoxType, &kindBoxReq.AddressID, &kindBoxReq.CountRequested, &countAccept, + err := scanner.Scan(&kindBoxReq.ID, &kindBoxReq.BenefactorID, &kindBoxType, &kindBoxReq.DeliverAddressID, &kindBoxReq.CountRequested, &countAccept, &desc, - &kindBoxReq.ReferDate, &kindBoxStatus, &kindBoxReq.CreatedAt) + &kindBoxReq.DeliverReferDate, &kindBoxStatus) if countAccept.Valid { kindBoxReq.CountAccepted = uint(countAccept.Int64) diff --git a/repository/mysql/migration/1705244014_add_benefactor_table.sql b/repository/mysql/migration/1705244014_add_benefactor_table.sql deleted file mode 100644 index 05ab613..0000000 --- a/repository/mysql/migration/1705244014_add_benefactor_table.sql +++ /dev/null @@ -1,21 +0,0 @@ --- +migrate Up --- please read this article to understand why we use VARCHAR(191) --- https://www.grouparoo.com/blog/varchar-191#why-varchar-and-not-text -CREATE TABLE `benefactors` ( - `id` INT PRIMARY KEY AUTO_INCREMENT, - `first_name` VARCHAR(191) , - `last_name` VARCHAR(191) , - `phone_number` VARCHAR(191) NOT NULL UNIQUE, - `address` TEXT, - `description` TEXT, - `email` VARCHAR(191), - `city` VARCHAR(191), - `gender` VARCHAR(191), - `status` VARCHAR(191), - `birthdate` TIMESTAMP, - `role` ENUM('benefactor') NOT NULL, - `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - --- +migrate Down -DROP TABLE `benefactors`; \ No newline at end of file diff --git a/repository/mysql/migration/1705244014_create_benefactors_table.sql b/repository/mysql/migration/1705244014_create_benefactors_table.sql new file mode 100644 index 0000000..2a36197 --- /dev/null +++ b/repository/mysql/migration/1705244014_create_benefactors_table.sql @@ -0,0 +1,20 @@ +-- +migrate Up +-- please read this article to understand why we use VARCHAR(191) +-- https://www.grouparoo.com/blog/varchar-191#why-varchar-and-not-text +CREATE TABLE `benefactors` ( + `id` INT PRIMARY KEY AUTO_INCREMENT, + `first_name` VARCHAR(191), + `last_name` VARCHAR(191), + `phone_number` VARCHAR(191) NOT NULL UNIQUE, + `description` TEXT, + `email` VARCHAR(191), + `gender` ENUM('male','female'), + `birth_date` TIMESTAMP, + + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP + +); + +-- +migrate Down +DROP TABLE `benefactors`; \ No newline at end of file diff --git a/repository/mysql/migration/1705244015_create_admins_table.sql b/repository/mysql/migration/1705244015_create_admins_table.sql new file mode 100644 index 0000000..1b66193 --- /dev/null +++ b/repository/mysql/migration/1705244015_create_admins_table.sql @@ -0,0 +1,19 @@ +-- +migrate Up +CREATE TABLE `admins` ( + `id` INT PRIMARY KEY AUTO_INCREMENT, + `first_name` VARCHAR(191), + `last_name` VARCHAR(191), + `password` VARCHAR(191) NOT NULL, + `phone_number` VARCHAR(191) NOT NULL UNIQUE, + `role` ENUM('super-admin','admin','agent') NOT NULL, -- default? + `description` TEXT, + `email` VARCHAR(191) NOT NULL UNIQUE, + `gender` ENUM('male','female'), + `status` ENUM('active','inactive') NOT NULL DEFAULT 'active', + + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP +); + +-- +migrate Down +DROP TABLE `admins`; \ No newline at end of file diff --git a/repository/mysql/migration/1705244016_create_admin_access_controls_table.sql b/repository/mysql/migration/1705244016_create_admin_access_controls_table.sql new file mode 100644 index 0000000..c98b59d --- /dev/null +++ b/repository/mysql/migration/1705244016_create_admin_access_controls_table.sql @@ -0,0 +1,13 @@ +-- +migrate Up +CREATE TABLE `admin_access_controls` ( + `id` INT PRIMARY KEY AUTO_INCREMENT, + `actor_id` INT NOT NULL, + `actor_type` ENUM('role', 'admin') NOT NULL, -- default? + `permission` ENUM('') NOT NULL, + + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP +); + +-- +migrate Down +DROP TABLE admin_access_controls; diff --git a/repository/mysql/migration/1705398864_add_provinces_table.sql b/repository/mysql/migration/1705398864_add_provinces_table.sql deleted file mode 100644 index f55b3c9..0000000 --- a/repository/mysql/migration/1705398864_add_provinces_table.sql +++ /dev/null @@ -1,9 +0,0 @@ --- +migrate Up -CREATE TABLE `provinces` ( - `id` INT PRIMARY KEY AUTO_INCREMENT, - `name` VARCHAR(191) NOT NULL , - `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - --- +migrate Down -DROP TABLE `provinces`; \ No newline at end of file diff --git a/repository/mysql/migration/1705399194_create_provinces_table.sql b/repository/mysql/migration/1705399194_create_provinces_table.sql new file mode 100644 index 0000000..9387c57 --- /dev/null +++ b/repository/mysql/migration/1705399194_create_provinces_table.sql @@ -0,0 +1,11 @@ +-- +migrate Up +CREATE TABLE `provinces` ( + `id` INT PRIMARY KEY AUTO_INCREMENT, + `name` VARCHAR(191) NOT NULL, + + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP +); + +-- +migrate Down +DROP TABLE `provinces`; \ No newline at end of file diff --git a/repository/mysql/migration/1705399195_add_cities_table.sql b/repository/mysql/migration/1705399195_add_cities_table.sql deleted file mode 100644 index 3e5f617..0000000 --- a/repository/mysql/migration/1705399195_add_cities_table.sql +++ /dev/null @@ -1,11 +0,0 @@ --- +migrate Up -CREATE TABLE `cities` ( - `id` INT PRIMARY KEY AUTO_INCREMENT, - `province_id` INT NOT NULL, - `name` VARCHAR(191) NOT NULL, - `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (`province_id`) REFERENCES `provinces`(`id`) -); - --- +migrate Down -DROP TABLE `cities`; \ No newline at end of file diff --git a/repository/mysql/migration/1705399195_create_cities_table.sql b/repository/mysql/migration/1705399195_create_cities_table.sql new file mode 100644 index 0000000..bf9da44 --- /dev/null +++ b/repository/mysql/migration/1705399195_create_cities_table.sql @@ -0,0 +1,13 @@ +-- +migrate Up +CREATE TABLE `cities` ( + `id` INT PRIMARY KEY AUTO_INCREMENT, + `name` VARCHAR(191) NOT NULL, + `province_id` INT NOT NULL, + + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP, + FOREIGN KEY (`province_id`) REFERENCES `provinces`(`id`) +); + +-- +migrate Down +DROP TABLE `cities`; \ No newline at end of file diff --git a/repository/mysql/migration/1705399370_add_addresses_table.sql b/repository/mysql/migration/1705399370_add_addresses_table.sql deleted file mode 100644 index c5f0107..0000000 --- a/repository/mysql/migration/1705399370_add_addresses_table.sql +++ /dev/null @@ -1,19 +0,0 @@ --- +migrate Up -CREATE TABLE `addresses` -( - `id` INT PRIMARY KEY AUTO_INCREMENT, - `postal_code` VARCHAR(191) NOT NULL, - `address` TEXT NOT NULL, - `lat` FLOAT NOT NULL, - `lon` FLOAT NOT NULL, - `province_id` INT NOT NULL, - `city_id` INT NOT NULL, - `benefactor_id` INT NOT NULL, - `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (`province_id`) REFERENCES `provinces` (`id`), - FOREIGN KEY (`city_id`) REFERENCES `cities` (`id`), - FOREIGN KEY (`benefactor_id`) REFERENCES `benefactors` (`id`) -); - --- +migrate Down -DROP TABLE `addresses`; \ No newline at end of file diff --git a/repository/mysql/migration/1705399370_create_addresses_table.sql b/repository/mysql/migration/1705399370_create_addresses_table.sql new file mode 100644 index 0000000..77b3093 --- /dev/null +++ b/repository/mysql/migration/1705399370_create_addresses_table.sql @@ -0,0 +1,21 @@ +-- +migrate Up +CREATE TABLE `addresses` ( + `id` INT PRIMARY KEY AUTO_INCREMENT, + `postal_code` VARCHAR(191) NOT NULL, + `address` TEXT NOT NULL, + `lat` FLOAT, + `lon` FLOAT, + `is_main` BOOL NOT NULL DEFAULT FALSE, + `city_id` INT NOT NULL, + `province_id` INT NOT NULL, + `benefactor_id` INT NOT NULL, + + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP, + FOREIGN KEY (`province_id`) REFERENCES `provinces` (`id`), + FOREIGN KEY (`city_id`) REFERENCES `cities` (`id`), + FOREIGN KEY (`benefactor_id`) REFERENCES `benefactors` (`id`) +); + +-- +migrate Down +DROP TABLE `addresses`; \ No newline at end of file diff --git a/repository/mysql/migration/1705400111_add_kind_box_reqs_table.sql b/repository/mysql/migration/1705400111_add_kind_box_reqs_table.sql deleted file mode 100644 index 5798e1f..0000000 --- a/repository/mysql/migration/1705400111_add_kind_box_reqs_table.sql +++ /dev/null @@ -1,19 +0,0 @@ --- +migrate Up -CREATE TABLE `kind_box_reqs` -( - `id` INT PRIMARY KEY AUTO_INCREMENT, - `benefactor_id` INT NOT NULL, - `kind_box_type` ENUM('on-table','cylindrical','stand-up') NOT NULL, - `address_id` INT NOT NULL, - `count_requested` INT UNSIGNED NOT NULL, - `count_accepted` INT, - `description` TEXT, - `refer_date` DATETIME NOT NULL, - `status` varchar(191), - `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (`address_id`) REFERENCES `addresses` (`id`), - FOREIGN KEY (`benefactor_id`) REFERENCES `benefactors` (`id`) -); - --- +migrate Down -DROP TABLE `kind_box_reqs`; \ No newline at end of file diff --git a/repository/mysql/migration/1705400111_create_kind_box_reqs_table.sql b/repository/mysql/migration/1705400111_create_kind_box_reqs_table.sql new file mode 100644 index 0000000..1c29e7b --- /dev/null +++ b/repository/mysql/migration/1705400111_create_kind_box_reqs_table.sql @@ -0,0 +1,23 @@ +-- +migrate Up +CREATE TABLE `kind_box_reqs` ( + `id` INT PRIMARY KEY AUTO_INCREMENT, + `benefactor_id` INT NOT NULL, + `kind_box_type` ENUM('on-table','cylindrical','stand-up') NOT NULL, -- default? + `count_requested` INT UNSIGNED NOT NULL, + `count_accepted` INT UNSIGNED, + `description` TEXT, + `status` ENUM('pending','accepted','assigned-sender-agent','rejected','delivered') NOT NULL DEFAULT 'pending', + `deliver_refer_date` DATETIME NOT NULL, + `deliver_address_id` INT NOT NULL, + `sender_agent_id` INT, + `delivered_at` DATETIME, + + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP, + FOREIGN KEY (`benefactor_id`) REFERENCES `benefactors` (`id`), + FOREIGN KEY (`deliver_address_id`) REFERENCES `addresses` (`id`), + FOREIGN KEY (`sender_agent_id`) REFERENCES `admins` (`id`) +); + +-- +migrate Down +DROP TABLE `kind_box_reqs`; \ No newline at end of file diff --git a/repository/mysql/migration/1705510025_seeder_add_provinces_table.sql b/repository/mysql/migration/1705510025_seeder_add_provinces_table.sql deleted file mode 100644 index ef4d613..0000000 --- a/repository/mysql/migration/1705510025_seeder_add_provinces_table.sql +++ /dev/null @@ -1,35 +0,0 @@ --- +migrate Up -INSERT INTO `provinces` (`id`, `name`) VALUES (1, 'آذربایجان شرقی'); -INSERT INTO `provinces` (`id`, `name`) VALUES (2, 'آذربایجان غربی'); -INSERT INTO `provinces` (`id`, `name`) VALUES (3, 'اردبیل'); -INSERT INTO `provinces` (`id`, `name`) VALUES (4, 'اصفهان'); -INSERT INTO `provinces` (`id`, `name`) VALUES (5, 'البرز'); -INSERT INTO `provinces` (`id`, `name`) VALUES (6, 'ایلام'); -INSERT INTO `provinces` (`id`, `name`) VALUES (7, 'بوشهر'); -INSERT INTO `provinces` (`id`, `name`) VALUES (8, 'تهران'); -INSERT INTO `provinces` (`id`, `name`) VALUES (9, 'چهارمحال و بختیاری'); -INSERT INTO `provinces` (`id`, `name`) VALUES (10, 'خراسان جنوبی'); -INSERT INTO `provinces` (`id`, `name`) VALUES (11, 'خراسان رضوی'); -INSERT INTO `provinces` (`id`, `name`) VALUES (12, 'خراسان شمالی'); -INSERT INTO `provinces` (`id`, `name`) VALUES (13, 'خوزستان'); -INSERT INTO `provinces` (`id`, `name`) VALUES (14, 'زنجان'); -INSERT INTO `provinces` (`id`, `name`) VALUES (15, 'سمنان'); -INSERT INTO `provinces` (`id`, `name`) VALUES (16, 'سیستان و بلوچستان'); -INSERT INTO `provinces` (`id`, `name`) VALUES (17, 'فارس'); -INSERT INTO `provinces` (`id`, `name`) VALUES (18, 'قزوین'); -INSERT INTO `provinces` (`id`, `name`) VALUES (19, 'قم'); -INSERT INTO `provinces` (`id`, `name`) VALUES (20, 'كردستان'); -INSERT INTO `provinces` (`id`, `name`) VALUES (21, 'كرمان'); -INSERT INTO `provinces` (`id`, `name`) VALUES (22, 'كرمانشاه'); -INSERT INTO `provinces` (`id`, `name`) VALUES (23, 'کهگیلویه و بویراحمد'); -INSERT INTO `provinces` (`id`, `name`) VALUES (24, 'گلستان'); -INSERT INTO `provinces` (`id`, `name`) VALUES (25, 'گیلان'); -INSERT INTO `provinces` (`id`, `name`) VALUES (26, 'لرستان'); -INSERT INTO `provinces` (`id`, `name`) VALUES (27, 'مازندران'); -INSERT INTO `provinces` (`id`, `name`) VALUES (28, 'مركزی'); -INSERT INTO `provinces` (`id`, `name`) VALUES (29, 'هرمزگان'); -INSERT INTO `provinces` (`id`, `name`) VALUES (30, 'همدان'); -INSERT INTO `provinces` (`id`, `name`) VALUES (31, 'یزد'); - --- +migrate Down -DELETE FROM `provinces` WHERE id BETWEEN '1' AND '31'; \ No newline at end of file diff --git a/repository/mysql/migration/1705562848_seeder_add_cities_table.sql b/repository/mysql/migration/1705562848_seeder_add_cities_table.sql deleted file mode 100644 index 7a416a8..0000000 --- a/repository/mysql/migration/1705562848_seeder_add_cities_table.sql +++ /dev/null @@ -1,944 +0,0 @@ --- +migrate Up -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (1, 1, 'آذرشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (2, 1, 'اسکو'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (3, 1, 'اهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (4, 1, 'بستان آباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (5, 1, 'بناب'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (6, 1, 'تبریز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (7, 1, ' جلفا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (8, 1, ' چار اویماق'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (9, 1, ' سراب'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (10, 1, ' شبستر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (11, 1, ' عجبشیر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (12, 1, ' کلیبر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (13, 1, ' مراغه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (14, 1, ' مرند'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (15, 1, ' ملکان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (16, 1, ' میانه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (17, 1, ' ورزقان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (18, 1, ' هریس'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (19, 1, 'هشترود'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (20, 2, ' ارومیه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (21, 2, ' اشنویه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (22, 2, ' بوکان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (23, 2, ' پیرانشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (24, 2, ' تکاب'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (25, 2, ' چالدران'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (26, 2, ' خوی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (27, 2, ' سردشت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (28, 2, ' سلماس'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (29, 2, ' شاهین دژ'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (30, 2, ' ماکو'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (31, 2, ' مهاباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (32, 2, ' میاندوآب'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (33, 2, ' نقده'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (34, 3, ' اردبیل'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (35, 3, ' بیله سوار'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (36, 3, ' پارس آباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (37, 3, ' خلخال'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (38, 3, ' کوثر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (39, 3, ' گرمی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (40, 3, ' مشگین'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (41, 3, ' نمین'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (42, 3, ' نیر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (43, 4, ' آران و بیدگل'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (44, 4, ' اردستان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (45, 4, ' اصفهان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (46, 4, ' برخوار و میمه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (47, 4, ' تیران و کرون'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (48, 4, ' چادگان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (49, 4, ' خمینی شهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (50, 4, ' خوانسار'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (51, 4, ' سمیرم'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (52, 4, ' شاهین شهر و میمه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (53, 4, ' شهر رضا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (54, 4, 'دهاقان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (55, 4, ' فریدن'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (56, 4, ' فریدون شهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (57, 4, ' فلاورجان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (58, 4, ' کاشان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (59, 4, ' گلپایگان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (60, 4, ' لنجان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (61, 4, ' مبارکه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (62, 4, ' نائین'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (63, 4, ' نجف آباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (64, 4, ' نطنز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (65, 5, ' ساوجبلاق'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (66, 5, ' کرج'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (67, 5, ' نظرآباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (68, 5, 'طالقان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (69, 6, ' آبدانان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (70, 6, ' ایلام'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (71, 6, ' ایوان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (72, 6, ' دره شهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (73, 6, ' دهلران'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (74, 6, ' شیران و چرداول'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (75, 6, ' مهران'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (76, 7, ' بوشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (77, 7, ' تنگستان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (78, 7, ' جم'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (79, 7, ' دشتستان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (80, 7, ' دشتی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (81, 7, ' دیر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (82, 7, ' دیلم'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (83, 7, ' کنگان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (84, 7, ' گناوه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (85, 8, ' اسلام شهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (86, 8, ' پاکدشت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (87, 8, ' تهران'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (88, 8, ' دماوند'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (89, 8, ' رباط کریم'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (90, 8, ' ری'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (91, 8, ' شمیرانات'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (92, 8, ' شهریار'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (93, 8, ' فیروزکوه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (94, 8, ' ورامین'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (95, 9, ' اردل'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (96, 9, ' بروجن'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (97, 9, ' شهرکرد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (98, 9, ' فارسان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (99, 9, ' کوهرنگ'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (100, 9, ' لردگان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (101, 10, ' بیرجند'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (102, 10, ' درمیان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (103, 10, ' سرایان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (104, 10, ' سر بیشه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (105, 10, ' فردوس'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (106, 10, ' قائن'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (107, 10, ' نهبندان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (108, 11, ' برد سکن'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (109, 11, ' بجستان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (110, 11, ' تایباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (111, 11, ' تحت جلگه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (112, 11, ' تربت جام'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (113, 11, ' تربت حیدریه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (114, 11, ' چناران'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (115, 11, ' جغتای'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (116, 11, ' جوین'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (117, 11, ' خلیل آباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (118, 11, ' خواف'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (119, 11, ' درگز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (120, 11, ' رشتخوار'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (121, 11, ' زاوه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (122, 11, ' سبزوار'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (123, 11, ' سرخس'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (124, 11, ' فریمان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (125, 11, ' قوچان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (126, 11, 'طرقبه شاندیز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (127, 11, ' کاشمر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (128, 11, ' کلات'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (129, 11, ' گناباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (130, 11, ' مشهد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (131, 11, ' مه ولات'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (132, 11, ' نیشابور'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (133, 12, ' اسفراین'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (134, 12, ' بجنورد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (135, 12, ' جاجرم'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (136, 12, ' شیروان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (137, 12, ' فاروج'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (138, 12, ' مانه و سملقان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (139, 13, ' آبادان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (140, 13, ' امیدیه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (141, 13, ' اندیمشک'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (142, 13, ' اهواز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (143, 13, ' ایذه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (144, 13, ' باغ ملک'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (145, 13, ' بندرماهشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (146, 13, ' بهبهان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (147, 13, ' خرمشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (148, 13, ' دزفول'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (149, 13, ' دشت آزادگان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (150, 13, ' رامشیر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (151, 13, ' رامهرمز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (152, 13, ' شادگان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (153, 13, ' شوش'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (154, 13, ' شوشتر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (155, 13, ' گتوند'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (156, 13, ' لالی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (157, 13, ' مسجد سلیمان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (158, 13, ' هندیجان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (159, 14, ' ابهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (160, 14, ' ایجرود'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (161, 14, ' خدابنده'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (162, 14, ' خرمدره'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (163, 14, ' زنجان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (164, 14, ' طارم'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (165, 14, ' ماه نشان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (166, 15, ' دامغان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (167, 15, ' سمنان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (168, 15, ' شاهرود'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (169, 15, ' گرمسار'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (170, 15, ' مهدی شهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (171, 16, ' ایرانشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (172, 16, ' چابهار'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (173, 16, ' خاش'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (174, 16, ' دلگان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (175, 16, ' زابل'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (176, 16, ' زاهدان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (177, 16, ' زهک'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (178, 16, ' سراوان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (179, 16, ' سرباز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (180, 16, ' کنارک'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (181, 16, ' نیکشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (182, 17, ' آباده'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (183, 17, ' ارسنجان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (184, 17, ' استهبان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (185, 17, ' اقلید'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (186, 17, ' بوانات'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (187, 17, ' پاسارگاد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (188, 17, ' جهرم'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (189, 17, ' خرم بید'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (190, 17, ' خنج'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (191, 17, ' داراب'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (192, 17, ' زرین دشت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (193, 17, ' سپیدان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (194, 17, ' شیراز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (195, 17, ' فراشبند'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (196, 17, ' فسا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (197, 17, ' فیروزآباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (198, 17, ' قیر و کارزین'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (199, 17, ' کازرون'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (200, 17, ' لارستان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (201, 17, ' لامرد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (202, 17, ' مرودشت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (203, 17, ' ممسنی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (204, 17, ' مهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (205, 17, ' نی ریز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (206, 18, ' آبیک'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (207, 18, ' البرز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (208, 18, ' بوئین زهرا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (209, 18, ' تاکستان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (210, 18, ' قزوین'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (211, 19, ' قم'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (212, 20, ' بانه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (213, 20, ' بیجار'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (214, 20, ' دیواندره'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (215, 20, ' سروآباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (216, 20, ' سقز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (217, 20, ' سنندج'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (218, 20, ' قروه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (219, 20, ' کامیاران'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (220, 20, ' مریوان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (221, 21, ' بافت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (222, 21, ' بردسیر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (223, 21, ' بم'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (224, 21, ' جیرفت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (225, 21, ' راور'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (226, 21, ' رفسنجان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (227, 21, ' رودبار جنوب'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (228, 21, ' زرند'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (229, 21, ' سیرجان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (230, 21, ' شهر بابک'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (231, 21, ' عنبرآباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (232, 21, ' قلعه گنج'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (233, 21, ' کرمان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (234, 21, ' کوهبنان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (235, 21, ' کهنوج'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (236, 21, ' منوجان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (237, 22, ' اسلام آباد غرب'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (238, 22, ' پاوه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (239, 22, ' ثلاث باباجانی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (240, 22, ' جوانرود'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (241, 22, ' دالاهو'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (242, 22, ' روانسر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (243, 22, ' سرپل ذهاب'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (244, 22, ' سنقر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (245, 22, ' صحنه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (246, 22, ' قصر شیرین'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (247, 22, ' کرمانشاه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (248, 22, ' کنگاور'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (249, 22, ' گیلان غرب'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (250, 22, ' هرسین'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (251, 23, ' بویر احمد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (252, 23, ' بهمئی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (253, 23, ' دنا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (254, 23, ' کهگیلویه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (255, 23, ' گچساران'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (256, 24, ' آزادشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (257, 24, ' آق قلا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (258, 24, ' بندر گز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (259, 24, ' بندر ترکمن'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (260, 24, ' رامیان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (261, 24, ' علی آباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (262, 24, ' کرد کوی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (263, 24, ' کلاله'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (264, 24, ' گرگان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (265, 24, ' گنبد کاووس'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (266, 24, ' مینو دشت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (267, 25, ' آستارا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (268, 25, ' آستانه اشرفیه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (269, 25, ' املش'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (270, 25, ' بندر انزلی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (271, 25, ' رشت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (272, 25, ' رضوانشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (273, 25, ' رودبار'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (274, 25, ' رودسر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (275, 25, ' سیاهکل'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (276, 25, ' شفت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (277, 25, ' صومعه سرا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (278, 25, ' طوالش'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (279, 25, ' فومن'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (280, 25, ' لاهیجان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (281, 25, ' لنگرود'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (282, 25, ' ماسال'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (283, 26, ' ازنا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (284, 26, ' الیگودرز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (285, 26, ' بروجرد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (286, 26, ' پلدختر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (287, 26, ' خرم آباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (288, 26, ' دورود'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (289, 17, ' لامرد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (290, 17, ' مرودشت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (291, 17, ' ممسنی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (292, 17, ' مهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (293, 17, ' نی ریز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (294, 18, ' آبیک'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (295, 18, ' البرز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (296, 18, ' بوئین زهرا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (297, 18, ' تاکستان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (298, 18, ' قزوین'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (299, 19, ' قم'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (300, 20, ' بانه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (301, 20, ' بیجار'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (302, 20, ' دیواندره'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (303, 20, ' سروآباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (304, 20, ' سقز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (305, 20, ' سنندج'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (306, 20, ' قروه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (307, 20, ' کامیاران'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (308, 20, ' مریوان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (309, 21, ' بافت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (310, 21, ' بردسیر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (311, 21, ' بم'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (312, 21, ' جیرفت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (313, 21, ' راور'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (314, 21, ' رفسنجان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (315, 21, ' رودبار جنوب'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (316, 21, ' زرند'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (317, 21, ' سیرجان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (318, 21, ' شهر بابک'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (319, 21, ' عنبرآباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (320, 21, ' قلعه گنج'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (321, 21, ' کرمان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (322, 21, ' کوهبنان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (323, 21, ' کهنوج'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (324, 21, ' منوجان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (325, 22, ' اسلام آباد غرب'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (326, 22, ' پاوه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (327, 22, ' ثلاث باباجانی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (328, 22, ' جوانرود'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (329, 22, ' دالاهو'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (330, 22, ' روانسر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (332, 22, ' سنقر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (333, 22, ' صحنه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (334, 22, ' قصر شیرین'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (335, 22, ' کرمانشاه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (336, 22, ' کنگاور'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (337, 22, ' گیلان غرب'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (338, 22, ' هرسین'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (339, 23, ' بویر احمد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (341, 23, ' دنا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (343, 23, ' گچساران'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (344, 24, ' آزادشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (345, 24, ' آق قلا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (346, 24, ' بندر گز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (347, 24, ' بندر ترکمن'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (348, 24, ' رامیان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (349, 24, ' علی آباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (350, 24, ' کرد کوی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (351, 24, ' کلاله'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (352, 24, ' گرگان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (353, 24, ' گنبد کاووس'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (354, 24, ' مینو دشت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (355, 25, ' آستارا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (356, 25, ' آستانه اشرفیه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (357, 25, ' املش'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (358, 25, ' بندر انزلی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (359, 25, ' رشت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (360, 25, ' رضوانشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (361, 25, ' رودبار'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (362, 25, ' رودسر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (363, 25, ' سیاهکل'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (364, 25, ' شفت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (365, 25, ' صومعه سرا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (366, 25, ' طوالش'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (367, 25, ' فومن'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (368, 25, ' لاهیجان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (369, 25, ' لنگرود'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (370, 25, ' ماسال'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (371, 26, ' ازنا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (372, 26, ' الیگودرز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (373, 26, ' بروجرد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (374, 26, ' پلدختر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (375, 26, ' خرم آباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (376, 26, ' دورود'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (377, 26, ' دلفان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (378, 26, ' سلسله'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (379, 26, ' کوهدشت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (380, 26, ' الشتر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (381, 26, ' نورآباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (382, 27, ' آمل'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (383, 27, ' بابل'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (384, 27, ' بابلسر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (385, 27, ' بهشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (386, 27, ' تنکابن'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (387, 27, ' جویبار'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (388, 27, ' چالوس'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (389, 27, ' رامسر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (390, 27, ' ساری'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (391, 27, ' سوادکوه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (392, 27, ' قائم شهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (393, 27, ' گلوگاه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (394, 27, ' محمود آباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (395, 27, ' نکا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (396, 27, ' نور'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (397, 27, ' نوشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (398, 27, ' فریدونکنار'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (399, 28, ' آشتیان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (400, 28, ' اراک'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (401, 28, ' تفرش'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (402, 28, ' خمین'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (403, 28, ' دلیجان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (404, 28, ' زرندیه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (405, 28, ' ساوه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (406, 28, ' شازند'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (407, 28, ' کمیجان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (408, 28, ' محلات'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (409, 29, ' بندرعباس'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (410, 29, ' میناب'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (411, 29, ' بندر لنگه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (412, 29, ' رودان-دهبارز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (413, 29, ' جاسک'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (414, 29, ' قشم'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (415, 29, ' حاجی آباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (416, 29, ' ابوموسی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (417, 29, ' بستک'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (418, 29, ' گاوبندی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (419, 29, ' خمیر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (420, 30, ' اسدآباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (421, 30, ' بهار'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (422, 30, ' تویسرکان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (423, 30, ' رزن'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (424, 30, ' کبودر آهنگ'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (425, 30, ' ملایر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (426, 30, ' نهاوند'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (427, 30, ' همدان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (428, 31, ' ابرکوه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (429, 31, ' اردکان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (430, 31, ' بافق'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (431, 31, ' تفت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (432, 31, ' خاتم'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (433, 31, ' صدوق'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (434, 31, ' طبس'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (435, 31, ' مهریز'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (436, 31, ' میبد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (437, 31, ' یزد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (438, 8, 'قرچک'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (439, 8, 'گلستان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (440, 8, 'قدس'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (441, 8, 'ملارد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (442, 8, 'نسیم‌شهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (443, 8, 'اندیشه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (444, 8, 'صالح‌آباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (445, 8, 'باقرشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (446, 8, 'باغستان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (447, 8, 'بومهن'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (448, 8, 'چهاردانگه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (449, 8, 'پیشوا'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (450, 8, 'پردیس'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (451, 8, 'وحیدیه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (452, 8, 'نصیرآباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (453, 8, 'فردوسیه'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (454, 8, 'حسن‌آباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (455, 8, 'رودهن'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (456, 8, 'شاهدشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (457, 8, 'صباشهر'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (458, 8, 'صفادشت'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (459, 8, 'لواسان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (460, 8, 'آبسرد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (461, 8, 'شریف‌آباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (462, 8, 'کهریزک'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (463, 8, 'فشم'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (464, 8, 'جوادآباد'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (465, 8, 'کیلان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (466, 8, 'آبعلی'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (467, 8, 'ارجمند'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (468, 29, 'کیش'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (469, 29, 'لاوان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (470, 29, 'پارسیان'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (471, 29, 'سیریک'); -INSERT INTO `cities` (`id`, `province_id`, `name`) -VALUES (472, 29, 'بشاگرد'); - --- +migrate Down -DELETE -FROM `cities` -WHERE id BETWEEN '1' AND '472'; \ No newline at end of file diff --git a/repository/mysql/migration/1705675489_add_admins_table.sql b/repository/mysql/migration/1705675489_add_admins_table.sql deleted file mode 100644 index 53017b2..0000000 --- a/repository/mysql/migration/1705675489_add_admins_table.sql +++ /dev/null @@ -1,18 +0,0 @@ --- +migrate Up -CREATE TABLE `admins` -( - `id` INT PRIMARY KEY AUTO_INCREMENT, - `first_name` VARCHAR(191), - `last_name` VARCHAR(191), - `password` TEXT NOT NULL, - `phone_number` VARCHAR(191) NOT NULL UNIQUE, - `role` ENUM('super-admin','admin') NOT NULL, - `description` TEXT, - `email` VARCHAR(191) NOT NULL UNIQUE, - `gender` VARCHAR(191), - `status` VARCHAR(191), - `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - --- +migrate Down -DROP TABLE `admins`; \ No newline at end of file diff --git a/repository/mysql/migration/1705992494_add_kind_boxes_table.sql b/repository/mysql/migration/1705992494_add_kind_boxes_table.sql deleted file mode 100644 index 8f7fd48..0000000 --- a/repository/mysql/migration/1705992494_add_kind_boxes_table.sql +++ /dev/null @@ -1,24 +0,0 @@ --- +migrate Up -CREATE TABLE `kind_boxes` -( - `id` INT PRIMARY KEY AUTO_INCREMENT, - `kind_box_req_id` INT NOT NULL, - `benefactor_id` INT NOT NULL, - `type` ENUM ('on-table','cylindrical','stand-up') NOT NULL, - `total_amount` INT UNSIGNED NULL NULL, - `serial_number` varchar(255), - `status` varchar(255), - `sender_id` INT NULL, - `receiver_id` INT NULL, - `status_changed_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (`kind_box_req_id`) REFERENCES `kind_box_reqs` (`id`), - FOREIGN KEY (`benefactor_id`) REFERENCES `benefactors` (`id`), - FOREIGN KEY (`sender_id`) REFERENCES `admins` (`id`), - FOREIGN KEY (`receiver_id`) REFERENCES `admins` (`id`), - index `index_serial_number` (`serial_number`) - -); - --- +migrate Down -DROP TABLE `kind_boxes`; \ No newline at end of file diff --git a/repository/mysql/migration/1705992494_create_kind_boxes_table.sql b/repository/mysql/migration/1705992494_create_kind_boxes_table.sql new file mode 100644 index 0000000..c5ecc4d --- /dev/null +++ b/repository/mysql/migration/1705992494_create_kind_boxes_table.sql @@ -0,0 +1,30 @@ +-- +migrate Up +CREATE TABLE `kind_boxes` ( + `id` INT PRIMARY KEY AUTO_INCREMENT, + `kind_box_req_id` INT NOT NULL, + `benefactor_id` INT NOT NULL, + `type` ENUM('on-table','cylindrical','stand-up') NOT NULL, + `amount` INT UNSIGNED, + `serial_number` varchar(191), + `status` ENUM('delivered','ready-to-return','assigned-receiver-agent','returned','enumerated') NOT NULL, + `deliver_refer_date` DATETIME NOT NULL, + `deliver_address_id` INT NOT NULL, + `sender_agent_id` INT NOT NULL, + `delivered_at` DATETIME NOT NULL, + `return_refer_date` DATETIME, + `return_address_id` INT, + `receiver_agent_id` INT, + `returned_at` DATETIME, + + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`kind_box_req_id`) REFERENCES `kind_box_reqs` (`id`), + FOREIGN KEY (`benefactor_id`) REFERENCES `benefactors` (`id`), + FOREIGN KEY (`deliver_address_id`) REFERENCES `addresses` (`id`), + FOREIGN KEY (`sender_agent_id`) REFERENCES `admins` (`id`), + FOREIGN KEY (`return_address_id`) REFERENCES `addresses` (`id`), + FOREIGN KEY (`receiver_agent_id`) REFERENCES `admins` (`id`), + INDEX `index_serial_number` (`serial_number`) +); + +-- +migrate Down +DROP TABLE `kind_boxes`; \ No newline at end of file diff --git a/repository/mysql/migration/1705675814_seeder_add_super_admin.sql b/repository/mysql/migration/1708712563_insert_admins_table_super_admin_value.sql similarity index 52% rename from repository/mysql/migration/1705675814_seeder_add_super_admin.sql rename to repository/mysql/migration/1708712563_insert_admins_table_super_admin_value.sql index ff36d9e..8de5ae3 100644 --- a/repository/mysql/migration/1705675814_seeder_add_super_admin.sql +++ b/repository/mysql/migration/1708712563_insert_admins_table_super_admin_value.sql @@ -1,9 +1,10 @@ -- +migrate Up -- what can we do for password? INSERT INTO `admins` (`id`, `phone_number`, `email`,`password`,`role`,`status`) -VALUES (1, '09122702856', 'keshvari@gmail.com','Abc123456','super-admin','active'); + VALUES + (1, '09122702856', 'keshvari@gmail.com','Abc123456','super-admin','active'); -- +migrate Down DELETE -FROM `admins` -WHERE id '1' ; + FROM `admins` + WHERE id = 1; diff --git a/repository/mysql/migration/1708712564_alter_admin_access_controls_table_permission_enum_field.sql b/repository/mysql/migration/1708712564_alter_admin_access_controls_table_permission_enum_field.sql new file mode 100644 index 0000000..4aa5216 --- /dev/null +++ b/repository/mysql/migration/1708712564_alter_admin_access_controls_table_permission_enum_field.sql @@ -0,0 +1,10 @@ +-- +migrate Up +ALTER TABLE `admin_access_controls` MODIFY COLUMN `permission` + enum ( + 'admin-register', + 'kindboxreq-accept', + 'kindboxreq-reject', + 'kindboxreq-getall' + ) NOT NULL; + +-- +migrate Down \ No newline at end of file diff --git a/repository/mysql/migration/1708712565_insert_admin_access_controls_table.sql b/repository/mysql/migration/1708712565_insert_admin_access_controls_table.sql new file mode 100644 index 0000000..bb58fee --- /dev/null +++ b/repository/mysql/migration/1708712565_insert_admin_access_controls_table.sql @@ -0,0 +1,15 @@ +-- +migrate Up +INSERT INTO `admin_access_controls` (`id`, `actor_id`, `actor_type`,`permission`) + VALUES + (1, 1 , 'role','admin-register'), + (2, 1 , 'role','kindboxreq-accept'), + (3, 1 , 'role','kindboxreq-reject'), + (4, 1 , 'role','kindboxreq-getall'), + (5, 2 , 'role','kindboxreq-accept'), + (6, 2 , 'role','kindboxreq-reject'), + (7, 2 , 'role','kindboxreq-getall'); + +-- +migrate Down +DELETE + FROM `admin_access_controls` + WHERE id BETWEEN 1 AND 7; \ No newline at end of file diff --git a/repository/mysql/migration/1708712570_insert_provinces_table.sql b/repository/mysql/migration/1708712570_insert_provinces_table.sql new file mode 100644 index 0000000..6befb3d --- /dev/null +++ b/repository/mysql/migration/1708712570_insert_provinces_table.sql @@ -0,0 +1,39 @@ +-- +migrate Up +INSERT INTO `provinces` (`id`, `name`) + VALUES + (1, 'آذربایجان شرقی'), + (2, 'آذربایجان غربی'), + (3, 'اردبیل'), + (4, 'اصفهان'), + (5, 'البرز'), + (6, 'ایلام'), + (7, 'بوشهر'), + (8, 'تهران'), + (9, 'چهارمحال و بختیاری'), + (10, 'خراسان جنوبی'), + (11, 'خراسان رضوی'), + (12, 'خراسان شمالی'), + (13, 'خوزستان'), + (14, 'زنجان'), + (15, 'سمنان'), + (16, 'سیستان و بلوچستان'), + (17, 'فارس'), + (18, 'قزوین'), + (19, 'قم'), + (20, 'كردستان'), + (21, 'كرمان'), + (22, 'كرمانشاه'), + (23, 'کهگیلویه و بویراحمد'), + (24, 'گلستان'), + (25, 'گیلان'), + (26, 'لرستان'), + (27, 'مازندران'), + (28, 'مركزی'), + (29, 'هرمزگان'), + (30, 'همدان'), + (31, 'یزد'); + +-- +migrate Down +DELETE + FROM `provinces` + WHERE id BETWEEN 1 AND 31; \ No newline at end of file diff --git a/repository/mysql/migration/1708712571_insert_cities_table.sql b/repository/mysql/migration/1708712571_insert_cities_table.sql new file mode 100644 index 0000000..0b748f8 --- /dev/null +++ b/repository/mysql/migration/1708712571_insert_cities_table.sql @@ -0,0 +1,477 @@ +-- +migrate Up +INSERT INTO `cities` (`id`, `province_id`, `name`) + VALUES + (1, 1, 'آذرشهر'), + (2, 1, 'اسکو'), + (3, 1, 'اهر'), + (4, 1, 'بستان آباد'), + (5, 1, 'بناب'), + (6, 1, 'تبریز'), + (7, 1, ' جلفا'), + (8, 1, ' چار اویماق'), + (9, 1, ' سراب'), + (10, 1, ' شبستر'), + (11, 1, ' عجبشیر'), + (12, 1, ' کلیبر'), + (13, 1, ' مراغه'), + (14, 1, ' مرند'), + (15, 1, ' ملکان'), + (16, 1, ' میانه'), + (17, 1, ' ورزقان'), + (18, 1, ' هریس'), + (19, 1, 'هشترود'), + (20, 2, ' ارومیه'), + (21, 2, ' اشنویه'), + (22, 2, ' بوکان'), + (23, 2, ' پیرانشهر'), + (24, 2, ' تکاب'), + (25, 2, ' چالدران'), + (26, 2, ' خوی'), + (27, 2, ' سردشت'), + (28, 2, ' سلماس'), + (29, 2, ' شاهین دژ'), + (30, 2, ' ماکو'), + (31, 2, ' مهاباد'), + (32, 2, ' میاندوآب'), + (33, 2, ' نقده'), + (34, 3, ' اردبیل'), + (35, 3, ' بیله سوار'), + (36, 3, ' پارس آباد'), + (37, 3, ' خلخال'), + (38, 3, ' کوثر'), + (39, 3, ' گرمی'), + (40, 3, ' مشگین'), + (41, 3, ' نمین'), + (42, 3, ' نیر'), + (43, 4, ' آران و بیدگل'), + (44, 4, ' اردستان'), + (45, 4, ' اصفهان'), + (46, 4, ' برخوار و میمه'), + (47, 4, ' تیران و کرون'), + (48, 4, ' چادگان'), + (49, 4, ' خمینی شهر'), + (50, 4, ' خوانسار'), + (51, 4, ' سمیرم'), + (52, 4, ' شاهین شهر و میمه'), + (53, 4, ' شهر رضا'), + (54, 4, 'دهاقان'), + (55, 4, ' فریدن'), + (56, 4, ' فریدون شهر'), + (57, 4, ' فلاورجان'), + (58, 4, ' کاشان'), + (59, 4, ' گلپایگان'), + (60, 4, ' لنجان'), + (61, 4, ' مبارکه'), + (62, 4, ' نائین'), + (63, 4, ' نجف آباد'), + (64, 4, ' نطنز'), + (65, 5, ' ساوجبلاق'), + (66, 5, ' کرج'), + (67, 5, ' نظرآباد'), + (68, 5, 'طالقان'), + (69, 6, ' آبدانان'), + (70, 6, ' ایلام'), + (71, 6, ' ایوان'), + (72, 6, ' دره شهر'), + (73, 6, ' دهلران'), + (74, 6, ' شیران و چرداول'), + (75, 6, ' مهران'), + (76, 7, ' بوشهر'), + (77, 7, ' تنگستان'), + (78, 7, ' جم'), + (79, 7, ' دشتستان'), + (80, 7, ' دشتی'), + (81, 7, ' دیر'), + (82, 7, ' دیلم'), + (83, 7, ' کنگان'), + (84, 7, ' گناوه'), + (85, 8, ' اسلام شهر'), + (86, 8, ' پاکدشت'), + (87, 8, ' تهران'), + (88, 8, ' دماوند'), + (89, 8, ' رباط کریم'), + (90, 8, ' ری'), + (91, 8, ' شمیرانات'), + (92, 8, ' شهریار'), + (93, 8, ' فیروزکوه'), + (94, 8, ' ورامین'), + (95, 9, ' اردل'), + (96, 9, ' بروجن'), + (97, 9, ' شهرکرد'), + (98, 9, ' فارسان'), + (99, 9, ' کوهرنگ'), + (100, 9, ' لردگان'), + (101, 10, ' بیرجند'), + (102, 10, ' درمیان'), + (103, 10, ' سرایان'), + (104, 10, ' سر بیشه'), + (105, 10, ' فردوس'), + (106, 10, ' قائن'), + (107, 10, ' نهبندان'), + (108, 11, ' برد سکن'), + (109, 11, ' بجستان'), + (110, 11, ' تایباد'), + (111, 11, ' تحت جلگه'), + (112, 11, ' تربت جام'), + (113, 11, ' تربت حیدریه'), + (114, 11, ' چناران'), + (115, 11, ' جغتای'), + (116, 11, ' جوین'), + (117, 11, ' خلیل آباد'), + (118, 11, ' خواف'), + (119, 11, ' درگز'), + (120, 11, ' رشتخوار'), + (121, 11, ' زاوه'), + (122, 11, ' سبزوار'), + (123, 11, ' سرخس'), + (124, 11, ' فریمان'), + (125, 11, ' قوچان'), + (126, 11, 'طرقبه شاندیز'), + (127, 11, ' کاشمر'), + (128, 11, ' کلات'), + (129, 11, ' گناباد'), + (130, 11, ' مشهد'), + (131, 11, ' مه ولات'), + (132, 11, ' نیشابور'), + (133, 12, ' اسفراین'), + (134, 12, ' بجنورد'), + (135, 12, ' جاجرم'), + (136, 12, ' شیروان'), + (137, 12, ' فاروج'), + (138, 12, ' مانه و سملقان'), + (139, 13, ' آبادان'), + (140, 13, ' امیدیه'), + (141, 13, ' اندیمشک'), + (142, 13, ' اهواز'), + (143, 13, ' ایذه'), + (144, 13, ' باغ ملک'), + (145, 13, ' بندرماهشهر'), + (146, 13, ' بهبهان'), + (147, 13, ' خرمشهر'), + (148, 13, ' دزفول'), + (149, 13, ' دشت آزادگان'), + (150, 13, ' رامشیر'), + (151, 13, ' رامهرمز'), + (152, 13, ' شادگان'), + (153, 13, ' شوش'), + (154, 13, ' شوشتر'), + (155, 13, ' گتوند'), + (156, 13, ' لالی'), + (157, 13, ' مسجد سلیمان'), + (158, 13, ' هندیجان'), + (159, 14, ' ابهر'), + (160, 14, ' ایجرود'), + (161, 14, ' خدابنده'), + (162, 14, ' خرمدره'), + (163, 14, ' زنجان'), + (164, 14, ' طارم'), + (165, 14, ' ماه نشان'), + (166, 15, ' دامغان'), + (167, 15, ' سمنان'), + (168, 15, ' شاهرود'), + (169, 15, ' گرمسار'), + (170, 15, ' مهدی شهر'), + (171, 16, ' ایرانشهر'), + (172, 16, ' چابهار'), + (173, 16, ' خاش'), + (174, 16, ' دلگان'), + (175, 16, ' زابل'), + (176, 16, ' زاهدان'), + (177, 16, ' زهک'), + (178, 16, ' سراوان'), + (179, 16, ' سرباز'), + (180, 16, ' کنارک'), + (181, 16, ' نیکشهر'), + (182, 17, ' آباده'), + (183, 17, ' ارسنجان'), + (184, 17, ' استهبان'), + (185, 17, ' اقلید'), + (186, 17, ' بوانات'), + (187, 17, ' پاسارگاد'), + (188, 17, ' جهرم'), + (189, 17, ' خرم بید'), + (190, 17, ' خنج'), + (191, 17, ' داراب'), + (192, 17, ' زرین دشت'), + (193, 17, ' سپیدان'), + (194, 17, ' شیراز'), + (195, 17, ' فراشبند'), + (196, 17, ' فسا'), + (197, 17, ' فیروزآباد'), + (198, 17, ' قیر و کارزین'), + (199, 17, ' کازرون'), + (200, 17, ' لارستان'), + (201, 17, ' لامرد'), + (202, 17, ' مرودشت'), + (203, 17, ' ممسنی'), + (204, 17, ' مهر'), + (205, 17, ' نی ریز'), + (206, 18, ' آبیک'), + (207, 18, ' البرز'), + (208, 18, ' بوئین زهرا'), + (209, 18, ' تاکستان'), + (210, 18, ' قزوین'), + (211, 19, ' قم'), + (212, 20, ' بانه'), + (213, 20, ' بیجار'), + (214, 20, ' دیواندره'), + (215, 20, ' سروآباد'), + (216, 20, ' سقز'), + (217, 20, ' سنندج'), + (218, 20, ' قروه'), + (219, 20, ' کامیاران'), + (220, 20, ' مریوان'), + (221, 21, ' بافت'), + (222, 21, ' بردسیر'), + (223, 21, ' بم'), + (224, 21, ' جیرفت'), + (225, 21, ' راور'), + (226, 21, ' رفسنجان'), + (227, 21, ' رودبار جنوب'), + (228, 21, ' زرند'), + (229, 21, ' سیرجان'), + (230, 21, ' شهر بابک'), + (231, 21, ' عنبرآباد'), + (232, 21, ' قلعه گنج'), + (233, 21, ' کرمان'), + (234, 21, ' کوهبنان'), + (235, 21, ' کهنوج'), + (236, 21, ' منوجان'), + (237, 22, ' اسلام آباد غرب'), + (238, 22, ' پاوه'), + (239, 22, ' ثلاث باباجانی'), + (240, 22, ' جوانرود'), + (241, 22, ' دالاهو'), + (242, 22, ' روانسر'), + (243, 22, ' سرپل ذهاب'), + (244, 22, ' سنقر'), + (245, 22, ' صحنه'), + (246, 22, ' قصر شیرین'), + (247, 22, ' کرمانشاه'), + (248, 22, ' کنگاور'), + (249, 22, ' گیلان غرب'), + (250, 22, ' هرسین'), + (251, 23, ' بویر احمد'), + (252, 23, ' بهمئی'), + (253, 23, ' دنا'), + (254, 23, ' کهگیلویه'), + (255, 23, ' گچساران'), + (256, 24, ' آزادشهر'), + (257, 24, ' آق قلا'), + (258, 24, ' بندر گز'), + (259, 24, ' بندر ترکمن'), + (260, 24, ' رامیان'), + (261, 24, ' علی آباد'), + (262, 24, ' کرد کوی'), + (263, 24, ' کلاله'), + (264, 24, ' گرگان'), + (265, 24, ' گنبد کاووس'), + (266, 24, ' مینو دشت'), + (267, 25, ' آستارا'), + (268, 25, ' آستانه اشرفیه'), + (269, 25, ' املش'), + (270, 25, ' بندر انزلی'), + (271, 25, ' رشت'), + (272, 25, ' رضوانشهر'), + (273, 25, ' رودبار'), + (274, 25, ' رودسر'), + (275, 25, ' سیاهکل'), + (276, 25, ' شفت'), + (277, 25, ' صومعه سرا'), + (278, 25, ' طوالش'), + (279, 25, ' فومن'), + (280, 25, ' لاهیجان'), + (281, 25, ' لنگرود'), + (282, 25, ' ماسال'), + (283, 26, ' ازنا'), + (284, 26, ' الیگودرز'), + (285, 26, ' بروجرد'), + (286, 26, ' پلدختر'), + (287, 26, ' خرم آباد'), + (288, 26, ' دورود'), + (289, 17, ' لامرد'), + (290, 17, ' مرودشت'), + (291, 17, ' ممسنی'), + (292, 17, ' مهر'), + (293, 17, ' نی ریز'), + (294, 18, ' آبیک'), + (295, 18, ' البرز'), + (296, 18, ' بوئین زهرا'), + (297, 18, ' تاکستان'), + (298, 18, ' قزوین'), + (299, 19, ' قم'), + (300, 20, ' بانه'), + (301, 20, ' بیجار'), + (302, 20, ' دیواندره'), + (303, 20, ' سروآباد'), + (304, 20, ' سقز'), + (305, 20, ' سنندج'), + (306, 20, ' قروه'), + (307, 20, ' کامیاران'), + (308, 20, ' مریوان'), + (309, 21, ' بافت'), + (310, 21, ' بردسیر'), + (311, 21, ' بم'), + (312, 21, ' جیرفت'), + (313, 21, ' راور'), + (314, 21, ' رفسنجان'), + (315, 21, ' رودبار جنوب'), + (316, 21, ' زرند'), + (317, 21, ' سیرجان'), + (318, 21, ' شهر بابک'), + (319, 21, ' عنبرآباد'), + (320, 21, ' قلعه گنج'), + (321, 21, ' کرمان'), + (322, 21, ' کوهبنان'), + (323, 21, ' کهنوج'), + (324, 21, ' منوجان'), + (325, 22, ' اسلام آباد غرب'), + (326, 22, ' پاوه'), + (327, 22, ' ثلاث باباجانی'), + (328, 22, ' جوانرود'), + (329, 22, ' دالاهو'), + (330, 22, ' روانسر'), + (332, 22, ' سنقر'), + (333, 22, ' صحنه'), + (334, 22, ' قصر شیرین'), + (335, 22, ' کرمانشاه'), + (336, 22, ' کنگاور'), + (337, 22, ' گیلان غرب'), + (338, 22, ' هرسین'), + (339, 23, ' بویر احمد'), + (341, 23, ' دنا'), + (343, 23, ' گچساران'), + (344, 24, ' آزادشهر'), + (345, 24, ' آق قلا'), + (346, 24, ' بندر گز'), + (347, 24, ' بندر ترکمن'), + (348, 24, ' رامیان'), + (349, 24, ' علی آباد'), + (350, 24, ' کرد کوی'), + (351, 24, ' کلاله'), + (352, 24, ' گرگان'), + (353, 24, ' گنبد کاووس'), + (354, 24, ' مینو دشت'), + (355, 25, ' آستارا'), + (356, 25, ' آستانه اشرفیه'), + (357, 25, ' املش'), + (358, 25, ' بندر انزلی'), + (359, 25, ' رشت'), + (360, 25, ' رضوانشهر'), + (361, 25, ' رودبار'), + (362, 25, ' رودسر'), + (363, 25, ' سیاهکل'), + (364, 25, ' شفت'), + (365, 25, ' صومعه سرا'), + (366, 25, ' طوالش'), + (367, 25, ' فومن'), + (368, 25, ' لاهیجان'), + (369, 25, ' لنگرود'), + (370, 25, ' ماسال'), + (371, 26, ' ازنا'), + (372, 26, ' الیگودرز'), + (373, 26, ' بروجرد'), + (374, 26, ' پلدختر'), + (375, 26, ' خرم آباد'), + (376, 26, ' دورود'), + (377, 26, ' دلفان'), + (378, 26, ' سلسله'), + (379, 26, ' کوهدشت'), + (380, 26, ' الشتر'), + (381, 26, ' نورآباد'), + (382, 27, ' آمل'), + (383, 27, ' بابل'), + (384, 27, ' بابلسر'), + (385, 27, ' بهشهر'), + (386, 27, ' تنکابن'), + (387, 27, ' جویبار'), + (388, 27, ' چالوس'), + (389, 27, ' رامسر'), + (390, 27, ' ساری'), + (391, 27, ' سوادکوه'), + (392, 27, ' قائم شهر'), + (393, 27, ' گلوگاه'), + (394, 27, ' محمود آباد'), + (395, 27, ' نکا'), + (396, 27, ' نور'), + (397, 27, ' نوشهر'), + (398, 27, ' فریدونکنار'), + (399, 28, ' آشتیان'), + (400, 28, ' اراک'), + (401, 28, ' تفرش'), + (402, 28, ' خمین'), + (403, 28, ' دلیجان'), + (404, 28, ' زرندیه'), + (405, 28, ' ساوه'), + (406, 28, ' شازند'), + (407, 28, ' کمیجان'), + (408, 28, ' محلات'), + (409, 29, ' بندرعباس'), + (410, 29, ' میناب'), + (411, 29, ' بندر لنگه'), + (412, 29, ' رودان-دهبارز'), + (413, 29, ' جاسک'), + (414, 29, ' قشم'), + (415, 29, ' حاجی آباد'), + (416, 29, ' ابوموسی'), + (417, 29, ' بستک'), + (418, 29, ' گاوبندی'), + (419, 29, ' خمیر'), + (420, 30, ' اسدآباد'), + (421, 30, ' بهار'), + (422, 30, ' تویسرکان'), + (423, 30, ' رزن'), + (424, 30, ' کبودر آهنگ'), + (425, 30, ' ملایر'), + (426, 30, ' نهاوند'), + (427, 30, ' همدان'), + (428, 31, ' ابرکوه'), + (429, 31, ' اردکان'), + (430, 31, ' بافق'), + (431, 31, ' تفت'), + (432, 31, ' خاتم'), + (433, 31, ' صدوق'), + (434, 31, ' طبس'), + (435, 31, ' مهریز'), + (436, 31, ' میبد'), + (437, 31, ' یزد'), + (438, 8, 'قرچک'), + (439, 8, 'گلستان'), + (440, 8, 'قدس'), + (441, 8, 'ملارد'), + (442, 8, 'نسیم‌شهر'), + (443, 8, 'اندیشه'), + (444, 8, 'صالح‌آباد'), + (445, 8, 'باقرشهر'), + (446, 8, 'باغستان'), + (447, 8, 'بومهن'), + (448, 8, 'چهاردانگه'), + (449, 8, 'پیشوا'), + (450, 8, 'پردیس'), + (451, 8, 'وحیدیه'), + (452, 8, 'نصیرآباد'), + (453, 8, 'فردوسیه'), + (454, 8, 'حسن‌آباد'), + (455, 8, 'رودهن'), + (456, 8, 'شاهدشهر'), + (457, 8, 'صباشهر'), + (458, 8, 'صفادشت'), + (459, 8, 'لواسان'), + (460, 8, 'آبسرد'), + (461, 8, 'شریف‌آباد'), + (462, 8, 'کهریزک'), + (463, 8, 'فشم'), + (464, 8, 'جوادآباد'), + (465, 8, 'کیلان'), + (466, 8, 'آبعلی'), + (467, 8, 'ارجمند'), + (468, 29, 'کیش'), + (469, 29, 'لاوان'), + (470, 29, 'پارسیان'), + (471, 29, 'سیریک'), + (472, 29, 'بشاگرد'); + +-- +migrate Down +DELETE + FROM `cities` + WHERE id BETWEEN 1 AND 472; \ No newline at end of file diff --git a/service/admin/admin/login.go b/service/admin/admin/login.go index 9726a6b..46c6c21 100644 --- a/service/admin/admin/login.go +++ b/service/admin/admin/login.go @@ -17,7 +17,7 @@ func (s Service) LoginWithPhoneNumber(ctx context.Context, req adminserviceparam return adminserviceparam.LoginWithPhoneNumberResponse{}, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected) } - if cErr := CompareHash(admin.GetPassword(), req.Password); cErr != nil { + if cErr := CompareHash(admin.Password, req.Password); cErr != nil { return adminserviceparam.LoginWithPhoneNumberResponse{}, richerror.New(op).WithErr(cErr).WithMessage(errmsg.ErrorMsgPhoneNumberOrPassIsIncorrect).WithKind(richerror.KindForbidden) } authenticableAdmin := entity.Authenticable{ diff --git a/service/admin/admin/register.go b/service/admin/admin/register.go index 62acf92..709acf1 100644 --- a/service/admin/admin/register.go +++ b/service/admin/admin/register.go @@ -43,7 +43,7 @@ func (s Service) Register(ctx context.Context, req adminserviceparam.RegisterReq if bErr := GenerateHash(req.Password); bErr != nil { return adminserviceparam.RegisterResponse{}, richerror.New(op).WithErr(bErr).WithKind(richerror.KindUnexpected) } - newAdmin.SetPassword(*req.Password) + newAdmin.Password = *req.Password admin, err := s.repo.AddAdmin(ctx, newAdmin) if err != nil { diff --git a/service/admin/kind_box/add.go b/service/admin/kind_box/add.go index 9b0bb5d..314aa23 100644 --- a/service/admin/kind_box/add.go +++ b/service/admin/kind_box/add.go @@ -1 +1,32 @@ package adminkindboxservice + +import ( + "context" + + entity "git.gocasts.ir/ebhomengo/niki/entity" + param "git.gocasts.ir/ebhomengo/niki/param/admin/kind_box" + richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" +) + +func (s Service) AddBatchKindBox(ctx context.Context, req param.AddKindBoxRequest) (param.AddKindBoxResponse, error) { + const op = "adminkindboxservice.AddKindBox" + kindBoxes := make([]entity.KindBox, 0) + kb := entity.KindBox{ + KindBoxReqID: req.KindBoxReqID, + BenefactorID: req.BenefactorID, + Type: req.Type, + DeliverReferDate: req.DeliverReferDate, + DeliverAddressID: req.DeliverAddressID, + DeliveredAt: req.DeliveredAt, + SenderAgentID: req.SenderAgentID, + Status: entity.KindBoxDeliveredStatus, + } + for i := uint(0); i < req.CountAccepted; i++ { + kindBoxes = append(kindBoxes, kb) + } + aErr := s.repo.AddBatchKindBox(ctx, kindBoxes) + if aErr != nil { + return param.AddKindBoxResponse{}, richerror.New(op).WithErr(aErr).WithKind(richerror.KindUnexpected) + } + return param.AddKindBoxResponse{}, nil +} diff --git a/service/admin/kind_box/service.go b/service/admin/kind_box/service.go index 0910923..20e96a1 100644 --- a/service/admin/kind_box/service.go +++ b/service/admin/kind_box/service.go @@ -8,6 +8,7 @@ import ( type Repository interface { AddBatchKindBox(ctx context.Context, kindBoxes []entity.KindBox) error + AddKindBox(ctx context.Context, kindBox entity.KindBox) error } type Service struct { diff --git a/service/admin/kind_box_req/accept.go b/service/admin/kind_box_req/accept.go index dc0bfcb..56dd16c 100644 --- a/service/admin/kind_box_req/accept.go +++ b/service/admin/kind_box_req/accept.go @@ -29,7 +29,7 @@ func (s Service) Accept(ctx context.Context, req param.KindBoxReqAcceptRequest) KindBoxReqStatus: kindBoxReq.Status, CountRequested: kindBoxReq.CountRequested, CountAccepted: kindBoxReq.CountAccepted, - ReferDate: kindBoxReq.ReferDate, - AddressID: kindBoxReq.AddressID, + DeliverReferDate: kindBoxReq.DeliverReferDate, + DeliverAddressID: kindBoxReq.DeliverAddressID, }, nil } diff --git a/service/admin/kind_box_req/deliver.go b/service/admin/kind_box_req/deliver.go new file mode 100644 index 0000000..7102df3 --- /dev/null +++ b/service/admin/kind_box_req/deliver.go @@ -0,0 +1,38 @@ +package adminkindboxreqservice + +import ( + "context" + "time" + + kindboxParam "git.gocasts.ir/ebhomengo/niki/param/admin/kind_box" + param "git.gocasts.ir/ebhomengo/niki/param/admin/kind_box_req" + richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" +) + +func (s Service) Deliver(ctx context.Context, req param.DeliverKindBoxReqRequest) (param.DeliverKindBoxReqResponse, error) { + const op = "adminkindboxreqservice.Deliver" + + kindBoxReq, gErr := s.repo.GetByID(ctx, req.KindBoxReqID) + if gErr != nil { + return param.DeliverKindBoxReqResponse{}, richerror.New(op).WithErr(gErr).WithKind(richerror.KindUnexpected) + } + _, aErr := s.kindBoxSvc.AddBatchKindBox(ctx, kindboxParam.AddKindBoxRequest{ + KindBoxReqID: kindBoxReq.ID, + BenefactorID: kindBoxReq.BenefactorID, + Type: kindBoxReq.KindBoxType, + DeliverReferDate: kindBoxReq.DeliverReferDate, + DeliverAddressID: kindBoxReq.DeliverAddressID, + SenderAgentID: kindBoxReq.SenderAgentID, + DeliveredAt: time.Now(), + CountAccepted: kindBoxReq.CountAccepted, + }) + if aErr != nil { + return param.DeliverKindBoxReqResponse{}, richerror.New(op).WithErr(aErr).WithKind(richerror.KindUnexpected) + } + dErr := s.repo.DeliverKindBoxReq(ctx, req.KindBoxReqID) + if dErr != nil { + return param.DeliverKindBoxReqResponse{}, richerror.New(op).WithErr(dErr).WithKind(richerror.KindUnexpected) + } + + return param.DeliverKindBoxReqResponse{}, nil +} diff --git a/service/admin/kind_box_req/reject.go b/service/admin/kind_box_req/reject.go index aac41ec..f45c42d 100644 --- a/service/admin/kind_box_req/reject.go +++ b/service/admin/kind_box_req/reject.go @@ -20,13 +20,13 @@ func (s Service) Reject(ctx context.Context, req param.KindBoxReqRejectRequest) } return param.KindBoxReqRejectResponse{ - ID: kindBoxReq.ID, - KindBoxType: kindBoxReq.KindBoxType, - CountRequested: kindBoxReq.CountRequested, - BenefactorID: kindBoxReq.BenefactorID, - Status: kindBoxReq.Status, - Description: kindBoxReq.Description, - ReferDate: kindBoxReq.ReferDate, - AddressID: kindBoxReq.AddressID, + ID: kindBoxReq.ID, + KindBoxType: kindBoxReq.KindBoxType, + CountRequested: kindBoxReq.CountRequested, + BenefactorID: kindBoxReq.BenefactorID, + Status: kindBoxReq.Status, + Description: kindBoxReq.Description, + DeliverReferDate: kindBoxReq.DeliverReferDate, + DeliverAddressID: kindBoxReq.DeliverAddressID, }, nil } diff --git a/service/admin/kind_box_req/service.go b/service/admin/kind_box_req/service.go index 97d79a1..beac3d8 100644 --- a/service/admin/kind_box_req/service.go +++ b/service/admin/kind_box_req/service.go @@ -3,8 +3,9 @@ package adminkindboxreqservice import ( "context" - "git.gocasts.ir/ebhomengo/niki/entity" + entity "git.gocasts.ir/ebhomengo/niki/entity" paginationparam "git.gocasts.ir/ebhomengo/niki/param" + param "git.gocasts.ir/ebhomengo/niki/param/admin/kind_box" ) type Repository interface { @@ -13,10 +14,16 @@ type Repository interface { RejectKindBoxReq(ctx context.Context, kindBoxReqID uint, description string) error RollbackKindBoxRequestStatus(ctx context.Context, id uint) error GetAllKindBoxReq(ctx context.Context, pagination paginationparam.PaginationRequest) ([]entity.KindBoxReq, paginationparam.PaginationResponse, error) + DeliverKindBoxReq(ctx context.Context, kindBoxReqID uint) error +} + +type KindBoxSvc interface { + AddBatchKindBox(ctx context.Context, req param.AddKindBoxRequest) (param.AddKindBoxResponse, error) } type Service struct { - repo Repository + repo Repository + kindBoxSvc KindBoxSvc } func New(repository Repository) Service { diff --git a/service/benefactor/benefactor/login_register.go b/service/benefactor/benefactor/login_register.go index e67f8b4..a0243d8 100644 --- a/service/benefactor/benefactor/login_register.go +++ b/service/benefactor/benefactor/login_register.go @@ -32,7 +32,6 @@ func (s Service) LoginOrRegister(ctx context.Context, req benefactoreparam.Login if !isExist { newBenefactor, err := s.repo.CreateBenefactor(ctx, entity.Benefactor{ PhoneNumber: req.PhoneNumber, - Status: entity.BenefactorActiveStatus, Role: entity.UserBenefactorRole, }) if err != nil { @@ -44,7 +43,7 @@ func (s Service) LoginOrRegister(ctx context.Context, req benefactoreparam.Login athenticableBenefactor := entity.Authenticable{ ID: benefactor.ID, - Role: benefactor.Role.String(), + Role: entity.UserBenefactorRole.String(), } accessToken, aErr := s.auth.CreateAccessToken(athenticableBenefactor) if aErr != nil { @@ -61,7 +60,7 @@ func (s Service) LoginOrRegister(ctx context.Context, req benefactoreparam.Login ID: benefactor.ID, FirstName: benefactor.FirstName, LastName: benefactor.LastName, - Role: benefactor.Role.String(), + Role: entity.UserBenefactorRole.String(), }, Tokens: benefactoreparam.Tokens{ AccessToken: accessToken, diff --git a/service/benefactor/kind_box_req/add.go b/service/benefactor/kind_box_req/add.go index b2f4db6..3acaecc 100644 --- a/service/benefactor/kind_box_req/add.go +++ b/service/benefactor/kind_box_req/add.go @@ -2,21 +2,25 @@ package benefactorkindboxreqservice import ( "context" - - entity "git.gocasts.ir/ebhomengo/niki/entity" + "git.gocasts.ir/ebhomengo/niki/entity" param "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" + "time" ) func (s Service) Add(ctx context.Context, req param.KindBoxReqAddRequest) (param.KindBoxReqAddResponse, error) { const op = "userkindboxreqservice.Add" + t, tErr := time.Parse(time.DateTime, req.DeliverReferDate) + if tErr != nil { + return param.KindBoxReqAddResponse{}, richerror.New(op).WithErr(tErr).WithKind(richerror.KindInvalid) + } kindBoxReq, err := s.repo.AddKindBoxReq(ctx, entity.KindBoxReq{ - BenefactorID: req.BenefactorID, - KindBoxType: req.TypeID, - AddressID: req.AddressID, - ReferDate: req.ReferDate, - CountRequested: req.CountRequested, - Status: entity.KindBoxReqPendingStatus, + BenefactorID: req.BenefactorID, + KindBoxType: req.TypeID, + DeliverAddressID: req.DeliverAddressID, + DeliverReferDate: t, + CountRequested: req.CountRequested, + Status: entity.KindBoxReqPendingStatus, }) if err != nil { return param.KindBoxReqAddResponse{}, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected) diff --git a/validator/admin/kind_box_req/deliver.go b/validator/admin/kind_box_req/deliver.go new file mode 100644 index 0000000..0a20a10 --- /dev/null +++ b/validator/admin/kind_box_req/deliver.go @@ -0,0 +1,37 @@ +package adminkindboxreqvalidator + +import ( + "errors" + + param "git.gocasts.ir/ebhomengo/niki/param/admin/kind_box_req" + errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" + richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" + validation "github.com/go-ozzo/ozzo-validation/v4" +) + +func (v Validator) ValidateDeliver(req param.DeliverKindBoxReqRequest) (map[string]string, error) { + const op = "adminkindboxreqvalidator.ValidateAssignSender" + + if err := validation.ValidateStruct(&req, + validation.Field(&req.KindBoxReqID, validation.Required, validation.By(v.doesKindBoxRequestExist), validation.By(v.checkKindBoxReqStatusForDelivering))); err != nil { + + fieldErrors := make(map[string]string) + + var errV validation.Errors + if errors.As(err, &errV) { + for key, value := range errV { + if value != nil { + fieldErrors[key] = value.Error() + } + } + } + + return fieldErrors, richerror.New(op). + WithMessage(errmsg.ErrorMsgInvalidInput). + WithKind(richerror.KindInvalid). + WithMeta(map[string]interface{}{"req": req}). + WithErr(err) + } + + return map[string]string{}, nil +} diff --git a/validator/admin/kind_box_req/validator.go b/validator/admin/kind_box_req/validator.go index d9cf678..6ec8339 100644 --- a/validator/admin/kind_box_req/validator.go +++ b/validator/admin/kind_box_req/validator.go @@ -75,3 +75,19 @@ func (v Validator) CheckKindBoxReqStatusForRejecting(value interface{}) error { return nil } + +func (v Validator) checkKindBoxReqStatusForDelivering(value interface{}) error { + kindboxreqID, ok := value.(uint) + if !ok { + return fmt.Errorf(errmsg.ErrorMsgSomethingWentWrong) + } + kindBoxReq, err := v.repo.GetByID(context.Background(), kindboxreqID) + if err != nil { + return err + } + if kindBoxReq.Status != entity.KindBoxReqAssignedSenderAgentStatus { + return fmt.Errorf(errmsg.ErrorMsgDeliverKindBoxReqStatus) + } + + return nil +} diff --git a/validator/benefactor/kind_box_req/add.go b/validator/benefactor/kind_box_req/add.go index 58f58ee..b40385d 100644 --- a/validator/benefactor/kind_box_req/add.go +++ b/validator/benefactor/kind_box_req/add.go @@ -24,11 +24,11 @@ func (v Validator) ValidateAddRequest(req param.KindBoxReqAddRequest) *Validator validation.Required, validation.By(v.doesTypeExist)), - validation.Field(&req.AddressID, + validation.Field(&req.DeliverAddressID, validation.Required, validation.By(v.doesAddressExist(req.BenefactorID))), - validation.Field(&req.ReferDate, + validation.Field(&req.DeliverReferDate, validation.Required, ), ); err != nil {