Kaynağa Gözat

crm query information structure json test finished.

master
Patrick Peng Sun 8 yıl önce
ebeveyn
işleme
d01652f648
12 değiştirilmiş dosya ile 15867 ekleme ve 21 silme
  1. +90
    -0
      crmLead.go
  2. +381
    -0
      crmLead_test.go
  3. +2
    -21
      eventSubscribe.go
  4. +97
    -0
      sample_data/crm_view_lead.json
  5. +3007
    -0
      sample_data/crmhar/save-lead.har
  6. +756
    -0
      sample_data/crmhar/search-ldea.har
  7. +1127
    -0
      sample_data/crmhar/search-lead-Archive 17-06-04 14-01-27.har
  8. +1031
    -0
      sample_data/crmhar/search-lead-by-wechat-id-c.hitxy.org.au.har
  9. +1528
    -0
      sample_data/crmhar/upload-头像.har
  10. +7465
    -0
      sample_data/crmhar/view-specific-lead.har
  11. +330
    -0
      sample_data/crmhar/上传照片-192.168.1.39.har
  12. +53
    -0
      sample_data/sample_crm_lead_query.json

+ 90
- 0
crmLead.go Dosyayı Görüntüle

@@ -0,0 +1,90 @@
package main

import "time"

type crmLeadInfo struct {
ID string `json:"id"`
Name string `json:"name,omitempty"`
Deleted bool `json:"deleted,omitempty"`
SalutationName string `json:"salutationName,omitempty"`
FirstName string `json:"firstName,omitempty"`
LastName string `json:"lastName,omitempty"`
Title string `json:"title,omitempty"`
Status string `json:"status,omitempty"`
Source string `json:"source,omitempty"`
Industry string `json:"industry,omitempty"`
OpportunityAmount int `json:"opportunityAmount,omitempty"`
Website string `json:"website,omitempty"`
AddressStreet string `json:"addressStreet,omitempty"`
AddressCity string `json:"addressCity,omitempty"`
AddressState string `json:"addressState,omitempty"`
AddressCountry string `json:"addressCountry,omitempty"`
AddressPostalCode string `json:"addresPostalCode,omitempty"`
EmailAddress string `json:"emailAddress,omitempty"`
PhoneNumber string `json:"phoneNumber,omitempty"`
DoNotCall bool `json:"doNotCall,omitempty"`
Description string `json:"description,omitempty"`
CreatedAt string `json:"createdAt,omitempty"`
ModifiedAt string `json:"ModifiedAt,omitempty"`
AccountName string `json:"accountName,omitempty"`
Password string `json:"password,omitempty"`
WechatHitxyID string `json:"wechat_hitxy_id,omitempty"`
Verifier []string `json:"verifier,omitempty"`
OpportunityAmountCurrency string `json:"opportunityAmountCurrency,omitempty"`
OpportunityAmountConverted int `json:"opportunityAmountConverted,omitempty"`
EmailAddressData []struct {
EmailAddress string `json:"emailAddress,omitempty"`
Lower string `json:"lower,omitempty"`
Primary bool `json:"primary,omitempty"`
OptOut bool `json:"optOut,omitempty"`
Invalid bool `json:"invalid,omitempty"`
} `json:"emailAddressData,omitempty"`
PhoneNumberData []struct {
PhoneNumber string `json:"phoneNumber,omitempty"`
Primary bool `json:"primary,omitempty"`
Type string `json:"type,omitempty"`
} `json:"phoneNumberData,omitempty"`
CreatedByID string `json:"createdById,omitempty"`
CreatedByName string `json:"createdByName,omitempty"`
ModifiedByID string `json:"modifiedById,omitempty"`
ModifiedByName string `json:"modifiedByName,omitempty"`
AssignedUserID string `json:"assignedUserId,omitempty"`
AssignedUserName string `json:"assignedUserName,omitempty"`
CampaignID string `json:"campaignId,omitempty"`
CreatedAccountID string `json:"createdAccountId,omitempty"`
CreatedContactID string `json:"createdContactId,omitempty"`
CreatedOpportunityID string `json:"createdOpportunityId,omitempty"`
}

type crmSearchLead struct {
Total int `json:"total"`
List []crmLeadInfo `json:"list"`
}

func (m *crmLeadInfo) getCreatedAt() (r time.Time) {
layout := m.getTimeLayout()
r, _ = time.Parse(layout, m.CreatedAt)
return
}

func (m *crmLeadInfo) setCreatedAt(v time.Time) string {
layout := m.getTimeLayout()
m.CreatedAt = v.Format(layout)
return m.CreatedAt
}

func (m *crmLeadInfo) getModifiedAt() (r time.Time) {
layout := m.getTimeLayout()
r, _ = time.Parse(layout, m.ModifiedAt)
return
}

func (m *crmLeadInfo) setModifiedAt(v time.Time) string {
layout := m.getTimeLayout()
m.ModifiedAt = v.Format(layout)
return m.ModifiedAt
}

func (m *crmLeadInfo) getTimeLayout() string {
return "2006-01-02 15:04:05"
}

+ 381
- 0
crmLead_test.go Dosyayı Görüntüle

@@ -0,0 +1,381 @@
package main

import (
"encoding/json"
"log"
"testing"
)

func TestDecodeLeadInfo(t *testing.T) {
msg := `{
"id": "58f4aa0682ea74bb8",
"name": "same email",
"deleted": false,
"salutationName": "Mr",
"firstName": "same",
"lastName": "email",
"title": "title",
"status": "New",
"source": "",
"industry": "",
"opportunityAmount": null,
"website": "",
"addressStreet": "",
"addressCity": "",
"addressState": "",
"addressCountry": "",
"addressPostalCode": "",
"emailAddress": "test@gmail.com",
"phoneNumber": "456",
"doNotCall": false,
"description": "",
"createdAt": "2017-04-17 11:41:58",
"modifiedAt": "2017-04-18 04:41:06",
"accountName": "",
"password": "abcdefg",
"wechat_hitxy_id": "the user id obtained from wechat public account",
"verifier": [
"231823091",
"adkdaifaskfsafsa",
"394kfdjafdsa",
"39410498321041"
],
"opportunityAmountCurrency": null,
"opportunityAmountConverted": null,
"createdById": "1",
"createdByName": "Admin",
"modifiedById": "58ef420cac3cf6c95",
"modifiedByName": "wechat robot",
"assignedUserId": "1",
"assignedUserName": "Admin",
"campaignId": null,
"createdAccountId": null,
"createdContactId": null,
"createdOpportunityId": null
}`

r := crmLeadInfo{}
err := json.Unmarshal([]byte(msg), &r)
log.Println(r)
AssertEqual(t, err, nil, "Decode CRM Lead Json shold be correct")

AssertEqual(t, r.ID, "58f4aa0682ea74bb8", "ID mismatch ")
AssertEqual(t, r.Name, "same email", "Name mismatch")
AssertEqual(t, r.Deleted, false, "")
AssertEqual(t, r.SalutationName, "Mr", "")
AssertEqual(t, r.FirstName, "same", "")
AssertEqual(t, r.LastName, "email", "")
AssertEqual(t, r.Title, "title", "")
AssertEqual(t, r.Status, "New", "")
AssertEqual(t, r.Source, "", "")
AssertEqual(t, r.Industry, "", "")
AssertEqual(t, r.OpportunityAmount, 0, "")
AssertEqual(t, r.Website, "", "")
AssertEqual(t, r.AddressStreet, "", "")
AssertEqual(t, r.AddressCity, "", "")
AssertEqual(t, r.AddressState, "", "")
AssertEqual(t, r.AddressCountry, "", "")
AssertEqual(t, r.AddressPostalCode, "", "")
AssertEqual(t, r.EmailAddress, "test@gmail.com", "")
AssertEqual(t, r.PhoneNumber, "456", "")
AssertEqual(t, r.DoNotCall, false, "")
AssertEqual(t, r.Description, "", "")
AssertEqual(t, r.CreatedAt, "2017-04-17 11:41:58", "")
AssertEqual(t, r.ModifiedAt, "2017-04-18 04:41:06", "")
AssertEqual(t, r.AccountName, "", "")
AssertEqual(t, r.Password, "abcdefg", "")
AssertEqual(t, r.WechatHitxyID, "the user id obtained from wechat public account", "")
AssertEqual(t, r.Verifier[0], "231823091", "")
AssertEqual(t, r.Verifier[1], "adkdaifaskfsafsa", "")
AssertEqual(t, r.Verifier[2], "394kfdjafdsa", "")
AssertEqual(t, r.Verifier[3], "39410498321041", "")
AssertEqual(t, r.OpportunityAmountCurrency, "", "")
AssertEqual(t, r.OpportunityAmountConverted, 0, "")
AssertEqual(t, r.CreatedByID, "1", "")
AssertEqual(t, r.CreatedByName, "Admin", "")
AssertEqual(t, r.ModifiedByID, "58ef420cac3cf6c95", "")
AssertEqual(t, r.ModifiedByName, "wechat robot", "")
AssertEqual(t, r.AssignedUserID, "1", "")
AssertEqual(t, r.AssignedUserName, "Admin", "")
AssertEqual(t, r.CampaignID, "", "")
AssertEqual(t, r.CreatedAccountID, "", "")
AssertEqual(t, r.CreatedContactID, "", "")
AssertEqual(t, r.CreatedOpportunityID, "", "")

}

func TestCrmLeadInfoByCompleteInfo(t *testing.T) {
msg := `{
"id": "58f4aa0682ea74bb8",
"name": "same email",
"deleted": false,
"salutationName": "",
"firstName": "same",
"lastName": "email",
"title": "",
"status": "New",
"source": "",
"industry": "",
"opportunityAmount": 120,
"website": "",
"addressStreet": "",
"addressCity": "",
"addressState": "",
"addressCountry": "",
"addressPostalCode": "",
"emailAddress": "test@gmail.com",
"phoneNumber": "456",
"doNotCall": false,
"description": "",
"createdAt": "2017-04-17 11:41:58",
"modifiedAt": "2017-06-04 04:08:16",
"accountName": "",
"password": "abcdefg",
"wechat_hitxy_id": "the user id obtained from wechat public account",
"verifier": [
"231823091",
"adkdaifaskfsafsa",
"394kfdjafdsa",
"39410498321041"
],
"opportunityAmountCurrency": "AUD",
"opportunityAmountConverted": 120,
"emailAddressData": [
{
"emailAddress": "test@gmail.com",
"lower": "test@gmail.com",
"primary": true,
"optOut": false,
"invalid": false
},
{
"emailAddress": "abc@hotmail.com",
"lower": "abc@hotmail.com",
"primary": false,
"optOut": false,
"invalid": false
},
{
"emailAddress": "def@jjx.com.au",
"lower": "def@jjx.com.au",
"primary": false,
"optOut": false,
"invalid": false
}
],
"phoneNumberData": [
{
"phoneNumber": "456",
"primary": true,
"type": "Home"
},
{
"phoneNumber": "123",
"primary": false,
"type": "Mobile"
}
],
"createdById": "1",
"createdByName": "Admin",
"modifiedById": "1",
"modifiedByName": "Admin",
"assignedUserId": "1",
"assignedUserName": "Admin",
"teamsIds": [],
"teamsNames": {},
"campaignId": null,
"campaignName": null,
"createdAccountId": null,
"createdAccountName": null,
"createdContactId": null,
"createdContactName": null,
"createdOpportunityId": null,
"createdOpportunityName": null,
"imagesIds": [],
"imagesNames": {},
"isFollowed": true,
"followersIds": [
"1"
],
"followersNames": {
"1": "Admin"
},
"imagesTypes": {}
}`
r := crmLeadInfo{}
err := json.Unmarshal([]byte(msg), &r)
log.Println(r)
AssertEqual(t, err, nil, "")

AssertEqual(t, r.ID, "58f4aa0682ea74bb8", "ID mismatch ")
AssertEqual(t, r.Name, "same email", "Name mismatch")
AssertEqual(t, r.Deleted, false, "")
AssertEqual(t, r.SalutationName, "", "")
AssertEqual(t, r.FirstName, "same", "")
AssertEqual(t, r.LastName, "email", "")
AssertEqual(t, r.Title, "", "")
AssertEqual(t, r.Status, "New", "")
AssertEqual(t, r.Source, "", "")
AssertEqual(t, r.Industry, "", "")
AssertEqual(t, r.OpportunityAmount, 120, "")
AssertEqual(t, r.Website, "", "")
AssertEqual(t, r.AddressStreet, "", "")
AssertEqual(t, r.AddressCity, "", "")
AssertEqual(t, r.AddressState, "", "")
AssertEqual(t, r.AddressCountry, "", "")
AssertEqual(t, r.AddressPostalCode, "", "")
AssertEqual(t, r.EmailAddress, "test@gmail.com", "")
AssertEqual(t, r.PhoneNumber, "456", "")
AssertEqual(t, r.DoNotCall, false, "")
AssertEqual(t, r.Description, "", "")
AssertEqual(t, r.CreatedAt, "2017-04-17 11:41:58", "")
AssertEqual(t, r.ModifiedAt, "2017-06-04 04:08:16", "")
AssertEqual(t, r.AccountName, "", "")
AssertEqual(t, r.Password, "abcdefg", "")
AssertEqual(t, r.WechatHitxyID, "the user id obtained from wechat public account", "")
AssertEqual(t, r.Verifier[0], "231823091", "")
AssertEqual(t, r.Verifier[1], "adkdaifaskfsafsa", "")
AssertEqual(t, r.Verifier[2], "394kfdjafdsa", "")
AssertEqual(t, r.Verifier[3], "39410498321041", "")
AssertEqual(t, r.OpportunityAmountCurrency, "AUD", "")
AssertEqual(t, r.OpportunityAmountConverted, 120, "")
AssertEqual(t, r.CreatedByID, "1", "")
AssertEqual(t, r.CreatedByName, "Admin", "")
AssertEqual(t, r.ModifiedByID, "1", "")
AssertEqual(t, r.ModifiedByName, "Admin", "")
AssertEqual(t, r.AssignedUserID, "1", "")
AssertEqual(t, r.AssignedUserName, "Admin", "")
AssertEqual(t, r.CampaignID, "", "")
AssertEqual(t, r.CreatedAccountID, "", "")
AssertEqual(t, r.CreatedContactID, "", "")
AssertEqual(t, r.CreatedOpportunityID, "", "")

AssertEqual(t, r.EmailAddressData[0].EmailAddress, "test@gmail.com", "")
AssertEqual(t, r.EmailAddressData[0].Lower, "test@gmail.com", "")
AssertEqual(t, r.EmailAddressData[0].Primary, true, "")
AssertEqual(t, r.EmailAddressData[0].OptOut, false, "")
AssertEqual(t, r.EmailAddressData[0].Invalid, false, "")

AssertEqual(t, r.EmailAddressData[1].EmailAddress, "abc@hotmail.com", "")
AssertEqual(t, r.EmailAddressData[1].Lower, "abc@hotmail.com", "")
AssertEqual(t, r.EmailAddressData[1].Primary, false, "")
AssertEqual(t, r.EmailAddressData[1].OptOut, false, "")
AssertEqual(t, r.EmailAddressData[1].Invalid, false, "")

AssertEqual(t, r.EmailAddressData[2].EmailAddress, "def@jjx.com.au", "")
AssertEqual(t, r.EmailAddressData[2].Lower, "def@jjx.com.au", "")
AssertEqual(t, r.EmailAddressData[2].Primary, false, "")
AssertEqual(t, r.EmailAddressData[2].OptOut, false, "")
AssertEqual(t, r.EmailAddressData[2].Invalid, false, "")

AssertEqual(t, r.PhoneNumberData[0].PhoneNumber, "456", "")
AssertEqual(t, r.PhoneNumberData[0].Primary, true, "")
AssertEqual(t, r.PhoneNumberData[0].Type, "Home", "")

AssertEqual(t, r.PhoneNumberData[1].PhoneNumber, "123", "")
AssertEqual(t, r.PhoneNumberData[1].Primary, false, "")
AssertEqual(t, r.PhoneNumberData[1].Type, "Mobile", "")

}

func TestSearchResult(t *testing.T) {
msg := `{
"total": 2,
"list": [
{
"id": "58f4aa0682ea74bb8",
"name": "same email",
"deleted": false,
"salutationName": "",
"firstName": "same",
"lastName": "email",
"title": "",
"status": "New",
"source": "",
"industry": "",
"opportunityAmount": 120,
"website": "",
"addressStreet": "",
"addressCity": "",
"addressState": "",
"addressCountry": "",
"addressPostalCode": "",
"emailAddress": "test@gmail.com",
"phoneNumber": "456",
"doNotCall": true,
"description": "",
"createdAt": "2017-04-17 11:41:58",
"modifiedAt": "2017-06-04 06:57:48",
"accountName": "",
"password": "abcdefg",
"wechat_hitxy_id": "the user id obtained from wechat public account",
"verifier": [
"231823091",
"adkdaifaskfsafsa",
"394kfdjafdsa",
"39410498321041"
],
"opportunityAmountCurrency": "AUD",
"opportunityAmountConverted": 120,
"createdById": "1",
"createdByName": "Admin",
"modifiedById": "1",
"modifiedByName": "Admin",
"assignedUserId": "1",
"assignedUserName": "Admin",
"campaignId": null,
"createdAccountId": null,
"createdContactId": null,
"createdOpportunityId": null
},
{
"id": "58f4a849502da6f33",
"name": "not searchable",
"deleted": false,
"salutationName": "Mr.",
"firstName": "not",
"lastName": "searchable",
"title": "",
"status": "New",
"source": "",
"industry": "",
"opportunityAmount": null,
"website": "",
"addressStreet": "",
"addressCity": "",
"addressState": "",
"addressCountry": "",
"addressPostalCode": "",
"emailAddress": null,
"phoneNumber": null,
"doNotCall": false,
"description": "",
"createdAt": "2017-04-17 11:34:33",
"modifiedAt": "2017-04-18 05:09:36",
"accountName": "",
"password": null,
"wechat_hitxy_id": "the user id obtained from wechat public account",
"verifier": [],
"opportunityAmountCurrency": null,
"opportunityAmountConverted": null,
"createdById": "1",
"createdByName": "Admin",
"modifiedById": "58ef420cac3cf6c95",
"modifiedByName": "wechat robot",
"assignedUserId": "1",
"assignedUserName": "Admin",
"campaignId": null,
"createdAccountId": null,
"createdContactId": null,
"createdOpportunityId": null
}
]
}`
r := crmSearchLead{}
err := json.Unmarshal([]byte(msg), &r)
AssertEqual(t, err, nil, "")
AssertEqual(t, r.Total, 2, "")
AssertEqual(t, len(r.List), 2, "")
AssertEqual(t, r.List[0].ID, "58f4aa0682ea74bb8", "")
AssertEqual(t, r.List[1].ID, "58f4a849502da6f33", "")
}

+ 2
- 21
eventSubscribe.go Dosyayı Görüntüle

@@ -10,30 +10,11 @@ import (

func onSubscribe(in InWechatMsg) {
openID := in.header.FromUserName
//getUser fromCRM
log.Println(openID)
}

/*
{
"subscribe": 1,
"openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M",
"nickname": "Band",
"sex": 1,
"language": "zh_CN",
"city": "广州",
"province": "广东",
"country": "中国",

"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"subscribe_time": 1382694957,
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
"remark": "",

"groupid": 0,

"tagid_list":[128,2]
}
*/
//WechatUserInfo response for wechat user info.
type WechatUserInfo struct {
Subscribe int32 `json:"subscribe"`
OpenID string `json:"openid"`

+ 97
- 0
sample_data/crm_view_lead.json Dosyayı Görüntüle

@@ -0,0 +1,97 @@
{
"id": "58f4aa0682ea74bb8",
"name": "same email",
"deleted": false,
"salutationName": "",
"firstName": "same",
"lastName": "email",
"title": "",
"status": "New",
"source": "",
"industry": "",
"opportunityAmount": 120,
"website": "",
"addressStreet": "",
"addressCity": "",
"addressState": "",
"addressCountry": "",
"addressPostalCode": "",
"emailAddress": "test@gmail.com",
"phoneNumber": "456",
"doNotCall": false,
"description": "",
"createdAt": "2017-04-17 11:41:58",
"modifiedAt": "2017-06-04 04:08:16",
"accountName": "",
"password": "abcdefg",
"wechat_hitxy_id": "the user id obtained from wechat public account",
"verifier": [
"231823091",
"adkdaifaskfsafsa",
"394kfdjafdsa",
"39410498321041"
],
"opportunityAmountCurrency": "AUD",
"opportunityAmountConverted": 120,
"emailAddressData": [
{
"emailAddress": "test@gmail.com",
"lower": "test@gmail.com",
"primary": true,
"optOut": false,
"invalid": false
},
{
"emailAddress": "abc@hotmail.com",
"lower": "abc@hotmail.com",
"primary": false,
"optOut": false,
"invalid": false
},
{
"emailAddress": "def@jjx.com.au",
"lower": "def@jjx.com.au",
"primary": false,
"optOut": false,
"invalid": false
}
],
"phoneNumberData": [
{
"phoneNumber": "456",
"primary": true,
"type": "Home"
},
{
"phoneNumber": "123",
"primary": false,
"type": "Mobile"
}
],
"createdById": "1",
"createdByName": "Admin",
"modifiedById": "1",
"modifiedByName": "Admin",
"assignedUserId": "1",
"assignedUserName": "Admin",
"teamsIds": [],
"teamsNames": {},
"campaignId": null,
"campaignName": null,
"createdAccountId": null,
"createdAccountName": null,
"createdContactId": null,
"createdContactName": null,
"createdOpportunityId": null,
"createdOpportunityName": null,
"imagesIds": [],
"imagesNames": {},
"isFollowed": true,
"followersIds": [
"1"
],
"followersNames": {
"1": "Admin"
},
"imagesTypes": {}
}

+ 3007
- 0
sample_data/crmhar/save-lead.har
Dosya farkı çok büyük olduğundan ihmal edildi
Dosyayı Görüntüle


+ 756
- 0
sample_data/crmhar/search-ldea.har
Dosya farkı çok büyük olduğundan ihmal edildi
Dosyayı Görüntüle


+ 1127
- 0
sample_data/crmhar/search-lead-Archive 17-06-04 14-01-27.har
Dosya farkı çok büyük olduğundan ihmal edildi
Dosyayı Görüntüle


+ 1031
- 0
sample_data/crmhar/search-lead-by-wechat-id-c.hitxy.org.au.har
Dosya farkı çok büyük olduğundan ihmal edildi
Dosyayı Görüntüle


+ 1528
- 0
sample_data/crmhar/upload-头像.har
Dosya farkı çok büyük olduğundan ihmal edildi
Dosyayı Görüntüle


+ 7465
- 0
sample_data/crmhar/view-specific-lead.har
Dosya farkı çok büyük olduğundan ihmal edildi
Dosyayı Görüntüle


+ 330
- 0
sample_data/crmhar/上传照片-192.168.1.39.har
Dosya farkı çok büyük olduğundan ihmal edildi
Dosyayı Görüntüle


+ 53
- 0
sample_data/sample_crm_lead_query.json Dosyayı Görüntüle

@@ -0,0 +1,53 @@
{
"total": 1,
"list": [
{
"id": "58f4aa0682ea74bb8",
"name": "same email",
"deleted": false,
"salutationName": "",
"firstName": "same",
"lastName": "email",
"title": "",
"status": "New",
"source": "",
"industry": "",
"opportunityAmount": null,
"website": "",
"addressStreet": "",
"addressCity": "",
"addressState": "",
"addressCountry": "",
"addressPostalCode": "",
"emailAddress": "test@gmail.com",
"phoneNumber": "456",
"doNotCall": false,
"description": "",
"createdAt": "2017-04-17 11:41:58",
"modifiedAt": "2017-04-18 04:41:06",
"accountName": "",
"password": "abcdefg",
"wechat_hitxy_id": "the user id obtained from wechat public account",
"verifier": [
"231823091",
"adkdaifaskfsafsa",
"394kfdjafdsa",
"39410498321041"
],
"opportunityAmountCurrency": null,
"opportunityAmountConverted": null,
"createdById": "1",
"createdByName": "Admin",
"modifiedById": "58ef420cac3cf6c95",
"modifiedByName": "wechat robot",
"assignedUserId": "1",
"assignedUserName": "Admin",
"campaignId": null,
"createdAccountId": null,
"createdContactId": null,
"createdOpportunityId": null
}
]
}



Yükleniyor…
İptal
Kaydet